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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 關(guān)于stm32的定時(shí)器的運(yùn)用配置

          關(guān)于stm32的定時(shí)器的運(yùn)用配置

          作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏
          定時(shí)器stm32的一大利器,現(xiàn)在的項(xiàng)目中可以說(shuō)沒(méi)有一個(gè)不會(huì)用到定時(shí)器的,所以掌握理解運(yùn)用定時(shí)器才會(huì)做出好的產(chǎn)品來(lái)。
          本章內(nèi)容說(shuō)一說(shuō)關(guān)于stm32的定時(shí)器TIM_GetCounter(TIMx)的運(yùn)用。之前的項(xiàng)目中曾經(jīng)用這個(gè)來(lái)獲取高低電平的時(shí)長(zhǎng),在超聲波測(cè)距,紅外遙控解碼中運(yùn)用過(guò)。Stm32的定時(shí)器除了1和8其他都是通用定時(shí)器。如何用這句函數(shù)來(lái)捕捉電平時(shí)長(zhǎng)呢?首先看一下初始化內(nèi)容,以TIM4為例
          void Timer4_CFG()
          {

          TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
          NVIC_InitTypeDef NVIC_InitStructure;
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
          GPIO_InitTypeDef GPIO_InitStructure;


          RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO , ENABLE);

          GPIO_InitStructure.GPIO_Pin = IR_LED_PIN;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIO_Init(IR_LED_PORT, &GPIO_InitStructure);


          TIM_TimeBaseStructure.TIM_Prescaler = 3599; //TIM_CKD_DIV1
          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
          TIM_TimeBaseStructure.TIM_Period = 200;// ARR
          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
          //TIM_TimeBaseStructure.TIM_RepetitionCounter = 4;
          TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

          //TIM_PrescalerConfig(TIM4,3599,TIM_PSCReloadMode_Immediate);//72MHz/(3599+1)=20 000HZ 50uS
          TIM_ARRPreloadConfig(TIM4,DISABLE);

          TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
          TIM_ITConfig(TIM4,TIM_IT_Trigger,ENABLE);
          TIM_Cmd(TIM4, DISABLE);


          }
          APB1是36M時(shí)鐘,經(jīng)過(guò)分頻后產(chǎn)生20KHZ 50us周期的波形。TIM->CNT這個(gè)是計(jì)數(shù)器,在這里計(jì)算TIM_TimeBaseStructure.TIM_Period的值時(shí)有一定的規(guī)律,就是你采集的高低電平最大是多少要知道,比如我采集的波形中的電平最長(zhǎng)的是4ms,基準(zhǔn)計(jì)時(shí)器是50us,那么我要計(jì)算80個(gè)才能達(dá)到4ms,所以TIM_TimeBaseStructure.TIM_Period的值一定要比80大,否則就會(huì)出錯(cuò)。這里要提醒大家TIM-CNT的值達(dá)到TIM_TimeBaseStructure.TIM_Period的值時(shí),就會(huì)清零重新計(jì)數(shù)如下圖。這是利用定時(shí)器的TIMX-CNT計(jì)數(shù)器獲得高低電平的寄存器配置方法,當(dāng)然cnt=TIM_GetCounter(TIMx);cnt要乘以50us才是真正的時(shí)間。


          如果不用計(jì)數(shù)器,想在中斷里用一個(gè)全局變量來(lái)表示中斷的次數(shù)來(lái)計(jì)算高低電平的時(shí)長(zhǎng),注意,這種方法可能因?yàn)槌绦蚬δ芏喽斐刹粶?zhǔn)確,在功能較少的情況下可以嘗試,那么配置定時(shí)器就又要改了,基準(zhǔn)還是50us,
          TIM_TimeBaseStructure.TIM_Prescaler =3599; //TIM_CKD_DIV1
          這個(gè)時(shí)候不能考慮最大值了,而是考慮一個(gè)最小公約數(shù),比如我要采集的高低電平有多少呢,有8ms,4ms,1ms,500us,那么TIM_TimeBaseStructure.TIM_Period的值就有要求了,只要是50us的倍數(shù)并和50us相乘后小于500us還是他的約數(shù)就可以了。舉個(gè)例子

          TIM_TimeBaseStructure.TIM_Prescaler = 3599; //
          TIM_TimeBaseStructure.TIM_Period=1;//
          這兩句話代表50us發(fā)生一次中斷。


          評(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); })();