STM32定時(shí)器中斷設置方法
今天調試了STM32的定時(shí)器功能,STM32定時(shí)器比較多,但調試都是一樣的,寄存器都是一一對應的。就拿TIM2舉例說(shuō)明。在網(wǎng)上搜了好多關(guān)于定時(shí)器的設置,但大多數都是一個(gè)版本,而且都是針對庫函數操作的,讓人看起來(lái)一頭霧水,對于初學(xué)者很是不利(我也是初學(xué)者)。下面我將自己的定時(shí)器設置過(guò)程一一記錄下來(lái),以供大家參考,我們共同學(xué)習……
本文引用地址:http://dyxdggzs.com/article/201612/325041.htm首先定義定時(shí)器頭文件,也就是定義寄存器以供操作:
//*************************************************************************
//
// TIM2-Register
//
//*************************************************************************
#define TIM2_CR1 (*((volatile unsigned long *)0x40000000))
#define TIM2_CR2 (*((volatile unsigned long *)0x40000004))
#define TIM2_DIER (*((volatile unsigned long *)0x4000000C))
#define TIM2_SR (*((volatile unsigned long *)0x40000010))
#define TIM2_EGR (*((volatile unsigned long *)0x40000014))
#define TIM2_CNT (*((volatile unsigned long *)0x40000024))
#define TIM2_PSC (*((volatile unsigned long *)0x40000028))
#define TIM2_ARR (*((volatile unsigned long *)0x4000002C))
然后配置定時(shí)器TIM2:
void TIM2_Configuration(void)
{
RCC_APB1ENR|=0x00000001; //位0 IM2EN TIM2定時(shí)器時(shí)鐘使能
TIM2_PSC |=19999; //設置預分頻,實(shí)現1ms,20M ,20000/20M
TIM2_ARR = 1000; //1s產(chǎn)生一次中斷
TIM2_DIER |=0X1; //允許tim2更新中斷
SETENA0|=0x10000000; //允許T2中斷
TIM2_CR1 |=0X1;//啟動(dòng)tim2相當于//TIM_Cmd(TIM2, ENABLE); //是能定時(shí)器
}
注:RCC_APB1ENR,SETENA0前面的文章已經(jīng)定義過(guò)
中斷函數處理:
void TIM2_IRQHandler(void)
{
if(TIM1_SR&0x01)
{
TIM1_SR&=0xFFFE; //清中斷標志
USART1_DR=0xAA;
while((USART1_SR)&0x80==0);
}
解釋?zhuān)?S中斷來(lái)一次,向串口發(fā)送一字節數據0xAA;
接下來(lái)就在main()函數中添加配置定時(shí)器就可以了:
int main()
{
SystemInit0(); //系統(時(shí)鐘)初始化
stm32_GpioSetup (); //GPIO初始化
stm32_UsartSetup (); //串口初始化
TIM2_Configuration(); //TIM1初始化
while(1)
{
GPIO_PORTB_ODR|=(1<<5); //LED閃爍
delay(10); //延時(shí)
GPIO_PORTB_ODR&=~(1<<5);
delay(10);
}
}
當然以上TIM2的配置必須在系統(時(shí)鐘)初始化以后,因為這些外設的工作要有時(shí)鐘來(lái)源的,知道了時(shí)鐘來(lái)源,和頻率才能計算出定時(shí)的時(shí)間等參數,本程序是基于所有時(shí)鐘都設置成20M來(lái)執行的。前面的幾個(gè)初始化函數以及寄存器設置都是調用的前面文章中設置好的。
好了,查看串口(9600),調試成功,1S發(fā)送1個(gè)0xAA,這樣看起來(lái)是很簡(jiǎn)單,但調試的過(guò)程是艱難的,要一次次的實(shí)驗,一個(gè)寄存器一個(gè)寄存器的進(jìn)行配置,學(xué)習本來(lái)就是一個(gè)緩慢而且艱辛的過(guò)程,但是當你看到LED在閃爍,串口上收到數據時(shí),說(shuō)有的付出都是值得的,天道酬勤,一切困難都是紙老虎!
評論