void delay_ms(uint32_t ms) { uint32_t i, j; for (i = 0; i < ms; i++) for (j = 0; j < 2000; j++); }
时间: 2024-05-23 10:15:46 浏览: 226
看起来这是一个简单的延时函数,它会在输入的毫秒数内进行循环延时。在每个循环中,内部的j循环将会执行2000次。因此,这个函数的延时时间将会受到两个因素的影响:输入的毫秒数和循环中内部j循环的次数。在某些情况下,这种方法可能会有问题,因为延时时间可能会因处理器速度和其他因素而变化。如果需要更精确的延时,建议使用定时器或其他硬件计时器进行延时。
相关问题
static __IO uint32_t delay_ms_ticks; void delay_init(void) { SysTick_Config(SystemCoreClock/1000); } void delay_ms(uint16_t ms) { delay_ms_ticks = ms; while(delay_ms_ticks); } void SysTick_Handler() { if (delay_ms_ticks > 0) { delay_ms_ticks--; } }
这是一段用于 STM32 MCU 的延时函数代码。其原理是使用 SysTick 定时器来计时,每当 SysTick 定时器中断时,就将延时计数器减一,当计数器为零时,延时结束。其中,delay_init 函数用于初始化 SysTick 定时器,设置为每毫秒中断一次;delay_ms 函数用于启动一次指定的毫秒级延时;SysTick_Handler 函数则是 SysTick 定时器中断服务函数,每次中断时将计数器减一。需要注意的是,这段代码中的 delay_ms_ticks 变量必须声明为 volatile,以避免编译器优化造成的问题。
static __IO uint32_t delay_ms_ticks; static inline void delay_init(void) { SysTick_Config(SystemCoreClock/1000); } static inline void delay_ms(uint16_t ms) { delay_ms_ticks = ms; while(delay_ms_ticks); } __weak void SysTick_Handler() { if (delay_ms_ticks > 0) { delay_ms_ticks--; } }改为使用外部32.768KHz晶振的延时函数
首先,需要明确的是使用外部32.768KHz晶振的延时函数需要使用RTC定时器,因为RTC定时器使用的是低速外部晶振。以下是修改后的代码:
```c
static __IO uint32_t delay_ms_ticks;
static inline void delay_init(void) {
RCC->APB1ENR1 |= RCC_APB1ENR1_PWREN; // Enable power interface clock
PWR->CR1 |= PWR_CR1_DBP; // Enable access to RTC, backup and power registers
RCC->BDCR |= RCC_BDCR_RTCEN; // Enable RTC clock
RCC->BDCR |= RCC_BDCR_RTCSEL_LSE; // Select low speed external oscillator as RTC clock
RTC->WPR = 0xCA; // Unlock write protection
RTC->WPR = 0x53;
RTC->ISR |= RTC_ISR_INIT; // Enter initialization mode
while (!(RTC->ISR & RTC_ISR_INITF)); // Wait for initialization flag to be set
RTC->PRER = (127 << 16) | (255); // Set prescaler values for 32.768KHz oscillator
RTC->ISR &= ~RTC_ISR_INIT; // Exit initialization mode
RTC->WPR = 0xFF; // Lock write protection
}
static inline void delay_ms(uint16_t ms) {
delay_ms_ticks = ms;
while (delay_ms_ticks);
}
__weak void RTC_WKUP_IRQHandler() {
if (delay_ms_ticks > 0) {
delay_ms_ticks--;
}
}
```
在上述代码中,我们首先使能了PWR、RTC和BKP的时钟,并且解锁了RTC写保护。然后选择了低速外部晶振作为RTC时钟源,并且设置了对应的预分频器值。最后,我们将写保护锁定,并在RTC的WKUP中断句柄中进行延时操作。需要注意的是,在这里我们使用了RTC的WKUP中断而不是SysTick中断来进行延时,因为我们现在使用的是RTC定时器。
阅读全文