本專欄記錄STM32開發各個功能的詳細過程,方便自己后續查看,當然也供正在入門STM32單片機的兄弟們參考;
本小節的目標是,系統主頻64 MHZ,采用高速外部晶振,通過定時器3 每秒中斷控制 PB9 引腳輸出高低電平,從而實現 LED 燈的亮滅。
原理:通過配置定時器3每1mS進入中斷一次,每進入中斷服務程序一次,增加一次計數,計數到達500,控制PB9引腳輸出高或低電平,從而實現1S鐘周期閃爍。。
涉及到的知識:配置UART引腳,定時器中斷,STM32CubeMX的使用
文章目錄
- 1 新建工程
- 2 配置SWD下載引腳
- 3 配置GPIO輸出
- 4 配置RCC
- 5 設置系統主頻
- 6 定時器配置
- 6.1 錯誤配置記錄
- 6.2 正確配置
- 7 生成工程
- 8 增加代碼實現每1S 控制PB9 引腳輸出高或者低電平
1 新建工程
點擊File 菜單下的New Project
選擇芯片型號,如下圖所示先輸入芯片型號,目前這邊輸入STM32G030C8,
雙擊選擇,就確定了芯片型號,界面會變成如下圖所示
2 配置SWD下載引腳
如下圖所示,在Pinout&Configuration 欄目的System Core 下,先點擊SYS,再勾選Serial Wire 框,
配置好SWD 下載引腳設置:
3 配置GPIO輸出
按下圖 的1,2,3 步驟完成PB9 引腳配置成GPIO 輸出設置:
配置成功后如下圖所示:
4 配置RCC
如下圖,先點擊RCC,在HSE 配置中選擇Crystal/Ceramic Resonator 外部晶振設
5 設置系統主頻
如下圖, 先點擊Clock Configuration 欄目,按下圖的1,2,3,4 步驟完成系統64MHZ 主頻設置:
6 定時器配置
6.1 錯誤配置記錄
如下圖的1,2,3,4 步驟完成定時器1ms 計時:
(注意,這里我踩了一個坑,誤以為Clock source中的Internal Clock為內部時鐘,而我是使用的外部晶振,所以我一直選擇了第二個選項ETR2。其實第二個選項是ETR2 外部觸發輸入(ETR)(僅適用TIM2,3,4),意思外接界的其他信號源;正確的應該是:外部晶振也是internal clock ,相當于使用外部時鐘分頻來的時鐘,只要你rcc配置的是外部晶振就沒事),所以下面的示例是錯誤的,正確過程請參考6.2
ETR2 外部觸發輸入(ETR)(僅適用TIM2,3,4),意思外接界的其他信號源。
如下圖所示完成TIM3 中斷使能:
6.2 正確配置
如下圖的1,2,3,4 步驟完成定時器1ms 計時:
因為我們選擇的是64MHz的外部時鐘,64分頻,1000計數時,1ms產生一次中斷。
上圖中各個參數的計數以及計數器周期計算方法如下:
Clock Source(時鐘來源) :本文中使用的64MHz外部晶振也要使用Internal Clock
計數器設置:
Prtscaler (定時器預分頻系數) : 63
Counter Mode(計數模式) : Up(向上計數模式)
Counter Period(自動重裝載值) : 999
CKD(時鐘分頻因子) : No Division 不分頻 (可以選擇二分頻和四分頻 )
auto-reload-preload(自動重裝載) : Disable 不使能
定時器的定時周期計算方法:
T = (psc+1)(arr+1)/Tclk
其中psc 為定時器預分頻系數 arr為自動重裝載值 Tclk為系統時鐘頻率
通過計算 T = (psc+1)(arr+1)/Tclk=(63+1)(999+1)/64us=1000us=1ms
因此實現了1ms中斷。
如下圖所示完成TIM3 中斷使能:
7 生成工程
按照下圖的步驟,進行項目配置,項目名稱和路徑設置等,生成項目的類型選擇STM32CubeIDE(我這里以STM32CubeIDE為例,如果你要試用keil5,那就選擇MDK-RAM,如果要使用makefile,就選擇Makefile),注意項目名稱和路徑不要有中文名;
最后全部設置完畢后點擊create code,生成項目代碼:
生成的工程如下圖所示:
8 增加代碼實現每1S 控制PB9 引腳輸出高或者低電平
如下圖,如箭頭所示實現1ms 中斷回調函數中實現計數到500ms 后PB9 翻轉輸出,
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//1ms中斷回調函數
{TimeCounter++;if(TimeCounter>=500)//500ms時間到{TimeCounter=0;HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);//LED反轉輸出}
}