STM32F407 uCOS-III工程
## uCOS_III_STM32F407
STM32F407ZGT6 uCOS-III LED TFTLCD UART KEY TOUCH
uCOS-III STM32F407ZGT6移植
工程所创建任务:
1、LED1 500ms闪烁一次
2、LED2 5000ms闪烁一次
3、USART1 100ms发送一次数据
4、LCD显示:检测四个按键,按下后显示上下左右;检测触摸按键,按下后文字提示;显示3任务中的数值累加记录
以上!
工程文件百度网盘地址:
链接:https://pan.baidu.com/s/1cFU4Ld9s7XQ6navILSs3Sg
提取码:q4cf
app_cfg.h
/* ********************************************************************************************************* * TASK PRIORITIES ********************************************************************************************************* */ #define APP_CFG_TASK_START_PRIO 2u #define APP_CFG_TASK_LED1_PRIO 3u #define APP_CFG_TASK_LED2_PRIO 3u #define APP_CFG_TASK_CALC_PRIO 4u #define APP_CFG_TASK_LCD_PRIO 4u /* ********************************************************************************************************* * TASK STACK SIZES ********************************************************************************************************* */ #define APP_CFG_TASK_START_STK_SIZE 128u #define APP_CFG_TASK_LED1_STK_SIZE 512u #define APP_CFG_TASK_LED2_STK_SIZE 512u #define APP_CFG_TASK_CALC_STK_SIZE 512u #define APP_CFG_TASK_LCD_STK_SIZE 512u
app.c
#include <includes.h>
static OS_TCB AppTaskStartTCB;
static CPU_STK AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE];
static OS_TCB AppTaskLed1TCB;
static CPU_STK AppTaskLed1Stk[APP_CFG_TASK_LED1_STK_SIZE];
static OS_TCB AppTaskLed2TCB;
static CPU_STK AppTaskLed2Stk[APP_CFG_TASK_LED2_STK_SIZE];
static OS_TCB AppTaskCalcTCB;
static CPU_STK AppTaskCalcStk[APP_CFG_TASK_CALC_STK_SIZE];
static OS_TCB AppTaskLcdTCB;
static CPU_STK AppTaskLcdStk[APP_CFG_TASK_LCD_STK_SIZE];
static void AppTaskStart (void *p_arg);
static void AppTaskLed1 (void *p_arg);
static void AppTaskLed2 (void *p_arg);
static void AppTaskCalc (void *p_arg);
static void AppTaskLcd (void *p_arg);
void LcdClear();
u16 testNumber = 0;
int main(void)
{
OS_ERR err;
//初始化
SysTick_Init(168);
HSI_SetSysClock(16, 432, 2, 9); //216M
USART1_Init(9600); //9600波特率
LED_Init();
TFTLCD_Init();
FSMC_SRAM_Init();
KEY_Init();
Touch_Key_Init(4);
OSInit(&err); /* Init uC/OS-III. */
OSTaskCreate((OS_TCB *)&AppTaskStartTCB, /* Create the start task */
(CPU_CHAR *)"App Task Start",
(OS_TASK_PTR )AppTaskStart,
(void *)0u,
(OS_PRIO )APP_CFG_TASK_START_PRIO,
(CPU_STK *)&AppTaskStartStk[0u],
(CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE / 10u,
(CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE,
(OS_MSG_QTY )2u,
(OS_TICK )0u,
(void *)0u,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSStart(&err); /* Start multitasking (i.e. give control to uC/OS-III). */
return (0u);
}
static void AppTaskStart (void *p_arg)
{
OS_ERR err;
printf("%d:", BSP_CPU_ClkFreq());
CPU_INT32U cpu_clk_freq;
CPU_INT32U cnts;
(void)p_arg;
/* Initialize BSP functions */
BSP_Init();
CPU_Init();
/* Determine SysTick reference freq. */
cpu_clk_freq = BSP_CPU_ClkFreq();
/* Determine nbr SysTick increments */
cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;
/* Init uC/OS periodic time src (SysTick). */
OS_CPU_SysTickInit(cnts);
/* Initialize Memory Management Module */
Mem_Init();
#if OS_CFG_STAT_TASK_EN > 0u
/* Compute CPU capacity with no task running */
OSStatTaskCPUUsageInit(&err);
#endif
// CPU_IntDisMeasMaxCurReset();
OSTaskCreate((OS_TCB *)&AppTaskLed1TCB, /* Create the start task */
(CPU_CHAR *)"App Task Led1",
(OS_TASK_PTR )AppTaskLed1,
(void *)0u,
(OS_PRIO )APP_CFG_TASK_LED1_PRIO,
(CPU_STK *)&AppTaskLed1Stk[0u],
(CPU_STK_SIZE )APP_CFG_TASK_LED1_STK_SIZE / 10u,
(CPU_STK_SIZE )APP_CFG_TASK_LED1_STK_SIZE,
(OS_MSG_QTY )5u,
(OS_TICK )0u,
(void *)0u,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSTaskCreate((OS_TCB *)&AppTaskLed2TCB, /* Create the start task */
(CPU_CHAR *)"App Task Led2",
(OS_TASK_PTR )AppTaskLed2,
(void *)0u,
(OS_PRIO )APP_CFG_TASK_LED2_PRIO,
(CPU_STK *)&AppTaskLed2Stk[0u],
(CPU_STK_SIZE )APP_CFG_TASK_LED2_STK_SIZE / 10u,
(CPU_STK_SIZE )APP_CFG_TASK_LED2_STK_SIZE,
(OS_MSG_QTY )5u,
(OS_TICK )0u,
(void *)0u,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSTaskCreate((OS_TCB *)&AppTaskCalcTCB, /* Create the start task */
(CPU_CHAR *)"App Task Calc",
(OS_TASK_PTR )AppTaskCalc,
(void *)0u,
(OS_PRIO )APP_CFG_TASK_CALC_PRIO,
(CPU_STK *)&AppTaskCalcStk[0u],
(CPU_STK_SIZE )APP_CFG_TASK_CALC_STK_SIZE / 10u,
(CPU_STK_SIZE )APP_CFG_TASK_CALC_STK_SIZE,
(OS_MSG_QTY )10u,
(OS_TICK )0u,
(void *)0u,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSTaskCreate((OS_TCB *)&AppTaskLcdTCB, /* Create the start task */
(CPU_CHAR *)"App Task Lcd",
(OS_TASK_PTR )AppTaskLcd,
(void *)0u,
(OS_PRIO )APP_CFG_TASK_LCD_PRIO,
(CPU_STK *)&AppTaskLcdStk[0u],
(CPU_STK_SIZE )APP_CFG_TASK_LCD_STK_SIZE / 10u,
(CPU_STK_SIZE )APP_CFG_TASK_LCD_STK_SIZE,
(OS_MSG_QTY )10u,
(OS_TICK )0u,
(void *)0u,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSTaskDel(&AppTaskStartTCB, &err);
}
static void AppTaskLed1(void *p_arg )
{
OS_ERR err;
(void)p_arg;
while (DEF_TRUE)
{
led1 = !led1;
OSTimeDly ( 500, OS_OPT_TIME_DLY, & err );
}
}
static void AppTaskLed2(void *p_arg )
{
OS_ERR err;
(void)p_arg;
while (DEF_TRUE)
{
led2 = !led2;
OSTimeDly ( 5000, OS_OPT_TIME_DLY, & err );
}
}
static void AppTaskCalc(void *p_arg )
{
OS_ERR err;
(void)p_arg;
while (DEF_TRUE)
{
for(int i=0;i<1000;i+=10)
{
printf("calc: %f\n", (i / 1000.0f));
testNumber = i;
OSTimeDly ( 100, OS_OPT_TIME_DLY, & err );
}
LcdClear();
testNumber = 0;
}
}
static void AppTaskLcd(void *p_arg )
{
OS_ERR err;
(void)p_arg;
u8 num_len = 0;
FRONT_COLOR=BLUE;
LCD_Clear(WHITE);
LCD_Set_Window(0, 0, tftlcd_data.width, tftlcd_data.height);
LCD_ShowString(64,164,tftlcd_data.width,tftlcd_data.height,12,"https://www.wiyixiao4.com/blog");
while (DEF_TRUE)
{
//检测按键
u8 key = KEY_Scan(0);
if(key > 0)
{
LcdClear();
}
switch(key)
{
case KEY_UP:
LCD_ShowString(64,96,tftlcd_data.width,tftlcd_data.height,16,"UP");
break;
case KEY_DOWN:
LCD_ShowString(64,96,tftlcd_data.width,tftlcd_data.height,16,"DOWN");
break;
case KEY_LEFT:
LCD_ShowString(64,96,tftlcd_data.width,tftlcd_data.height,16,"LEFT");
break;
case KEY_RIGHT:
LCD_ShowString(64,96,tftlcd_data.width,tftlcd_data.height,16,"RIGHT");
break;
}
//检测触摸
if(Touch_Key_Scan(0) == 1)
{
LcdClear();
LCD_ShowString(64,128,tftlcd_data.width,tftlcd_data.height,16,"TOUCH");
}
//显示串口数据
if(testNumber < 10)
num_len = 1;
else if(testNumber >= 10 && testNumber < 100)
num_len = 2;
else
num_len = 3;
LCD_ShowNum(164,96,testNumber,num_len,16);
}
}
void LcdClear()
{
LCD_Clear(WHITE);
LCD_ShowString(64,164,tftlcd_data.width,tftlcd_data.height,12,"https://www.wiyixiao4.com/blog");
}

浙公网安备 33010602011771号