CH32V203 TIM的CNT寄存器是否可以動態(tài)寫入

測試的時候發(fā)現(xiàn),?更新ARR后,?關閉TIM,?CNT寫入0,?然后啟動TIM,?對于TIM3是存在問題的,?TIM4則沒問題,?TIM3會出現(xiàn)斷續(xù)

1676986036197334.jpg

1676986036829180.jpg

1676986037177810.jpg


您好,定時器的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)以下情況:第一個中斷響應完后定時器像是停止計數一樣,?過一段時間又會恢復.

image.png

展開第一個脈沖位置,時序如下:


image.png


注釋

TIM_SetCounter(TIM3,?0);???///?TIM3?不要動態(tài)寫CNT,?會出現(xiàn)斷續(xù)


則是正常的.


image.png


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)下面情況:


image.png


重新計數我可以保證有足夠的低電平時間,


image.png


所有定時器中斷優(yōu)先級是相同的,不用嵌套的原因在于計算頻率的數據要依靠其他中斷里的數據,嵌套就很難保證完整性和準確性了


您好,這邊模擬你的應用測試了一下,并沒有出現(xiàn)斷續(xù)的問題,若方便,可將你的程序發(fā)至我的郵箱(lzs@wch.cn)這邊看一下具體復現(xiàn)一下,并在此基礎上檢查一下問題幫助你修改程序,有什么問題也可以具體溝通一下。

image.png

image.png




只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频