delay_ms(2);
时间: 2023-07-16 17:12:27 浏览: 106
这是一个函数调用,意思是让程序暂停执行 2 毫秒。在很多嵌入式系统中,时间的精度非常重要,而 delay 函数可以用来控制程序的执行速度,确保程序按照预期的时间来运行。常见的用法是在控制器上的 LED 灯闪烁中,通过 delay 函数来控制灯的亮灭时间。不过需要注意的是,使用 delay 函数会占用 CPU 的时间,如果 delay 时间太长,可能会影响系统的实时性。
相关问题
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定时器。
阅读全文