/* set voltage internal voltage to 1.8V */ RCC->APB1ENR |= RCC_APB1ENR_PWREN; PWR->CR = PWR_CR_VOS_0; phal_clk_init(); /* enable peripheral and GPIO clocks */ RCC->IOPENR |= GPIO_CLOCKS; RCC->APB1ENR |= APB1_CLOCKS; RCC->APB2ENR |= APB2_CLOCKS; RCC->AHBENR |= AHB_CLOCKS; phal_timer_init(); #if (USE_DMA_FOR_UART_TX == IOL_FEATURE_ENABLED) phal_dma_init(); #endif #if (AL_TRIGGER == AL_FROM_INTERRUPT) phal_al_sw_interrupt_setup(); #endif
时间: 2023-04-09 21:03:56 浏览: 269
这段代码的作用是将内部电压设置为1.8V,然后初始化时钟和定时器,并启用外设和GPIO时钟。其中,RCC代表时钟控制寄存器,PWR代表电源控制寄存器,APB1ENR、APB2ENR、AHBENR分别代表不同的时钟总线。GPIO_CLOCKS、APB1_CLOCKS、APB2_CLOCKS、AHB_CLOCKS则是不同的外设和GPIO时钟。
相关问题
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定时器。
STM32L431采用LSI (32kHz)作为 RTC 的时钟源,每秒钟 RTC_CNT 计数器递增 1,写一个RTC初始化函数
好的,以下是一个简单的RTC初始化函数,可以供参考:
```c
void RTC_Init(void)
{
// 使能PWR和RTC时钟
RCC_APB1ENR1 |= RCC_APB1ENR1_PWREN;
RCC_APB1ENR1 |= RCC_APB1ENR1_RTCAPBEN;
// 进入RTC初始化模式
RTC_CR &= ~(RTC_CR_WUTE | RTC_CR_FMT | RTC_CR_ALRAE | RTC_CR_ALRBE | RTC_CR_TSE | RTC_CR_WUCLKSEL | RTC_CR_BYPSHAD);
// 等待RTC寄存器同步
RTC_WaitForSynchro();
// 设置RTC时钟源
RCC_CSR |= RCC_CSR_LSION; // 使能LSI
while((RCC_CSR & RCC_CSR_LSIRDY) == 0); // 等待LSI稳定
RCC_CSR &= ~RCC_CSR_RTCSEL; // 选择LSI为RTC时钟源
// 设置RTC预分频器
RTC_PRER = (127 << RTC_PRER_PREDIV_S_Pos) | (255 << RTC_PRER_PREDIV_A_Pos); // 使RTC时钟为1Hz
// 退出RTC初始化模式
RTC_CR &= ~RTC_CR_INIT;
while((RTC_ISR & RTC_ISR_INITF) != 0); // 等待RTC退出初始化模式
}
```
需要注意的是,以上代码只是一个简单的RTC初始化函数,实际使用中需要根据具体需求进行修改和完善。例如,需要设置RTC闹钟、中断等功能。
阅读全文