"); //-->
代码:
主程序
#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 */
}效果图:

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
意法半导体的STM32CubeIDE开发环境新增FreeRTOS™线程感知调试功能
如何在XIAO ESP32S3上使用FreeRTOS,确保即使在互联网关闭时也能连续收集传感器数据
德州仪器宣布其SimpleLink™ MCU平台集成全新的Amazon FreeRTOS,实现快速云连接
嵌入式操作系统FreeRTOS的原理与实现
FreeRTOS系统是什么?
FreeRTOS,xSemaphoreTake 请问FreeRTOS中xSemaphoreTake()函数是干什么用的
一种嵌入式的太阳能干燥实时监控系统的设计方案
在晶心平台运行具 OSC 的 FreeRTOS
FreeRTOS 在STM32上的移植 V1.0
移植 FreeRTOS 環境下實現Web Server电路图
WiFi智能灯泡方案
关于Amazon FreeRTOS你可能还不知道
嵌入式操作系统FreeRTOS的原理与实现
移植 FreeRTOS 環境下實現Web Server
基于NXP iMX7 ARM处理器部署FreeRTOS实时操作系统
FreeRTOS User Manual
瑞萨FreeRTOS移植
移植 FreeRTOS 環境下實現Web Server
分享STM32F103上移植UCOSII和FreeRTOS
基于STM32和FreeRTOS的嵌入式太阳能干燥实时监测和
基于STM32和FreeRTOS的嵌入式太阳能干燥实时监测和控制系统设计
移植 FreeRTOS 環境下實現Web Server
英飞凌AURIX™ TC3x新增支持FreeRTOS