STM32中断系统
理解中断、中断源、中断向量、中断优先级、中断服务函数…等基础概念。
ARM Cortex M3内核支持256个中断,包括16个内核中断和240个外设中断,拥有256个中断优先级别。
STM32的中断通道可能会由多个中断源共用。这就意味着,某一个中断服务函数也可能被多个中断源所共用。所以,在中断服务函数的入口处,需要有一个判断机制,用以辨别是那个中断触发了中断。
STM32微处理器的内核中有一个NVIC(嵌套向量中断控制器)的设备,它对中断进行统一的协调和控制,其中最主要的工作就是控制中断通道的使能和确定中断的优先级。
STM32中有2个优先级的概念:抢占优先级和响应优先级,每个中断都需要指定这两种优先级。
如果两个抢占优先级相同的中断同时到达,NVIC会根据他们的响应优先级高低来决定先处理哪一个。如果两个同时到达的中断的抢占优先级和响应优先级都相等,则根据中断的自然排位顺序来决定响应哪一个。
中断设计步骤
传统STM32外部中断设计步骤:
【1】将GPIO初始化为输入端口。
【2】配置相关I/O引脚与中断线的映射关系。
【3】设置该I/O引脚对应的中断触发条件。
【4】配置NVIC,并使能中断。
【5】编写中断服务函数。
基于STM32CubeMX的外部中断设计步骤:
【1】在STM32CubeMX中指定引脚,配置中断初始化参数。
选择GPIO引脚的功能,设置中断信号触发条件,使能NVIC对应的中断通道。
【2】重写该I/O引脚对应的中断回调函数。
抢占优先级和响应优先级
(1)如果两个中断同时到达,则中断控制器会先处理响应优先级高的中断。(2)当一个中断到来后,如果正在处理另一个中断,则这个后到的中断就要等到前一个中断处理完之后才能被处理(高响应优先级的中断不可以打断低响应优先级的中断)。(3)如果它们的抢占式优先级和响应优先级都相等,则根据它们在中断表中的排位顺序决定先处理哪一个。[link]
(https://zhuanlan.zhihu.com/p/92688895)
NVIC相关函数
设置优先级组:
10HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
(stm32f10xx_hal.c)
在涉及大量中断时设置优先级组可以优化工程,一般工程选NVIC_PRIORITYGROUP_2 就够用了,即2位用来配置抢占优先级,2位用来配置响应优先,即2的2次方共4种抢占优先级,2的2次方共4种响应优先级。
中断线
STM32的每个IO都可以作为外部中断输入。
STM32的中断控制器支持19个外部中断/事件请求:
线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
stm32外部中断线有16个,io口有几十上百个,一个中断线可以控制几个io口,但是同一时刻只能响应一个io口的中断。
小蜜蜂老师link
用cubemx初始化后只用重写void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)函数,在里面判断
eg:GPIO_Pin == GPIO_PIN_13
exit
优先级在中断中有写
PWM
STM32产生PWM原理:
pwm模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道一为有效电平,否则为无效。在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道一为无效电平,否则为有效电平。
pwm模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道一为无效电平,否则为有效。在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道一为有效电平,否则为无效电平。
通俗来说,CNT相当于分针,有一个秒针转一圈CNT加一,再转一圈,再加一。当CNT加到ARR后再加一次,CNT就变成零了。
秒针转一圈多长时间?这就要看预分频系数PSC,时间为时钟频率除以PSC。一个周期为(ARR+1)*(PSC+1)/timer clocks
“本站所有文章均为原创,欢迎转载,请注明文章出处:一只菜鸡儿。(https://blog.csdn.net/Linuxzbc/article/details/108279737)百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。”