void delayms(uint16_t x) { uint16_t i; while(x--)for(i = 0; i < 120; i++); }
时间: 2023-06-22 12:18:23 浏览: 44
这是一个延时函数,输入参数x为需要延时的毫秒数。
函数内部使用for循环进行延时,每次循环执行120次(这个数字可能需要根据实际情况进行调整),循环次数为x,即总共延时x毫秒。
这种延时方式也被称为“忙等待”,因为在延时期间,CPU会一直占用处理器资源,无法进行其他操作。因此,在实际应用中,需要根据具体的需求和系统资源情况,选择合适的延时方式。
相关问题
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--; } }每一句都加注释
这段代码是用来实现毫秒级延时的功能。下面是每一句的注释:
```c
static __IO uint32_t delay_ms_ticks; // 定义一个静态全局变量,用来保存延时的时间
void delay_init(void) { // 延时初始化函数
SysTick_Config(SystemCoreClock/1000); // 配置 SysTick 定时器,使其每 1ms 中断一次
}
void delay_ms(uint16_t ms) { // 毫秒级延时函数,传入需要延时的时间(单位:毫秒)
delay_ms_ticks = ms; // 将需要延时的时间赋值给延时计数器
while(delay_ms_ticks); // 等待延时计数器归零,即延时完成
}
void SysTick_Handler() { // SysTick 中断服务函数
if (delay_ms_ticks > 0) // 如果延时计数器还未归零
{
delay_ms_ticks--; // 将计数器减一
}
}
```
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定时器。