[C] 纯文本查看 复制代码 #include <stdio.h>
#include "board.h"
#include "FreeRTOS.h"
#include "task.h"
#include "FreeRTOS_Data.h"
#include "hpm_gpio_drv.h"
#include "hpm_mchtmr_drv.h"
SemaphoreHandle_t xKeyScanSemaphore;
//extern SemaphoreHandle_t xCANRXSemaphore;
extern int window_cnt;
extern void switch_window(void);
extern void gui_preload_image(void);
#define DEBOUNCE_TIME_MS 200
uint32_t last_key1_time = 0;
uint32_t last_key2_time = 0;
SDK_DECLARE_EXT_ISR_M(BOARD_APP_GPIO_IRQ, isr_gpio)
#define MCHTMR_CLK_NAME (clock_mchtmr0)
void configure_gpio_for_key_scan(void) {
gpio_set_pin_input(BOARD_APP_GPIO_CTRL, BOARD_KEY1_GPIO_INDEX, BOARD_KEY1_GPIO_PIN);
gpio_set_pin_input(BOARD_APP_GPIO_CTRL, BOARD_KEY2_GPIO_INDEX, BOARD_KEY2_GPIO_PIN);
gpio_interrupt_trigger_t trigger = gpio_interrupt_trigger_edge_falling;
gpio_config_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_KEY1_GPIO_INDEX, BOARD_KEY1_GPIO_PIN, trigger);
gpio_config_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_KEY2_GPIO_INDEX, BOARD_KEY2_GPIO_PIN, trigger);
gpio_enable_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_KEY1_GPIO_INDEX, BOARD_KEY1_GPIO_PIN);
gpio_enable_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_KEY2_GPIO_INDEX, BOARD_KEY2_GPIO_PIN);
intc_m_enable_irq_with_priority(BOARD_APP_GPIO_IRQ, 3);
}
void isr_gpio(void)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
BaseType_t canrxHigherPriorityTaskWoken = pdFALSE;
gpio_clear_pin_interrupt_flag(BOARD_APP_GPIO_CTRL, BOARD_KEY1_GPIO_INDEX,
BOARD_KEY1_GPIO_PIN);
gpio_clear_pin_interrupt_flag(BOARD_APP_GPIO_CTRL, BOARD_KEY2_GPIO_INDEX,
BOARD_KEY2_GPIO_PIN);
//xSemaphoreGiveFromISR(xCANRXSemaphore, &canrxHigherPriorityTaskWoken);
xSemaphoreGiveFromISR(xKeyScanSemaphore, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
void task_key_scan(void *pvParameters) {
while (1) {
if (xSemaphoreTake(xKeyScanSemaphore, portMAX_DELAY) == pdTRUE) {
debug_print_task_status();
uint32_t current_time = xTaskGetTickCount(); // 获取当前系统时间(ticks)
if (gpio_read_pin(BOARD_APP_GPIO_CTRL,BOARD_KEY1_GPIO_INDEX,BOARD_KEY1_GPIO_PIN) == 0) {
if (current_time - last_key1_time >= pdMS_TO_TICKS(DEBOUNCE_TIME_MS)){
printf("KEY1 window_cnt=%d\n",window_cnt);
last_key1_time = current_time;
gui_preload_image();
if (window_cnt >= 3) {
window_cnt = 0;
printf("window_cnt > 3 KEY1 window_cnt=%d\n",window_cnt);
}
window_cnt++;
switch_window();
}
}
if (gpio_read_pin(BOARD_APP_GPIO_CTRL,BOARD_KEY2_GPIO_INDEX,BOARD_KEY2_GPIO_PIN) == 0) {
if (current_time - last_key2_time >= pdMS_TO_TICKS(DEBOUNCE_TIME_MS))
{
window_cnt--;
printf("KEY2 window_cnt=%d\n",window_cnt);
last_key2_time = current_time;
gui_preload_image();
if (window_cnt <= 0) {
window_cnt = 3;
printf("window_cnt < 0 KEY2 window_cnt=%d\n",window_cnt);
}
switch_window();
}
}
vTaskDelay(pdMS_TO_TICKS(20));
}
}
}
void task_scan_key_entry(void) {
BaseType_t stat;
xKeyScanSemaphore = xSemaphoreCreateBinary();
if (xKeyScanSemaphore == NULL) {
printf("Failed to create semaphore.\n");
for (;;) {
}
}
configure_gpio_for_key_scan();
printf("intake task_scan_key!.\n");
if (xTaskCreate(task_key_scan, "key_scan",
TASK_KEY_SCAN_STACK_SIZE , NULL,
PRIORITY_TASK_KEY_SCAN, NULL) != pdPASS) {
printf("key_scan creation failed!.\n");
for (;;) {
}
}
printf("task_scan_key complete!.\n");
}
键盘扫描任务代码
|