一、对于STM32中断优先级的概念的理解
STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
1. 何为占先式优先级(pre-emption priority)
高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。
2. 何为副优先级(subpriority)
在占先式优先级相同的情况下,高副优先级的中断优先被响应;
在占先式优先级相同的情况下,如果有低副优先级中断正在执行,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应—非抢断式响应(不能嵌套)。
3. 判断中断是否会被响应的依据
首先是占先式优先级,其次是副优先级;
占先式优先级决定是否会有中断嵌套;
4. 优先级冲突的处理
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
5. stm32中对中断优先级的定义
STM32中指定中断优先级的寄存器位有4位,这4个寄存器位的分组方式如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
STM32为了适应,不同优先级的组合,设置了GROUP的概念,组是一个大的框架,在组下分别分配了占优先级与副优先级。每一个中断都有一个专门的寄存器(Interrupt Priority Registers)来描述该中断的占先式优先级及副优先级。在这个寄存器中STM32使用4个二进制描述位描述优先级(Cortex M3定义了8位,但STM32只使用了4位)。
二、stm32定时器的简介
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器,和1个系统滴答定时器。
其中TIM1和TIM8为高级定时器
TIM2.TIM3.TIM4.TIM5 为普通定时器
TIM6.TIM7是基本定时器
定时器 |
计数器分辨率 |
计数器类型 |
预分频系数 |
产生DMA请求 |
捕获比较通道 |
互补输出 |
TIM1 TIM8 |
16位 |
向上,向下,向上/向下 |
1~65536之间的任意数 |
可以 |
4 |
有 |
TIM2 TIM3 TIM4 TIM5
|
16位 |
向上,向下,向上/向下 |
1~65536之间的任意数 |
可以 |
4 |
有 |
TIM6 TIM7 |
16位 |
向上 |
1~65536之间的任意数 |
可以 |
4 |
有 |
普通定时器时钟的选择
计数器时钟可由下列时钟源提供:
● 内部时钟(CK_INT)
● 外部时钟模式1:外部输入脚(TIx)
● 外部时钟模式2:外部触发输入(ETR)
● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时
三、编程步骤
1、配置系统时钟
2、配置相应中断NVIC的优先级
3、配置GPIO
4、配置具体的TIME
5、编写相应的中断服务程序
定时器驱动程序的文件是misc.c
现在对编程的步骤进行分析,主要是针对第二步和第四步进行分析
第二部配置中断NVIC的优先级的具体配置的参数为
(1) 选择中断分组
(2) 配置相应的定时器中断通道
(3) 抢占式中断优先级的设置
(4) 响应式中断优先级的设置
(5) 使能中断
(6) 中断初始化
Timer配置如下设置:
(1) 设置Time模块的时钟源
(2) 利用TIM_DeInit()函数将Timer设置为默认缺省值
(3) TIM_Period自动重装载寄存器周期的值(计数值)
(4) TIM_Prescaler设置时钟的分频系数
(5) TIM_ClockDivision设置时钟分割 ??
(6) TIM_CounterMode设置计数模式
(7) 初始化上面所有的数值函数
(8) 清除溢出中断标志
(9) 打开中断溢出功能
(10)使能TIME中断
定时器中断时间的计算
计算公式如下:
Tout = (TIM_Period*(TIM_Prescaler+1))/TCLK;
其中:
Tout: time的溢出时间
Tclk:TIM的输入时钟频率(单位为:Khz),当选择来自内部的时钟(CK_INT),假设系统时钟为72Mhz,虽然TIMx是属于低速总线的的,这条总线的最高只能36Mhz的速度,但芯片内部还有一个*2的倍频器,用于把这个低速36M倍频成72M,速度依旧是72Mhz,如果将TIM_Prescaler赋值7200-1则预分频后的效果是0.0001S一个周期。
TIM_Period:预装载值
TIM_Prescaler:分频系数
习惯了用51或AVR的朋友们总是把中断函数和普通函数视为不同,总以为C语言的中断函数应指示特定的属性以便让编译器生成特殊的指令(如返回中断),但在CORTEX-M3中中断例程和普通C例程没有什么驱别了,按理说编译器应当提代一个指示字,例如__interrupt之类的,以便让中断程序定位到对流的中断向量,可是ARM编译器没有提供这样的指示字,因此我们只能通过在汇编的启动代码内直接写C程序中的中断函数:如我们写了下面这样一个UART1的中断函数:在51,AVR中这个是编译器通过函数属性自动处理的,在ARM7中中断函数地址写入对应的中断寄存器即可。而在CM3中我们不得不这样手动修改。
中断服务函数写在stm32f10x_it.c文件中,并且中断服务子程序的函数名,必须按照startup_stm32d10x_hd.s文件中的中断向量表中,对应的向量名进行。如果担心写错函数名,可以直接打开startup_stm32d10x_hd.s文件。对于具体的中断函数的。
上一篇:STM32 FSMC学习笔记+补充(LCD的FSMC配置)
下一篇:STM32串口的学习(2)
推荐阅读最新更新时间:2024-03-16 15:14
设计资源 培训 开发板 精华推荐
- 改变你对万用表的看法!福禄克首款热成像万用表Fluke-279FC功能畅想大征集!
- 看视频抽好礼:Type-C承载的高速串行标准,功能多样,挑战也不小
- 创通联达高通 IOT 平台解决方案及成功案例|报名直播赢【蓝牙耳机、音箱、京东卡】等好礼
- 有奖问答|ADI应用之旅——工业大机器健康篇
- 有奖直播|罗彻斯特电子半导体全周期解决方案 助您应对供应链中断和元器件停产的挑战
- 12月6日上午10:00有奖直播:如何使用Microchip安全方案为IoT设备保驾护航
- 【分享成长,10月有奖】EEWORLD优秀主题/回复第15期活动开始啦!!!
- 瑞萨电子MCU全国技术研讨会开放报名!覆盖上海、南京、杭州、合肥等10大城市!