你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
AiHeRong_H.rar
2019-11-11 04:14 上传
点击文件名下载附件
603.91 KB, 下载次数: 26
举报
缺省是己装入字库或同时按下下面一排3个按键安装字库,没字库也没关系跳过中文显示即可正常1 g! m: R6 T' U1 ^. i
操作!该文件还未包括Lwip,485等,(由于其中有一部分函数为引用原版文件,故仅供坛友相互学习,不要它用,以免侵犯他们版权),切换注释和startup.s文件能看到两种结果以下是main.c7 M, i' y0 |0 j9 B1 O5 f
// 此示例文件涉及库函数部分已经全部改写(完全脱离),不涉及库的部分函数引用深圳普中科技有限公司// PZ-6806L开发板例程改写而成 本实验板12M晶振 LCD型号: R61509V3 2019-10-12 夜2:00#include "aiherong.h"/*20190916 * /#define nFS 60 //定义处理文件的个数!FileNameTypeDef filename[nFS];int main(){ // i - 目录下逐个图片文件处理,相当第几个文件 int i=0,j,fn; //fn-for whole BMPFileStr; j-only FNameStr or typeStr u8 pth[9] = {"0:/"}; //{"0:/图片"}; //要显示的图片的文件地址 u8 picFile[nFS]; u8 num[6]; //用于显示SD卡空间多少兆 u32 sdCapacity, sdFreeSize; //^ FATFS_GetFree 参数 AHR_initSysTick(9000,0,0);// AHR_initHSEclock(RCC_PLLSource_HSE_Div2,RCC_CFGR_PLLMULL10);//【 AIRCR:E000_ED00】31~16写钥匙)=0x05FA;15:0-LSB,1-MSB;A~8:0x500-从位5处划分(共2个位表示抢占优先级)// *(volatile unsigned int *)0xE000ED00 = 0x05FA0500;//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); AHR_initSRAM_FSMC(); AHR_initUS123ART45(1,9600,0x0C,2,0,0,0,0); //串1优先级2 AHR_initTFTLCD(0); AHR_initEN25QXX(); //初始化EN25Q128 如果开发板的外闪存里的字库被清除,约20秒异常,要等待!-艾和荣- initKEY_UpA0LfE2DwE3RgE4(); //待完善 *(unsigned int*)0x40021018|=(uint32_t)0x00000010; //APB2GPIOC(10)ClockEnable GPIO15~8偏移:04H *(unsigned int*)0x40011000 =(uint32_t)0x33333333; //GPIOC0~7 out_50MHzPP 3-推挽输出;B-复用推挽 *(unsigned int*)0x40011010 =(uint32_t)0x000000FF; //关闭ALL:共阳故下置高 8-上下拉入;4-浮空输入 LCD_ShowString(0,0,tLCData.width,tLCData.height,16,"Connect 2 USB lines, Power on read this information\,then press KEY_UP, waiting for a moment and you'll find 2 Disks in 'My Computer',Copy a few BMP files \which pixels < 240X400, then unload that 2 Disks from Bottom Bar and press Key_Right to browse the pictures");//"接上两条USB,打开电源,按UP按键,等一会在‘我的电脑’出现SD卡和FLASH两个盘符,\可以查看内容,复制一些不大于240X400像素的BMP图片文件到SD卡,然后安全卸载两盘符。再按Right键,按提示看图片"); //delayu0m1(1,15000); 没有预先安装字库此处乱码,按UP键跳过 while(KeyScanPZ6806L(0)!=KEY_UP); LCD_Clear(BACK_COLOR); initMEM(ICSRAM); //初始化内部内存池 initMEM(EXSRAM); //初始化外部内存池,必须先FSMC_SRAM_Init(); if(AHR_initSDCard()!=0) LCD_ShowString(10,20,90,40,16,"SDErrOrNone"); //检测SD卡错误 else{ //SD 卡正常 Mass_Memory_Size[0]=(long long)SD_GetSectorCount()*512;//得到SD卡容量(字节) Mass_Block_Size[0] =512;//因为我们在Init里面设置了SD卡的操作字节为512个,所以这里一定是512个字节. Mass_Block_Count[0]=Mass_Memory_Size[0]/Mass_Block_Size[0]; } if(EN25QXX_ReadID()==0xBADFACE) LCD_ShowString(10,70,tLCData.width,tLCData.height,16,"EN25QXX Error!"); else { //SPI FLASH 正常 Mass_Memory_Size[1]=1024*1024*6;//前6M字节 Mass_Block_Size[1] =512;//因为我们在Init里面设置了SD卡的操作字节为512个,所以这里一定是512个字节. Mass_Block_Count[1]=Mass_Memory_Size[1]/Mass_Block_Size[1]; } delay_ms(1800); LCD_ShowString(10,90,tLCData.width,tLCData.height,16,"USB Connecting...");printf("USB Connecting...\r\n"); AHR_initUSB(); delay_ms(1800); while(KeyScanPZ6806L(0)!=KEY_RIGHT); AHR_initFATFS(); //为fatfs相关变量申请内存 f_mount(fs[0],"0:",1); //挂载SD卡 f_mount(fs[1],"1:",1); //挂载FLASH. TFTLCD->LCD_CMD=0x0400; TFTLCD->LCD_DATA=0xe200; TFTLCD->LCD_CMD=0x0400; TFTLCD->LCD_DATA=0x6200; LCD_Clear(BACK_COLOR); LCD_ShowFont12Char(10,20,"显示SD卡里BMP文件实验"); while(FATFS_GetFree("0",&sdCapacity, &sdFreeSize)!=0) LCD_ShowFont12Char(10,50,"SDCardFAT error!"); sdCapacity >>= 10;for (i=0,j=10000;i<sizeof(num);i++){ num[i]=(sdCapacity/j%10)+'0';j/=10;}//将KB转换为MB LCD_ShowFont12Char(10, 40, "直接显示图片按键: KeyUp "); LCD_ShowFont12Char(10, 60, "SD card totl memory: MB"); LCD_ShowFont12Char(170, 60, num); sdFreeSize >>= 10;for (i=0,j=10000;i<sizeof(num);i++){ num[i]=(sdFreeSize/j%10)+'0';j/=10;} LCD_ShowFont12Char(10, 80, "SD card free memory: MB"); LCD_ShowFont12Char(170, 80, num); LCD_ShowFont12Char(10, 100, "Chg FontLIBZK,hit KeyLeft"); LCD_ShowFont12Char(10, 120, "右显示左跳过,上下翻转三字库"); //同时按三键更新字库 FATFS_ScanFiles(pth, filename); //扫描文件地址里面所有的文件 while(1){ for(i=0;i<nFS;i++ ) { // 因为定义filename[nFS],故只能处理 nFS 个文件 if((filename[i].type[1]=='b')&&(filename[i].type[2]=='m')&&(filename[i].type[3]=='p')){ //v-添加文件路径 // ^^^ ---- 判断是否是BMP图片文件 //v--路径之后加上一斜杠 for(fn=0; *(pth+fn)!= '\0'; fn++) *(picFile+fn)=*(pth+fn);*(picFile + fn++)='/'; for(j=0;filename[i].name[j]!= '\0';fn++,j++) *(picFile+fn)=filename[i].name[j];//添文件名字 for(j=0;filename[i].type[j]!= '\0';fn++,j++) *(picFile+fn)=filename[i].type[j];//添文件后缀 *(picFile+fn)='\0'; //文件最后添加一个结束符号 LCD_ShowFont12Char(10,380,picFile); // if (y<381) y+=(i*20)%400; else y=200; //----------------------------------------------------------------------------------------------------- while(1){ switch(KeyScanPZ6806L(0)){ case KeyL3all : FontUpdate(GUI_UPDATE_ALL); LCD_ShowFont12Char(10,120,"汉字库已更新");break; case KEY_LEFT : LCD_Clear(BACK_COLOR); goto ___SkipBMP; case KEY_DOWN : TFTLCD->LCD_CMD=0x0400; TFTLCD->LCD_DATA=0x6200; break;//设置刷屏为正方向 case KEY_UP : TFTLCD->LCD_CMD=0x0400; TFTLCD->LCD_DATA=0xe200; //.BMP文件是倒序的 case KEY_RIGHT: LCD_ShowFont12Char(0,380,"显示该图片"); goto ___ShowBMP ; // default: break; } } //while(1)//-----------------------------------------------------------------------------------------------------___ShowBMP: BMP_ShowPicture(picFile); // 显示图片 <-末尾空格决定下一行助记符是白色还是绿色-20191012___SkipBMP:__asm{nop};}//if }//for(;;) }//while(1) Program Size: Code=24408 RO-data=193180 RW-data=656 ZI-data=1100944 MicroLib}/ * 20190916 *///-----------------------------------------------------------------------------------------------------#define START_TASK_PRIO 3 // 1.宏定义:任务优先级#define START_STK_SIZE 1024 // 2.宏定义:任务堆栈大小void StartTask(void *p_arg); // 3.声明任务函数OS_TCB StartTaskTCB; // 4.声明任务控制块CPU_STK StartTaskStack[START_STK_SIZE]; // 5.声明任务堆栈#define GUI_TASK_PRIO 5#define GUI_STK_SIZE 2048void GuiTask(void *p_arg);OS_TCB GuiTaskTCB;CPU_STK GuiTaskStack[START_STK_SIZE];#define HMI_TASK_PRIO 4#define HMI_STK_SIZE 128void HmiTask(void *p_arg);OS_TCB HmiTaskTCB;CPU_STK HmiTaskStack[START_STK_SIZE];#define FONT_TASK_PRIO 6#define FONT_STK_SIZE 128void FontTask(void *p_arg);OS_TCB FontTaskTCB;CPU_STK FontTaskStack[START_STK_SIZE];OS_ERR err; // 6.返回信息AllTaskFunctionHasItint main(){ AHR_initSysTick(9000,0,0); AHR_initSRAM_FSMC(); *(volatile unsigned int *)0xE000ED00 = 0x05FA0500; AHR_initUS123ART45(1,9600,0x0C,2,0,0,0,0); //串1优先级2 AHR_initTFTLCD(1);; LCD_Clear(BLUE); LCD_ShowString(10,10,380,40,24,"u^COSIII Demonstrate! 2018-04-18\r\n"); AHR_initEN25QXX(); initKEY_UpA0LfE2DwE3RgE4(); // 占 code=656; RW-data=8; To取代:标准键盘扫描程序 LCD_ShowFont12Char(0,100," 本人多年从事计算机软/硬件研发工作,内容涉及光纤通讯,电子语音\工业控制、个人机器人、指纹考勤、EMC测试软件等诸多方面,积累了丰富的工作经验! 自学能力和动\手能力均强,能独立工作,愿分享经验! 联系: 13866362895 艾和荣"); while((KeyScanPZ6806L(0))!=KEY_UP); LCD_Clear(BACK_COLOR);// initMEM(ICSRAM); //初始化内部内存池 //==================== 项目初始化 ========================== RCC->AHBENR|=0x40;//开启CRC时钟 *(unsigned int*)0x40021018|=(uint32_t)0x00000010; //APB2 GPIOC Clock Enable!Not uCOS *(unsigned int*)0x40011000 =(uint32_t)0x33333333; //GPIOC0~7 out_PP *(unsigned int*)0x40011010 =(uint32_t)0x000000FF; //turn off all LED=7~0高 //=========================================================== LCD_ShowFontHZ(60,200,"中国商科技艾和荣"); BACK_COLOR=BLUE;FRONT_COLOR = YELLOW; OSInit(&err); // 7.初始化UCOSIII OSTaskCreate((OS_TCB *)&StartTaskTCB,// 8.1控制块 (CPU_CHAR *)"1stTaskBornInMain", // 8.2名字 (OS_TASK_PTR)StartTask, // 8.3函数 (void *)0, // 8.4函数的参数 (OS_PRIO)START_TASK_PRIO, // 8.5优先级 (CPU_STK *)&StartTaskStack[0], // 8.6堆栈基地址 (CPU_STK_SIZE)START_STK_SIZE/10, // 8.7堆栈深度限位 (CPU_STK_SIZE)START_STK_SIZE, // 8.8堆栈大小 (OS_MSG_QTY)0, // 8.9内部消息队列能接收最大消息数目,0-禁止接收消息 (OS_TICK)0, // 8.A当使能时间片轮转时的时间片长度,为0时为默认长度 (void *)0, // 8.B用户补充的存储区 (OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //8.C任务选项 (OS_ERR *)&err // 8.D存放该函数错误时的返回值 ); OSStart(&err); // 9.开启UCOSIII while(1){ __asm{ nop } }; //This line has no chance to Execute!!! So it can be anyway.}void OSTaskCre( OS_TCB *TaskTCB, OS_TASK_PTR *FunctionTask, CPU_STK TaskStack[128]){ OSTaskCreate( (OS_TCB*)&TaskTCB, (CPU_CHAR *)"TaskName", (OS_TASK_PTR)FunctionTask, (void *)0, (OS_PRIO)8, (CPU_STK *)&TaskStack[0], (CPU_STK_SIZE)128/10, (CPU_STK_SIZE)128, (OS_MSG_QTY)0, (OS_TICK)0, (void *)0, (OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR *)&err );}void StartTask(void *p_arg){ // !!! 初始化并产生任务 !!! CPU_INT32U cpuClkFreq; //10.uCOSiii自身的SysTick CPU_INT32U clkCount; //11.__//CPU_SR_ALLOC(); unsigned int cpu_sr=0; //12.分配存储空间保存切换时的CPU的状态寄存器 p_arg = p_arg; //13.防止编译出错 = NOP CPU_Init(); //14.uCOSiii时钟使能 ?? cpuClkFreq =BSP_CPU_ClkFreq();//15.Determine SysTick reference freq clkCount = cpuClkFreq/(CPU_INT32U)OSCfg_TickRate_Hz; //16.Determine nbr SysTick increments OS_CPU_SysTickInit(clkCount); //17.Init uC/OS periodic time src (SysTick) OSStatTaskCPUUsageInit(&err); //15.统计任务//#if OS_CFG_STAT_TASK_EN>0u CPU_IntDisMeasMaxCurReset(); //16.关闭测量中断时间//#ifdef CPU_CFG_INT_DIS_MEAS_EN OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);//17.时间片调度1节拍=5ms//#if OS_CFG_SCHED_ROUND_ROBIN_EN OS_CRITICAL_ENTER(); //18.进入临界区 OSTaskCreate((OS_TCB *)&GuiTaskTCB,//(8)用户图形系统STemWin (CPU_CHAR *)"STemWin GUIos of ST.", (OS_TASK_PTR)GuiTask, (void *)0, (OS_PRIO)GUI_TASK_PRIO, (CPU_STK *)&GuiTaskStack[0], (CPU_STK_SIZE)GUI_STK_SIZE/10, (CPU_STK_SIZE)GUI_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 *)&HmiTaskTCB,//(8)人机交互界面 (CPU_CHAR *)"Hmi Task", (OS_TASK_PTR)HmiTask, (void *)0, (OS_PRIO)HMI_TASK_PRIO, (CPU_STK *)&HmiTaskStack[0], (CPU_STK_SIZE)HMI_STK_SIZE/10, (CPU_STK_SIZE)HMI_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 *)&FontTaskTCB,//(8)简体中文字库 (CPU_CHAR *)"Font Task", (OS_TASK_PTR)FontTask, (void *)0, (OS_PRIO)FONT_TASK_PRIO, (CPU_STK *)&FontTaskStack[0], (CPU_STK_SIZE)FONT_STK_SIZE/10, (CPU_STK_SIZE)FONT_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); //19.挂起开始任务 OS_CRITICAL_EXIT(); //20.退出临界区}void GuiTask(void *p_arg){ int j=0; char str[64]; while(1){ j++; sprintf(str,"GUI show 'H' Task: %d Timer:30s",j); LCD_ShowString(10,60,250,80,16,(u8*)str); *(unsigned int*)0x40011010=(uint32_t)0x00760000; OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); *(unsigned int*)0x40011010=(uint32_t)0x00000076; OSTimeDlyHMSM(0,0,29,0,OS_OPT_TIME_HMSM_STRICT,&err);//延时30s }}void HmiTask(void *p_arg){ u8 key; int j=0; char str[64]; while(1){ j++; sprintf(str,"HMI Task: %d Timer:1ms",j); LCD_ShowString(10,80,250,100,16,(u8*)str); key=KeyScanPZ6806L(0); switch(key){ case KEY_UP: //挂起任务 OS_TaskSuspend((OS_TCB*)&FontTaskTCB,&err); break; case KEY_DOWN: //恢复任务 OS_TaskResume( (OS_TCB*)&FontTaskTCB,&err); break; case KEY_LEFT: //删除任务 OSTaskDel( (OS_TCB*)&FontTaskTCB,&err); break; case KEY_RIGHT: //创建任务 OSTaskCre( (OS_TCB*)&FontTaskTCB, (OS_TASK_PTR*)&FontTask, (CPU_STK *)&FontTaskStack[128]); break; } OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1ms }}void FontTask(void *pdata){ // Once only ! So try to delete task int j=0; char str[64]; while(1){ j++; sprintf(str,"Font Task: %d Timer:100ms",j); LCD_ShowString(10,100,250,120,16,(u8*)str); OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_PERIODIC,&err);//延时100ms }}// "Code=100,ZI-data=4296" is occupied for each task(StackSize=128)// Program Size: Code=51200 RO-data=10648 RW-data=304 ZI-data=54240 // Program Size: Code=53336 RO-data=10648 RW-data=312 ZI-data=54240 // Program Size: Code=53172 RO-data=10648 RW-data=308 ZI-data=54236 // Program Size: Code=23888 RO-data=9092 RW-data=488 ZI-data=25912 // */
5 x+ F2 W& l% T1 g; s9 T7 y