外部中斷學習總結
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。