打印

板子为GD32F103ZET6,想用NOP指令来延时1ms,改怎么做呢?

[复制链接]
2033|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
板子为GD32F103ZET6,想用NOP指令来延时1ms,改怎么做呢?
查了一些帖子,说是用晶振来算机器周期,GD32的板子是108M 这个来算吗

使用特权

评论回复
沙发
shenxiaolin| | 2024-7-29 22:04 | 只看该作者
感谢分享

使用特权

评论回复
板凳
shenxiaolin| | 2024-7-29 22:04 | 只看该作者
使用思源宋体参考或者定时器实现精确延时。

使用特权

评论回复
地板
shenxiaolin| | 2024-7-29 22:05 | 只看该作者
systic

使用特权

评论回复
5
储小勇_526| | 2024-7-30 08:41 | 只看该作者
1ms干嘛要用_NOP实现,定时器精度达不到你要求?

使用特权

评论回复
6
AProgrammer|  楼主 | 2024-7-30 09:39 | 只看该作者
储小勇_526 发表于 2024-7-30 08:42
1ms干嘛要用_NOP实现,定时器精度达不到你要求?

当时可以用定时器中断来实现。当前先简单点实现看看是否满足功能。

使用特权

评论回复
7
xionghaoyun| | 2024-7-30 10:17 | 只看该作者
volatile static uint32_t delay_count;

void system_config(void)
{
    if (SysTick_Config(SystemCoreClock / 1000U / 1000U))
    {
        while (1)
            ;
    }
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
}

void delay_sw_us(uint32_t count)
{
    uint32_t sw_count = count;
    while (sw_count != 0)
    {
        sw_count--;
        for (uint32_t i = 0; i < 19; i++)
            ;
    }
}

void delay_sw_ms(uint32_t count)
{
    uint32_t sw_count = count;
    while (sw_count != 0)
    {
        sw_count--;
        for (uint32_t i = 0; i < 24200; i++)
            ;
    }
}

void delay_us(uint32_t count)
{
    delay_count = count;

    while (0U != delay_count)
        ;
}

void delay_ms(uint32_t count)
{
    delay_count = count * 1000; // ms 比 us 多延时1000倍

    while (0U != delay_count)
        ;
}

void SysTick_Handler(void)
{
    if (0U != delay_count)
    {
        delay_count--;
    }
}

使用特权

评论回复
8
xionghaoyun| | 2024-7-30 10:18 | 只看该作者
volatile static uint32_t delay_count;

void system_config(void)
{
    if (SysTick_Config(SystemCoreClock / 1000U / 1000U))
    {
        while (1)
            ;
    }
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
}
void SysTick_Handler(void)
{
    if (0U != delay_count)
    {
        delay_count--;
    }
}
void delay_ms(uint32_t count)
{
    delay_count = count * 1000; // ms 比 us 多延时1000倍

    while (0U != delay_count)
        ;
}

使用特权

评论回复
评论
xionghaoyun 2024-7-30 10:18 回复TA
别人的工程找到的 
9
AProgrammer|  楼主 | 2024-7-30 11:19 | 只看该作者
xionghaoyun 发表于 2024-7-30 10:18
volatile static uint32_t delay_count;

void system_config(void)

感谢您的回复

使用特权

评论回复
10
地瓜patch| | 2024-7-31 15:22 | 只看该作者
一个nop就是一个机器周期

使用特权

评论回复
11
AProgrammer|  楼主 | 2024-7-31 16:15 | 只看该作者
本帖最后由 AProgrammer 于 2024-7-31 16:47 编辑
地瓜patch 发表于 2024-7-31 15:22
一个nop就是一个机器周期

一个nop执行时间是 1/108M    s,也就是说1s要执行108M个nop,我这么写了下:当传入是1时,实际执行时间感觉大于1s,都大概到1.8s了。。。不知道是不是按照108M主频走的?

使用特权

评论回复
12
地瓜patch| | 2024-7-31 21:10 | 只看该作者
AProgrammer 发表于 2024-7-31 16:15
一个nop执行时间是 1/108M    s,也就是说1s要执行108M个nop,我这么写了下:当传入是1时,实际执行时间感 ...

牛掰,怎么计时的,执行时间感觉大于1s,怎么感觉的?

使用特权

评论回复
13
小小蚂蚁举千斤| | 2024-7-31 21:32 | 只看该作者
建议使用嘀嗒时钟进行问题解决,因为NOP不稳定

使用特权

评论回复
14
AProgrammer|  楼主 | 2024-8-1 09:05 | 只看该作者
地瓜patch 发表于 2024-7-31 21:10
牛掰,怎么计时的,执行时间感觉大于1s,怎么感觉的?

    while(1)
    {
        BusyDelayS(1);
        printf("lazy\r\n");
    }
单片机给串口助手发消息,串口助手软件收到的消息被打出来了(串口助手加了时间戳)

[2024-07-31 17:59:55.981]
RX:lazy

[2024-07-31 17:59:57.853]
RX:lazy

使用特权

评论回复
15
AProgrammer|  楼主 | 2024-8-1 10:52 | 只看该作者
储小勇_526 发表于 2024-7-30 08:41
1ms干嘛要用_NOP实现,定时器精度达不到你要求?

还有一点,systick是靠中断实现的,要切换上下文,nop不需要切换上下文。当前nop不准

使用特权

评论回复
16
地瓜patch| | 2024-8-1 23:11 | 只看该作者
AProgrammer 发表于 2024-8-1 10:52
还有一点,systick是靠中断实现的,要切换上下文,nop不需要切换上下文。当前nop不准 ...

可以用示波器量一下时间

使用特权

评论回复
17
AProgrammer|  楼主 | 2024-8-2 11:51 | 只看该作者
xionghaoyun 发表于 2024-7-30 10:17
volatile static uint32_t delay_count;

void system_config(void)

需要用哪个管脚初始化吗?

使用特权

评论回复
18
qn7a12| | 2024-8-31 11:13 | 只看该作者
对于 GD32F103ZET6 这款芯片,其主频是 108 MHz。

使用特权

评论回复
19
王派oo| | 2024-9-30 13:33 | 只看该作者
对于SWD或JTAG信号线,可以适当增加上拉电阻以提高信号的抗干扰能力。

使用特权

评论回复
20
而服务器人| | 2024-9-30 13:37 | 只看该作者
你提到的两点方法非常有效,调试器与MCU之间使用屏蔽线可以降低外界干扰,改善信号质量,尤其是在电磁干扰较强的环境中。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

269

帖子

3

粉丝