STM32F0xx芯片LL库的EXTI中断
在ST官方的文档RM0091中
友情翻译:
扩展中断和事件控制器(EXTI)
- 扩展中断和事件控制器(EXTI)管理外部和内部的异步事件/中断,并生成事件请求到CPU/中断控制器和一个唤醒请求到电源管理器。
- EXTI允许管理多达32个外部/内部事件行(23个外部事件行和9个内部事件行)。
- 每个外部中断线的活动边缘可以独立选择,而内部中断的活动边缘总是上升的。
- 一个中断可能被保留:在外部的情况下,一个状态寄存器被实例化,并指示中断的源;
- 一个事件总是一个简单的脉冲,它被用来触发核心唤醒(例如,cortex-m0rxev pin)。
- 对于内部中断,生成的IP保证挂起的状态,因此不需要特定的标记。
- 每个输入行可以独立地屏蔽,用于中断或事件生成,此外,内部的行也只在停止模式下进行采样。
- 该控制器还允许通过软件模拟(仅)外部事件,并通过写入专用寄存器来对相应的硬件事件行进行复用。
1.1 硬件中断选择
1.2 硬件事件选择
1.3 软件中断/事件的选择
1.4 外部和内部中断/事件行映射
GPIOs连接到16个外部中断/事件行
剩余的行连接:
输出16连接到PVD EXTI行
EXTI第17行连接到RTC报警事件
EXTI第18行内部连接到USB唤醒事件
EXTI线19连接到RTC篡改事件和时间戳
EXTI第20行连接到RTC唤醒事件(只有STM32F07x和STM32F09x设备)
EXTI第21行与比较器1的输出
EXTI第22行与第二比较器输出
EXTI第23行连接到内部I2C1唤醒事件
EXTI第24行保留(内部低)
EXTI第25行连接到内部USART1唤醒事件
EXTI第26行连接到内部USART2唤醒事件(只有STM32F07x和STM32F09x设备)
EXTI线27连接到内部CEC唤醒事件
EXTI 线28是连接到内部USART3唤醒事件(只有STM32F09x设备)
EXTI第29行保留(内部低)
EXTI线30保留(内部低)
EXTI第31行连接到VDDIO2供应比较器输出(只有STM32F04x,STM32F07x和STM32F09x设备
2.GPIO口配置(基于LL库)
void CanBusCANWakeupConfig(void)
{
LL_EXTI_InitTypeDef EXTI_InitStruct;
/* GPIO Ports Clock Enable */
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTA, LL_SYSCFG_EXTI_LINE11);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTA, LL_SYSCFG_EXTI_LINE12);
/**/
LL_GPIO_SetPinPull(CAN_TX_GPIO_Port, CAN_TX_Pin, LL_GPIO_PULL_NO);
/**/
LL_GPIO_SetPinPull(CAN_RX_GPIO_Port, CAN_RX_Pin, LL_GPIO_PULL_NO);
/**/
LL_GPIO_SetPinMode(CAN_TX_GPIO_Port, CAN_TX_Pin, LL_GPIO_MODE_INPUT);
/**/
LL_GPIO_SetPinMode(CAN_RX_GPIO_Port, CAN_RX_Pin, LL_GPIO_MODE_INPUT);
/**/
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_11;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING; //触发升降模式
LL_EXTI_Init(&EXTI_InitStruct);
/**/
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_12;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
/* EXTI interrupt init*/
NVIC_SetPriority(EXTI4_15_IRQn, 3);
NVIC_EnableIRQ(EXTI4_15_IRQn);
DebugPrint("TX And Rx Weak Up Pin Set...");
}
这里使用CAN_TX_Pin和CAN_RX_Pin作为中断触发IO口:
#define CAN_RX_Pin LL_GPIO_PIN_11
#define CAN_RX_GPIO_Port GPIOA
#define CAN_TX_Pin LL_GPIO_PIN_12
#define CAN_TX_GPIO_Port GPIOA
中断函数:
/* USER CODE BEGIN 1 */
/**
* @brief This function handles EXTI line0_31 interrupt.
*/
void EXTI4_15_IRQHandler(void)
{
#if 1
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_11) != RESET)
{
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_11);
/* USER CODE BEGIN LL_EXTI_LINE_11 */
HAL_GPIO_EXTI_Callback(CAN_RX_Pin);
/* USER CODE END LL_EXTI_LINE_11 */
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_12) != RESET)
{
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_12);
/* USER CODE BEGIN LL_EXTI_LINE_12 */
HAL_GPIO_EXTI_Callback(CAN_TX_Pin);
/* USER CODE END LL_EXTI_LINE_12 */
}
#endif
DebugPrint("System Weak Up ...");
// FLySystemReset();
}
/* USER CODE END 1 */
注:
HAL_GPIO_EXTI_Callback(CAN_TX_Pin)这个函数可自己重写,添加自己的效果;
DebugPrint()打印函数自己重新定义;
再将CanBusCANWakeupConfig()函数放进初始化或某个函数中,上升沿或下降沿触发试试。