前面我们点了个灯 现在我们来做个外部中断测试实验。长话短说。 我们用CUBE配置好引脚,这次我们选用USER按键按钮引脚配置为外部中断触发。
配置好LD2,LD3引脚,通过外部中断事件触发,从而控制这两个灯的变化。
配置好时钟,使能外部中断,生成工程。
这里同样使用的是MDK keil集成开发环境。
首先使能时钟
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
复制代码 配置GPIO
中断分组配置以及使能中断
- HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
- HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
复制代码 中断处理函数
- void EXTI15_10_IRQHandler(void)
- {
- /* USER CODE BEGIN EXTI15_10_IRQn 0 */
- /* USER CODE END EXTI15_10_IRQn 0 */
- HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
- /* USER CODE BEGIN EXTI15_10_IRQn 1 */
- /* USER CODE END EXTI15_10_IRQn 1 */
- }
复制代码 当按键按下,就会触发中断,从而进入下面的外部中断回调函数
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- delay_ms(10)//延时10毫秒,消抖
- switch(GPIO_Pin)
- {
- case GPIO_PIN_13:
- if(USER==1) //控制LD3,LD2电平翻转
- {
- HAL_GPIO_TogglePin(GPIOB, LD3_Pin | LD2_Pin);
- }
- break;
- }
- }
复制代码 在main函数如下写就好:
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- /* USER CODE END 1 */
- /* MCU Configuration----------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* Configure the system clock */
- SystemClock_Config();
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- /* USER CODE BEGIN 2 */
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
复制代码 编译下载验证,结果如下图,当上电第一次按下按键的时候LD3,LD2亮,再按就正常熄灭,多测试几次,没有出错的话,就成功了。
|