新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32學習心得(3)

        STM32學習心得(3)

        作者: 時間:2016-11-25 來源:網絡 收藏


        中斷代碼:

        voidTIM2_IRQHandler(void)

        {

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

        {

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

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

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

        }

        }

        i)簡單應用:

        //改變占空比

        TIM_SetCompare4(TIM3,變量);

        j)注意事項:

        管腳的IO輸出模式是根據應用來定,比如如果用PWM輸出驅動LED則應該將相應管腳設為AF_PP,否則單片機沒有輸出

        我的測試程序可以發出不斷循環三種波長并捕獲,對比結果如下:

        捕捉的穩定性很好,也就是說,同樣的方波捕捉到數值相差在一兩個數值。

        捕捉的精度跟你設置的濾波器長度有關,在這里

        TIM_ICInitStructure.TIM_ICFilter=0x4;//濾波設置,經歷幾個周期跳變認定波形穩定0x0~0xF

        這個越長就會捕捉數值越小,但是偏差幾十個數值,下面是0、4、16個周期濾波的比較,out是輸出的數值,in是捕捉到的。

        現在有兩個疑問:

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

        TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2);//選擇時鐘觸發源

        按照硬件框圖,4通道應該對應TI4FP4??墒菍嶋H使用TI1FP1,TI2FP2都行,其他均編譯錯誤未注冊。這是為什么?

        2、關閉調試器和IAR程序,直接供電跑出來的結果第一個周期很正常,當輸出脈寬第二次循環變小后捕捉的數值就差的遠了。不知道是為什么







        時鐘不息工作不止,systic時鐘應用

        a)目的:使用系統時鐘來進行兩項實驗——周期執行代碼與精確定時延遲。

        b)初始化函數定義:

        voidSysTick_Configuration(void);

        c)初始化函數調用:

        SysTick_Configuration();

        d)初始化函數:

        voidSysTick_Configuration(void)

        {

        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//時鐘除8

        SysTick_SetReload(250000);//計數周期長度

        SysTick_CounterCmd(SysTick_Counter_Enable);//啟動計時器

        SysTick_ITConfig(ENABLE);//打開中斷

        }

        e)在NVIC的初始化函數里面增加以下代碼打開相關中斷:

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

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

        voidSysTickHandler(void)

        {

        執行代碼

        }

        g)簡單應用:精確延遲函數,因為systic中斷往往被用來執行周期循環代碼,所以一些例程中使用其中斷的啟動和禁止來編寫的精確延時函數實際上不實用,我自己編寫了精確計時函數反而代碼更精簡,思路更簡單。思路是調用后,變量清零,然后使用時鐘來的曾變量,不斷比較變量與延遲的數值,相等則退出函數。代碼和步驟如下:

        i.定義通用變量:u16Tic_Val=0;//變量用于精確計時

        ii.在stm32f10x_it.c文件中相應定義:

        externu16Tic_Val;//在本文件引用MAIN.c定義的精確計時變量

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

        iv.精確延時函數:

        voidTic_Delay(u16Tic_Count)//精確延時函數

        {Tic_Val=0;//變量清零

        while(Tic_Val!=Tic_Count){printf("");}//計時

        }

        v.在stm32f10x_it.c文件中voidSysTickHandler函數里面添加

        Tic_Val++;//變量遞增

        vi.調用代碼:Tic_Delay(10);//精確延時

        vii.疑問:如果去掉計時行那個沒用的printf("");函數將停止工作,這個現象很奇怪

        C語言功底問題。是的,那個“注意事項”最后的疑問的原因就是這個

        Tic_Val應該改為vu16

        while(Tic_Val!=Tic_Count){printf("");}//計時

        就可以改為:

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

        STM32筆記之十三:惡搞,兩只看門狗

        a)目的:

        了解兩種看門狗(我叫它:系統運行故障探測器和獨立系統故障探測器,新手往往被這個并不形象的象形名稱搞糊涂)之間的區別和基本用法。

        b)相同:

        都是用來探測系統故障,通過編寫代碼定時發送故障清零信號(高手們都管這個代碼叫做“喂狗”),告訴它系統運行正常。一旦系統故障,程序清零代碼(“喂狗”)無法執行,其計數器就會計數不止,直到記到零并發生故障中斷(狗餓了開始叫喚),控制CPU重啟整個系統(不行啦,開始咬人了,快跑……)。

        c)區別:

        獨立看門狗Iwdg——我的理解是獨立于系統之外,因為有獨立時鐘,所以不受系統影響的系統故障探測器。(這條狗是借來的,見誰偷懶它都咬?。┲饕糜诒O視硬件錯誤。

        窗口看門狗wwdg——我的理解是系統內部的故障探測器,時鐘與系統相同。如果系統時鐘不走了,這個狗也就失去作用了。(這條狗是老板娘養的,老板不干活兒他不管!)主要用于監視軟件錯誤。

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

        voidWDG_Configuration(void);

        e)初始化函數調用:

        WDG_Configuration();

        f)初始化函數

        voidWDG_Configuration()//看門狗初始化

        {

        //軟件看門狗初始化

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

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

        WWDG_SetWindowValue(65);//計數器數值

        WWDG_Enable(127);//啟動計數器,設置喂狗時間

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

        WWDG_ClearFlag();//清除標志位

        WWDG_EnableIT();//啟動中斷

        //獨立看門狗初始化

        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//啟動寄存器讀寫

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

        IWDG_SetReload(349);//計數器數值

        IWDG_ReloadCounter();//重啟計數器

        IWDG_Enable();//啟動看門狗

        }

        g)RCC初始化:只有軟件看門狗需要時鐘初始化,獨立看門狗有自己的時鐘不需要但是需要systic工作相關設置。

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);

        h)獨立看門狗使用systic的中斷來喂狗,所以添加systic的中斷打開代碼就行了。軟件看門狗需要在NVIC打開中斷添加如下代碼:

        NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQChannel;//通道

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//占先中斷等級

        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//響應中斷優先級

        NVIC_Init(&NVIC_InitStructure);//打開中斷

        i)中斷程序,軟件看門狗在自己的中斷中喂狗,獨立看門狗需要使用systic的定時中斷來喂狗。以下兩個程序都在stm32f10x_it.c文件中。

        voidWWDG_IRQHandler(void)

        {

        WWDG_SetCounter(0x7F);//更新計數值

        WWDG_ClearFlag();//清除標志位

        }

        voidSysTickHandler(void)

        {IWDG_ReloadCounter();//重啟計數器(喂狗)

        }

        j)注意事項:

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

        ii.初始化程序的調用一定要在systic的初始化之后。

        iii.獨立看門狗需要systic中斷來喂,但是systic做別的用處不能只做這件事,所以我寫了如下幾句代碼,可以不影響systic的其他應用,其他systic周期代碼也可參考:

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

        intTic_IWDG;//喂狗循環程序的頻率判斷變量

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

        Tic_IWDG++;//變量遞增

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

        {IWDG_ReloadCounter();//重啟計數器(喂狗)

        Tic_IWDG=0;//變量清零

        }

        本文引用地址:http://www.104case.com/article/201611/321206.htm

        上一頁 1 2 3 下一頁

        關鍵詞: STM32學習心

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 安龙县| 天柱县| 胶南市| 江北区| 吴川市| 敦化市| 盐源县| 宜兴市| 栾川县| 紫阳县| 富阳市| 安乡县| 黑水县| 台东县| 江门市| 新丰县| 扶沟县| 廉江市| 拜泉县| 张家川| 神木县| 乃东县| 湘乡市| 仙游县| 交城县| 开远市| 辽阳县| 莎车县| 元阳县| 和林格尔县| 莫力| 宜春市| 阿坝| 北流市| 天津市| 资阳市| 运城市| 寻甸| 韩城市| 阿尔山市| 崇义县|