当前位置:首页 > stm32中断和事件
STM32中断和事件
写“1”清除
写“0” 屏蔽中断
读到“1”有请求
写“1” 开放中断
读到“0”无请求
写“0” 禁止 写“0” 禁止下降沿触发 写“1” 允许上升 写“1” 允许下降沿触发
EXTI_IMR EXTI_PR
EXTI_SWIER EXTI_RTSR EXTI_FTSR
SWIER写“1”PR挂起
写“0” 屏蔽事件 写“1” 开放事件
EXTI_EMR
库函数:
void EXTI_DeInit(void) {
EXTI->IMR = 0x00000000;//屏蔽所有中断 EXTI->EMR = 0x00000000;//屏蔽所有事件
EXTI->RTSR = 0x00000000; //禁止所有上升沿触发 EXTI->FTSR = 0x00000000; //禁止所有下降沿触发 EXTI->PR = 0x000FFFFF;//挂起位全部清空 }
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) {
该函数接收一个结构体,按照下面的结构体配置EXTI寄存器 typedef struct {
uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled.
This parameter can be any combination of @ref EXTI_Lines */
EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines.
This parameter can be a value of @ref EXTIMode_TypeDef */
EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. This parameter can be a value of @ref EXTIMode_TypeDef */
FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines.
This parameter can be set either to ENABLE or DISABLE */
}EXTI_InitTypeDef;
uint32_t tmp = 0;
tmp = (uint32_t)EXTI_BASE;
if (EXTI_InitStruct->EXTI_LineCmd != DISABLE) {
/* Clear EXTI line configuration 屏蔽中断和事件*/ EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line; EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line;
tmp += EXTI_InitStruct->EXTI_Mode;
*(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; //开放中断或事件
/* Clear Rising Falling edge configuration 禁止上升沿触发和下降沿触发*/ EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line; EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line;
/* Select the trigger for the selected external interrupts */
if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) //允许上升沿触发和下降沿触发 {
/* Rising Falling edge */
EXTI->RTSR |= EXTI_InitStruct->EXTI_Line; EXTI->FTSR |= EXTI_InitStruct->EXTI_Line; }
else
//允许上升沿触发或下降沿触发 {
tmp = (uint32_t)EXTI_BASE;
tmp += EXTI_InitStruct->EXTI_Trigger;
*(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; } } else
//需要配置的线路取反再与Mode或运算,及相应线路的中断屏蔽位或事件屏蔽位写“0”,屏蔽事件或中断 {
tmp += EXTI_InitStruct->EXTI_Mode;
/* Disable the selected external lines */
*(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line; } }
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) //软件中断事件寄存器EXTI_SWIER对应线路写“1”,产生一个软件触发 {
EXTI->SWIER |= EXTI_Line; }
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) //读取挂起寄存器PR对应线路的值 {
FlagStatus bitstatus = RESET;
if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) {
bitstatus = SET; } else {
bitstatus = RESET; }
return bitstatus; }
void EXTI_ClearFlag(uint32_t EXTI_Line)//挂起寄存器PR对应线路写“1”清除 {
EXTI->PR = EXTI_Line; }
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)//如果对应线路开放该线路中断,则读取PR的值 {
ITStatus bitstatus = RESET; uint32_t enablestatus = 0;
enablestatus = EXTI->IMR & EXTI_Line;
if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) {
bitstatus = SET; } else {
bitstatus = RESET;
}
return bitstatus; }
void EXTI_ClearITPendingBit(uint32_t EXTI_Line) //挂起寄存器PR对应线路写“1”清除 {
EXTI->PR = EXTI_Line; }
从ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)函数和函数名来看,感觉IT是在中断函数中使用的,Flag是在中断和事件中使用的。
仅供学习交流使用 参考资料:
stm32中文参考手册; stm32中文固件库; stm32中文数据手册;
STM32F10x_StdPeriph_Lib_V3.5.0。
共分享92篇相关文档