1. 串口通信
在ESK32-360开发板上提供了串行通讯功能,其接口如图1所示。
图1 RS232接口
图2 DB9的引脚连接
通过串行通讯的例程,我们可以学习串口通信的基本用法。
例程的主程序如下:
uc8 gHelloString[] = "Hello, this is USART Tx/Rx Polling example. Please enter characters.....\r\n";
int main(void)
{
HT32F_DVB_LEDInit(HT_LED1);
UxART_Configuration();
UxART_TxTest();
while (1)
{
#if 0 // Blocking mode
{
UxART_RxTest_Block(); // Wait until get UxART data
}
#else // Non-Blocking mode
{
UxART_RxTest_NonBlock(); // Return if no UxART data, LED can toggle by "LED_Demo()".
}
#endif
LED_Demo(); // LED1 闪烁
}
}
由程序分析可以看出,它预先定义了一个数组来存放字符串,在完成串口通信的基本配置后,就发送该字符串来验证输出功能,随后可通过串口向其发送信息,在接收后再原样反馈输出,其执行效果如图3所示。
图3 串口通信
2.基本应用
有了串行通讯后,我们用它可以做什么呢?
我们还是将它与LCD屏显示结合起来,最简单的就是发送数据在LCD屏上进行绘制,如动态地指定一个宽度,然后进行指定色彩的填充,见图4和图5所示。
图4 窄彩条
图5宽彩条
3.通讯传输显示图片
有了前面简单的测试,我们就可以大胆地期待着通过传输数据来显示图片了,因为前面用数组来显示大的图片时会导致下载崩溃。
首先以小图片来测试,成功通过!其效果如图6所示。
图6 以传送数据来显示图片
传送数据的界面如图7所示,其中“00 38”是图片宽度,即56个像素,而“00 44”是图片的高度,即68个像素。别小看这个图片,它可是占用了7616个字节呀!
图7 传送图片数据
那么把胆子再放大些呢? 能传送153600个字节吗?它可是满屏图片的规格,153600=240*320*2
( 320=0140H 240=F0H 153600=240*320*2 )
首先用Image2Lcd软件将一幅240*320像素点的图片转换为二进制数据文件BIN,其格式设置如图8所示,然后进行串口传送,则效果如图9所示,一样的成功!
当然在执行时有些吓人,首先是读入文件时串口调试器有点懵,像是被打晕,好一会没找到北;好容易在发送窗口有了数据,这次该轮到发送器晕了,也是一段时间没响应,近乎是要崩溃!还在还算顽强,终于挺过来了,屏幕上一丝丝彩线在游走,终于是一个圆满!
图8 准备数据文件
图9 图片显示
为防止偶然,又传第2幅、第3幅 ... ... 完全抗击打!
图10 演示效果
最后请出我们的主角,功能程序:
int main(void)
{
u32 err = 0, result;
u16 uData,a,b;
u32 xid = 0;
u32 ImgAdds = 0;
u32 yid = 0;
u32 i = 0, j = 0, color = 0;
u8 X_Location=0, Height;
u16 Y_Location=0, Width;
/* Initialize LEDs */
HT32F_DVB_LEDInit(HT_LED1);
HT32F_DVB_LEDInit(HT_LED2);
HT32F_DVB_LEDInit(HT_LED3);
LCD_Init();
LCD_Config();
LCD_BackColorSet(Black);
LCD_TextColorSet(Yellow);
LCD_StringLineDisplay(Line3, " Holtek ");
LCD_StringLineDisplay(Line4, " HT32 Series ");
LCD_StringLineDisplay(Line5, " LCD Example ");
UxART_Configuration();
UxART_TxTest();
for (i = 0; i < 4; i++)
{
while (USART_GetFlagStatus(HTCFG_UART_PORT, USART_FLAG_RXDR) == RESET);
uData = USART_ReceiveData(HTCFG_UART_PORT);
Tx_Buffer[i]=(u8)uData;
UxART_TxSend(uData);
}
a=Tx_Buffer[0];
b=Tx_Buffer[1];
Width=a << 8 | b;
a=Tx_Buffer[2];
b=Tx_Buffer[3];
Height=a << 8 | b;
xid = X_Location;
yid = Y_Location;
LCD_StarterSet(xid, yid);
for (i = 0; i < Height; i++)
{
LCD_WriteRAMPrior();
for (j = 0; j < Width; j++)
{
while(USART_GetFlagStatus(HTCFG_UART_PORT, USART_FLAG_RXDR) == RESET);
a = USART_ReceiveData(HTCFG_UART_PORT);
while(USART_GetFlagStatus(HTCFG_UART_PORT, USART_FLAG_RXDR) == RESET);
b = USART_ReceiveData(HTCFG_UART_PORT);
color = a << 8 | b;
LCD_WriteRAM(color);
}
xid++;
LCD_StarterSet(xid, yid);
}
while (1);
}
|