KST-STM32学习之中断及定时器

1、ARM Cortex-M3 内核搭载了一个强大而方便的中断系统,称之为 NVIC(嵌套向量中断控制器)。

2、Cortex-M3 支持 256 个“中断通道”(16 个异常+240 个中断)以及对应的可编程 256 级中断优先级设置。
STM32 虽然采用 Cortex-M3 内核,但是只使用了其中的 84 个“中断通道”(16 个异常+68 个中断)以及 16 级中断优先级设置。

3、关于优先级的问题

优先级分为抢占优先级和响应优先级,51所设置的优先级均属于抢占优先级,默认的便是响应优先级!
有一个问题就显得尤为主要了,那便是关于中断嵌套了,到底是怎么样一个规则呢?
高抢占优先级可以嵌套低抢占优先级的中断。
两者抢占优先级相同,那么无论响应优先级是什么关系,这两者都没有嵌套关系。

假如两者同时发生,且抢占优先级相同,则根据响应优先级顺序执行;加入此时他们的相应优先级也相同,则根据中断清单表排位顺序执行,序号越小,对应优先级越高!

关于优先级,编程时需要注意:
首先要预先对程序的各个功能模块进行计算论证,开机初始化时一次性设置好优先级分组,以后就再也不动他了,避免同一个程序中使用多个优先级分组。

4、定时器

STM32F103ZE 中一共有 11 个定时器,包括 2 个高级控制定时器4 个通用定时器2个基本定时器(TIM6/TIM7),以及 2 个看门狗定时器1 个系统定时器(SysTick)

基本定时器包括 TIM6 和 TIM7 两个定时器模块,由计数器寄存器(TIMx_CNT)(和51的TH/TL一样一样的。。。。)、预分频寄存器(TIMx_PSC)自动重装载寄存器(TIMx_ARR)三部分构成。

这里写图片描述

5、定时器的时钟

为定时器提供时钟的时钟源有三个,HSI、HSE 和 PLL。
HSI - 由 8MHz的 RC 振荡器产生,精度较差,对时钟精度不敏感的情况下使用;HSE - 为外部时钟源(板载8MHz 晶振);
PLL - 是将 HSI 或者 HSE 的时钟倍频后提供的时钟频率

这里写图片描述

其中 AHB 域和 APB2最大时钟频率为 72MHz,而 APB1 域允许的最大时钟频率为 36MHz

还有一点,同上图红色圈住的,注释“自动进行1倍或2倍 倍频”这个怎么理解呢?
就是前面的分频器加入进行1分频(就是不分频),那么后面倍频器就进行1倍频。前面的分频器进行2分频,那么后面的倍频器就进行2倍频!

还有一点需要注意,当AHB提供的时钟源是72M时,那么APB1的预分频器最小需要配置成2分频!

AHB、APB 和定时器都具有预分频器,并且定时器自身还具备在特定条件下 2 倍频的功能,因此计算定时器的计数频率要充分考虑所有的影响因素,
定时器时钟 CK_CNT = CK_PSC/ (TIM_Prescaler + 1),其中 TIM_Prescaler定时器预分频系数,系数加 1 为实际定时器分频数

至于为什么,可以重新回到前面的预分频0到3的变化,再感受下。。。

这里写图片描述

另外,注意实际编程的时候的写法:

这里写图片描述

不要搞糊涂了。。。。

6、关于基本定时器的编程步骤

固件库函数中没有针对基本定时器的配置函数,但是基本定时器我们可以看做是通用寄存器的阉割版,只是部分功能少了,所以可以直接像通用寄存器一样操作也是可以的。
1、配置结构体成员

这里写图片描述

2、 NVIC 中断优先级设置

这里写图片描述

3、清除中断标志位

TIM_ClearITPendingBit(TIM_TypeDef* TIMx, u16 TIM_IT) 中断标志位清除函数预先清除标志位。

4、中断初始化

TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, 
FunctionalState NewState)
;TIMx 的 x 为 1~8,表示使用哪个定时器;TIM_IT 表示中断源类型,
NewState 为中断是否使能

这里写图片描述

STM32 的定时器有 6 种中断源类型,这 6 个中断源不仅都可以触发中断,每种类型还可以单独设置中断使能。

这里写图片描述

(基本定时器重点关注TIM_IT_Update

TIM_IT_Update:表示更新事件中断,比如计数器向上溢出/向下溢出,计数器初始化等都可以导致定时器的标志位更新,基本定时器通常都是用这个中断源

TIM_IT_CC1~4:都是捕获/比较中断,即外部信号输入捕获、输出比较,高级和通用寄存器有这个功能,基本定时器没有这个功能!(学习可类比51中的PCA)。

TIM_IT_Trigger:表示触发事件中断。和 51 单片机的外部计数器功能类似,STM32 也可以通过外部信号实现定时器的启动、停止、初始化等,这种中断源叫触发中断源。这个功能应用比较少,基本定时器也没有,高级和通用寄存器具有这个功能。

5 、使能定时器

TIM_Cmd(TIM_TypeDef* TIMx,
FunctionalState NewState)

一般上中断服务函数是放在, stm32f10x_it.c 文件中的,但是使用时要特别注意,该文件还有9个与异常中断相关的函数,只需再后面添加自己的中断服务函数即可,不要删除已有的异常。

7、关于两段不同优先级程序的对比

使用系统默认优先级

这里写图片描述

设置抢占优先级

这里写图片描述

8、定时时间的解读

这里写图片描述

72M进行7200分频,然后分之一,对应的每计一个数的时间,乘以100000,对应计这么多数的时间。便有了定时时间。。。

至于为什么72M呢?当时是有疑问,直到学到了第四章才恍然大悟!

这里写图片描述

那么对应72M也就不难解释了!


今天这一课,两个地方感受颇深。

第一个,先看张图吧,

这里写图片描述

似乎是很小的毛病,要是让自己来做,可能就会直接忽略的东西,但是他们却鲜明的写了出来,并告诉读者这里的误区,反思自己为什么考虑不到或者习惯性的选择忽略呢?其实你我之间普通人的差距本不大,无不是这些细节成就了个人,向工程师致敬,向工程师看齐。

对了,还有一个细节

这里写图片描述

猜你喜欢

转载自blog.csdn.net/ReCclay/article/details/81223849