这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 企业专区» GD32» GD32107C-EVAL--GUI实验(三)

共3条 1/1 1 跳转至

GD32107C-EVAL--GUI实验(三)

高工
2015-04-11 04:08:26 打赏

在上一个实验中调试了SPI FLASH的读写。也是为了这个实验准备,那就是将汉字字库写入到FLASH中。我所用的汉子字库是2M左右的,板子上没有SD卡卡座,想了想就决定用1K Xmodem协议来传输文件。

字库文件:16_24_32HZK.rar

关于1K Xmodem协议简单的介绍一下,将文件数据分为多个包来传输,其中每个包都有1K的数据。当然加上包头以及后面的校验字节,每个数据包有1028个字节。GD32的存储容量够所以直接选用了1K Xmodem而没有选用128 Xmodem协议。

1K Xmodem协议传输与128 Xmodem协议传输相比较所需要的时间短,如果所用控制器的内存容量小那么可以考虑使用128 Xmodem协议。有兴趣了解的童鞋可以在网上查查更加详细的介绍。

下面是主要的接收代码:

if(gFontFlag != X_REC_END) { while(XmodemInfoStruct.Xmodem_Status != X_REC_END ) { if(XmodemInfoStruct.Xmodem_Status == X_REC_INVALID) { USART_SendData (USART1,XMODEM_NAK); //¿ªÊ¼ XmodemInfoStruct.Xmodem_Status = X_REC_READY; } if(XmodemInfoStruct.Xmodem_Time >= XMODE_TIMEOUT) { USART_SendData (USART1,XMODEM_NAK); //¿ªÊ¼ XmodemInfoStruct.Xmodem_Status = X_REC_READY; XmodemInfoStruct.Xmodem_Time = 0; } if(XmodemInfoStruct.Xmodem_Status == X_REC_RECOK) { if((XmodemInfoStruct.Xmodem_Count & 0x00ff) != gUart1RecBuff[1]) { if((XmodemInfoStruct.Xmodem_Count & 0x00ff) > gUart1RecBuff[1]) { XmodemInfoStruct.Xmodem_Count += 0x100; } XmodemInfoStruct.Xmodem_Count &= 0xff00; XmodemInfoStruct.Xmodem_Count |= gUart1RecBuff[1]; GUI_DispDecAt(XmodemInfoStruct.Xmodem_Count,100,100,5); SPI_Flash_Write(&gUart1RecBuff[3],gFontFlashAddr,1024); gFontFlashAddr += 1024; USART_SendData (USART1,XMODEM_ACK); XmodemInfoStruct.Xmodem_Status = X_REC_READY; } } } if(XmodemInfoStruct.Xmodem_Status == X_REC_END ) { USART_SendData (USART1,XMODEM_ACK); gFontFlag = X_REC_END; DelayMs(500); SPI_Flash_Write(&gFontFlag,FONT_FLASH_FLAG,1); } }

先判断是否已经成功写入过字库,如果没有写入字库,那么再开始Xmodem协议。

在液晶上显示接收的数据包个数:

总共接收2002个数据包,一共2002K的字库数据。主函数里的程序:

int main() { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); LedPinInit(); SysTickInit(); UartInit(); FlashInit(); SPI_Flash_Read(&gFontFlag,FONT_FLASH_FLAG,1); TimerInit(99,7199); AdcInit(); GUI_Init(); GUI_SetBkColor(GUI_RED); GUI_SetColor(GUI_WHITE); GUI_Clear(); GUI_DispStringAt("liklon--->GD32107C-EVAL",1,40); GUI_DispStringAt("m.amcfsurvey.com",40,60); GUI_DispStringAt("Xmodem pack number:",10,80); GUI_DispStringAt("电子产品世界",48,160); // TouchInit(); GUI_SetPenSize(10); GUI_DispStringAt((const char *)gReadWriteBuff,38,200); USART_SendData(USART1,'a'); DelayMs(500); if(gFontFlag != X_REC_END) { while(XmodemInfoStruct.Xmodem_Status != X_REC_END ) { if(XmodemInfoStruct.Xmodem_Status == X_REC_INVALID) { USART_SendData (USART1,XMODEM_NAK); //¿ªÊ¼ XmodemInfoStruct.Xmodem_Status = X_REC_READY; } if(XmodemInfoStruct.Xmodem_Time >= XMODE_TIMEOUT) { USART_SendData (USART1,XMODEM_NAK); //¿ªÊ¼ XmodemInfoStruct.Xmodem_Status = X_REC_READY; XmodemInfoStruct.Xmodem_Time = 0; } if(XmodemInfoStruct.Xmodem_Status == X_REC_RECOK) { if((XmodemInfoStruct.Xmodem_Count & 0x00ff) != gUart1RecBuff[1]) { if((XmodemInfoStruct.Xmodem_Count & 0x00ff) > gUart1RecBuff[1]) { XmodemInfoStruct.Xmodem_Count += 0x100; } XmodemInfoStruct.Xmodem_Count &= 0xff00; XmodemInfoStruct.Xmodem_Count |= gUart1RecBuff[1]; GUI_DispDecAt(XmodemInfoStruct.Xmodem_Count,100,100,5); SPI_Flash_Write(&gUart1RecBuff[3],gFontFlashAddr,1024); gFontFlashAddr += 1024; USART_SendData (USART1,XMODEM_ACK); XmodemInfoStruct.Xmodem_Status = X_REC_READY; } } } if(XmodemInfoStruct.Xmodem_Status == X_REC_END ) { USART_SendData (USART1,XMODEM_ACK); gFontFlag = X_REC_END; DelayMs(500); SPI_Flash_Write(&gFontFlag,FONT_FLASH_FLAG,1); } }

效果图:


字库烧写进去后,在GUI的相关文件做修改,具体修改方法查看下面链接,是楼主以前的一篇关于GUI加入汉子字库的介绍性文章: //m.amcfsurvey.com/article/182405.htm

对代码有兴趣的童鞋去楼主的导航帖处下载




关键词: GD32107C-EVAL--GUI 实验 汉字

院士
2015-04-11 07:52:13 打赏
2楼

真棒

我最近也在弄GUI的实例呢


专家
2015-04-26 12:16:15 打赏
3楼
不愧高手。

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]