标题: stm32f030单片机us级延时难达不需要更新UEV么? [打印本页]

作者: omokimi    时间: 2022-1-19 15:06
标题: stm32f030单片机us级延时难达不需要更新UEV么?

先贴代码,其实主频 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这边.


作者: omokimi    时间: 2022-1-21 16:18
我好像自己找到了答案


TIMx->EGR = TIM_EGR_UG;
回头试一下 ...
作者: omokimi    时间: 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);
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1