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()函数放进初始化或某个函数中,上升沿或下降沿触发试试。

posted on 2018-03-02 15:12  银天蓝  阅读(2685)  评论(0编辑  收藏  举报

导航