/********************************************************** BPB信息显示子函数 **********************************************************/ void BPB_INFO(void) { data_change2(BPBbytesPerSec); //每个扇区的字节数 LCD_ShowString(2,24,colors[0],colors[7],"BPBbytesPerSec"); LCD_ShowChar( 2,40,colors[2],colors[7],data_temp[0]); LCD_ShowChar(10,40,colors[2],colors[7],data_temp[1]); LCD_ShowChar(18,40,colors[2],colors[7],data_temp[2]); data_change2(BPBSecPerClust); //每个簇的扇区数 LCD_ShowString(2,56,colors[0],colors[7],"BPBSecPerClust"); LCD_ShowChar( 2,72,colors[2],colors[7],data_temp[0]); LCD_ShowChar(10,72,colors[2],colors[7],data_temp[1]); LCD_ShowChar(18,72,colors[2],colors[7],data_temp[2]); data_change2(BPBRevdFATSec); //保留扇区数 LCD_ShowString(2,88,colors[0],colors[7],"BPBRevdFATSec"); LCD_ShowChar( 2,104,colors[2],colors[7],data_temp[0]); LCD_ShowChar(10,104,colors[2],colors[7],data_temp[1]); LCD_ShowChar(18,104,colors[2],colors[7],data_temp[2]); /* data_change2(BPBhiddsector); //隐藏扇区数 LCD_ShowString(2,120,colors[0],"BPBhiddsector"); LCD_ShowChar( 2,136,colors[2],data_temp[0]); LCD_ShowChar(10,136,colors[2],data_temp[1]); LCD_ShowChar(18,136,colors[2],data_temp[2]); */ data_change1(BPBFATPerSec16); //每个FAT的扇区数 LCD_ShowString(2,120,colors[0],colors[7],"BPBFATPerSec"); LCD_ShowChar( 2,136,colors[2],colors[7],data_temp[0]); LCD_ShowChar(10,136,colors[2],colors[7],data_temp[1]); LCD_ShowChar(18,136,colors[2],colors[7],data_temp[2]); LCD_ShowChar(26,136,colors[2],colors[7],data_temp[3]); LCD_ShowChar(34,136,colors[2],colors[7],data_temp[4]); }
//主任务的任务函数 void main_task(void *p_arg) { u8 key,num; OS_ERR err; u8 *p; while(1) { key = KEY_Scan(0); //扫描按键 if(key==WKUP_PRES) { tmr1sta = !tmr1sta; if(tmr1sta) { OSTmrStart(&tmr1,&err); LCD_ShowString(40,150,100,16,16,"TMR1 START!"); } else { OSTmrStop(&tmr1,OS_OPT_TMR_NONE,0,&err); //停止定时器1 LCD_ShowString(40,150,100,16,16,"TMR1 STOP! "); } } num++; if(num%10==0) check_msg_queue(p);//检查DATA_Msg消息队列的容量 if(num==50) { num=0; LED0 = ~LED0; } OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err); //延时10ms } }
int main(void) { u8 t=0; u16 Time=0,dis_pre=0; float V_ave; //平均速度 char code_ave[5],code_v[5],code_vr[5], mileage[5];//信息储存数组 delay_init(72); //延时函数初始化 Stm32_Clock_Init(9); //系统时钟设置 uart_init(72,9600); //串口初始化为9600 usmart_dev.init(72); //初始化USMART EXTIX_Init(); //外部中断初始化 TIM3_Int_Init(5000,7199); //10Khz的计数频率,计数到5000为500ms LCD_Init(); // PE.ALL,PD1~5 LCD_Display_Dir(1); //设置显示方向为横屏显示 LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); //初始化按键 while(RTC_Init()) { //等待RTC初始化 delay_ms(200); printf("rtc waiting```\r\n"); } printf("finish\n"); display_jing(); //初始化完成 while(1) { POINT_COLOR=RED; if(t!=calendar.sec) //时间更新后显示新时间 { t=calendar.sec; LCD_ShowNum(200,135,calendar.min,2,32); LCD_ShowString(230,135,200,32,32,":"); LCD_ShowNum(248,135,calendar.sec,2,32); Time = 60*calendar.min+calendar.sec;//比赛用时 if(dis_pre != quanshu_tenfold) //有位移变化 { V_ave=(0.154*quanshu_tenfold)/Time; dis_pre = quanshu_tenfold; sprintf(code_ave,"%.2f",V_ave); LCD_ShowString(100,200,200,32,32,code_ave);//修改一下位置 } } sprintf(code_v,"%.2f",V); //float 转 字符串 LCD_ShowString(365,275,200,32,32,code_v); //速度 sprintf(code_vr,"%d",V_RPM); //float 转 字符串 LCD_ShowString(365,275,200,32,32,code_vr); //转速 sprintf(mileage,"%.2f",0.154*quanshu_tenfold); LCD_ShowString(250,225,200,24,32,mileage); //里程 display_dong(V_RPM,V,50); delay_ms(300); } }
/** * @brief: 触摸屏初始化 * @retval:0 - 没有进行校准 * 1 - 进行过校准 * @note: * - T_SCK -> PB1 * - T_CS -> PB2 * - T_MISO -> PF8 * - T_MOSI -> PF9 * - T_PEN -> PF10 */ u8 TP_Init(void) { RCC->APB2ENR|=1<<3; //PB时钟使能 RCC->APB2ENR|=1<<7; //PF时钟使能 GPIOB->CRL&=0XFFFFF00F; //PB1 PB2 GPIOB->CRL|=0X00000330; GPIOB->ODR|=3<<1; //PB1 PB2 推挽输出 GPIOF->CRH&=0XFFFFF000; GPIOF->CRH|=0X00000838; //PF8-上拉输入 PF9-推挽输出 PF10-上拉输入 GPIOF->ODR|=7<<8; //PF8 PF9 PF10 全部上拉 TP_Read_XY(&tp_dev.x,&tp_dev.y);//第一次读取初始化 IIC_Init(); //初始化IIC while(AT24CXX_Check()) //检测不到24c02 { LCD_ShowString(16,150,200,16,16,"24C02 Check Failed!"); delay_ms(500); LCD_ShowString(16,150,200,16,16,"Please Check! "); delay_ms(500); } if(TP_Get_Adjdata())return 0; //已经校准 else //未校准 { LCD_Clear(WHITE); //清屏 TP_Adjust(); //屏幕校准 TP_Save_Adjdata(); } TP_Get_Adjdata(); return 1; }
//硬件初始化 void borad_HarwareInit(void) { //OS_ERR err; //CPU_SR_ALLOC(); delay_init(168); //时钟初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置 uart_init(115200); //串口初始化 INTX_DISABLE(); //关中断,防止滴答定时器对外设初始化的打扰 LED_Init(); //LED初始化 LCD_Init(); //LCD初始化 POINT_COLOR = RED; LCD_ShowString(30,10,200,16,16,"HardWare: STM32F4"); LCD_ShowString(30,30,200,16,16,"SotfWareSystem:UCOSIII,FATFS"); LCD_ShowString(30,50,200,16,16,"STM32_NC"); LCD_ShowString(30,70,200,16,16,"HuBei University of Technology"); LCD_ShowString(30,90,200,16,16,"2016/1/16"); //SD卡初始化 SDCard_Init(); INTX_ENABLE(); //开中断 }
void LCD_ShowLine(u8 x,u16 y, u8 *p) //显示一个字符串,16字体 { LCD_ShowString(0,y*20," "); LCD_ShowString(x, y*20,p); }
int main(void) { u8 key; u8 i=0; SystemInit(); delay_init(72); //延时初始化 NVIC_Configuration(); uart_init(9600); LED_Init(); KEY_Init(); LCD_Init(); POINT_COLOR=RED;//设置字体为蓝色 LCD_ShowString(60,50,"Mini STM32"); LCD_ShowString(60,70,"TOUCH TEST"); LCD_ShowString(60,90,"ATOM@ALIENTEK"); LCD_ShowString(60,110,"2011/1/1"); LCD_ShowString(60,130,"Press KEY0 to Adjust"); Touch_Init(); delay_ms(1500); Load_Drow_Dialog(); while(1) { key=KEY_Scan(); if(Pen_Point.Key_Sta==Key_Down)//触摸屏被按下 { Pen_Int_Set(0);//关闭中断 do { Convert_Pos(); Pen_Point.Key_Sta=Key_Up; if(Pen_Point.X0>216&&Pen_Point.Y0<16)Load_Drow_Dialog();//清除 else { Draw_Big_Point(Pen_Point.X0,Pen_Point.Y0);//画图 GPIOC->ODR|=1<<1; //PC1 上拉 } }while(PEN==0);//如果PEN一直有效,则一直执行 Pen_Int_Set(1);//开启中断 }else delay_ms(10); if(key==1)//KEY0按下,则执行校准程序 { LCD_Clear(WHITE);//清屏 Touch_Adjust(); //屏幕校准 Save_Adjdata(); Load_Drow_Dialog(); } i++; if(i==20) { i=0; LED0=!LED0; } }; }
//显示GPS定位信息 void Gps_Msg_Show(void) { float tp; POINT_COLOR=BLUE; tp=gpsx.longitude; sprintf((char *)dtbuf,"Longitude:%.5f %1c ",tp/=100000,gpsx.ewhemi); //得到经度字符串 LCD_ShowString(30,130,200,16,16,dtbuf); tp=gpsx.latitude; sprintf((char *)dtbuf,"Latitude:%.5f %1c ",tp/=100000,gpsx.nshemi); //得到纬度字符串 LCD_ShowString(30,150,200,16,16,dtbuf); tp=gpsx.altitude; sprintf((char *)dtbuf,"Altitude:%.1fm ",tp/=10); //得到高度字符串 LCD_ShowString(30,170,200,16,16,dtbuf); tp=gpsx.speed; sprintf((char *)dtbuf,"Speed:%.3fkm/h ",tp/=1000); //得到速度字符串 LCD_ShowString(30,190,200,16,16,dtbuf); if(gpsx.fixmode<=3) //定位状态 { sprintf((char *)dtbuf,"Fix Mode:%s",fixmode_tbl[gpsx.fixmode]); LCD_ShowString(30,210,200,16,16,dtbuf); } sprintf((char *)dtbuf,"Valid satellite:%02d",gpsx.posslnum); //用于定位的卫星数 LCD_ShowString(30,230,200,16,16,dtbuf); sprintf((char *)dtbuf,"Visible satellite:%02d",gpsx.svnum%100); //可见卫星数 LCD_ShowString(30,250,200,16,16,dtbuf); sprintf((char *)dtbuf,"UTC Date:%04d/%02d/%02d ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date); //显示UTC日期 //printf("year2:%d\r\n",gpsx.utc.year); LCD_ShowString(30,270,200,16,16,dtbuf); sprintf((char *)dtbuf,"UTC Time:%02d:%02d:%02d ",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec); //显示UTC时间 LCD_ShowString(30,290,200,16,16,dtbuf); }
int main(void) { u16 i,rxlen; u16 lenx; u8 key=0XFF; u8 upload=0; delay_init(); //延时函数初始化 uart_init(38400); //串口初始化为9600 USART2_Init(38400); //初始化串口2 LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); //初始化与LED连接的硬件接口 LCD_Init(); //初始化LCD POINT_COLOR=RED; LCD_ShowString(30,20,200,16,16,"ALIENTEK STM32 ^_^"); LCD_ShowString(30,40,200,16,16,"NE0-6M GPS TEST"); LCD_ShowString(30,60,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,80,200,16,16,"KEY0:Upload NMEA Data SW"); LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:OFF"); if(Ublox_Cfg_Rate(1000,1)!=0) //设置定位信息更新速度为1000ms,顺便判断GPS模块是否在位. { LCD_ShowString(30,120,200,16,16,"NEO-6M Setting..."); while((Ublox_Cfg_Rate(1000,1)!=0)&&key) //持续判断,直到可以检查到NEO-6M,且数据保存成功 { USART2_Init(9600); //初始化串口2波特率为9600(EEPROM没有保存数据的时候,波特率为9600.) Ublox_Cfg_Prt(38400); //重新设置模块的波特率为38400 USART2_Init(38400); //初始化串口2波特率为38400 Ublox_Cfg_Tp(1000000,100000,1); //设置PPS为1秒钟输出1次,脉冲宽度为100ms key=Ublox_Cfg_Cfg_Save(); //保存配置 } LCD_ShowString(30,120,200,16,16,"NEO-6M Set Done!!"); delay_ms(500); LCD_Fill(30,120,30+200,120+16,WHITE);//清除显示 } while(1) { delay_ms(1); if(USART2_RX_STA&0X8000) //接收到一次数据了 { rxlen=USART2_RX_STA&0X7FFF; //得到数据长度 for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART2_RX_BUF[i]; USART2_RX_STA=0; //启动下一次接收 USART1_TX_BUF[i]=0; //自动添加结束符 GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串 Gps_Msg_Show(); //显示信息 if(upload)printf("\r\n%s\r\n",USART1_TX_BUF);//发送接收到的数据到串口1 } key=KEY_Scan(0); if(key==KEY0_PRES) { upload=!upload; POINT_COLOR=RED; if(upload)LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:ON "); else LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:OFF"); } if((lenx%500)==0)LED0=!LED0; lenx++; } }
//显示串口收到的数据 //comdata:要显示的数据 void com_statusBar(char * comdata){ static u8 rec_count = 0; LCD_DrawRectangle(1,lcddev.height-40,lcddev.width-1,lcddev.height-1); //屏幕底部画一个矩形 LCD_DrawLine(1,lcddev.height-20,lcddev.width,lcddev.height-20); //画线 LCD_ShowString(2,lcddev.height-39,500,16,16,"Received data from srialport:"); //标题 LCD_Fill(2,lcddev.height-19,lcddev.width-2,lcddev.height-2,WHITE); LCD_ShowString(2,lcddev.height-19,500,16,16,(u8*)comdata); //内容 //状态条尾部蓝绿色闪烁:表示系统串口任务正在接收数据 LCD_Fill(lcddev.width-19,lcddev.height-39,lcddev.width,lcddev.height-21,lcd_discolor[10-rec_count%2]); //填充状态信号 }
//查询DATA_Msg消息队列中的总队列数量和剩余队列数量 void check_msg_queue(u8 *p) { CPU_SR_ALLOC(); u8 msgq_remain_size; //消息队列剩余大小 OS_CRITICAL_ENTER(); //进入临界段 msgq_remain_size =Msgdis_TaskTCB.MsgQ.NbrEntriesSize-Msgdis_TaskTCB.MsgQ.NbrEntries; p = mymalloc(SRAMIN,20); //申请内存 sprintf((char*)p,"Total Size:%d",Msgdis_TaskTCB.MsgQ.NbrEntriesSize); //显示DATA_Msg消息队列总的大小 LCD_ShowString(40,190,100,16,16,p); sprintf((char*)p,"Remain Size:%d",msgq_remain_size); //显示DATA_Msg剩余大小 LCD_ShowString(40,230,100,16,16,p); myfree(SRAMIN,p); //释放内存 OS_CRITICAL_EXIT(); //退出临界段 }
//在LCD上显示地址信息 //mode:1 显示DHCP获取到的地址 // 其他 显示静态地址 void show_address(u8 mode) { u8 buf[30]; if(mode==1) { sprintf((char*)buf,"MAC :%d.%d.%d.%d.%d.%d",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);//打印MAC地址 LCD_ShowString(30,130,210,16,16,buf); sprintf((char*)buf,"DHCP IP:%d.%d.%d.%d",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]); //打印动态IP地址 LCD_ShowString(30,150,210,16,16,buf); sprintf((char*)buf,"DHCP GW:%d.%d.%d.%d",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]); //打印网关地址 LCD_ShowString(30,170,210,16,16,buf); sprintf((char*)buf,"DHCP IP:%d.%d.%d.%d",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]); //打印子网掩码地址 LCD_ShowString(30,190,210,16,16,buf); } else { sprintf((char*)buf,"MAC :%d.%d.%d.%d.%d.%d",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);//打印MAC地址 LCD_ShowString(30,130,210,16,16,buf); sprintf((char*)buf,"Static IP:%d.%d.%d.%d",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]); //打印动态IP地址 LCD_ShowString(30,150,210,16,16,buf); sprintf((char*)buf,"Static GW:%d.%d.%d.%d",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]); //打印网关地址 LCD_ShowString(30,170,210,16,16,buf); sprintf((char*)buf,"Static IP:%d.%d.%d.%d",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]); //打印子网掩码地址 LCD_ShowString(30,190,210,16,16,buf); } }
int main(void) { u32 sector_size; u8 t=0; SystemInit(); delay_init(72); //延时初始化 NVIC_Configuration(); uart_init(9600); LED_Init(); KEY_Init(); LCD_Init(); POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,"Mini STM32"); LCD_ShowString(60,70,"SD Card TEST"); LCD_ShowString(60,90,"ATOM@ALIENTEK"); LCD_ShowString(60,110,"2011/1/1"); while(SD_Initialize()!=0)//检测不到SD卡 { LCD_ShowString(60,130,"SD Card Failed!"); delay_ms(500); LCD_ShowString(60,130,"Please Check! "); delay_ms(500); LED0=!LED0;//DS0闪烁 } //检测SD卡成功 LCD_ShowString(60,130,"SD Card Checked OK "); sector_size=SD_GetSectorCount(); printf(" SD Sector Size:%x\n",sector_size); LCD_ShowString(60,150,"SD Card Size: Mb"); LCD_ShowNum(164,150,sector_size>>12,4,16); while(1) { if(t==30)//每6s钟执行一次 { if(SD_ReadDisk(buf,0,1)==0)//读取MBR扇区 { LCD_ShowString(60,170,"USART1 Sending Data..."); printf("SECTOR 0 DATA:\n"); for(sector_size=0;sector_size<512;sector_size++)printf("%x ",buf[sector_size]);//打印MBR扇区数据 printf("\nDATA ENDED\n"); LCD_ShowString(60,170,"USART1 Send Data Over!"); } t=0; } t++; delay_ms(200); LED0=!LED0; } }
//Mini STM32开发板范例代码18 //触摸屏 实验 //正点原子@ALIENTEK //技术论坛:www.openedv.com void Load_Drow_Dialog(void) { LCD_Clear(WHITE);//清屏 POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(216,0,"RST");//显示清屏区域 POINT_COLOR=RED;//设置画笔蓝色 }
//定时器1的回调函数 void tmr1_callback(void *p_tmr,void *p_arg) { u8 *pbuf; static u8 msg_num; OS_ERR err; pbuf = mymalloc(SRAMIN,10); //申请10个字节 if(pbuf) //申请内存成功 { msg_num++; sprintf((char*)pbuf,"ALIENTEK %d",msg_num); //发送消息 OSTaskQPost((OS_TCB* )&Msgdis_TaskTCB, //向任务Msgdis发送消息 (void* )pbuf, (OS_MSG_SIZE)10, (OS_OPT )OS_OPT_POST_FIFO, (OS_ERR* )&err); if(err != OS_ERR_NONE) { myfree(SRAMIN,pbuf); //释放内存 OSTmrStop(&tmr1,OS_OPT_TMR_NONE,0,&err); //停止定时器1 tmr1sta = !tmr1sta; LCD_ShowString(40,150,100,16,16,"TMR1 STOP! "); } } }
//加载触摸画板函数 void Load_Drow_Dialog(void) { LCD_Fill(0, 180,240,320,WHITE); POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(216,304,"RST");//显示清屏区域 LCD_DrawLine(0, 158, 240, 158); POINT_COLOR=RED;//设置画笔蓝色 }
void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) { // GUI_DispStringAt("HardFault_Handler",30,232); LCD_ShowString(30,232,200,16,16,"HardFault_Handler"); } }
void SDCard_Init(void) { u32 total,free; u8 res=0; W25QXX_Init(); //初始化W25Q128 my_mem_init(SRAMIN); //初始化内部内存池 my_mem_init(SRAMCCM); //初始化CCM内存池 while(SD_Init())//检测不到SD卡 { LCD_ShowString(30,150,200,16,16,"SD Card Error!"); delay_ms(500); LCD_ShowString(30,150,200,16,16,"Please Check! "); delay_ms(500); LED0=!LED0;//DS0闪烁 } 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:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇 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); } LCD_Fill(30,150,240,150+16,WHITE); //清除显示 while(exf_getfree("0",&total,&free)) //得到SD卡的总容量和剩余容量 { LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!"); delay_ms(200); LCD_Fill(30,150,240,150+16,WHITE); //清除显示 delay_ms(200); LED0=!LED0;//DS0闪烁 } POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(30,150,200,16,16,"FATFS OK!"); LCD_ShowString(30,170,200,16,16,"SD Total Size: MB"); LCD_ShowString(30,190,200,16,16,"SD Free Size: MB"); LCD_ShowNum(30+8*14,170,total>>10,5,16); //显示SD卡总容量 MB LCD_ShowNum(30+8*14,190,free>>10,5,16); //显示SD卡剩余容量 MB }
//加载主界面 void ucos_load_main_ui(void) { POINT_COLOR = RED; LCD_ShowString(10,10,200,16,16,"Explorer STM32F4"); LCD_ShowString(10,30,200,16,16,"UCOSIII Examp 11-2"); LCD_ShowString(10,50,200,16,16,"Task Queue"); LCD_ShowString(10,70,220,16,16,"KEY_UP:Tmr1"); LCD_ShowString(10,90,200,16,16,"2015/5/20"); POINT_COLOR = BLACK; LCD_DrawLine(0,107,239,107); //画线 POINT_COLOR = RED; LCD_ShowString(30,130,100,16,16,"tmr1 state:"); LCD_ShowString(30,170,120,16,16,"Task_QMsg Size:"); LCD_ShowString(30,210,120,16,16,"Task_QMsg rema:"); LCD_ShowString(30,250,100,16,16,"Task_QMsg:"); POINT_COLOR = BLUE; LCD_ShowString(40,150,100,16,16,"TMR1 STOP! "); }
//DHCP处理任务 void lwip_dhcp_task(void *pdata) { int res; u8 ip_buf[20]; //存放ip用于显示 u32 ip=0,netmask=0,gw=0; dhcp_start(&lwip_netif);//开启DHCP lwipdev.dhcpstatus=0; //正在DHCP printf("正在查找DHCP服务器,请稍等...........\r\n"); POINT_COLOR = RED; LCD_ShowString(20, 80, 160, 20, 16, "DHCP configuring..."); //显示IP到屏幕上 while(1) { printf("正在获取地址...\r\n"); ip=lwip_netif.ip_addr.addr; //读取新IP地址 netmask=lwip_netif.netmask.addr;//读取子网掩码 gw=lwip_netif.gw.addr; //读取默认网关 if(ip!=0) //当正确读取到IP地址的时候 { lwipdev.dhcpstatus=2; //DHCP成功 printf("网卡en的MAC地址为:................%d.%d.%d.%d.%d.%d\r\n",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]); //解析出通过DHCP获取到的IP地址 lwipdev.ip[3]=(uint8_t)(ip>>24); lwipdev.ip[2]=(uint8_t)(ip>>16); lwipdev.ip[1]=(uint8_t)(ip>>8); lwipdev.ip[0]=(uint8_t)(ip); printf("通过DHCP获取到IP地址..............%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]); sprintf((char *)ip_buf, "IP: %d.%d.%d.%d ", lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]); POINT_COLOR = RED; LCD_ShowString(20, 80, 160, 20, 16, ip_buf); //显示IP到屏幕上 //解析通过DHCP获取到的子网掩码地址 lwipdev.netmask[3]=(uint8_t)(netmask>>24); lwipdev.netmask[2]=(uint8_t)(netmask>>16); lwipdev.netmask[1]=(uint8_t)(netmask>>8); lwipdev.netmask[0]=(uint8_t)(netmask); printf("通过DHCP获取到子网掩码............%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]); //解析出通过DHCP获取到的默认网关 lwipdev.gateway[3]=(uint8_t)(gw>>24); lwipdev.gateway[2]=(uint8_t)(gw>>16); lwipdev.gateway[1]=(uint8_t)(gw>>8); lwipdev.gateway[0]=(uint8_t)(gw); printf("通过DHCP获取到的默认网关..........%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]); break; }else if(lwip_netif.dhcp->tries>LWIP_MAX_DHCP_TRIES) //通过DHCP服务获取IP地址失败,且超过最大尝试次数
//根据当前的日期,更新日历表. void calendar_date_refresh(void) { u8 weekn; //周寄存 u16 offx=(lcddev.width-240)/2; //显示阳历年月日 POINT_COLOR=BRED; BACK_COLOR=BLACK; LCD_ShowxNum(offx+5,OTHER_TOPY+9,(calendar.w_year/100)%100,2,16,0);//显示年 20/19 LCD_ShowxNum(offx+21,OTHER_TOPY+9,calendar.w_year%100,2,16,0); //显示年 LCD_ShowString(offx+37,OTHER_TOPY+9,lcddev.width,lcddev.height,16,"-"); //"-" LCD_ShowxNum(offx+45,OTHER_TOPY+9,calendar.w_month,2,16,0X80); //显示月 LCD_ShowString(offx+61,OTHER_TOPY+9,lcddev.width,lcddev.height,16,"-"); //"-" LCD_ShowxNum(offx+69,OTHER_TOPY+9,calendar.w_date,2,16,0X80); //显示日 //显示周几? POINT_COLOR=RED; weekn=calendar.week; Show_Str(5+offx,OTHER_TOPY+35,lcddev.width,lcddev.height,(u8 *)calendar_week_table[gui_phy.language][weekn],16,0); //显示周几? }
void show_menu(char* path, uint8_t start, uint8_t end) { uint8_t i = 0, j = 1; LCD_Fill(1, 8, 126, 126, BLACK); for(i=start;i<end;i++) { LCD_ShowString(10, 8*j+1, &all_file_name[i][1], BRRED, BLACK); j++; } }
//更新字体文件,UNIGBK,GBK16一起更新 //返回值:0,更新成功; // 其他,错误代码. u8 update_font() { u8 *gbk16_path; u8 *unigbk_path; u8 res; unigbk_path=(u8*)UNIGBK_SDPATH; gbk16_path=(u8*)GBK16_SDPATH; POINT_COLOR=RED; LCD_ShowString(60,90,"Updating UNI2GBK.SYS"); res=updata_fontx(unigbk_path,0);//更新UNIGBK.BIN if(res)return 1; LCD_ShowString(60,90,"Updating GBK16.FON "); res=updata_fontx(gbk16_path,1);//更新GBK16.FON if(res)return 2; //全部更新好了 res=0XAA; SPI_Flash_Write(&res,FONTINFOADDR+24,1);//写入字库存在标志 0XAA return 0;//无错误. }
void LCD_ShowLineEx(u16 y, u8 *p) { // 16 Pixel = 1 character u8 tBuf[80]; memset(tBuf, ' ', sizeof(tBuf)); sprintf((char *)tBuf,"%s",p); tBuf[strlen((char *)p)]=' '; tBuf[40]=0x00; LCD_ShowString(0,y*LN_HEIGHT,tBuf); }
//ALIENTEK Mini STM32开发板范例代码11 //TFTLCD显示实验 //技术支持:www.openedv.com //广州市星翼电子科技有限公司 int main(void) { u8 x=0; u8 lcd_id[12]; //存放LCD ID字符串 delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); POINT_COLOR=RED; sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。 while(1) { switch(x) { case 0:LCD_Clear(WHITE);break; case 1:LCD_Clear(BLACK);break; case 2:LCD_Clear(BLUE);break; case 3:LCD_Clear(RED);break; case 4:LCD_Clear(MAGENTA);break; case 5:LCD_Clear(GREEN);break; case 6:LCD_Clear(CYAN);break; case 7:LCD_Clear(YELLOW);break; case 8:LCD_Clear(BRRED);break; case 9:LCD_Clear(GRAY);break; case 10:LCD_Clear(LGRAY);break; case 11:LCD_Clear(BROWN);break; } POINT_COLOR=RED; LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^"); LCD_ShowString(30,70,200,16,16,"TFTLCD TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,110,200,16,16,lcd_id); //显示LCD ID LCD_ShowString(30,130,200,12,12,"2014/3/7"); x++; if(x==12)x=0; LED0=!LED0; delay_ms(1000); } }
int main(void) { u16 adcx; float temp; delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); Adc_Init(); //ADC初始化 POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,200,16,16,"Mini STM32"); LCD_ShowString(60,70,200,16,16,"ADC TEST"); LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(60,110,200,16,16,"2014/3/9"); //显示提示信息 POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:"); LCD_ShowString(60,150,200,16,16,"ADC_CH1_VOL:0.000V"); while(1) { adcx=Get_Adc_Average(ADC_Channel_1,10); LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值 temp=(float)adcx*(3.3/4096); adcx=temp; LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值 temp-=adcx; temp*=1000; LCD_ShowxNum(172,150,temp,3,16,0X80); LED0=!LED0; delay_ms(250); } }
//任务0 void KEY0_TASK() { u8 key,mode; u16 t=0; u8 tmp_buf[33]; u8 key_buf[33] = "key0_pres"; LCD_Clear(WHITE); Show_Str(50,50,200,24,"当前任务0 :",24,0); NRF24L01_TX_Mode(); mode=' ';//从空格键开始 // while(1) { if(NRF24L01_TxPacket(tmp_buf)==TX_OK) { LCD_ShowString(30,170,239,32,16,"Sended DATA:"); LCD_ShowString(0,190,lcddev.width-1,32,16,tmp_buf); for(t=0; t<32; t++) { tmp_buf[t]=key_buf[t]; } tmp_buf[32]=0;//加入结束符 } else { LCD_Fill(0,170,lcddev.width,170+16*3,WHITE);//清空显示 LCD_ShowString(30,170,lcddev.width-1,32,16,"Send Failed "); } LED0=!LED0; delay_ms(1500); } }
void ADJ_INFO_SHOW(u8*str) { LCD_ShowString(40,40,"x1: y1: "); LCD_ShowString(40,60,"x2: y2: "); LCD_ShowString(40,80,"x3: y3: "); LCD_ShowString(40,100,"x4: y4: "); LCD_ShowString(40,100,"x4: y4: "); LCD_ShowString(40,120,str); }
int main(void) { u32 i; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); //初始化按键 LCD_Init(); //初始化LCD TIM3_Int_Init(1000,719); //定时器3频率为100hz usmart_dev.init(72); //初始化USMART FSMC_SRAM_Init(); //初始化外部SRAM my_mem_init(SRAMIN); //初始化内部内存池 my_mem_init(SRAMEX); //初始化外部内存池 POINT_COLOR=RED; //设置字体为红色 LCD_ShowString(30,30,200,16,16,"ENC28J60+STM32"); LCD_ShowString(30,50,200,16,16,"LWIP Test!"); LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,90,200,16,16,"2015/4/27"); while(lwip_comm_init()) //lwip初始化 { LCD_ShowString(30,110,200,20,16,"LWIP Init Falied!"); delay_ms(1200); LCD_Fill(30,110,230,130,WHITE); //清除显示 LCD_ShowString(30,110,200,16,16,"Retrying..."); } LCD_ShowString(30,110,200,20,16,"LWIP Init Success!"); LCD_ShowString(30,130,200,16,16,"DHCP IP configing..."); #if LWIP_DHCP //使用DHCP while((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))//等待DHCP获取成功/超时溢出 { lwip_periodic_handle(); //LWIP内核需要定时处理的函数 } #endif show_address(lwipdev.dhcpstatus); //显示地址信息 while(1) { lwip_periodic_handle(); //LWIP内核需要定时处理的函数 i++; if(i==50000) { LED0=~LED0; i=0; } } }
int main(void) { u8 i; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 uart_init(9600); OV7670_Init(); LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); //初始化LCD if(lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X5510||lcddev.id==0X1963) //强制设置屏幕分辨率为320*240.以支持3.5寸大屏 { lcddev.width=240; lcddev.height=320; } usmart_dev.init(72); //初始化USMART POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,200,200,16,"Mini STM32"); LCD_ShowString(60,70,200,200,16,"OV7670 TEST"); LCD_ShowString(60,90,200,200,16,"ATOM@ALIENTEK"); LCD_ShowString(60,110,200,200,16,"2014/3/27"); LCD_ShowString(60,130,200,200,16,"Use USMART To Set!"); LCD_ShowString(60,150,200,200,16,"OV7670 Init..."); while(OV7670_Init())//初始化OV7670 { LCD_ShowString(60,150,200,200,16,"OV7670 Error!!"); delay_ms(200); LCD_Fill(60,150,239,166,WHITE); delay_ms(200); } LCD_ShowString(60,150,200,200,16,"OV7670 Init OK"); delay_ms(1500); TIM3_Int_Init(10000,7199); //TIM3,10Khz计数频率,1秒钟中断 EXTI15_Init(); //使能定时器捕获 OV7670_Window_Set(10,174,240,320); //设置窗口 OV7670_CS=0; while(1) { camera_refresh(); //更新显示 if(i!=ov_frame) //DS0闪烁. { i=ov_frame; LED0=!LED0; } } }