你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用一个独立文件快捷创建工程

[复制链接]
aiherong 发布时间:2019-11-11 04:25
大量个性定制在aiherong.h头文件中进行,完全脱离标准库函数,大部分接口初始化函数被统一,由于全局变量多了些,HEX有点大
4 `" o7 u; T8 E7 Y4 w# p

AiHeRong_H.rar

下载

603.91 KB, 下载次数: 26

收藏 评论3 发布时间:2019-11-11 04:25

举报

3个回答
aiherong 回答时间:2019-11-11 10:42:05
补充说明:独立文件替代库和ucosiii而未取代核,所以仍需cm3.h和startup.s,也就是不用包含一大堆文件才搭建工程框架了
aiherong 回答时间:2019-11-26 03:56:18
下面我举个例子便于同仁们理解,分两部分: USB及bmp显示; ucos框架;
& v: n* [& D) U5 z6 {缺省是己装入字库或同时按下下面一排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  // */
( W) P" D" `  Q0 x1 f
4 ]* ^7 ?' B# \- O5 x+ F2 W& l% T1 g; s9 T7 y

9 g  m: I% K$ z7 G
aiherong 回答时间:2019-11-26 03:59:39
有些乱,回车换行被盗

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版