当前位置: 代码迷 >> 综合 >> stm32 SysTick/EXTI/USART中断过程
  详细解决方案

stm32 SysTick/EXTI/USART中断过程

热度:5   发布时间:2024-02-22 20:51:43.0

本文中例子所使用的是stm32f103+标准库函数, 声明.

SysTick中断过程

SysTick是配置好重装载计数器(STK_LOAD)后, 并使能了SysTick.

SysTick功能框图
SysTick功能框图
每当随着STK_CLK, 只要递减计数器(STK_VAL)慢慢减到0后, 就会发生一次中断, 进入到SysTick的中断服务函数中.
也就是每过(STK_LOAD/STK_CLK)时间, 就发生一次中断, 进入到中断服务函数中.


EXTI中断过程

EXTI功能框图
EXTI功能框图

EXTI是外部中断, 配置好某个GPIO口, 并配置对应的EXTI, 设置为上升沿/下降沿/双边沿.
每当这个GPIO口发生了上升沿/下降沿/双边沿, 就发生一次中断, 进入到EXTI的中断服务函数中.


USART中断过程

USART的中断过程是配置USART函数中, 使能了一些中断.
USART中断事件
USART中断事件
上列表格是所有USART可以发生的中断, 若要允许中断, 则要载USART_CR1中进行配置, 标准库函数中USART_ITConfig()函数进行配置.

例如下列代码

USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);    //使能串口接收寄存器不为空中断
USART_ITConfig ( DEBUG_USARTx, USART_IT_IDLE, ENABLE ); //使能串口总线空闲中断

RXNE是接收寄存器不为空, 就是接收到一个字节产生中断
IDLE就是空闲线路, 也就是接收到一帧数据后产生中断, 一帧数据就是这一次传送的数据

例如当有一帧数据从USART发送到stm32中
第一个字节到接收寄存器后, RXNE被置1, 发生RXNE中断
然后进入中断服务函数, 执行程序, 清除RXNE
第二个字节到接收寄存器后, RXNE被置1, 发生RXNE中断
然后进入中断服务函数, 执行程序, 清除RXNE
然后继续接收, 等到这帧数据都接收完了
IDLE被置1, 发生IDLE中断
然后进入中断服务函数, 执行程序, 清除IDLE

标准库中用USART_GetITStatus()函数来检测标志位是否被置1

在中断服务函数快要结束要记得清除相应的中断标志位, 清除方法参考手册中都有
对于RXNE: 对USART_DR读操作或用USART_ClearITPendingBit()函数写0
对于IDLE: 先读USART_SR, 然后读USART_DR (这个比较特殊, 不要被坑了!!!)


SHOUT OUT TO
STM32F系列USART的IDLE中断要注意了
stm32串口中断接收一帧数据