功能實(shí)現(xiàn):采用定時(shí)器實(shí)現(xiàn)LED燈的閃爍,周期為1S
準(zhǔn)備工作:1、STM32開發(fā)板(我的是STM32F103VET6)
2、STM32CubeMx軟件、 IDE:Keil軟件
3、按鍵管腳 :PA0 PC13
4、LED管腳 :PB0 PB1 PB5
定時(shí)器簡介:smt32F1系列共有8個(gè)定時(shí)器:
基本定時(shí)器(TIM6、TIM7)
通用定時(shí)器(TIM2、TIM3、TIM4、TIM5)
高級(jí)定時(shí)器(TIM1、TIM8)
SMT32F4系列共有15個(gè)定時(shí)器:
基本定時(shí)器(TIM6、TIM7)
通用定時(shí)器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14)
高級(jí)定時(shí)器(TIM1、TIM8)
基本定時(shí)器功能(TIM6、TIM7):
16位向上、向下、向上/下自動(dòng)裝載計(jì)數(shù)器
16位可編程(可以實(shí)時(shí)修改)預(yù)分頻器,計(jì)數(shù)器時(shí)鐘頻率的分頻系數(shù)為1~65535之間的任意數(shù)值
觸發(fā)DAC的同步電路 注:此項(xiàng)是TIM6/7獨(dú)有功能.
位于APB1總線上
通用定時(shí)器(TIM2~TIM5)的主要功能:
16位向上、向下、向上/下自動(dòng)裝載計(jì)數(shù)器
16位可編程(可以實(shí)時(shí)修改)預(yù)分頻器,計(jì)數(shù)器時(shí)鐘頻率的分頻系數(shù)為1~65535之間的任意數(shù)值
4 個(gè)獨(dú)立通道(TIMx_CH1~4)可以用作:
測量輸入信號(hào)的脈沖長度( 輸入捕獲)
輸出比較
單脈沖模式輸出
PWM輸出(邊緣或中間對(duì)齊模式)
支持針對(duì)定位的增量(正交)編碼器和霍爾傳感器電路
如下事件發(fā)生時(shí)產(chǎn)生中斷/DMA:
更新:計(jì)數(shù)器向上溢出/向下溢出,計(jì)數(shù)器初始化(通過軟件或者內(nèi)部/外部觸發(fā))
觸發(fā)事件(計(jì)數(shù)器啟動(dòng)、停止、初始化或者由內(nèi)部/外部觸發(fā)計(jì)數(shù))
輸入捕獲
輸出比較
位于APB1總線上
高級(jí)定時(shí)器(TIM1,TIM8)的主要功能:
高級(jí)定時(shí)器具有基本,通用定時(shí)器的所有的功能,
還具有控制交直流電動(dòng)機(jī)所有的功能,
輸出6路互補(bǔ)帶死區(qū)的信號(hào),剎車功能等等
位于APB2總線上
總括:基本定時(shí)器就是單純的定時(shí)計(jì)數(shù)器,通用定時(shí)器多了四個(gè)通道,相對(duì)應(yīng)的增加了功能,高級(jí)定時(shí)器具有基本,通用定時(shí)器的所有的功能,并且添加了其他功能
定時(shí)器計(jì)數(shù)模式通用定時(shí)器可以向上計(jì)數(shù)、向下計(jì)數(shù)、向上向下雙向計(jì)數(shù)模式。
向上計(jì)數(shù)模式:計(jì)數(shù)器從0計(jì)數(shù)到自動(dòng)加載值(TIMx_ARR),然后重新從0開始計(jì)數(shù)并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件。
向下計(jì)數(shù)模式:計(jì)數(shù)器從自動(dòng)裝入的值(TIMx_ARR)開始向下計(jì)數(shù)到0,然后從自動(dòng)裝入的值重新開始,并產(chǎn)生一個(gè)計(jì)數(shù)器向下溢出事件。
中央對(duì)齊模式(向上/向下計(jì)數(shù)):計(jì)數(shù)器從0開始計(jì)數(shù)到自動(dòng)裝入的值-1,產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件,然后向下計(jì)數(shù)到1并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件;然后再從0開始重新計(jì)數(shù)。
簡單地理解三種計(jì)數(shù)模式,可以通過下面的圖形:
計(jì)數(shù)時(shí)鐘的選擇計(jì)數(shù)器時(shí)鐘可由下列時(shí)鐘源提供:
內(nèi)部時(shí)鐘(TIMx_CLK)
外部時(shí)鐘模式1:外部捕捉比較引腳(TIx)
外部時(shí)鐘模式2:外部引腳輸入(TIMx_ETR) 僅適用TIM2,3,4
內(nèi)部觸發(fā)輸入(ITRx):使用一個(gè)定時(shí)器作為另一個(gè)定時(shí)器的預(yù)分頻器,如可以配置一個(gè)定時(shí)器Timer1而作為另一個(gè)定時(shí)器Timer2的預(yù)分頻器。
新建工程1.1 New Project1 搜索芯片型號(hào)
2選擇芯片
3創(chuàng)建工程
1.2設(shè)置時(shí)鐘源RCC 系統(tǒng)時(shí)鐘源選擇外部晶振時(shí)鐘源
設(shè)置時(shí)鐘設(shè)置倍頻為4,則定時(shí)器的時(shí)鐘源頻率為32M,這個(gè)數(shù)值需要用到計(jì)算定時(shí)器的定時(shí)周期
1.3 設(shè)置GPIO設(shè)置PB0和PB1為輸出模式
[/ol]
設(shè)置定時(shí)器
使能T2中斷
1選擇TIM2
2定時(shí)器時(shí)鐘選擇內(nèi)部時(shí)鐘
Clock Source(時(shí)鐘來源)
計(jì)數(shù)器設(shè)置:
Prtscaler (定時(shí)器預(yù)分頻系數(shù)) : 31999
Counter Mode(計(jì)數(shù)模式) : Up(向上計(jì)數(shù)模式)
Counter Period(自動(dòng)重裝載值) : 499
CKD(時(shí)鐘分頻因子) :No Division 不分頻 (可以選擇二分頻和四分頻 )
auto-reload-preload(自動(dòng)重裝載) : Enable 使能
定時(shí)器的定時(shí)周期
T = (psc+1)(arr+1)/Tclkpsc 為定時(shí)器預(yù)分頻系數(shù)
arr為自動(dòng)重裝載值
Tclk為系統(tǒng)時(shí)鐘頻率
通過計(jì)算
T = (psc+1)(arr+1)/Tclk=(31999+1)(499+1)/32us=500ms
項(xiàng)目文件設(shè)置1 設(shè)置項(xiàng)目名稱
2 選擇所用IDE
生成代碼為每個(gè)功能生成獨(dú)立的.c和.h文件
生成代碼
[/ol]
代碼部分解析找到main函數(shù),里面關(guān)于TIM2初始化的函數(shù) MX_TIM2_Init(),進(jìn)入初始化函數(shù),查看源碼
TIM_HandleTypeDef htim2;
/* TIM2 init function */
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 31999;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 499;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
[/ol]
從上面代碼可以看到,先定義了一個(gè)htim2的結(jié)構(gòu)體
然后是對(duì)結(jié)構(gòu)體的初始化,就是我們圖形化的配置
再找到stm32f1xx_it.c文件
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
/* USER CODE END TIM2_IRQn 1 */
}
[/ol]上面的代碼是如果TIM2中斷,則調(diào)用 HAL_TIM_IRQHandler(&htim2);
進(jìn)入HAL_TIM_IRQHandler(&htim2)函數(shù),這里面的代碼很長,就是不同的中斷類型,進(jìn)入不同的中斷回調(diào)函數(shù),這里找到 HAL_TIM_PeriodElapsedCallback(htim);
進(jìn)入這個(gè)回調(diào)函數(shù),我們看到是個(gè)虛函數(shù),需要我們重寫,在這個(gè)函數(shù)里面,就是我們需要實(shí)現(xiàn)的功能,但在這之前,需要在main函數(shù)里使能中斷 HAL_TIM_Base_Start_IT(&htim2)
main.c中的添加代碼如下:
總結(jié),對(duì)于定時(shí)器的定時(shí)中斷,相對(duì)比較簡單,絕大多數(shù)功能圖形化配置已經(jīng)為我們配置好了,我們做的只需兩步
在main函數(shù)中,開啟TIM2中斷,HAL_TIM_Base_Start_IT(&htim2);
重寫 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函數(shù),然后在里面實(shí)現(xiàn)我們需要的功能
[/ol] |