STM32開發,HAL函數實現按鍵中斷/定時器/PWM功能

1 概述

1.1 資源概述

開發板:正點原子STM32F103 Nano開發板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型號:STM32F103RBT6
正點原子開發板

1.2 實現功能

1,LED0通過Button按鍵實現翻轉,Button按鍵採用中斷方式輸入;
2,LED1採用定時器方式實現翻轉,當計數達到時,狀態進行翻轉;
3,LED3採用while函數和Hal_delay函數實現,固定時長;
4,LED6採用PWM進行驅動,PWM設置一個固定的週期和佔空比。

1.3 PWM邊沿對齊和中心對齊

1.3.1 邊沿對齊模式

下圖爲邊沿對齊模式,其中ARR通過cubemx的counter period設置,決定PWM的週期,CCR通過pulse設置,決定佔空比。PWM模式1和PWM模式2,爲互補的波形,PWM模式1+極性低等效於PWM模式2+極性高。
PWM模式1- 在向上計數時,一旦TIMx_CNT<TIMx_CCR1時通道1爲有效電平,否則爲無效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道1爲無效電平(OC1REF=0),否則爲有效電平(OC1REF=1)。
PWM模式2- 在向上計數時,一旦TIMx_CNT<TIMx_CCR1時通道1爲無效電平,否則爲有效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道1爲有效電平,否則爲無效電平。
邊沿對齊模式

1.3.2 中央對齊模式

中央對齊模式如下圖,對於高級定時器產生互補帶死區的雙路輸出時非常有用,很方便設置死區時間。
中央對齊模式

2 軟件開發

2.1 CUBEMX配置

1,中斷分組設置,搶佔優先級設爲0,子優先級設爲1,2,3。
中斷分組
2,TIM2設置,設置爲向上計數,一個計數的時間爲
1/72000000*(35999+1)*(999+1)=0.5S
定時器2設置
定時器2對應的時序圖如下
定時器時許
3,TIM3設置,採用內部時鐘,PWM模式1,CH極性爲1。這裏頻率爲
72000000/(35999+1)/(3999+1)=0.5Hz,佔空比爲(249+1)/(3999+1)=6.25%
定時器3設置
4,GPIO設置,其中Button設置爲中斷模式。
GPIO配置

2.2 軟件代碼

使用CUBEMX生成代碼後,會自動對GPIO口以及定時器等進行初始化
我們需要在Main函數中開始定時器和PWM

 HAL_TIM_Base_Start_IT(&htim2);//timer2 on 開啓定時器2
 
 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);// timer3 on  PWM ON開始PWM

在While(1)增加LED3燈的操作

  HAL_Delay(4000);
  HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);//使用HAL函數進行LED燈的等時間亮滅

在main函數外邊設置按鍵中斷回調函數

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//按鍵中斷,當檢測到按鍵被按下時,翻轉LED0的狀態
{
if(GPIO_Pin==Button_Pin)//檢測按鍵
	HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
}

增加計數器回調函數

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//Timer2的定時器中斷,當計時結束後翻轉燈LED1的狀態
{
if(htim->Instance==htim2.Instance)//檢測定時器2
	{
		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);	
	}
}

程序編寫結束

3,實驗結果

3.1 仿真結果

LED1(採用定時器)和LED6(採用PWM)的仿真波形如下,時間不太對,但是沒關係,不深究,硬件實現的時間是對的。
PC1和PC6的波形

3.2 實物運行結果

實驗結果與預期相符
在這裏插入圖片描述

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