李建波 張永亮 梁振華



摘要:介紹了嵌入式芯片STM32圖形化配置軟件STM32CubeMX,以定時器2為例,信號源為內部時鐘,當計數溢出時產生定時器中斷。通過分析STM32CubeMX定時器中斷處理機制,并進行軟件仿真和硬件實驗,從技術上為開發者提供幫助。
關鍵詞:定時器中斷;中斷回調函數;STM32CubeMX
中圖分類號:TH85+1 文獻標識碼:A
文章編號:1009-3044(2020)08-0248-02
1 簡介
STM32CubeMX是ST意法半導體近幾年來大力推薦的STM32芯片圖形化配置工具,允許用戶使用圖形化向導生成C初始化代碼,可以大大減輕開發工作、時間和費用[1-2]。 聊城大學物理科學與信息工程學院羅清龍等對如何將STM32CubeMX引入本科嵌入式實驗教學改革進行了實踐[3],廣東機電職業技術學院電子與通信學院李建波等分析了將STM32CubeMX引入高職嵌入式系統設計課程教學中[4],西安工程大學電子信息學院羅瑤等將STM32CubeMX用在高速USB通信模塊設計中[5]。
目前沒有發現文章對STM32CubeMX定時器中斷進行分析,而定時器中斷是處理器實時處理事件的一種內部機制,是很重要的一個環節。本文利用STM32CubeMx設置TIM4定時中斷功能,追蹤了定時中斷矢量,在定時中斷回調函數中編寫了服務代碼,并進行了軟件仿真和硬件驗證。
2 總體設計
利用STM32CubeMX軟件進行定時器配置,生成代碼。打開工程進入Keil開發環境,進行定時器中斷代碼編輯、編譯,生成可執行文件。在仿真軟件Proteus選擇STM32芯片,并裝載可執行文件,進行仿真觀察。利用ST-Link或JLink,將代碼下載到開發板,進行硬件調試。
3 STM32CubeMX軟件
3.1選擇控制器
打開STM32CubeMX,點擊菜單欄File—New Project新建項目,輸入STM32F103C6,選擇STM32F103C6Tx芯片。在引腳配置界面,配置復位和時鐘控制RCC;進行時鐘配置,系統時鐘為8MHz;配置系統模式SYS Mode and Configuration;將PB9配制成GPIO_Output輸出模式。
3.2 配置TIM2
在引腳配置界面,類別Categories中選擇TIM2,在TIM2I作模式Mode配置時鐘源為內部時鐘,在設置Configuration中參數設置Parameter Setting中,配置分配系數為7999,計數周期為999,如圖l所示。
定時器中斷頻率:
ft2=fosc/((Prescaler+ l)*( Counter Pe riod+l))
f0。系統時鐘為8MHz,Prescaler為7999,Counter Period為999,代入公式1,得到
f1=8000000/《7999+1)*(999+1))=1Hz
定時器中斷周期:Tt2=1/ft2=ls,周期為1秒。
3.3設置定時器中斷
在定時器模式和配置一Configuration配置窗口,選擇嵌套向量中斷控制器設置NVIC Settings,勾選TIM2 global inter-rupts。如果定時周期到,則進入定時器中斷函數。
3.4生成代碼
選擇菜單欄Project,點擊Generate Code,生成用戶代碼、復制庫文件,點擊Open Project即可進入Keil編輯環境。
4 Keil開發環境
4.1中斷初始化
打開mam.c主文件,將鼠標移動到定時器初始化函數MX_TIM2_1nit0;點擊右鍵,查看定義:
void MX_TIM2_1nit(void){
TIM_ClockConfigTypeDef sClockSourceConfig={0};
TIM_MasterConfigTypeDef sMasterConfig=(0};
htim2.1nstance= TIM2;
htim2.Init.Prescaler= 7999;
htim2.Init.CounterMode= TIM—COUNTERMODE_UP;
htim2.Init.Period= 999;
htim2.Init.ClockDivision=TIM—CLO CKDIVISION_DIV l;
htim2. Init. AutoReloadPreload=TIM- AUTORELOAD_PRE-LOAD_DISABLE;
HAL_TIM_Base_lnit(&htim2);...)
可以看到分頻系數Ptescaler為7999,計數周期999。
4.2 定時器中斷函數
1)定時器2中斷函數
如果定時周期到,則進入定時器2中斷函數voidTIM2_IRQHandler(void).
2)定時器中斷函數
在void TIM2_IRQHandler(void)中,調用了函數HAL_TIM_IRQHandler(&htim2);進入該函數定義。因為比較長,只分析相關部分。
if
(_HAL_TIM_ GET- IT_SOURCE(htim,
TIM_IT_UP-DATE)!= RESET){
一HAL-- TIM_CLEAR_IT(htim, TIM_IT_UPDATE);