亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

學嵌入式的時候 ,碰到以下延時函數,麻煩高手幫幫忙~

學嵌入式的時候 ,碰到以下延時函數,麻煩高手幫幫忙~

冉冉說 2022-10-02 14:10:53
void Delay(int time){U32 val = (PCLK>>3)/1000-1;rTCFG0 &= ~(0xff<<8);rTCFG0 |= 3<<8; //prescaler = 3+1rTCFG1 &= ~(0xf<<12);rTCFG1 |= 0<<12; //mux = 1/2rTCNTB3 = val;rTCMPB3 = val>>1; // 50%rTCON &= ~(0xf<<16);rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3rTCON &= ~(2<<16); //clear manual update bitwhile(time--) {while(rTCNTO3>=val>>1);while(rTCNTO3<val>>1);};}
查看完整描述

2 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

一種最原始,最沒有效率的延時程序。在調用這個延時程序時,CPU將在while(time--){}這個循環處不停的等待,直到time減到零,標志著延時結束。程序也隨之退出。
從函數第一句開始,直到while循環語句之前,都屬于定時器配置。通過注釋可以看出,使用了定時器3。由于不知道單片機的型號,只能做一個通用的解釋??炊@一解釋的基礎是你知道單片機定時器的配置方法和工作原理。
首先,表示時間的變量time不是時間單位,并不表示毫秒或者秒,他代表了延時多少個脈沖。而變量val也是脈沖,他定義了一個定時器工作周期所經過的脈沖數。單個脈沖表示的時間間隔則通過單片機工作頻率計算出來。比如說,單片機的頻率為10mHz,那么每個脈沖的時間就是1uS(假設分頻電路為1:1)。如果需要定時器的一個工作周期為1ms,那么val就需要設為1000。如果延時10ms,則time=100??梢姡訒r時間只能是定時器工作周期的整數倍。
rTcon3是定時器3的計數器,每個脈沖過后,會根據定時器的設定而自動進行+1操作。完成一個工作周期后,恢復為0。

查看完整回答
反對 回復 2022-10-06
?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

這是利用定時器3的計數功能來延時的程序
void Delay(int time)
{
U32 val = (PCLK>>3)/1000-1;

rTCFG0 &= ~(0xff<<8);
rTCFG0 |= 3<<8; //prescaler = 3+1
rTCFG1 &= ~(0xf<<12);
rTCFG1 |= 0<<12; //mux = 1/2 //這四句設置定時器輸入的頻率,PCLK/8

rTCNTB3 = val; //設置計數值,輸入頻率除以1000,即計數器到底時正好1ms
rTCMPB3 = val>>1; // 50% //這個是設置比較值,計數到這個值時,引腳會有輸出
rTCON &= ~(0xf<<16);
rTCON |= 0xb<<16; //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
rTCON &= ~(2<<16); //clear manual update bit //這幾行是啟動定時器,開始進行計數,計數到0時自動重新裝載計數值
while(time--) {
while(rTCNTO3>=val>>1);
while(rTCNTO3<val>>1); //這兩行是讀取計數器的值,每次到一半時,將time減一次,因為計數器一直在走的,所以要使用范圍讀取,不能像這樣while(rTCNTO3 == 0),這樣的話,估計會永遠都等等不到的。
};
}


查看完整回答
反對 回復 2022-10-06
  • 2 回答
  • 0 關注
  • 135 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號