找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 819|回复: 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这边.

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 单片机教程网

快速回复 返回顶部 返回列表