发布日期:2024-12-06 12:52 点击次数:110
代码:好利来 丝袜
主形状
#include "./SYSTEM/sys/sys.h" #include "./SYSTEM/usart/usart.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/LCD/lcd.h" #include "./BSP/KEY/key.h" #include "./BSP/EXTI/exti.h" #include "freertos_demo.h" #include "./BSP/SDRAM/sdram.h" #include "./MALLOC/malloc.h" #define START_TASK_PRIO 1 #define START_STK_SIZE 128 const char *SRAM_NAME_BUF[SRAMBANK] = {" SRAMIN ", " SRAMCCM ", " SRAMEX "}; int main(void) { HAL_Init(); /* 开动化HAL库 */ sys_stm32_clock_init(360, 25, 2, 8); /* 开发时钟,180Mhz */ delay_init(180); /* 延时开动化 */ usart_init(115200); /* 串口开动化为115200 */ //usmart_dev.init(90); /* 开动化USMART */ led_init(); /* 开动化LED */ key_init(); /* 开动化按键 */ sdram_init(); /* SRAM开动化 */ //lcd_init(); /* 开动化LCD */ extix_init(); my_mem_init(SRAMIN); /* 开动化里面内存池 */ my_mem_init(SRAMEX); /* 开动化外部内存池 */ my_mem_init(SRAMCCM); /* 开动化CCM内存池 */ // lcd_show_string(30, 50, 200, 16, 16, "STM32", RED); // lcd_show_string(30, 70, 200, 16, 16, "MALLOC TEST", RED); // lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED); // lcd_show_string(30, 110, 200, 16, 16, "KEY0:Malloc KEY2:Free", RED); // lcd_show_string(30, 130, 200, 16, 16, "KEY_UP:SRAMx KEY1:Read", RED); // lcd_show_string(60, 160, 200, 16, 16, " SRAMIN ", BLUE); // lcd_show_string(30, 176, 200, 16, 16, "SRAMIN USED:", BLUE); // lcd_show_string(30, 192, 200, 16, 16, "SRAMCCM USED:", BLUE); // lcd_show_string(30, 208, 200, 16, 16, "SRAMEX USED:", BLUE); freertos_demo(); }
freertos_demo.c
#include "freertos_demo.h" #include "./SYSTEM/usart/usart.h" #include "./BSP/LED/led.h" #include "./BSP/KEY/key.h" #include "./SYSTEM/delay/delay.h" /*FreeRTOS*********************************************************************************************/ #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "semphr.h" #include "string.h" #include "limits.h" /******************************************************************************************************/ /*FreeRTOS设置*/ /* START_TASK 任务 设置 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务 */ #define START_TASK_PRIO 1 /* 任务优先级 */ #define START_STK_SIZE 128 /* 任务堆栈大小 */ TaskHandle_t StartTask_Handler; /* 任务句柄 */ void start_task(void *pvParameters); /* 任务函数 */ /* TASK1 任务 设置 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务 */ #define EVENTSETBIT_PRIO 2 /* 任务优先级 */ #define EVENTSETBIT_STK_SIZE 128 /* 任务堆栈大小 */ TaskHandle_t EventSetBit_Handler; /* 任务句柄 */ void eventsetbit(void *pvParameters); /* 任务函数 */ #define EVENTGROUP_PRIO 2 /* 任务优先级 */ #define EVENTGROUP_STK_SIZE 128 /* 任务堆栈大小 */ TaskHandle_t EventGroup_Handler; /* 任务句柄 */ void eventgroup(void *pvParameters); /* 任务函数 */ #define KEYMSG_Q_NUM 1 /* 任务函数 */ QueueHandle_t Key_Queue; #define EVENTBIT_0 (1<<0) #define EVENTBIT_1 (1<<1) #define EVENTBIT_2 (1<<2) #define EVENTBIT_ALL (EVENTBIT_1|EVENTBIT_2) /******************************************************************************************************/ /* LCD刷屏时使用的颜料 */ /** * @brief FreeRTOS例程进口函数 * @param 无 * @retval 无 */ void freertos_demo(void) { xTaskCreate((TaskFunction_t )start_task, /* 任务函数 */ (const char* )"start_task", /* 任务称号 */ (uint16_t )START_STK_SIZE, /* 任务堆栈大小 */ (void* )NULL, /* 传入给任务函数的参数 */ (UBaseType_t )START_TASK_PRIO, /* 任务优先级 */ (TaskHandle_t* )&StartTask_Handler); /* 任务句柄 */ vTaskStartScheduler(); } /** * @brief start_task * @param pvParameters : 传入参数(未用到) * @retval 无 */ void start_task(void *pvParameters) { taskENTER_CRITICAL(); Key_Queue=xQueueCreate(KEYMSG_Q_NUM,sizeof(uint8_t)); /* 创建任务1 */ xTaskCreate((TaskFunction_t )eventsetbit, (const char* )"eventsetbit", (uint16_t )EVENTSETBIT_STK_SIZE, (void* )NULL, (UBaseType_t )EVENTSETBIT_PRIO, (TaskHandle_t* )&EventSetBit_Handler); xTaskCreate((TaskFunction_t )eventgroup, (const char* )"eventgroup", (uint16_t )EVENTGROUP_STK_SIZE, (void* )NULL, (UBaseType_t )EVENTGROUP_PRIO, (TaskHandle_t* )&EventGroup_Handler); // xTaskCreate((TaskFunction_t )eventgroup, // (const char* )"eventquery", // (uint16_t )EVENTQUERY_STK_SIZE, // (void* )NULL, // (UBaseType_t )EVENTQUERY_PRIO, // (TaskHandle_t* )&EventQuery_Handler); vTaskDelete(StartTask_Handler); /* 删除入手任务 */ taskEXIT_CRITICAL(); /* 退出临界区 */ } /** * @brief task1 * @param pvParameters : 传入参数(未用到) * @retval 无 */ void eventsetbit(void *pvParameters) { uint8_t key; while(1) { if(EventGroup_Handler!=NULL) { key=key_scan(0); switch(key) { case KEY1_PRES: xTaskNotify(EventGroup_Handler,EVENTBIT_1,eSetBits); //xEventGroupSetBits(EventGroupHandle,EVENTBIT_1); break; case KEY2_PRES: xTaskNotify(EventGroup_Handler,EVENTBIT_2,eSetBits); //xEventGroupSetBits(EventGroupHandle,EVENTBIT_2); break; } } vTaskDelay(10); /* 延时1000ticks */ } } void eventgroup(void *pvParameters) { uint8_t num=0; static uint8_t eventvalue,event0flag,event1flag,event2flag; BaseType_t err; uint32_t NotifyValue; while(1) { err=xTaskNotifyWait(0,ULONG_MAX,&NotifyValue,portMAX_DELAY); if(err==pdPASS) { if(NotifyValue & EVENTBIT_0) { event0flag=1; } else if(NotifyValue & EVENTBIT_1) { event1flag=1; } else if(NotifyValue & EVENTBIT_2) { event2flag=1; } } eventvalue=event0flag|(event1flag<<1)|(event2flag<<2); printf("eventvalue =%#x\r\n",eventvalue); if(eventvalue==0x07) { num++; event0flag=0; event1flag=0; event2flag=0; printf("event running =%d\r\n",num); } } }
外部中断形状:
含羞草研究院在线看#include "./SYSTEM/sys/sys.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" #include "./BSP/KEY/key.h" #include "./BSP/EXTI/exti.h" #include "FreeRTOS.h" #include "task.h" /** * @brief KEY0 外部中断做事形状 * @param 无 * @retval 无 */ //extern TaskHandle_t Task2Task_Handler; #define EVENTBIT_0 (1<<0) /** * @brief KEY1 外部中断做事形状 * @param 无 * @retval 无 */ extern TaskHandle_t EventGroup_Handler; /* 任务句柄 */ /** * @brief KEY2 外部中断做事形状 * @param 无 * @retval 无 */ void KEY0_INT_IRQHandler(void) { //HAL_GPIO_EXTI_IRQHandler(KEY0_INT_GPIO_PIN); /* 调用中断处分公用函数,排除中断象征位 */ /* 退出时再清一次中断,幸免按键抖动误触发 */ delay_ms(20); /* 消抖 */ BaseType_t xYieldRequired,xHigherPriorityTaskWoken; //if (KEY0 == 0) { xTaskNotifyFromISR(EventGroup_Handler,EVENTBIT_0,eSetBits,&xHigherPriorityTaskWoken); /* LED0 情景取反 */ portYIELD_FROM_ISR(xYieldRequired); } //portYIELD_FROM_ISR(xYieldRequired); __HAL_GPIO_EXTI_CLEAR_IT(KEY0_INT_GPIO_PIN); } /** * @brief WK_UP 外部中断做事形状 * @param 无 * @retval 无 */ /** * @brief 中断做事形状中需要作念的事情 在HAL库中统共的外部中断做事函数王人会调用此函数 * @param GPIO_Pin:中断引脚号 * @retval 无 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { } /** * @brief 外部中断开动化形状 * @param 无 * @retval 无 */ void extix_init(void) { GPIO_InitTypeDef gpio_init_struct; key_init(); gpio_init_struct.Pin = KEY0_INT_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_IT_FALLING; /* 下落沿触发 */ gpio_init_struct.Pull = GPIO_PULLUP; HAL_GPIO_Init(KEY0_INT_GPIO_PORT, &gpio_init_struct); /* KEY2设置为下落沿触发中断 */ /* 使能中断线2 */ HAL_NVIC_SetPriority(KEY0_INT_IRQn, 6, 0); /* 霸占2,子优先级2 */ HAL_NVIC_EnableIRQ(KEY0_INT_IRQn); /* 使能中断线13 */ /* 使能中断线0 */ }
成果图:
*博客实质为网友个东谈主发布好利来 丝袜,仅代表博主个东谈主不雅点,如有侵权请有关责任主谈主员删除。