前言
本章介紹使用STM32CubeMX對(duì)基本定時(shí)器進(jìn)行配置的方法,STM32F103高性能系列設(shè)備包括基本定時(shí)器、高級(jí)控制定時(shí)器、通用定時(shí)器、看門狗定時(shí)器和 SysTick 定時(shí)器,但是STM32F103C6t6上資源比較有限(高級(jí)定時(shí)器TIM1,通用定時(shí)器TIM2和TIM3),沒有真正的基本定時(shí)器,其實(shí)通用定時(shí)器和高級(jí)定時(shí)的功能是包含基本定時(shí)器的,因此如果沒有使用到通用定時(shí)和高級(jí)定時(shí)的附加功能,也就是基本定時(shí)器了。本章介紹基本定時(shí)器,其他的定時(shí)器由后續(xù)章節(jié)一一介紹,最后通過示波器和打印結(jié)果來展現(xiàn)實(shí)現(xiàn)結(jié)果,如果有LED燈也可以,通過定時(shí)器來控制LED燈閃爍來觀察現(xiàn)象。
一、定時(shí)器的介紹
定時(shí)器就像單片機(jī)的鬧鐘一樣,定時(shí)器的核心就是計(jì)算器, 要實(shí)現(xiàn)計(jì)數(shù)功能,首先要給它一個(gè)時(shí)鐘源,定時(shí)器根據(jù)時(shí)鐘的輸出信號(hào),每隔“一秒"(一個(gè)單位時(shí)間),計(jì)數(shù)單元的數(shù)值就增加一,當(dāng)計(jì)數(shù)單元數(shù)值增加到“設(shè)定的鬧鐘提醒時(shí)間"時(shí),計(jì)數(shù)單元就會(huì)向中斷系統(tǒng)發(fā)出中斷申請(qǐng),產(chǎn)生"響鈴提醒",使程序跳轉(zhuǎn)到中斷服務(wù)函數(shù)中執(zhí)行。
下面是三種定時(shí)的比較:
我們這里給出基本定時(shí)器的框圖,基本定時(shí)器比較簡單,也是通用定時(shí)器和高級(jí)定時(shí)器的基礎(chǔ),分析基本定時(shí)器,可以很好的分解通用定時(shí)器和高級(jí)定時(shí)器。
從上圖我們可以看到基本定時(shí)器主要由下面四個(gè)部分組成:
**時(shí)鐘源:**定時(shí)器時(shí)鐘 TIMxCLK,即內(nèi)部時(shí)鐘 CK_INT所以定時(shí)器時(shí)鐘,通過下圖可以看到不同定時(shí)器所在的總線,從而確定他們的時(shí)鐘源,STM32F103C6T6的高級(jí)定時(shí)器TIM1定時(shí)掛在APB2上,通用定時(shí)器TIM2。
**預(yù)分頻器(TIMx_PSC):**定時(shí)器時(shí)鐘經(jīng)過 PSC 預(yù)分頻器之后,即計(jì)數(shù)器時(shí)鐘 CK_CNT,用來驅(qū)動(dòng)計(jì)數(shù)器計(jì)數(shù)。 PSC 是一
個(gè)16 位的預(yù)分頻器,可以對(duì)定時(shí)器時(shí)鐘 TIMxCLK 進(jìn)行 1~65536 之間的任何一個(gè)數(shù)進(jìn)行分頻。具體計(jì)算方式為: CK_CNT=TIMxCLK/(PSC+1)。
下圖為預(yù)分頻系數(shù)從1變到2的計(jì)數(shù)器時(shí)序圖:圖中CK_PSC是脈沖信號(hào),預(yù)分頻系數(shù)為2,所以最下面的預(yù)分頻計(jì)數(shù)器計(jì)數(shù)0,1,中間的計(jì)數(shù)器寄存器記一次數(shù)。
**計(jì)數(shù)器(TIMx_CNT):**計(jì)數(shù)器 CNT 是一個(gè) 16 位的計(jì)數(shù)器,只能往上計(jì)數(shù),最大計(jì)數(shù)值為 65535。當(dāng)計(jì)數(shù)達(dá)到自動(dòng)重裝載寄存器的時(shí)候產(chǎn)生更新事件,并清零從頭開始計(jì)數(shù)。
**自動(dòng)重裝載寄存器(TIMx_ARR):**自動(dòng)重裝載寄存器 ARR 是一個(gè) 16 位的寄存器,這里面裝著計(jì)數(shù)器能計(jì)數(shù)的最大數(shù)
值。當(dāng)計(jì)數(shù)到這個(gè)值的時(shí)候,如果使能了中斷的話,定時(shí)器就產(chǎn)生溢出中斷。
下圖為分頻系數(shù)為1,自動(dòng)重裝載寄存器(TIMx_ARR)為36的計(jì)數(shù)器時(shí)序圖。當(dāng)計(jì)數(shù)器滿36則進(jìn)行重裝,同時(shí)觸發(fā)更新事件,更新中斷標(biāo)志等動(dòng)作。
定時(shí)器有如下三種計(jì)數(shù)模式
**遞增計(jì)數(shù)模式:**計(jì)數(shù)器從 0 計(jì)數(shù)到自動(dòng)重載值,然后重新從 0 開始計(jì)數(shù)并生成計(jì)數(shù)器上溢事件。
**遞減計(jì)數(shù)模式:**計(jì)數(shù)器從自動(dòng)重載值開始遞減到 0,然后重新從自動(dòng)重載值開始計(jì)數(shù)并生成計(jì)數(shù)器下溢事件。
**中心對(duì)齊模式:**計(jì)數(shù)器從 0 開始計(jì)數(shù)到自動(dòng)重載值 – 1 ,生成計(jì)數(shù)器上溢事件;然后從自動(dòng)重載值開始向下計(jì)數(shù)到 1 并生成計(jì)數(shù)器下溢事件。之后從0 開始重新計(jì)數(shù)。
有了以上的基礎(chǔ)知識(shí),下面我們通過實(shí)驗(yàn)來驗(yàn)證一下
二、實(shí)驗(yàn)過程
1.實(shí)驗(yàn)材料
- STM32F103C6T6最小系統(tǒng)開發(fā)板
- ST-LINK V2
- 杜邦線
- 示波器
2.STM32CubeMX配置基本定時(shí)器
選擇芯片stm32f103c6t6,新建工程
設(shè)置時(shí)鐘源,最小系統(tǒng)外部晶振8Mhz,作為外部高速HSE時(shí)鐘源。由于沒有外接外部低速晶振,這里低速時(shí)鐘源選擇旁路時(shí)鐘源。
配置時(shí)鐘樹,這里使用官方推薦的配置
配置引腳功能,先配置一個(gè)GPIO,過會(huì)使用定時(shí)器控制其輸出高低電平,方便用示波器測(cè)試,我們使用通用定時(shí)器TIM2,已知TIM2掛在APB1上。
內(nèi)部時(shí)鐘設(shè)置為不分頻(CKD),則CK_PSC的時(shí)鐘頻率等于APB1的時(shí)鐘頻率72MHz,即72000 000Hz。若要定時(shí)時(shí)間為1s,則即可設(shè)置7200分頻(預(yù)分頻器寄存器 (TIMx_PSC)的值為7200-1),定時(shí)器的時(shí)鐘CK_CNT的頻率為10000Hz.則自動(dòng)重載寄存器 (TIMx_ARR)設(shè)置為10000-1即定時(shí)為1s.TRGO為觸發(fā)輸出,可以觸發(fā)內(nèi)部ADC/DAC,這里我們沒有用到這個(gè)功能,參數(shù)為默認(rèn)設(shè)置。
T = (psc+1)(arr+1)/Tclk=(7200)(1000)/72us=1000ms = 1s
在NVIC Settings框勾選開啟定時(shí)器中斷。優(yōu)先級(jí)為默認(rèn)?;蛘咴贜VIC配置中使能TIM2中斷。
Code Generator中設(shè)置只拷貝使用到的庫,分離.c和.h文件
設(shè)置好項(xiàng)目名稱和路徑,點(diǎn)擊GENERATE CODE即可,生成后使用keil5 IDE打開。
2.代碼實(shí)現(xiàn)
在usart.c文件后面添加如下代碼,代碼中添加了#ifdef宏定義進(jìn)行條件編譯,如果使用GUNC編譯,則PUTCHAR_PROTOTYPE 定義為int __io_putchar(int ch)函數(shù),否則定義為int fputc(int ch, FILE *f)函數(shù)。
/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
實(shí)現(xiàn)一個(gè)LED等間隔1s閃爍一次的功能,代碼如下
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); //PA0
printf("TIM2 \r\n");
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
3.編譯燒錄
代碼編譯成功
在下載前檢查keil是否檢測(cè)到ST-LINK,選擇魔法棒進(jìn)行設(shè)置
如圖所示,已經(jīng)檢測(cè)到ST-LINK 下載器
點(diǎn)擊load,自動(dòng)下載固件
4.硬件連接
燒錄器ST-LINK V2和最小系統(tǒng)板的連接如圖所示: 四線連接 SWDIO,GND,SWCLK,和3.3V電源
5.實(shí)驗(yàn)結(jié)果
使用串口打印和示波器兩種方式測(cè)試,打印可以看到周期輸出,示波器可以精準(zhǔn)的讀到輸出頻率和時(shí)間間隔。
文章來源:http://www.zghlxwxcb.cn/news/detail-575093.html
總結(jié)
本章介紹了STM32F103系列設(shè)備中基本定時(shí)器的用法,其實(shí)前面交到的PWM也是定時(shí)器的典型應(yīng)用,接下來在介紹其他的定時(shí)用法。文章來源地址http://www.zghlxwxcb.cn/news/detail-575093.html
到了這里,關(guān)于STM32開發(fā)(10)----CubeMX配置基本定時(shí)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!