<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學(xué)習(xí)心得(3)

          STM32學(xué)習(xí)心得(3)

          作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏


          中斷代碼:

          voidTIM2_IRQHandler(void)

          {

          if(TIM_GetITStatus(TIM2,TIM_IT_CC4)!=RESET)//判斷中斷來(lái)源

          {

          TIM_ClearITPendingBit(TIM2,TIM_IT_CC4);//清除中斷標(biāo)志

          GPIO_WriteBit(GPIOB,GPIO_Pin_11,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_11)));//變換LED色彩

          IC4value=TIM_GetCapture4(TIM2);//獲取捕捉數(shù)值

          }

          }

          i)簡(jiǎn)單應(yīng)用:

          //改變占空比

          TIM_SetCompare4(TIM3,變量);

          j)注意事項(xiàng):

          管腳的IO輸出模式是根據(jù)應(yīng)用來(lái)定,比如如果用PWM輸出驅(qū)動(dòng)LED則應(yīng)該將相應(yīng)管腳設(shè)為AF_PP,否則單片機(jī)沒(méi)有輸出

          我的測(cè)試程序可以發(fā)出不斷循環(huán)三種波長(zhǎng)并捕獲,對(duì)比結(jié)果如下:

          捕捉的穩(wěn)定性很好,也就是說(shuō),同樣的方波捕捉到數(shù)值相差在一兩個(gè)數(shù)值。

          捕捉的精度跟你設(shè)置的濾波器長(zhǎng)度有關(guān),在這里

          TIM_ICInitStructure.TIM_ICFilter=0x4;//濾波設(shè)置,經(jīng)歷幾個(gè)周期跳變認(rèn)定波形穩(wěn)定0x0~0xF

          這個(gè)越長(zhǎng)就會(huì)捕捉數(shù)值越小,但是偏差幾十個(gè)數(shù)值,下面是0、4、16個(gè)周期濾波的比較,out是輸出的數(shù)值,in是捕捉到的。

          現(xiàn)在有兩個(gè)疑問(wèn):

          1、在TIM2的捕捉輸入通道初始化里面這句

          TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2);//選擇時(shí)鐘觸發(fā)源

          按照硬件框圖,4通道應(yīng)該對(duì)應(yīng)TI4FP4??墒菍?shí)際使用TI1FP1,TI2FP2都行,其他均編譯錯(cuò)誤未注冊(cè)。這是為什么?

          2、關(guān)閉調(diào)試器和IAR程序,直接供電跑出來(lái)的結(jié)果第一個(gè)周期很正常,當(dāng)輸出脈寬第二次循環(huán)變小后捕捉的數(shù)值就差的遠(yuǎn)了。不知道是為什么







          時(shí)鐘不息工作不止,systic時(shí)鐘應(yīng)用

          a)目的:使用系統(tǒng)時(shí)鐘來(lái)進(jìn)行兩項(xiàng)實(shí)驗(yàn)——周期執(zhí)行代碼與精確定時(shí)延遲。

          b)初始化函數(shù)定義:

          voidSysTick_Configuration(void);

          c)初始化函數(shù)調(diào)用:

          SysTick_Configuration();

          d)初始化函數(shù):

          voidSysTick_Configuration(void)

          {

          SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//時(shí)鐘除8

          SysTick_SetReload(250000);//計(jì)數(shù)周期長(zhǎng)度

          SysTick_CounterCmd(SysTick_Counter_Enable);//啟動(dòng)計(jì)時(shí)器

          SysTick_ITConfig(ENABLE);//打開(kāi)中斷

          }

          e)在NVIC的初始化函數(shù)里面增加以下代碼打開(kāi)相關(guān)中斷:

          NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick,1,0);//中斷等級(jí)設(shè)置,一般設(shè)置的高一些會(huì)少受其他影響

          f)在stm32f10x_it.c文件中找到voidSysTickHandler函數(shù)

          voidSysTickHandler(void)

          {

          執(zhí)行代碼

          }

          g)簡(jiǎn)單應(yīng)用:精確延遲函數(shù),因?yàn)閟ystic中斷往往被用來(lái)執(zhí)行周期循環(huán)代碼,所以一些例程中使用其中斷的啟動(dòng)和禁止來(lái)編寫(xiě)的精確延時(shí)函數(shù)實(shí)際上不實(shí)用,我自己編寫(xiě)了精確計(jì)時(shí)函數(shù)反而代碼更精簡(jiǎn),思路更簡(jiǎn)單。思路是調(diào)用后,變量清零,然后使用時(shí)鐘來(lái)的曾變量,不斷比較變量與延遲的數(shù)值,相等則退出函數(shù)。代碼和步驟如下:

          i.定義通用變量:u16Tic_Val=0;//變量用于精確計(jì)時(shí)

          ii.在stm32f10x_it.c文件中相應(yīng)定義:

          externu16Tic_Val;//在本文件引用MAIN.c定義的精確計(jì)時(shí)變量

          iii.定義函數(shù)名稱:voidTic_Delay(u16Tic_Count);//精確延遲函數(shù)

          iv.精確延時(shí)函數(shù):

          voidTic_Delay(u16Tic_Count)//精確延時(shí)函數(shù)

          {Tic_Val=0;//變量清零

          while(Tic_Val!=Tic_Count){printf("");}//計(jì)時(shí)

          }

          v.在stm32f10x_it.c文件中voidSysTickHandler函數(shù)里面添加

          Tic_Val++;//變量遞增

          vi.調(diào)用代碼:Tic_Delay(10);//精確延時(shí)

          vii.疑問(wèn):如果去掉計(jì)時(shí)行那個(gè)沒(méi)用的printf("");函數(shù)將停止工作,這個(gè)現(xiàn)象很奇怪

          C語(yǔ)言功底問(wèn)題。是的,那個(gè)“注意事項(xiàng)”最后的疑問(wèn)的原因就是這個(gè)

          Tic_Val應(yīng)該改為vu16

          while(Tic_Val!=Tic_Count){printf("");}//計(jì)時(shí)

          就可以改為:

          while(Tic_Val!=Tic_Count);//檢查變量是否計(jì)數(shù)到位

          STM32筆記之十三:惡搞,兩只看門(mén)狗

          a)目的:

          了解兩種看門(mén)狗(我叫它:系統(tǒng)運(yùn)行故障探測(cè)器和獨(dú)立系統(tǒng)故障探測(cè)器,新手往往被這個(gè)并不形象的象形名稱搞糊涂)之間的區(qū)別和基本用法。

          b)相同:

          都是用來(lái)探測(cè)系統(tǒng)故障,通過(guò)編寫(xiě)代碼定時(shí)發(fā)送故障清零信號(hào)(高手們都管這個(gè)代碼叫做“喂狗”),告訴它系統(tǒng)運(yùn)行正常。一旦系統(tǒng)故障,程序清零代碼(“喂狗”)無(wú)法執(zhí)行,其計(jì)數(shù)器就會(huì)計(jì)數(shù)不止,直到記到零并發(fā)生故障中斷(狗餓了開(kāi)始叫喚),控制CPU重啟整個(gè)系統(tǒng)(不行啦,開(kāi)始咬人了,快跑……)。

          c)區(qū)別:

          獨(dú)立看門(mén)狗Iwdg——我的理解是獨(dú)立于系統(tǒng)之外,因?yàn)橛歇?dú)立時(shí)鐘,所以不受系統(tǒng)影響的系統(tǒng)故障探測(cè)器。(這條狗是借來(lái)的,見(jiàn)誰(shuí)偷懶它都咬?。┲饕糜诒O(jiān)視硬件錯(cuò)誤。

          窗口看門(mén)狗wwdg——我的理解是系統(tǒng)內(nèi)部的故障探測(cè)器,時(shí)鐘與系統(tǒng)相同。如果系統(tǒng)時(shí)鐘不走了,這個(gè)狗也就失去作用了。(這條狗是老板娘養(yǎng)的,老板不干活兒他不管?。┲饕糜诒O(jiān)視軟件錯(cuò)誤。

          d)初始化函數(shù)定義:鑒于兩只狗作用差不多,使用過(guò)程也差不多初始化函數(shù)栓一起了,用的時(shí)候根據(jù)情況刪減。

          voidWDG_Configuration(void);

          e)初始化函數(shù)調(diào)用:

          WDG_Configuration();

          f)初始化函數(shù)

          voidWDG_Configuration()//看門(mén)狗初始化

          {

          //軟件看門(mén)狗初始化

          WWDG_SetPrescaler(WWDG_Prescaler_8);//時(shí)鐘8分頻4ms

          //(PCLK1/4096)/8=244Hz(~4ms)

          WWDG_SetWindowValue(65);//計(jì)數(shù)器數(shù)值

          WWDG_Enable(127);//啟動(dòng)計(jì)數(shù)器,設(shè)置喂狗時(shí)間

          //WWDGtimeout=~4ms*64=262ms

          WWDG_ClearFlag();//清除標(biāo)志位

          WWDG_EnableIT();//啟動(dòng)中斷

          //獨(dú)立看門(mén)狗初始化

          IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//啟動(dòng)寄存器讀寫(xiě)

          IWDG_SetPrescaler(IWDG_Prescaler_32);//40K時(shí)鐘32分頻

          IWDG_SetReload(349);//計(jì)數(shù)器數(shù)值

          IWDG_ReloadCounter();//重啟計(jì)數(shù)器

          IWDG_Enable();//啟動(dòng)看門(mén)狗

          }

          g)RCC初始化:只有軟件看門(mén)狗需要時(shí)鐘初始化,獨(dú)立看門(mén)狗有自己的時(shí)鐘不需要但是需要systic工作相關(guān)設(shè)置。

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);

          h)獨(dú)立看門(mén)狗使用systic的中斷來(lái)喂狗,所以添加systic的中斷打開(kāi)代碼就行了。軟件看門(mén)狗需要在NVIC打開(kāi)中斷添加如下代碼:

          NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQChannel;//通道

          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//占先中斷等級(jí)

          NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//響應(yīng)中斷優(yōu)先級(jí)

          NVIC_Init(&NVIC_InitStructure);//打開(kāi)中斷

          i)中斷程序,軟件看門(mén)狗在自己的中斷中喂狗,獨(dú)立看門(mén)狗需要使用systic的定時(shí)中斷來(lái)喂狗。以下兩個(gè)程序都在stm32f10x_it.c文件中。

          voidWWDG_IRQHandler(void)

          {

          WWDG_SetCounter(0x7F);//更新計(jì)數(shù)值

          WWDG_ClearFlag();//清除標(biāo)志位

          }

          voidSysTickHandler(void)

          {IWDG_ReloadCounter();//重啟計(jì)數(shù)器(喂狗)

          }

          j)注意事項(xiàng):

          i.有狗平常沒(méi)事情可以不理,但是千萬(wàn)別忘了喂它,否則死都不知道怎么死的!

          ii.初始化程序的調(diào)用一定要在systic的初始化之后。

          iii.獨(dú)立看門(mén)狗需要systic中斷來(lái)喂,但是systic做別的用處不能只做這件事,所以我寫(xiě)了如下幾句代碼,可以不影響systic的其他應(yīng)用,其他systic周期代碼也可參考:

          第一步:在stm32f10x_it.c中定義變量

          intTic_IWDG;//喂狗循環(huán)程序的頻率判斷變量

          第二步:將SysTickHandler中喂狗代碼改為下面:

          Tic_IWDG++;//變量遞增

          if(Tic_IWDG>=100)//每100個(gè)systic周期喂狗

          {IWDG_ReloadCounter();//重啟計(jì)數(shù)器(喂狗)

          Tic_IWDG=0;//變量清零

          }

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

          上一頁(yè) 1 2 3 下一頁(yè)

          關(guān)鍵詞: STM32學(xué)習(xí)心

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