初级会员

- 积分
- 157
- 金钱
- 157
- 注册时间
- 2017-3-24
- 在线时间
- 42 小时
|
发表于 2020-1-26 21:46:35
|
显示全部楼层
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "sram.h"
#include "malloc.h"
#include "ILI93xx.h"
#include "led.h"
#include "key.h"
#include "timer.h"
#include "touch.h"
#include "sdio_sdcard.h"
#include "GUI.h"
#include "ff.h"
#include "exfuns.h"
#include "w25qxx.h"
#include "fontupd.h"
#include "includes.h"
#include "EmWinHZFont.h"
#include "WM.h"
#include "BUTTON.h"
#include "mytext.h"
#include "ButtonUse.h"
#include "DIALOG.h"
#include "usmart.h"
#include "beep.h"
#include "diskio.h" /* FatFs lower layer API */
#include "ff.h" // FATFS和应用模块公用的包含文件
#include "aux_data.h"
#include "fattester.h"
#include "exfuns.h"
/************************************************
ALIENTEK 探索者STM32F407开发板
STemWin 文本显示实验
UCOSIII中以下优先级用户程序不能使用,ALIENTEK
将这些优先级分配给了UCOSIII的5个系统内部任务
优先级0:中断服务服务管理任务 OS_IntQTask()
优先级1:时钟节拍任务 OS_TickTask()
优先级2:定时任务 OS_TmrTask()
计算活动任务的堆栈使用量:OSTaskStkChk &p_tcb->StkFree,&p_tcb->StkUsed,
特别注意:在要显示汉字的任务程序中必须加这个头文件"EmWinHZFont.h"//要显示汉字必须加这个头文件
广州市星翼电子科技有限公司
作者:正点原子 @ALIENTEK
************************************************/
//字库更新任务
//设置任务优先级
#define FONTUPDATA_TASK_PRIO 7
//任务堆栈大小
#define FONTUPDATA_STK_SIZE 128
//任务控制块
OS_TCB FontupdataTaskTCB;
//任务堆栈
CPU_STK FONTUPDATA_TASK_STK[FONTUPDATA_STK_SIZE];
//字库更新任务
void fontupdata_task(void *p_arg);
/************************************************/
//任务优先级
#define START_TASK_PRIO 3
//任务堆栈大小
#define START_STK_SIZE 1024
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);
//TOUCH任务
//设置任务优先级
#define TOUCH_TASK_PRIO 4
//任务堆栈大小
#define TOUCH_STK_SIZE 128
//任务控制块
OS_TCB TouchTaskTCB;
//任务堆栈
CPU_STK TOUCH_TASK_STK[TOUCH_STK_SIZE];
//touch任务
void touch_task(void *p_arg);
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO 5
//任务堆栈大小
#define LED0_STK_SIZE 128
//任务控制块
OS_TCB Led0TaskTCB;
//任务堆栈
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
//led0任务
void led0_task(void *p_arg);
//EMWINDEMO任务
//设置任务优先级
#define EMWINDEMO_TASK_PRIO 6
//任务堆栈大小
#define EMWINDEMO_STK_SIZE 2048
//任务控制块
OS_TCB EmwindemoTaskTCB;
//任务堆栈
CPU_STK EMWINDEMO_TASK_STK[EMWINDEMO_STK_SIZE];
//emwindemo_task任务
void emwindemo_task(void *p_arg);
u8 cpy_msg_show(u8* name,u8 pct,u8 mode)
{
// if(mode&0X01)printf("\r\ncopy file:%s\r\n",name);
// if(mode&0X02)printf("file copyed:%d\r\n",pct);
return 0;
}
u8 mf_file_copy(u8* src,u8* dst)
{
return exf_copy(cpy_msg_show,src,dst,0,0,0);
}
int main(void)
{
u8 res=0;
OS_ERR err;
CPU_SR_ALLOC();
delay_init(168); // 延时初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断分组配置
uart_init(115200); // 串口波特率设置
TFTLCD_Init(); // 初始化LCD
W25QXX_Init(); // 初始化W25Q128
LED_Init(); // LED初始化
BEEP_Init(); // 初始化蜂鸣器
exfuns_init();
usmart_dev.init(84); // 初始化USMART
FSMC_SRAM_Init(); // SRAM初始化
mem_init(SRAMIN); // 内部RAM初始化
mem_init(SRAMEX); // 外部RAM初始化
mem_init(SRAMCCM); // CCM初始化
disk_initialize(1); // 初始化磁盘
exfuns_init(); // 为fatfs文件系统分配内存
f_mount(fs[0],"0:",1); // 挂载SD卡
res=f_mount(fs[1],"1:",1); // 挂载FLASH
if(res==0X0D) // FLASH磁盘,FAT文件系统错误,重新格式化FLASH
{
LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting..."); //格式化FLASH
res=f_mkfs("1:",0,0);//格式化W25Q128,盘符:1;disk_initialize(1)中设置了格式化为6M字节为fatfs文件系统用。
if(res==0)
{
f_setlabel((const TCHAR *)"1:ALIENTEK"); //设置Flash磁盘的名字为:ALIENTEK
LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish"); //格式化完成
}else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error "); //格式化失败
delay_ms(1000);
}
TP_Init(); //初始化触摸屏
OSInit(&err); //初始化UCOSIII
/********************* 初始化字库 ***************************/
while(font_init()) //初始化字库
{
LCD_ShowString(30,70,240,32,32,"Font Error!");
while(SD_Init()) //检测SD卡
{
LCD_ShowString(30,104,240,32,32,"SD Card Failed!");
delay_ms(200);
LCD_Fill(30,104,200+30,70+32,WHITE);
delay_ms(200);
}
update_font(30,104,32,"0:"); //如果字库不存在就更新字库
delay_ms(2000);
LCD_Clear(WHITE); //清屏
break;
}
OS_CRITICAL_ENTER(); //进入临界区
//创建开始任务
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任务控制块
(CPU_CHAR * )"start task", //任务名字
(OS_TASK_PTR )start_task, //任务函数
(void * )0, //传递给任务函数的参数
(OS_PRIO )START_TASK_PRIO, //任务优先级
(CPU_STK * )&START_TASK_STK[0], //任务堆栈基地址
(CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位
(CPU_STK_SIZE)START_STK_SIZE, //任务堆栈大小
(OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
(OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
(void * )0, //用户补充的存储区
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
(OS_ERR * )&err); //存放该函数错误时的返回值
OS_CRITICAL_EXIT(); //退出临界区
OSStart(&err); //开启UCOSIII
while(1);
}
//开始任务函数
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //统计任务
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候
//使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC,ENABLE);//开启CRC时钟
WM_SetCreateFlags(WM_CF_MEMDEV); //启动所有窗口的存储设备
GUI_Init(); //STemWin初始化
OS_CRITICAL_ENTER(); //进入临界区
//STemWin Demo任务
OSTaskCreate((OS_TCB* )&EmwindemoTaskTCB,
(CPU_CHAR* )"Emwindemo task",
(OS_TASK_PTR )emwindemo_task,
(void* )0,
(OS_PRIO )EMWINDEMO_TASK_PRIO,
(CPU_STK* )&EMWINDEMO_TASK_STK[0],
(CPU_STK_SIZE)EMWINDEMO_STK_SIZE/10,
(CPU_STK_SIZE)EMWINDEMO_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void* )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR* )&err);
//触摸屏任务
OSTaskCreate((OS_TCB* )&TouchTaskTCB,
(CPU_CHAR* )"Touch task",
(OS_TASK_PTR )touch_task,
(void* )0,
(OS_PRIO )TOUCH_TASK_PRIO,
(CPU_STK* )&TOUCH_TASK_STK[0],
(CPU_STK_SIZE)TOUCH_STK_SIZE/10,
(CPU_STK_SIZE)TOUCH_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void* )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR* )&err);
//LED0任务
OSTaskCreate((OS_TCB* )&Led0TaskTCB,
(CPU_CHAR* )"Led0 task",
(OS_TASK_PTR )led0_task,
(void* )0,
(OS_PRIO )LED0_TASK_PRIO,
(CPU_STK* )&LED0_TASK_STK[0],
(CPU_STK_SIZE)LED0_STK_SIZE/10,
(CPU_STK_SIZE)LED0_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void* )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR* )&err);
//字库更新任务
OSTaskCreate((OS_TCB* )&FontupdataTaskTCB,
(CPU_CHAR* )"Fontupdata task",
(OS_TASK_PTR )fontupdata_task,
(void* )0,
(OS_PRIO )FONTUPDATA_TASK_PRIO,
(CPU_STK* )&FONTUPDATA_TASK_STK[0],
(CPU_STK_SIZE)FONTUPDATA_STK_SIZE/10,
(CPU_STK_SIZE)FONTUPDATA_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void* )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR* )&err);
OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //挂起开始任务
OS_CRITICAL_EXIT(); //退出临界区
}
//EMWINDEMO任务
void emwindemo_task(void *p_arg)
{
GUI_CURSOR_Show(); //调用鼠标
//更换皮肤
BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
MENU_SetDefaultSkin(MENU_SKIN_FLEX);
MULTIPAGE_SetDefaultSkin(MULTIPAGE_SKIN_FLEX);
PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
SPINBOX_SetDefaultSkin(SPINBOX_SKIN_FLEX);
while(1)
{
ButtonUse_Demo(); //
}
}
//TOUCH任务
void touch_task(void *p_arg)
{
OS_ERR err;
while(1)
{
GUI_TOUCH_Exec(); // 触摸屏驱动通过 GUI_TOUCH_Exec() 函数持续监控和更新触控面板,该函数在意识到执行了某项动
//作或发生什么变化时,会调用适当的通用触摸屏 API 程序。
OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_PERIODIC,&err);//延时5ms
}
}
//LED0任务
void led0_task(void *p_arg)
{
u32 total,free;
OS_ERR err;
while(1)
{
exf_getfree("1:",&total,&free);
printf("\r\n FLASH总容量:%d KB,FLASH余容量:%d KB。 \r\n",total,free);
LED0 = !LED0;
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err);//延时500ms
}
}
//字库更新任务
//KEY_UP键长按2s更新字库
void fontupdata_task(void *pdata)
{
FRESULT result;
OS_ERR err;
while(1)
{
// if(WK_UP == 1){ //KEY_UP键按下
// OSTimeDlyHMSM(0,0,0,40,OS_OPT_TIME_PERIODIC,&err);//延时2s
// if(WK_UP == 1) //还是KEY_UP键
// {
//// LCD_Clear(WHITE);
// OSSchedLock(&err); //调度器上锁
// printf("HZ Updataing,Please Wait...");
//// LCD_ShowString(10,40,400,30,32,"HZ Updataing,Please Wait...");//是用font.h的字符
////// update_font(10,84,32,"0:");//更新字库 是用font.h的字符
////// LCD_Clear(WHITE);
////// POINT_COLOR = BLACK; // BLACK
////// LCD_ShowString(10,40,400,30,32,"HZ Updata finshed.");//是用font.h的字符
////// LCD_ShowString(10,82,400,30,32,"Please Restart!");//是用font.h的字符
//
// OSSchedUnlock(&err); //调度器解锁
//
// }
// }
/********************start*************************/
// res=f_open (&fil,"0:/message.txt", FA_CREATE_ALWAYS|FA_WRITE);//打开文件,设置为没有就创建,并设置为写操作
//
// f_write (&fil, "Please Restart!", 50, &bww);//写“alientek test”,50个字节
//
// f_close(&fil);
//
// res=f_open (&fil,"0:/message.txt", FA_READ);
//
// f_read (&fil, buf,100,&bww);
// f_close(&fil);
// printf("\r\n message.txt:%s。 \r\n",buf);
/********************end***************************/
/*开启按键GPIO口的时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1);
OSSchedLock(&err); //调度器上锁
/*** 格式化FLASH */
// result = f_mount(fs[1],"1:",1);
// BURN_INFO("正在格式化FLASH...");
// //格式化FLASH
// result = f_mkfs(FLASH_ROOT,0,0);
// //重新挂载flash
// result = f_mount(NULL,FLASH_ROOT,1);
// result = f_mount(fs[1],"1:",1);
// //如果文件系统挂载失败就退出
// if(result != FR_OK)
// {
// BURN_ERROR("FLASH文件系统挂载失败,请复位重试!");
// }else{
// BURN_ERROR("FLASH格式化完成");
// }
/********************end***************************/
/*** 删除文件 */
// result=f_unlink("1:新宋体25.xbf");
// if(result==FR_OK){printf("删除GB2312_H3232.FON成功");
// }else{
// printf("删除失败");
// }
/*** 复制文件 */
// if(mf_file_copy("0:/srcdata/新宋体25.xbf","1:/新宋体25.xbf")==0)printf("复制新宋体25.xbf成功");
mf_scan_files("1:");
OSSchedUnlock(&err); //调度器解锁
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);//延时10ms
}
} |
|