static void key_hw_int_isr_0(uint32_t const *event_pins_low_to_high, uint32_t const *event_pins_high_to_low) { key_hw_int_isr(&g_key_driver_mgr.key_instance[KEY_DRIVER_INDEX_0], event_pins_low_to_high, event_pins_high_to_low); } static void key_hw_int_isr_1(uint32_t const *event_pins_low_to_high, uint32_t const *event_pins_high_to_low) { key_hw_int_isr(&g_key_driver_mgr.key_instance[KEY_DRIVER_INDEX_1], event_pins_low_to_high, event_pins_high_to_low); }
时间: 2023-08-22 08:10:56 浏览: 95
这段代码看起来是针对硬件中断处理的,其中定义了两个函数,分别对应不同的硬件中断。在这两个函数中,都调用了一个名为key_hw_int_isr的函数,并传入了不同的参数。可以猜测这个key_hw_int_isr函数是用来处理硬件中断的通用函数,而这里的代码是在不同的硬件中断触发时,调用这个通用函数并传入不同的参数,以区分不同的硬件中断。
相关问题
static void key_hw_int_isr(key_driver_instance_t *p_key_instance, uint32_t const * event_pins_low_to_high, uint32_t const * event_pins_high_to_low) { do { if((*event_pins_high_to_low & p_key_instance->pin_mask) != 0) { key_hw_int_send_event(p_key_instance, true); //按键按下 } else if((*event_pins_low_to_high & p_key_instance->pin_mask) != 0) { key_hw_int_send_event(p_key_instance, false); //按键弹起 } else { break; } key_hw_int_disable(p_key_instance); //禁止检测 }while(0); }
这是一个关于按键中断处理的函数,它接收一个 key_driver_instance_t 类型的指针参数和两个 uint32_t 类型的指针参数。其中,event_pins_low_to_high 表示从低电平到高电平的事件标志,event_pins_high_to_low 表示从高电平到低电平的事件标志。该函数的作用是检测哪个按键被按下或弹起,并调用 key_hw_int_send_event 函数发送事件。在检测到按键事件后,该函数会禁用按键中断检测,以避免重复触发事件。
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定时器。
阅读全文