STM32Cube和proteus学习-外部中断学习总结

1 题目要求

请用CubeMX建立一个工程并用protes仿真(cpu选择STM32F103R6),完成一个LED灯和一个按键的实验,熟悉GPIO设置和相关工具软件。

实验功能:每次按下按键后,LED灯状态发生翻转(中断方式),按键和LED灯分别连接在PB15和PA0管脚。

2 题目过程

2.1 RCC设置

在用cube配置时钟时,有下面两个选项:

  1. BYPASS Clock Source(旁路时钟源)
  2. 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 即可。
keil的

原因三:回调函数用错了,void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)这个才是外部中断的回调函数。

原因四:proteus中设置STM32F103的频率要为8M。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章