嵌入式软件--stm32 DAY 9 定时器
1.基本介绍
1.1系统计时器
系统计时器(systick系统)属于CM3内核,内嵌在NVIC中。
stm32103系列芯片外设定时器有8个。命名简单,都是TIM+序号。
我们现在要说的时内核系统滴答计时器。它是24位向下递减的计数器,24位所能计数的最大范围时2^24-1,2^10=1024,2^20=1M,那么它的计数上限时一千六百多万。计数器每计数一次时间就是1/SYSCLK,也就是时钟周期,72M主频下,时钟周期是1/72 us. 计数器从初始值降到1,就可以关掉计时器,不关掉就会循环往复不断重复计时。一般发生一次中断,系统内核的中断。
1.2与systick相关的寄存器
1.2.1 STK_CTRL
控制和状态寄存器。
COUNT FLAG 到0的时候,时间结束。状态位
下面三位是使能位。TICK INT 系统滴答定时器的中断使能位。101代表没有使用中断。
时钟源,9Mhz.
1.2.2 STK_LOAD
24位寄存器。
一次计数是1/72us.也就是1us72次滴答。也就是LOAD的值。周期性的话,每100个时钟周期,设计RELOAD的值为n-1.因为从99到0是100个时钟周期。如果是一锤子买卖,就直接设定即可。
1.2.3 STK-VAL
VAL就是当前计数器的值。
CURRENT[23:0],24位主要是为了读取。如果写的话,都会清零标志位。
1.2.4 STK-CALIB
校准寄存器。出场写死,不用多做了解。
2.系统中断案例:LED灯闪烁
2.1需求描述
利用系统定时器的中断,每隔一秒让LED灯闪烁一次。
2.2硬件电路设计
让LED灯闪烁,就是让对应GPIO引脚,输出一段低电平,保持一段时间,在输出高电平,再保持一定时间,变化电平,循环往复。
我们之前可以用软件while(1)的循环实现,现在我们要用外设系统滴答定时器中断实现。
2.3软件实现
2.3.1创建工程
这个工程只需要LED。
2.3.2写代码(寄存器)
时钟主频72MHZ,一个周期1/72M S,1/72us,1us72个周期,1ms72000个时钟周期
2.3.3hal库
Systick定时器是mcu的内核,cubemx里只配LED就可以了。
PA0设置输出
优先级可以改为2
之后创建工程就可以了。
直接在底层写入函数
直接烧录。