1.在一个简单的按键试验中,我在xxit.c的EXTI2_IRQHandler中调用了一个函数KEY_BUZ_LED(): void KEY_BUZ_LED(void) { /****************************************************************/ HAL_GPIO_WritePin ( GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);//低有效 HAL_GPIO_WritePin ( GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);//低有效 // H_delayMS(250000); //自定义延时函数 HAL_Delay(300); HAL_GPIO_WritePin ( GPIOD, GPIO_PIN_1, GPIO_PIN_SET); HAL_GPIO_WritePin ( GPIOD, GPIO_PIN_3, GPIO_PIN_SET); /***************************************************************/ } 但是我按下按键后,能按下降沿正常进入EXTI2_IRQHandler里面的HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2)函数,但是接下来执行KEY_BUZ_LED()时一直卡在了 HAL_Delay(300),此时单步执行也无效了。 后来我就使用了自定义的延时函数 H_delayMS(),发现正常实现按键后蜂鸣器和LED的响、亮。 请问,各位大侠,这是什么情况?还有就是HAL_Delay函数的延时是怎么计算的,麻烦详解,感激不尽! |
中断里面延时,新手才这么干的。
HAL_Delay()函数,是在systick中断中改变计数值。你的EXTI2_IRQHandler()中断 处理函数不退出,估计systick中断也不一定会执行得到,所以.......
嘿嘿,新手哈,但是我是在另外一个源文件定义的KEY_BUZ_LED()啊,是不是在中断里面调用到的所有函数都不能有这个HAL_Delay
我感觉也是这样的,但是就是不确定,所以献丑了哈。
但是我使用自定义的那个延时函数时,就是没有问题,麻烦你详解哈
恩,我查了哈我的滴答时钟抢占和响应优先级均设置为0,0(应该最高了),就是一直没能查到EXTI2这个中断是个什么优先级啊!
那这个中断的优先级在哪里修改A?
这个就是滴答定时器的优先级,你的中断不能比他高.
恩,好的,谢谢提醒哈
这个滴答已经是0,0了,EXTI2的中断优先级还没找到