OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10339|回复: 12

关于STM32F407,delay函数us延时不准

[复制链接]

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-4-12
在线时间
16 小时
发表于 2023-3-2 20:01:47 | 显示全部楼层 |阅读模式
15金钱
自己画的板子,用的芯片是407Zet6,外部晶振25M,程序是正点原子407电机开发板跑马灯实验

现实情况
delay1us,示波器抓取是1.3us
delay10us,示波器抓取是10.3us
程序只对io口位置进行了改动,其他部分没有做改动
int main(void)
{
    HAL_Init();                                 /* 初始化HAL库 */
    sys_stm32_clock_init(336, 25, 2, 4);         /* 设置时钟,168Mhz */
    delay_init(168);                            /* 延时初始化 */
    led_init();                                 /* 初始化LED */

    while(1)
    {
      GPIOE->BSRR = 0x0040;
                        delay_us(1);
      GPIOE->BSRR = 0x0040 << 16U;                               /* LED1 亮 */
      delay_us(1);
    }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-4-12
在线时间
16 小时
 楼主| 发表于 2023-3-2 20:30:58 | 显示全部楼层
续上实验:
1、不运用delay,直接操作io口的话,示波器抓取io口可以做到60ns左右一个周期
2、单步调试的时候,tcnt,在溢出前数值为176,那就意味着176-168=8,8/168us约等于47ns
3、47ns加上io操作时间30ns,等于70ns
那理论上delay1us的误差也应该也是1us±70ns
但是实际上示波器抓取此误差达到了300ns以上
求大神解惑
回复

使用道具 举报

2

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2014-4-30
在线时间
66 小时
发表于 2023-3-2 21:03:37 | 显示全部楼层
把晶振换8M
回复

使用道具 举报

5

主题

312

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2018-11-28
在线时间
226 小时
发表于 2023-3-2 21:46:32 | 显示全部楼层
因为delay函数的运行需要一些时间,所以短延时误差会有些大。如果需要更高的精度,就要改delay延时函数了,以下是原延时函数。void delay_us(u32 nus)
{               
        u32 temp;                     
        SysTick->LOAD=nus*fac_us;                                 //时间加载                           
        SysTick->VAL=0x00;                                        //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数          
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));        //等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
        SysTick->VAL =0X00;                                       //清空计数器
}


修改以后
void delay_us(u32 nus)
{               
        u32 temp;                     
        SysTick->LOAD=nus*fac_u - 6 ;                                 //加载时间        =时间-减去程序用时         
        SysTick->VAL=0x00;                                        //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数          
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));        //等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
        SysTick->VAL =0X00;                                       //清空计数器
}

回复

使用道具 举报

70

主题

6756

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12983
金钱
12983
注册时间
2012-11-26
在线时间
3787 小时
发表于 2023-3-3 08:45:51 | 显示全部楼层
指令执行及硬件处理都是需要时间的
学无止境
回复

使用道具 举报

2

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4287
金钱
4287
注册时间
2018-5-14
在线时间
928 小时
发表于 2023-3-3 08:46:48 | 显示全部楼层
你要实现精准延时,用delay本身就是错误。而且delay会阻塞代码的执行,一旦程序存在多个长时间delay,会出现按键不及时响应等故障
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-4-12
在线时间
16 小时
 楼主| 发表于 2023-3-3 09:03:40 | 显示全部楼层
jermy_z 发表于 2023-3-3 08:45
指令执行及硬件处理都是需要时间的

我上面算的70ns误差是不是已经是硬件处理和指令执行时间了?
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-4-12
在线时间
16 小时
 楼主| 发表于 2023-3-3 09:05:29 | 显示全部楼层
而且如果用正点原子开发板,ST32F429跑的话,这个误差是很小的
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-4-12
在线时间
16 小时
 楼主| 发表于 2023-3-3 09:11:23 | 显示全部楼层
姚先起 发表于 2023-3-3 08:46
你要实现精准延时,用delay本身就是错误。而且delay会阻塞代码的执行,一旦程序存在多个长时间delay,会出 ...

只是因为之前用正点原子429开发板跑的时候误差是很小的,换成407后就很大了,所以想知道是不是哪里没配置好
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-4-12
在线时间
16 小时
 楼主| 发表于 2023-3-3 09:13:09 | 显示全部楼层
hzhanhai 发表于 2023-3-2 21:46
因为delay函数的运行需要一些时间,所以短延时误差会有些大。如果需要更高的精度,就要改delay延时函数了, ...

我单步调试的时候,tcnt,在溢出前数值为176,那就意味着176-168=8,8/168us约等于47ns,我这样算这个delay函数的误差是对的吗,函数是正点原子hal库的delay函数
回复

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-4-12
在线时间
16 小时
 楼主| 发表于 2023-3-3 09:14:24 | 显示全部楼层

我想问问这个8M对这个delay误差有什么影响的?分频系数我现在是按照25M的来分倍频的
回复

使用道具 举报

5

主题

312

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1820
金钱
1820
注册时间
2018-11-28
在线时间
226 小时
发表于 2023-3-3 12:48:43 | 显示全部楼层
czh120779396 发表于 2023-3-3 09:13
我单步调试的时候,tcnt,在溢出前数值为176,那就意味着176-168=8,8/168us约等于47ns,我这样算这个dela ...

硬件和软件调用时,都需要用时间,要全部精确定计算出来,非常困难。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2023-3-7 23:32:50 | 显示全部楼层
你换不同的主频,可能效果又不一样了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 17:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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