1.STM32的Timer簡介
STM32中一共有11個定時器,其中2個高級控制定時器,4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。其中系統嘀嗒定時器是前文中所描述的SysTick,看門狗定時器以后再詳細研究。今天主要是研究剩下的8個定時器。
定時器 | 計數器分辨率 | 計數器類型 | 預分頻系數 | 產生DMA請求 | 捕獲/比較通道 | 互補輸出 |
TIM1 TIM8 | 16位 | 向上,向下,向上/向下 | 1-65536之間的任意數 | 可以 | 4 | 有 |
TIM2 TIM3 TIM4 TIM5 | 16位 | 向上,向下,向上/向下 | 1-65536之間的任意數 | 可以 | 4 | 沒有 |
TIM6 TIM7 | 16位 | 向上 | 1-65536之間的任意數 | 可以 | 0 | 沒有 |
其中TIM1和TIM8是能夠產生3對PWM互補輸出的高級登時其,常用于三相電機的驅動,時鐘由APB2的輸出產生。TIM2-TIM5是普通定時器,TIM6和TIM7是基本定時器,其時鐘由APB1輸出產生。由于STM32的TIMER功能太復雜了,所以只能一點一點的學習。因此今天就從最簡單的開始學習起,也就是TIM2-TIM5普通定時器的定時功能。
2.普通定時器TIM2-TIM5
2.1時鐘來源
計數器時鐘可以由下列時鐘源提供:
·內部時鐘(CK_INT)
·外部時鐘模式1:外部輸入腳(TIx)
·外部時鐘模式2:外部觸發輸入(ETR)
·內部觸發輸入(ITRx):使用一個定時器作為另一個定時器的預分頻器,如可以配置一個定時器Timer1而作為另一個定時器Timer2的預分頻器。
由于今天的學習是最基本的定時功能,所以采用內部時鐘。TIM2-TIM5的時鐘不是直接來自于APB1,而是來自于輸入為APB1的一個倍頻器。這個倍頻器的作用是:當APB1的預分頻系數為1時,這個倍頻器不起作用,定時器的時鐘頻率等于APB1的頻率;當APB1的預分頻系數為其他數值時(即預分頻系數為2、4、8或16),這個倍頻器起作用,定時器的時鐘頻率等于APB1的頻率的2倍。APB1的分頻在STM32_SYSTICK的學習筆記中有詳細描述。通過倍頻器給定時器時鐘的好處是:APB1不但要給TIM2-TIM5提供時鐘,還要為其他的外設提供時鐘;設置這個倍頻器可以保證在其他外設使用較低時鐘頻率時,TIM2-TIM5仍然可以得到較高的時鐘頻率。
2.2 計數器模式
TIM2-TIM5可以由向上計數、向下計數、向上向下雙向計數。向上計數模式中,計數器從0計數到自動加載值(TIMx_ARR計數器內容),然后重新從0開始計數并且產生一個計數器溢出事件。在向下模式中,計數器從自動裝入的值(TIMx_ARR)開始向下計數到0,然后從自動裝入的值重新開始,并產生一個計數器向下溢出事件。而中央對齊模式(向上/向下計數)是計數器從0開始計數到自動裝入的值-1,產生一個計數器溢出事件,然后向下計數到1并且產生一個計數器溢出事件;然后再從0開始重新計數。
1..自動裝載寄存器部分實際上包含兩個寄存器:
自動裝載寄存器緩沖寄存器 和 自動裝載寄存器影子寄存器
其中自動裝載寄存器緩沖寄存器可以有ARPE位控制是否起作用:
ARPE = 0 寫"自動裝載寄存器"時,數據直接寫入到"自動裝載寄存器緩沖寄存器"的同時,立即更新到"自動裝載寄存器影子寄存器"
ARPE = 1 寫"自動裝載寄存器"時,數據直接寫入到"自動裝載寄存器緩沖寄存器"的同時,只有更新事件發生的時候,才更新到"自動裝載寄存器影子寄存器"
2.預分頻器控制寄存器也分為兩部分:
預分頻器緩沖寄存器 和 預分頻器影子寄存器
當更新事件發生的時候,"預分頻器緩沖寄存器"的內容更新到"預分頻器影子寄存器中"
3.UDIS位作用:
UDIS = 1 禁止更新事件發生,但是計數器上下益處使,計數器和預分頻計數器歸0不受影響
UDIS = 0 允許更新事件發生
4.URS位作用:
URS = 1 只有計數器上下溢出才產生更新事件,從而產生中斷和DMA請求
URS = 0 計數器上下溢出,軟件設置UG位以及從模式控制器產生的更新 都會產生更新事件,從而產生中斷和DMA請求
編程步驟
1. 配置優先級;
2. 使能時鐘
3. 配置GPIO;
4. 配置TIME;
5.使能計數器;
6.開中斷;
7.清除標志位;
具體配置如下:
(1) NVIC_Configuration(void);配置優先級
(2) void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)使能時鐘
(3) void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);配置GPIO
(4) TIM_Configuration (void);配置TIM6/TIM7
(5) TIM_Cmd(TIM7, ENABLE);使能定時器
(6) TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);使能中斷
(7) TIM_ClearFlag(TIM7, TIM_FLAG_Update);清除標志位
步驟(4)中的預分頻系數用來確定TIMx所使用的時鐘頻率,具體計算方法為:CK_INT/(TIM_Perscaler+1)。CK_INT是內部時鐘源的頻率,是根據2.1中所描述的APB1的倍頻器送出的時鐘,TIM_Perscaler是用戶設定的預分頻系數,其值范圍是從0 – 65535。
步驟(4)中的時鐘分割定義的是在定時器時鐘頻率(CK_INT)與數字濾波器(ETR,TIx)使用的采樣頻率之間的分頻比例。TIM_ClockDivision的參數如下表:
TIM_ClockDivision 描述 二進制值
TIM_CKD_DIV1 tDTS = Tck_tim 0x00
TIM_CKD_DIV2 tDTS = 2 * Tck_tim 0x01
TIM_CKD_DIV4 tDTS = 4 * Tck_tim 0x10
步驟(4)中需要禁止使用預裝載緩沖器。當預裝載緩沖器被禁止時,寫入自動裝入的值(TIMx_ARR)的數值會直接傳送到對應的影子寄存器;如果使能預加載寄存器,則寫入ARR的數值會在更新事件時,才會從預加載寄存器傳送到對應的影子寄存器。
ARM中,有的邏輯寄存器在物理上對應2個寄存器,一個是程序員可以寫入或讀出的寄存器,稱為preload register(預裝載寄存器),另一個是程序員看不見的、但在操作中真正起作用的寄存器,稱為shadow register(影子寄存器);設計preload register和shadow register的好處是,所有真正需要起作用的寄存器(shadow register)可以在同一個時間(發生更新事件時)被更新為所對應的preload register的內容,這樣可以保證多個通道的操作能夠準確地同步。如果沒有shadow register,或者preload register和shadow register是直通的,即軟件更新preload register時,同時更新了shadow register,因為軟件不可能在一個相同的時刻同時更新多個寄存器,結果造成多個通道的時序不能同步,如果再加上其它因素(例如中斷),多個通道的時序關系有可能是不可預知的。
3. 程序源代碼
本例實現的是通過TIM2的定時功能,使得LED燈按照1s的時間間隔來閃爍
#include "stm32f10x_lib.h"
void RCC_cfg();
void TIMER_cfg();
void NVIC_cfg();
void GPIO_cfg();
int main()
{
RCC_cfg();
NVIC_cfg();
GPIO_cfg();
TIMER_cfg();
//開啟定時器2
TIM_Cmd(TIM2,ENABLE);
while(1);
}
void RCC_cfg()
{
//定義錯誤狀態變量
ErrorStatus HSEStartUpStatus;
//將RCC寄存器重新設置為默認值
RCC_DeInit();
//打開外部高速時鐘晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速時鐘晶振工作
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
//設置AHB時鐘(HCLK)為系統時鐘
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//設置高速AHB時鐘(APB2)為HCLK時鐘
RCC_PCLK2Config(RCC_HCLK_Div1);
//設置低速AHB時鐘(APB1)為HCLK的2分頻
RCC_PCLK1Config(RCC_HCLK_Div2);
//設置FLASH代碼延時
FLASH_SetLatency(FLASH_Latency_2);
//使能預取指緩存
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//設置PLL時鐘,為HSE的9倍頻 8MHz * 9 = 72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//使能PLL
RCC_PLLCmd(ENABLE);
//等待PLL準備就緒
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//設置PLL為系統時鐘源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//判斷PLL是否是系統時鐘
while(RCC_GetSYSCLKSource() != 0x08);
}
//允許TIM2的時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//允許GPIO的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
}
void TIMER_cfg()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//重新將Timer設置為缺省值
TIM_DeInit(TIM2);
//采用內部時鐘給TIM2提供時鐘源
TIM_InternalClockConfig(TIM2);
//預分頻系數為36000-1,這樣計數器時鐘為72MHz/36000 = 2kHz
TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;
//設置時鐘分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//設置計數器模式為向上計數模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//設置計數溢出大小,每計2000個數就產生一個更新事件
TIM_TimeBaseStructure.TIM_Period = 2000 - 1;
//將配置應用到TIM2中
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
//清除溢出中斷標志
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//禁止ARR預裝載緩沖器
TIM_ARRPreloadConfig(TIM2, DISABLE);
//開啟TIM2的中斷
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
}
void NVIC_cfg()
{
NVIC_InitTypeDef NVIC_InitStructure;
//選擇中斷分組1
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//選擇TIM2的中斷通道
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
//搶占式中斷優先級設置為0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//響應式中斷優先級設置為0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
上一篇:STM32--UART異步通信學習
下一篇:STM32單片機學習---PWM輸出
推薦閱讀
史海拾趣
Fastron公司深知產品質量對于企業的重要性。因此,公司建立了嚴格的質量控制體系,從原材料采購到產品生產、檢測等各個環節都實行嚴格的質量控制和管理。Fastron還引進了先進的檢測設備和技術手段,確保每一款產品都符合高標準的質量要求。這種對品質的執著追求使得Fastron的產品在市場上具有極高的競爭力。
Fastron公司深知產品質量對于企業的重要性。因此,公司建立了嚴格的質量控制體系,從原材料采購到產品生產、檢測等各個環節都實行嚴格的質量控制和管理。Fastron還引進了先進的檢測設備和技術手段,確保每一款產品都符合高標準的質量要求。這種對品質的執著追求使得Fastron的產品在市場上具有極高的競爭力。
隨著技術的不斷發展,Corex Intervest Inc公司意識到要想在競爭激烈的電子行業中脫穎而出,必須不斷進行技術創新和產品升級。因此,公司加大了研發投入,引進了一批高端人才,積極研發新型電子產品。經過多年的努力,公司成功開發出了一系列具有創新性和市場競爭力的產品,如智能傳感器、高性能電源模塊等,為公司的發展奠定了堅實的基礎。
君耀一直注重技術創新和產品研發。公司擁有一支強大的研發團隊,致力于開發新型的半導體器件,以滿足市場不斷變化的需求。同時,君耀還與全球知名的半導體公司合作,共同研究和開發未來的半導體技術。這些努力使得君耀在技術上始終保持領先地位,為公司的長期發展提供了有力保障。
在21世紀初,隨著電子行業的蓬勃發展,對于微型化、高性能電子元器件的需求日益增加。在這樣的時代背景下,CalRamic Technologies Llc公司應運而生。公司由幾位在電子行業有著豐富經驗的工程師創立,他們看到了陶瓷電容器等元器件的巨大市場潛力。初創時期,公司面臨著資金緊張和技術瓶頸等挑戰,但團隊憑借對市場的深刻理解和技術的不斷創新,逐漸在電子元器件市場上占據了一席之地。
為了進一步加速企業的發展,銀河微電決定走上上市之路。經過精心籌備和嚴格審核,公司終于在2021年成功在上交所上市。上市不僅為公司帶來了大量的資金支持,還提高了公司的知名度和品牌影響力。借助上市融資的優勢,銀河微電加大了對研發、生產、銷售等各個環節的投入,企業發展步入快車道。
功率變換技術是按用戶需求改變電能應用方式(改變電能的波形、頻率等)的技術;可以有AC/DC、DC/DC、DC/AC、AC/AC及其相互組合的多種變換。40年代前后,由電磁元件組合形成的各種功率變換過程基本上可實現清潔電源。例如,將交流電動機與直流發 ...… 查看全部問答∨ |
|
工信部首次明確3G牌照歸屬 年底或明年初發照 http://tech.163.com/08/1212/11/4SV7EQOV000915BE.html 工業和信息化部部長李毅中今日稱,根據綜合考慮,我們將通過一定的程序在年底或明年年初發放3G牌照 ...… 查看全部問答∨ |
|
我講外部RAM存儲數據,內部RAM放堆棧,程序很簡單,就是將外部ram復制,同時讀取,讀取后用串口發出來,我用JLINK調試,程序始終停在串口等待處,查看賦值也不對。我手動復位板子,不用JLINK帶,STM32能夠對外部RAM賦值,并且能夠從串口輸出來 ...… 查看全部問答∨ |