作为一名stm32的初学者,无人指导自学还是很困难的,网络上虽热资料很多,但是对于基础薄弱的人来说还是很难理解各个外设的使用,初次发帖,以最简单明了的方式解说使用SysTick定时器,没有专业术语,简单粗暴。(专业的大佬请视而不见,哈哈哈)下面的程序是使用Systick定时2秒实现led间隔2秒亮灭(stm32f103c8t6芯片)
#include"stm32f10x.h"
uint32_t count; //定义了一个全局变量,stm32f10x_it.h也声明这个全局变量
void led_config() //引脚PB8的配置
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void delay(uint16_t ntime) //延时函数,ntime就是次数
{
count=ntime; //ntime这个值由我们自己设定,就是进入SysTick中断的次数,ntime赋值给全局变量count
while(count!=0); //进入Systick中断一次,count就减1,这边判断count是否减到零,跳出while
}
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //开启GPIOB时钟,先开启时钟,GPIO引脚参数才能有效配置
led_config(); //引脚PB8配置写入
SysTick_Config(72000); //SysTick的时钟源是72MHz, 72000就是定时1ms进入中断函数
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_8);
delay(2000); //延时2s,进入中断2000次,每次减1,最后得到0,跳出while,执行下一语句ResetBits
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
delay(2000);
}
}
*******************以下是需要配置的一些东西********************************
在stm32f10x_it.c文件中找到void SysTick_Handler(void)中断函数, 函数里面写入count-- 如下:
void SysTick_Handler(void)
{
count--;
}
在stm32f10x_it.h文件中一定要定义全局变量count,如下:
extern uint32_t count;
我看了很多帖子,都是把SysTick_Handler函数写的很累赘,我喜欢简单 count--,一句搞定,大家都很忙
新人第一次发帖,不好的地方多指导,感谢
|