<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 重返STM32之---STM32定時(shí)器的誤解

          重返STM32之---STM32定時(shí)器的誤解

          作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
          說是接觸STM32都快3年了,說來也慚愧,很多東西都還沒搞明白;應(yīng)該也是因?yàn)橛⑽乃接写岬降脑?,不能正確的理解英文的含義,畢竟我們的語言思維是不一樣的(找個(gè)借口吧哈哈)。

          最近在用STM32的定時(shí)器,以前都是匆匆走過,由于自己想標(biāo)準(zhǔn)化自己的編程代碼,所以這次很用心的用通用定時(shí)器寫通用的延時(shí)函數(shù),網(wǎng)上很多都是用的系統(tǒng)滴答時(shí)鐘(SysTlck)來做的,但是想著自己要向操作系統(tǒng)方向發(fā)展,就不能用這個(gè)定時(shí)器了。

          本文引用地址:http://www.ex-cimer.com/article/201611/316594.htm

          平時(shí)因?yàn)橛玫氖堑未饡r(shí)鐘來做的延時(shí)函數(shù),就沒怎么去深究;這次用通用定時(shí)來做的時(shí)候,發(fā)現(xiàn)問題一大把。首先就是定時(shí)器的時(shí)鐘分頻,第二個(gè)就是如何不用中斷來實(shí)現(xiàn)定時(shí)。因?yàn)樽约河X得對(duì)STM32很了解,所以就范范的寫了代碼,覺得自己肯定沒問題;編譯下載。What f**k?!居然定時(shí)不對(duì),和我以前理解的定時(shí)器不一樣?還是我的代碼有問題?花了大半天去看每個(gè)寄存器;(其實(shí)我最開始用的就是直接操作寄存器,后來才用的庫(kù)函數(shù))覺得沒問題呀;后來想要不在把每個(gè)寄存的意思在認(rèn)真理解一遍;不看不知道,一看下一跳呀。哎,多的廢話就不說了,直接看圖吧。

          第一個(gè)就是我們認(rèn)為是控制時(shí)鐘分頻的寄存器,以前大家都是設(shè)置為00,但是當(dāng)把它設(shè)置為其他值時(shí),發(fā)現(xiàn)定時(shí)沒有變化;其實(shí)是被名稱誤導(dǎo)了,仔細(xì)看后邊的說明,這個(gè)時(shí)鐘只是用于數(shù)字濾波器?。?!更本沒有改變定時(shí)器的時(shí)鐘。它只影響ETR和TIX。

          第二個(gè)就是對(duì)于定時(shí)器時(shí)鐘和APB1時(shí)鐘是一致的誤解。

          其實(shí)定時(shí)器的時(shí)鐘和系統(tǒng)時(shí)鐘是一致的。所以更本不是APB1的時(shí)鐘。

          其實(shí)現(xiàn)在才發(fā)現(xiàn)自己以前有多么的不仔細(xì),經(jīng)過此事以后發(fā)現(xiàn)在技術(shù)方面對(duì)自己要求太低了,什么都是了解一個(gè)大概;要用的時(shí)候才發(fā)現(xiàn)自己千瘡百孔。

          這也算是提醒自己,也提醒正在嵌入式系統(tǒng)開發(fā)道路上的仁兄們,萬事要認(rèn)真呀?。。?/p>

          貼一段我自己寫通用定時(shí)器代碼吧。

          void delay_init()

          {

          TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

          TIM_TimeBaseStructure.TIM_Prescaler = 72-1;// 預(yù)分頻 72000000/72=1000000

          TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV2;//采樣時(shí)鐘分頻.不是定時(shí)器時(shí)鐘分頻。

          TIM_TimeBaseStructure.TIM_Period = 1;//重裝值

          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;

          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

          TIM_ARRPreloadConfig(TIM3, ENABLE);

          TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);

          TIM_Cmd(TIM3, DISABLE);

          }

          void delay_ms(uint16_t nms)

          {

          uint16_t count;

          count = nms*10;

          TIM3->PSC = 7200-1;

          TIM_GenerateEvent(TIM3,TIM_EventSource_Update);

          TIM_SetCounter(TIM3,count);

          TIM_Cmd(TIM3,ENABLE);

          while(count>1)

          {

          count = TIM3->CNT;

          }

          TIM_Cmd(TIM3,DISABLE);

          }

          void delay_us(uint16_t nus)

          {

          uint16_t count;

          count = nus;

          TIM3->PSC = 72-1;

          TIM_GenerateEvent(TIM3,TIM_EventSource_Update);

          TIM_SetCounter(TIM3,count);

          TIM_Cmd(TIM3,ENABLE);

          while(count>1)

          {

          count = TIM3->CNT;

          }

          TIM_Cmd(TIM3,DISABLE);

          }




          關(guān)鍵詞: STM32定時(shí)

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();