AProgrammer 发表于 2024-7-29 14:45

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

板子为GD32F103ZET6,想用NOP指令来延时1ms,改怎么做呢?
查了一些帖子,说是用晶振来算机器周期,GD32的板子是108M 这个来算吗

shenxiaolin 发表于 2024-7-29 22:04

感谢分享

shenxiaolin 发表于 2024-7-29 22:04

使用思源宋体参考或者定时器实现精确延时。

shenxiaolin 发表于 2024-7-29 22:05

systic

储小勇_526 发表于 2024-7-30 08:41

1ms干嘛要用_NOP实现,定时器精度达不到你要求?

AProgrammer 发表于 2024-7-30 09:39

储小勇_526 发表于 2024-7-30 08:42
1ms干嘛要用_NOP实现,定时器精度达不到你要求?

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

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--;
    }
}

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)
      ;
}

AProgrammer 发表于 2024-7-30 11:19

xionghaoyun 发表于 2024-7-30 10:18
volatile static uint32_t delay_count;

void system_config(void)


感谢您的回复

地瓜patch 发表于 2024-7-31 15:22

一个nop就是一个机器周期

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主频走的?

地瓜patch 发表于 2024-7-31 21:10

AProgrammer 发表于 2024-7-31 16:15
一个nop执行时间是 1/108M    s,也就是说1s要执行108M个nop,我这么写了下:当传入是1时,实际执行时间感 ...

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

小小蚂蚁举千斤 发表于 2024-7-31 21:32

建议使用嘀嗒时钟进行问题解决,因为NOP不稳定

AProgrammer 发表于 2024-8-1 09:05

地瓜patch 发表于 2024-7-31 21:10
牛掰,怎么计时的,执行时间感觉大于1s,怎么感觉的?

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


RX:lazy


RX:lazy

AProgrammer 发表于 2024-8-1 10:52

储小勇_526 发表于 2024-7-30 08:41
1ms干嘛要用_NOP实现,定时器精度达不到你要求?

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

地瓜patch 发表于 2024-8-1 23:11

AProgrammer 发表于 2024-8-1 10:52
还有一点,systick是靠中断实现的,要切换上下文,nop不需要切换上下文。当前nop不准 ...

可以用示波器量一下时间

AProgrammer 发表于 2024-8-2 11:51

xionghaoyun 发表于 2024-7-30 10:17
volatile static uint32_t delay_count;

void system_config(void)


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

qn7a12 发表于 2024-8-31 11:13

对于 GD32F103ZET6 这款芯片,其主频是 108 MHz。

王派oo 发表于 2024-9-30 13:33

对于SWD或JTAG信号线,可以适当增加上拉电阻以提高信号的抗干扰能力。

而服务器人 发表于 2024-9-30 13:37

你提到的两点方法非常有效,调试器与MCU之间使用屏蔽线可以降低外界干扰,改善信号质量,尤其是在电磁干扰较强的环境中。
页: [1] 2
查看完整版本: 板子为GD32F103ZET6,想用NOP指令来延时1ms,改怎么做呢?