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。
在這裏插入圖片描述

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