基于uVision的STM32F103C8编程第三弹

以下是我学习基于uVision中的STM32F103C8编程的一点感悟和指导,分享出来,希望对大家有所帮助。如果有错误的地方可以留言指出来,我一定耐心听取。相信大家只要付出努力,就一定学有所成!

目录

1.系统时钟

2.led灯开关模拟

                               言归正传了呦

1.系统时钟

1.1 首先介绍一下STM32的系统时钟吧。名为SYSTICK,是一个24位降序、零约束、写清除的计数器递减计数器。Systick设定初值并使能后,每经过一个时钟周期,计数器减一,计数到0时,Systick计数器自动重载初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能)。而外部晶振为8Mhz,9倍频,系统时钟为72Mhz,若Systick的频率为9Mhz(HCLK/8),在这个条件下

  1. 把Systick校验值设置成9,将Systick时钟设置为八分频,就能产生1us的时间基值,即产生1us中断。
  2. 把Systick校验值设置成9000,将Systick时钟设置为八分频,就能产生1ms的时间基值,即产生1ms中断。
  3. 把Systick校验值设置成9000000,将Systick时钟设置为八分频,就能产生1s的时间基值,即产生1s中断。

¥¥¥¥¥¥重要提示,由于系统时钟只有24位可以显示数字,所以SysTick校验值最大为2^24-1,差不多17600000,所以我们不能设置超过这个值,否则计时器会失效。比如说以s为单位,只能传1,不能传2以上,但是可以多次执行delay_s()这个函数哦。

1.2 接下来讲解具体实现过程。首先是建立一个头文件和一个源文件,来练习之前的知识哦。
1.2.1 在头文件中,我以clock.h命名

//clock.h

#ifndef _CLOCK_H
#define _CLOCK_H


void clock_init(void);//初始化时钟
void delay_us(int time);//系统延迟函数

#endif

1.2.2 在源文件中,我以clock.c代码如下

//clock.c

#include <stdio.h>
#include <stm32f10x.h>
#include <clock.h>//对应头文件

void clock_init(){
 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//设置时钟源函数
 SysTick_Type system_clock;//声明时钟变量
 return;
}

void delay_us(int time){
 u32 systick_ctrl;
 SysTick->LOAD = 9*time; //写入装载值
 SysTick->VAL = 0; //初始化当前寄存器
 SysTick->CTRL = SysTick->CTRL | 0x00000001;//末位赋值为1,表示开始赋值
 do{
  	;
 }while(!(SysTick->CTRL & (1<<16)));//第16位为计数完成位,0表示未完成,1表示完成
 SysTick->VAL = 0;
 SysTick->CTRL &= 0xFFFFFFFE;//末位赋值为0,其余为1,重载缺省值
 return;
}

这样。关于系统时钟的简单功能封装就实现了。原理是不是也比较简单呢?

2.led灯开关模拟

利用以上的功能封装,但是需要改动一下key.c中的key_scan函数来防止抖动哟。
函数修改如下

//key.c判断开关是否按下,功能改为只要按下就会被发现,而且长按算按一次
int key_scan(){
 int flag=1;
 while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0){
  delay_ms(20);
  if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
   flag = 0;
 }
 return flag;
}

对于main主函数

#include <stdio.h>
#include <stm32f10x.h>
#include <led.h>
#include <key.h>
#include<clock.h>
int main (){
 led_init();
 int i=0;//利用奇偶数来实现开关判断
 key_init();
 while(1){
  if(key_scan()==0){
   i++;
  }
  if(i%2==1){
   allon();
  }
  else{
   alloff();
  }
 }
 
 return 0;
}

这个函数主要是思维逻辑比较难想,具体过程实现并不是很难,相信大家加油理解就一定可以的!!!!

猜你喜欢

转载自blog.csdn.net/weixin_43661569/article/details/100138837
今日推荐