外部中断学习总结
1 题目要求
请用CubeMX建立一个工程并用protes仿真(cpu选择STM32F103R6),完成一个LED灯和一个按键的实验,熟悉GPIO设置和相关工具软件。
实验功能:每次按下按键后,LED灯状态发生翻转(中断方式),按键和LED灯分别连接在PB15和PA0管脚。
2 题目过程
2.1 RCC设置
在用cube配置时钟时,有下面两个选项:
- BYPASS Clock Source(旁路时钟源)
- Crystal/Ceramic Resonator(晶体/陶瓷晶振)
所谓HSE旁路时钟源,是指无需使用外部晶体时所需的芯片内部时钟驱动组件,直接从外界导入时钟信号。犹如芯片内部的驱动组件被旁路了。
外部晶体/陶瓷谐振器(HSE晶体)模式该时钟源是由外部无源晶体与MCU内部时钟驱动电路共同配合形成,有一定的启动时间,精度较高。
这里选择外部高速时钟的旁路时钟源。
2.2 外部中断设置
点击PB15的GPIO_EXTI15.
然后点击左边框中的GPIO,然后在下面的框中选择下降沿触发,因为一会电路设计的时候为上拉模式。
2.3 LED推挽输出设置
设置如果所示即可。
3 时钟树设置
记住这里一定选择为外部高速时钟提供时钟信号,并且要设置频率低一些,因为proteus不支持过高频率的仿真。
4 代码实现
我们需要自己加一个中断回调函数,当识别到PB15按键按下的时候,PA0电平状态发生反转。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == GPIO_PIN_15){
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15) == 0){
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0);
}
}
}
5 proteus仿真
按下PB15你会发现PA0的LED亮灭的变化。
6 仿真失败的现象和分析问题出错原因
刚开始弄完之后发现仿真不成功,按下按键没有现象,但是把外部中断模式改为普通查询模式之后,就有现象了,所以我可以肯定是中断的问题,并不是相应的LED引脚的问题。
首先我先去检查中断回调函数和判断引脚是否有问题,但是都是对的,那我就怀疑可能是时钟树有问题,后来我去把时钟树中的提供CLOCK的改为内部时钟源之后,其他都没有改变,当再次去仿真之后发现外部中断模式可以用了。
后续经过跟老师的讨论之后发现可能是我在用proteus中没有给STM32F103设置外部时钟源导致的,当我给单片机提供HSE的时候就可以用外部中断模式了,也就是下个章节的原因四。
7 仿真不成功的几个原因
原因一:STM32Cube 在设置时钟树的时SYSCLK频率过高,导致没办法仿真。
原因二:优化等级设置的太高了,设置为Level 1 即可。
原因三:回调函数用错了,void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)这个才是外部中断的回调函数。
原因四:proteus中设置STM32F103的频率要为8M。