今日理解一下STM32F103 C8T6的時鐘與時鐘系統(tǒng)、滴答計時器、定時器計時中斷的配置,文章提供原理,代碼,測試工程下載。
目錄
時鐘樹與時鐘系統(tǒng):
滴答計時器:
定時器計時中斷:
測試結果:
測試工程下載:
時鐘樹與時鐘系統(tǒng):
該系統(tǒng)介紹在 STM32F10x-中文參考手冊 P56頁開始
微控制器的時鐘系統(tǒng)包括以下幾個主要的時鐘源:
1. HSE(High-Speed External): 外部高速晶振,可接入外部晶振作為系統(tǒng)時鐘源。
2. HSI(High-Speed Internal):?? 內部高速振蕩器,提供內部時鐘源。
3. PLL(Phase Locked Loop):?? 鎖相環(huán),可以通過將外部時鐘源或內部時鐘源倍頻得到更高的系統(tǒng)時鐘頻率。
時鐘系統(tǒng)的配置和選擇可以通過對系統(tǒng)寄存器 RCC(Reset and Clock Control)的相應位進行配置。根據配置的不同,時鐘系統(tǒng)可分為以下幾個模式:
1. HSI模式:使用HSI作為系統(tǒng)時鐘源。
2. HSE模式:使用HSE作為系統(tǒng)時鐘源。
3. PLL模式:通過PLL倍頻方式產生高頻時鐘。
1、單片機內部的RC振蕩器是8Mhz
2、通過單片機引腳(OSC_IN OSC_OUT)接外部的晶振,這里就對外部的晶振有要求了,要求外部晶振輸入頻率范圍是4Mhz~32Mhz
3、是通過單片機引腳接外部的低速32.768Khz晶振,這個是單獨的給內部的實時時鐘模塊(RTC)使用
4、是內部的低速RC振蕩器40K,可以給RTC用,也可以給IWDG看門狗模塊用
5、是時鐘信號從MCO這個引腳上輸出,這個輸出可以作為測試,看看內部的時鐘配置是否正確,也可以用作和其他硬件進行時鐘同步用如上5種不同類型的時鐘,供給不同的需求,內置的RC振蕩器受到溫度影響會大一些;
這幾個外部時鐘晶振接口,根據需求使用;也可選擇不用,空著,或者接其他電路也可以;
時鐘信號進來,還要操作一些相關寄存器 分頻/倍頻后,才成為"系統(tǒng)時鐘SYSCLK"、HSI時鐘、HSE時鐘等等之類的,應用于單片機各個模塊(比如定時器、ADC、USART、APB perpherials、I2C… )
滴答計時器:
#include "SysTick.h"
static u8 fac_us=0; //us延時倍乘數
static u16 fac_ms=0; //ms延時倍乘數
//初始化延遲函數
//SYSTICK的時鐘固定為AHB時鐘的1/8
//SYSCLK:系統(tǒng)時鐘頻率
void SysTick_Init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
//延時nus
//nus為要延時的us數.
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //時間加載
SysTick->VAL=0x00; //清空計數器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //開始倒數
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關閉計數器
SysTick->VAL =0X00; //清空計數器
}
//延時nms
//注意nms的范圍
//SysTick->LOAD為24位寄存器,所以,最大延時為:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK單位為Hz,nms單位為ms
//對72M條件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //時間加載(SysTick->LOAD為24bit)
SysTick->VAL =0x00; //清空計數器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //開始倒數
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待時間到達
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //關閉計數器
SysTick->VAL =0X00; //清空計數器
}
定時器計時中斷:
查表可知,TIM2/3/4是適合作通用定時器的:
?此處我以初始化定時器4為通用定時器舉例:
計數器溢出頻率:???
CK CNT_OV= CK CNT?? /??? (ARR+1)
???????????????????? =? CK PSC? /??? (PSC +1)? /? (ARR +1)?
這里的計數器溢出頻率單位是赫茲,計數器溢出頻率的倒數就是定時器觸發(fā)的時間周期,一般我們計算用的是下面一個等于號的式子,這里的符號表示如下:
CK_PSC 一般為72Mhz(72 000 000)
ARR 自動重裝 對應變量TIM_Period 范圍0~65535
PSC 分頻? 對應變量 TIM_Prescaler 范圍0~65535
1. 定時器時鐘分頻(TIMx_PSC)
是用來將系統(tǒng)時鐘(通常為主頻)分頻為定時器的時鐘頻率。例如,如果系統(tǒng)時鐘為72MHz,定時器時鐘分頻設置為72-1,則定時器時鐘頻率為1MHz。定時器時鐘分頻越大,定時器的時鐘頻率越低。
2. 預分頻(TIMx_ARR)
是用來設置定時器溢出時間(自動重裝載寄存器值)的參數。當定時器計數器達到預分頻值時,定時器將溢出,并產生中斷或其他相關事件。預分頻的值決定了定時器溢出時間的長度。例如,如果預分頻值為1000,定時器時鐘頻率為1MHz,則定時器溢出時間為1ms。
以下為初始化定時器? 2? 作定時中斷,周期為1ms :
每次進入定時中斷都會通過串口1 打印一次進入中斷的總次數T:
#include "TIMER_init.h"
//初始化定時器2用作計時中斷定時器:
void Timer2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InternalClockConfig(TIM2);//選擇哪個中斷就寫哪個
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //修改分頻,對實際情況影響不大,可以不修改,這里是不分頻(可選1~72)
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上對齊模式,同時還有向下對齊,中央對齊模式
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1; //計數器周期。該參數決定了計數器計數溢出前的最大值。
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1; //分頻器預分頻系數。該參數決定了計數器時鐘頻率的變化程度。
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //高級計數器需要,不需要用到的直接給0就好
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //用于解決一復位時就先進一次中斷的情況
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //搶占優(yōu)先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //響應優(yōu)先級
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE);
}
定時中斷服務函數:文章來源:http://www.zghlxwxcb.cn/news/detail-640255.html
#include "TIMER_init.h"
uint16_t T;
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
printf("T=%d",T);
T++;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中斷寄存器標志位,用于退出中斷
}
}
測試結果:
文章來源地址http://www.zghlxwxcb.cn/news/detail-640255.html
測試工程下載:https://download.csdn.net/download/qq_64257614/88202750?spm=1001.2014.3001.5503
到了這里,關于STM32 F103C8T6學習筆記4:時鐘樹、滴答計時器、定時器定時中斷的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!