板子为GD32F103ZET6,想用NOP指令来延时1ms,改怎么做呢?
板子为GD32F103ZET6,想用NOP指令来延时1ms,改怎么做呢?查了一些帖子,说是用晶振来算机器周期,GD32的板子是108M 这个来算吗
感谢分享 使用思源宋体参考或者定时器实现精确延时。 systic 1ms干嘛要用_NOP实现,定时器精度达不到你要求? 储小勇_526 发表于 2024-7-30 08:42
1ms干嘛要用_NOP实现,定时器精度达不到你要求?
当时可以用定时器中断来实现。当前先简单点实现看看是否满足功能。 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--;
}
}
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
volatile static uint32_t delay_count;
void system_config(void)
感谢您的回复 一个nop就是一个机器周期 本帖最后由 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主频走的?
AProgrammer 发表于 2024-7-31 16:15
一个nop执行时间是 1/108M s,也就是说1s要执行108M个nop,我这么写了下:当传入是1时,实际执行时间感 ...
牛掰,怎么计时的,执行时间感觉大于1s,怎么感觉的? 建议使用嘀嗒时钟进行问题解决,因为NOP不稳定 地瓜patch 发表于 2024-7-31 21:10
牛掰,怎么计时的,执行时间感觉大于1s,怎么感觉的?
while(1)
{
BusyDelayS(1);
printf("lazy\r\n");
}
单片机给串口助手发消息,串口助手软件收到的消息被打出来了(串口助手加了时间戳)
RX:lazy
RX:lazy
储小勇_526 发表于 2024-7-30 08:41
1ms干嘛要用_NOP实现,定时器精度达不到你要求?
还有一点,systick是靠中断实现的,要切换上下文,nop不需要切换上下文。当前nop不准 AProgrammer 发表于 2024-8-1 10:52
还有一点,systick是靠中断实现的,要切换上下文,nop不需要切换上下文。当前nop不准 ...
可以用示波器量一下时间 xionghaoyun 发表于 2024-7-30 10:17
volatile static uint32_t delay_count;
void system_config(void)
需要用哪个管脚初始化吗? 对于 GD32F103ZET6 这款芯片,其主频是 108 MHz。 对于SWD或JTAG信号线,可以适当增加上拉电阻以提高信号的抗干扰能力。 你提到的两点方法非常有效,调试器与MCU之间使用屏蔽线可以降低外界干扰,改善信号质量,尤其是在电磁干扰较强的环境中。
页:
[1]
2