state = 0xff; SysTick_Config(72000); //10ms、
时间: 2024-04-04 15:33:23 浏览: 18
这段代码是用来配置系统定时器(SysTick)的。在这段代码中,state变量被赋值为0xff,而SysTick_Config函数被调用,并传入72000作为参数。SysTick_Config函数的作用是配置系统定时器的时钟源和计数周期,从而实现定时器的定时功能。在这里,72000是时钟源的频率,表示每秒钟定时器会计数72000次。由于这个定时器被设置为10ms,因此每次计数完720次后,就会触发一次定时器中断,执行相应的处理函数。
相关问题
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定时器。
void busy(void) { uchar temp; s_ms(500); PORTD&=~(1<<RS); //RS=7 s_ms(500); PORTD|=(1<<RW); //RW=6 s_ms(500); while(temp) { PORTD|=(1<<EN); //EN=5 s_ms(500); DDRC=0x00; //A口变输入 PORTC=0xff; //上拉使能 s_ms(500); temp = PINC&0x80; //读取C口 s_ms(500); DDRC=0xff; PORTC=0xff; //C口变输出 s_ms(500); PORTD&=~(1<<EN); //EN=0 s_ms(500); } } 解释意思
这段代码是一个函数,函数名为busy,没有参数和返回值。该函数的目的是检测LCD1602是否处于忙状态。
函数中使用了一些引脚控制和延时操作,具体解释如下:
1. s_ms(500); //延时500毫秒
2. PORTD &= ~(1<<RS); //将PD7口清零,RS=7
3. s_ms(500); //延时500毫秒
4. PORTD |= (1<<RW); //将PD6口置1,RW=6
5. s_ms(500); //延时500毫秒
6. while(temp) //进入循环,直到temp值为0才退出
7. {
8. PORTD |= (1<<EN); //将PD5口置1,EN=5
9. s_ms(500); //延时500毫秒
10. DDRC = 0x00; //将PC口设置为输入
11. PORTC = 0xff; //将PC口上拉
12. s_ms(500); //延时500毫秒
13. temp = PINC & 0x80; //读取PC7口的值,temp为0表示忙状态结束
14. s_ms(500); //延时500毫秒
15. DDRC = 0xff; //将PC口设置为输出
16. PORTC = 0xff; //将PC口置1
17. s_ms(500); //延时500毫秒
18. PORTD &= ~(1<<EN); //将PD5口清零,EN=5
19. s_ms(500); //延时500毫秒
20. }
总体来说,该函数的作用就是不断地读取LCD1602的忙状态,直到其处于空闲状态为止。其中的具体实现方式是通过设置不同的引脚状态和延时操作来达到目的。