本文中例子所使用的是stm32f103+标准库函数, 声明.
SysTick中断过程
SysTick是配置好重装载计数器(STK_LOAD)后, 并使能了SysTick.
SysTick功能框图
每当随着STK_CLK, 只要递减计数器(STK_VAL)慢慢减到0后, 就会发生一次中断, 进入到SysTick的中断服务函数中.
也就是每过(STK_LOAD/STK_CLK)时间, 就发生一次中断, 进入到中断服务函数中.
EXTI中断过程
EXTI功能框图
EXTI是外部中断, 配置好某个GPIO口, 并配置对应的EXTI, 设置为上升沿/下降沿/双边沿.
每当这个GPIO口发生了上升沿/下降沿/双边沿, 就发生一次中断, 进入到EXTI的中断服务函数中.
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串口中断接收一帧数据