欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1498|回復: 2
收起左側

stm32f030單片機us級延時難達不需要更新UEV么?

[復制鏈接]
ID:496704 發表于 2022-1-19 15:06 | 顯示全部樓層 |閱讀模式

先貼代碼,其實主頻 48 M的主頻這個函數延時還不錯.
void delay_us (uint16_t us){        __HAL_TIM_SET_COUNTER(&htim17,0);  // set the counter value a 0  HAL_TIM_Base_Start(&htim17);        while (__HAL_TIM_GET_COUNTER(&htim17) < us);  // wait for the counter to reach the us input in the parameter        HAL_TIM_Base_Stop(&htim17);}

函數填進去2 延時2us 所得到的結果也就是4.2 usE 的樣子 . 如果填寫 20 進去 就是22us 的延時
分頻填寫個48-1 實際上就是48 分頻 得到 us 一次的時間周期.
不過有一個問題,就是 我聽說如果不引發 UEV 更新事件的話 ,設置的CNT 寄存器是不會立刻寫入影子寄存器的.但是似乎這里又是立刻寫入了. 有點點奇怪.
我的問題是 hal 庫里面有沒有更新UEV的函數,如何用?.
然后沒有開啟重載寄存器的話,這樣為何沒有看到計數器到了預設值再更新CNT寄存器的現象呢?
略有疑問. 之所以有這個疑問,是因為之前用STm8003 這個U,這個如果你不更的話時間就會有很大問題. 習慣帶到了stm32這邊.

回復

使用道具 舉報

ID:496704 發表于 2022-1-21 16:18 | 顯示全部樓層
我好像自己找到了答案


TIMx->EGR = TIM_EGR_UG;
回頭試一下 ...

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:496704 發表于 2022-1-26 13:59 | 顯示全部樓層
不好意思,我自己來解答一下 自己的問題.
先說一下stm8s
這個單片和 stm32 其實就寄存器來說很多相似的 stm8 如果弄微秒級延時 特別是你要弄一些高高低低的模擬總線信號的話 更新事件 一定要觸發
也就是 TIM2_EGR = 0x01;    如果你延時不觸發. 使用示波器來看延時肯定有問題. 為啥呢? 規格書說要到 Rcnt寄存器到溢出以后你設置才能更新.但是stm32 的構建其實規格書也是這么寫.不過結果是完全不一樣.
stm8 沒有類似 TIM2_EGR = 0x01; 延時會變得不確定. 也就是一定要有 但是stm32 你只要調用類似的 HAL_TIM_SET_COUNTER
即使你把 ARR 設置成 0xffff  只要你調用,似乎馬上就生效, 有人可能會問 是不是你Reload 沒有開啊.我開了但是依然沒有問題,立刻生效. 不過既然官方在大多數計時器都有說到這個..我們加了也沒啥.


整體測了一下 stm32f030 48M的主頻 差不都us 的誤差是 + 3.4us 的樣子. 一般不是太高信號都足夠了.
函數如下

void delay_us (uint16_t us)
{
        __HAL_TIM_SET_COUNTER(&htim17,0);  // set the counter value a 0
  HAL_TIM_Base_Start(&htim17);
       
        TIM17->EGR = TIM_EGR_UG;
       
        while (__HAL_TIM_GET_COUNTER(&htim17) < us);  // wait for the counter to reach the us input in the parameter
        HAL_TIM_Base_Stop(&htim17);
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表