来源:bilibili视频
这里写目录标题
- 概述
- 一、寄存器部分
- 1. 控制和状态寄存器(STK_CTRL)
- 2. 加载值寄存器(STK_LOAD)
- 3.当前值寄存器(STK_VAL)
- 二、代码部分
- hal_delay()
- 1. hal_initTick()滴答定时器的初始化
- 2. 将七万二传入SysTick_Config()
- 3. 中断函数
- 三、注意点
概述
一、寄存器部分
1. 控制和状态寄存器(STK_CTRL)
2. 加载值寄存器(STK_LOAD)
3.当前值寄存器(STK_VAL)
每过1个周期,当前值就会往下减1,减到0时,会
触发中断
,会到加载值寄存器,把数值读入,从头开始计数。
二、代码部分
hal_delay()
- 这个函数刚开始是用
HAL_GetTick()
获取了当前的uwTick
的值(也就是初始值),赋给tickstart
- 判断一下,我们刚进来的
uwtick
与当前的uwtick
的差值,如果差值大于1000,则退出while(也就是 1000个的时候,已经是满足了系统时钟 计数72M个数了)
1. hal_initTick()滴答定时器的初始化
- 系统时钟 SystemCoreClock 我在cube MX中,已经设置了72MHz,然后除以1000(也就是1000U),变成了72000(也就是七万二)
2. 将七万二传入SysTick_Config()
系统时钟72MHz 意味着 一秒钟可以计数72M个数,然后1000分频后,变七万二,也就是它当前可以计七万个数(1ms),这就如同上面的
当前值寄存器的倒计时
,减到0 触发中断,重新赋值计数。
3. 中断函数
每次发生中断,也就是每1毫秒(计数七万二)uwTick自加1
三、注意点
由此可见,滴答寄存器的中断优先级是最低的,所以在中断中不可以使用Hal_delay(),优先级太低,不会被执行,甚至可能会卡死