日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]1. STM32的Timer簡介STM32中一共有11個定時器,其中2個高級控制定時器(TIM1、TIM8),4個普通定時器(TIM2-TIM5)和2個基本定時器(TIM6-TIM7),以及2個看門狗定時器和1個系統(tǒng)嘀嗒定時器(SysTick)。其中TIM1和TIM8

1. STM32的Timer簡介

STM32中一共有11個定時器,其中2個高級控制定時器(TIM1、TIM8),4個普通定時器(TIM2-TIM5)和2個基本定時器(TIM6-TIM7),以及2個看門狗定時器和1個系統(tǒng)嘀嗒定時器(SysTick)。



數(shù)字濾波器(ETR,TIx)是為了將ETR進來的分頻后的信號濾波,保證通過信號頻率不超過某個限定。

步驟(7)中需要禁止使用預(yù)裝載緩沖器。當(dāng)預(yù)裝載緩沖器被禁止時,寫入自動裝入的值(TIMx_ARR)的數(shù)值會直接傳送到對應(yīng)的影子寄存器;如果使能預(yù)加載寄存器,則寫入ARR的數(shù)值會在更新事件時,才會從預(yù)加載寄存器傳送到對應(yīng)的影子寄存器。

ARM中,有的邏輯寄存器在物理上對應(yīng)2個寄存器,一個是程序員可以寫入或讀出的寄存器,稱為preload register(預(yù)裝載寄存器),另一個是程序員看不見的、但在操作中真正起作用的寄存器,稱為shadow register(影子寄存器);設(shè)計preload register和shadow register的好處是,所有真正需要起作用的寄存器(shadow register)可以在同一個時間(發(fā)生更新事件時)被更新為所對應(yīng)的preload register的內(nèi)容,這樣可以保證多個通道的操作能夠準(zhǔn)確地同步。如果沒有shadow register,或者preload register和shadow register是直通的,即軟件更新preload register時,同時更新了shadow register,因為軟件不可能在一個相同的時刻同時更新多個寄存器,結(jié)果造成多個通道的時序不能同步,如果再加上其它因素(例如中斷),多個通道的時序關(guān)系有可能是不可預(yù)知的。

3.程序源代碼

本例實現(xiàn)的是通過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()

{

//定義錯誤狀態(tài)變量

ErrorStatus HSEStartUpStatus;

//將RCC寄存器重新設(shè)置為默認值

RCC_DeInit();

//打開外部高速時鐘晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速時鐘晶振工作

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

//設(shè)置AHB時鐘(HCLK)為系統(tǒng)時鐘

RCC_HCLKConfig(RCC_SYSCLK_Div1);

//設(shè)置高速AHB時鐘(APB2)為HCLK時鐘

RCC_PCLK2Config(RCC_HCLK_Div1);

//設(shè)置低速AHB時鐘(APB1)為HCLK的2分頻

RCC_PCLK1Config(RCC_HCLK_Div2);

//設(shè)置FLASH代碼延時

FLASH_SetLatency(FLASH_Latency_2);

//使能預(yù)取指緩存

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//設(shè)置PLL時鐘,為HSE的9倍頻 8MHz * 9 = 72MHz

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

//使能PLL

RCC_PLLCmd(ENABLE);

//等待PLL準(zhǔn)備就緒

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

//設(shè)置PLL為系統(tǒng)時鐘源

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//判斷PLL是否是系統(tǒng)時鐘

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設(shè)置為缺省值

TIM_DeInit(TIM2);

//采用內(nèi)部時鐘給TIM2提供時鐘源

TIM_InternalClockConfig(TIM2);

//預(yù)分頻系數(shù)為36000-1,這樣計數(shù)器時鐘為72MHz/36000 = 2kHz

TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;

//設(shè)置時鐘分割

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

//設(shè)置計數(shù)器模式為向上計數(shù)模式

TIM_TimeBaseS

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉