測試的時候發(fā)現(xiàn),?更新ARR后,?關閉TIM,?CNT寫入0,?然后啟動TIM,?對于TIM3是存在問題的,?TIM4則沒問題,?TIM3會出現(xiàn)斷續(xù)
您好,定時器的CNT寄存器是可讀可寫的,可以動態(tài)寫入。注意修改完重裝載寄存器ARR的值之后,需調用TIM_ARRPreloadConfig函數使能開啟ARR配置,否則會有問題,你可以按照該要求試一下。后續(xù)若有問題,可通過郵箱(lzs@wch.cn)和我溝通
你好,?問題依舊,?下面是我TIM3的改變頻率的代碼,
void?tim3_update_set_frequency(uint32_t?f){ ????uint32_t?period?=?0; ????//?static?uint16_t?ccr?=?0; ????static?uint32_t?minfreq?=?0,?maxfreq?=?0; ????if(minfreq?==?maxfreq){ ????????uint16_t?ccr?=?0; ????????ccr?=?TIM_GetCapture1(TIM3); ????????minfreq?=?STEP_TIM_CLK?/?(UINT16_MAX?-?ccr?-?1)?+?1; ????????maxfreq?=?STEP_TIM_CLK?/?(ccr?+?1)?-?1; ????????//?printf("%ldHz?<?f?<?%ldHz\n",?minfreq,?maxfreq); ????} ??? ????if(f?==?0){ ????????tim3_update_set_status(0); ????????return; ????}else?if(f?<?minfreq){ ????????f?=?minfreq; ????}else?if(f?>?maxfreq){ ????????f?=?maxfreq; ????} ????period?=?(STEP_TIM_CLK?/?f); ??? ????//?TIM_SetCounter(TIM3,?0);???///?TIM3?不要動態(tài)寫CNT,?會出現(xiàn)斷續(xù) ????TIM_SetAutoreload(TIM3,?(uint16_t)period); ????TIM_ARRPreloadConfig(TIM3,?ENABLE); ????//?TIM_SetCounter(TIM3,?0);???///?TIM3?不要動態(tài)寫CNT,?會出現(xiàn)斷續(xù) ????//?tim3_update_set_status(1);???///?不要重新啟動,?速度模式會出現(xiàn)問題 }
取消注釋
TIM_SetCounter(TIM3,?0);
會出現(xiàn)以下情況:第一個中斷響應完后定時器像是停止計數一樣,?過一段時間又會恢復.
展開第一個脈沖位置,時序如下:
注釋
TIM_SetCounter(TIM3,?0);???///?TIM3?不要動態(tài)寫CNT,?會出現(xiàn)斷續(xù)
則是正常的.
TIM4改變頻率的代碼,
void?tim4_update_set_frequency(uint32_t?f){ ????uint32_t?period?=?0; ????//?static?uint16_t?ccr?=?0; ????static?uint32_t?minfreq?=?0,?maxfreq?=?0; ????if(minfreq?==?maxfreq){ ????????uint16_t?ccr?=?0; ????????ccr?=?TIM_GetCapture1(TIM4); ????????minfreq?=?STEP_TIM_CLK?/?(UINT16_MAX?-?ccr?-?1)?+?1; ????????maxfreq?=?STEP_TIM_CLK?/?(ccr?+?1)?-?1; ????????//?printf("%ldHz?<?f?<?%ldHz\n",?minfreq,?maxfreq); ????} ??? ????if(f?==?0){ ????????tim4_update_set_status(0); ????????return; ????}else?if(f?<?minfreq){ ????????f?=?minfreq; ????}else?if(f?>?maxfreq){ ????????f?=?maxfreq; ????} ????period?=?(STEP_TIM_CLK?/?f); ????//?TIM_SetCounter(TIM4,?0); ????TIM_SetAutoreload(TIM4,?(uint16_t)period); ????TIM_ARRPreloadConfig(TIM4,?ENABLE); ????//?tim4_update_set_status(1);??? }
對于TIM4都是正常的。
之所以要寫入ARR后要CNT置零,是因為測試過程發(fā)現(xiàn)TIM2?UPDATE?中斷里計算新的頻率,花時在3us到8us之間,如果剛好卡在TIM3?OC1和UPDATE之間,會導致控制管腳低電平時間過短,頻率過度不順滑,?比如會出現(xiàn)下面情況:
重新計數我可以保證有足夠的低電平時間,
所有定時器中斷優(yōu)先級是相同的,不用嵌套的原因在于計算頻率的數據要依靠其他中斷里的數據,嵌套就很難保證完整性和準確性了
您好,這邊模擬你的應用測試了一下,并沒有出現(xiàn)斷續(xù)的問題,若方便,可將你的程序發(fā)至我的郵箱(lzs@wch.cn)這邊看一下具體復現(xiàn)一下,并在此基礎上檢查一下問題幫助你修改程序,有什么問題也可以具體溝通一下。