色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM學(xué)習(xí)《八》——STM32定時(shí)器配置及其中斷設(shè)置!

          ARM學(xué)習(xí)《八》——STM32定時(shí)器配置及其中斷設(shè)置!

          作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
          好久沒(méi)有寫(xiě)東西了,工作太忙都快沒(méi)時(shí)間學(xué)習(xí)了。今天調(diào)試了STM32的定時(shí)器功能,STM32定時(shí)器比較多,但調(diào)試都是一樣的,寄存器都是一一對(duì)應(yīng)的。就拿TIM2舉例說(shuō)明。在網(wǎng)上搜了好多關(guān)于定時(shí)器的設(shè)置,但大多數(shù)都是一個(gè)版本,而且都是針對(duì)庫(kù)函數(shù)操作的,讓人看起來(lái)一頭霧水,對(duì)于初學(xué)者很是不利(我也是初學(xué)者)。下面我將自己的定時(shí)器設(shè)置過(guò)程一一記錄下來(lái),以供大家參考,我們共同學(xué)習(xí)……

          首先定義定時(shí)器頭文件,也就是定義寄存器以供操作:

          本文引用地址:http://cafeforensic.com/article/201611/318954.htm

          //*************************************************************************

          //

          // 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è)置預(yù)分頻,實(shí)現(xiàn)1ms,20M ,20000/20M

          TIM2_ARR = 1000;//1s產(chǎn)生一次中斷

          TIM2_DIER |=0X1;//允許tim2更新中斷

          SETENA0|=0x10000000;//允許T2中斷

          TIM2_CR1 |=0X1;//啟動(dòng)tim2相當(dāng)于//TIM_Cmd(TIM2, ENABLE); //是能定時(shí)器

          }

          注:RCC_APB1ENR,SETENA0前面的文章已經(jīng)定義過(guò)

          中斷函數(shù)處理:

          void TIM2_IRQHandler(void)

          {

          if(TIM1_SR&0x01)

          {

          TIM1_SR&=0xFFFE;//清中斷標(biāo)志

          USART1_DR=0xAA;

          while((USART1_SR)&0x80==0);

          }

          解釋:1S中斷來(lái)一次,向串口發(fā)送一字節(jié)數(shù)據(jù)0xAA;

          接下來(lái)就在main()函數(shù)中添加配置定時(shí)器就可以了:

          int main()

          {

          SystemInit0();//系統(tǒng)(時(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);

          }

          }

          當(dāng)然以上TIM2的配置必須在系統(tǒng)(時(shí)鐘)初始化以后,因?yàn)檫@些外設(shè)的工作要有時(shí)鐘來(lái)源的,知道了時(shí)鐘來(lái)源,和頻率才能計(jì)算出定時(shí)的時(shí)間等參數(shù),本程序是基于所有時(shí)鐘都設(shè)置成20M來(lái)執(zhí)行的。前面的幾個(gè)初始化函數(shù)以及寄存器設(shè)置都是調(diào)用的前面文章中設(shè)置好的。

          好了,查看串口(9600),調(diào)試成功,1S發(fā)送1個(gè)0xAA,這樣看起來(lái)是很簡(jiǎn)單,但調(diào)試的過(guò)程是艱難的,要一次次的實(shí)驗(yàn),一個(gè)寄存器一個(gè)寄存器的進(jìn)行配置,學(xué)習(xí)本來(lái)就是一個(gè)緩慢而且艱辛的過(guò)程,但是當(dāng)你看到LED在閃爍,串口上收到數(shù)據(jù)時(shí),說(shuō)有的付出都是值得的,天道酬勤,一切困難都是紙老虎!




          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉