本帖最后由 jinglixixi 于 2022-8-17 19:57 编辑
#申请原创#
CW32F030CxTx StartKit是一款基于CW32F030C8 微控制器的评估板,其最高主频为64MHz,有64K 字节 FLASH和8K 字节 RAM。 对于这样一款开发板,要直接进行图片显示是较为困难的,因受程序空间的限制,你无法将图片的数据存放到数组中来支持其显示。 那如何才能实现图1所示的显示效果呢?
图1 显示效果 好在还开发板的外设资源是相对比较丰富的,它板载了一个W25Q64存储芯片,使用它可以解决图像数据的读写问题,并可凭此来构建图库。 因为W25Q64的存储空间为8MB,每个扇区为4KB, 每个块为64KB。也就是说,对于一幅320*240像素点的图片,它可以存储8000/(320*240*2)=52幅。 解决了存储的问题,还存在一个如何来提供数据的问题。因为正是由于CW32F030C8的程序空间小,才导致无法将显示数据存放到程序中,没有了数据又何谈存储呢? 问题的解决方法就是通过串行通讯来提供存储数据。 1. 串口数据收发 CW32F030C8提供了多个串行通讯接口,并板载了USB转TTL芯片CH340,其原理图见图2所示。
图2 CH340接口电路 在使用时,需通过CN9为其提供电源支持,并将串口的发送引脚连接到PA9,将串口的接收引脚连接到PA8,见图3所示。
图3 引脚连接 在硬件的基础上,实现数据收发的程序如下: UART_Configuration();
while(1)
{
while(USART_GetFlagStatus(CW_UART1, USART_FLAG_RC)==RESET);
a=USART_ReceiveData_8bit(CW_UART1);
USART_ClearFlag(CW_UART1, USART_FLAG_RC);
USART_SendData_8bit(CW_UART1, a);
}
其中,语句USART_GetFlagStatus(CW_UART1, USART_FLAG_RC)的作用是判别接收到信息否,而语句USART_ReceiveData_8bit(CW_UART1) 的作用是接收一个字节的数据。 语句USART_ClearFlag(CW_UART1,USART_FLAG_RC)的作用则是清除接收标志,以便进行后续的接收判别。 语句USART_SendData_8bit(CW_UART1,a) 的作用是发送接收到的字节数据,从而便于分析判别。 经编译和下载,其测试效果如图4所示,即一次发送多个字节数据会回显接收到的内容。
图4 测试效果 当然在此基础上,也可实现文件数据的发送及保存。 2.数据接收与图像显示 我们使用串口收发数据的目的是显示图像,那通过串口发送的文本数据能否支撑起图像显示呢? 这里以320*240像素点的TFT显示屏为例,其引脚连接关系如下: CLK ---PB5 DIN ---PB4 DC --- PB3 RST--- PA14 CS ---- PA7 实现图像再现的主要程序为: app_tft_init();
tft_Init();
LCD_Clear(RED);
Address_set(0,0,LCD_W-1,LCD_H-1);
UART_Configuration();
while(1)
{
while(USART_GetFlagStatus(CW_UART1, USART_FLAG_RC)==RESET);
a=USART_ReceiveData_8bit(CW_UART1);
USART_ClearFlag(CW_UART1, USART_FLAG_RC);
USART_SendData_8bit(CW_UART1, a);
LCD_WR_DATA8(a);
}
经编译和下载,其测试效果如图5和图6所示,由此证明发送文本数据是可以实现图像再现的。
图5 发送文本数据
图6 图像再现 3.Flash数据存储 板上的W25Q64是一款 FLASH 芯片,它是通过CN10的排针来为其配置工作电压。 此外,需按以下关系进行连接: NCS---PA15 MISO---PA11 MOSI---PA12 SCK---PA10
图7 FLASH电路
图8 线路连接 在硬件的基础上,要进行数据的读写需先进行擦除处理。所使用的擦除方式有分为扇区擦除和块擦除,其中每个扇区为4KB, 每个块为64KB。 对于一幅320*240像素的16位色画面来讲,共需320*240*2=153600字节,所以使用扇区方式进行擦除是不可取的,应使用块擦除方式,且要擦除3个数据块,其语句如下: SPI_FLASH_BlockErase(0x00000); SPI_FLASH_BlockErase(0x10000); SPI_FLASH_BlockErase(0x20000); 在完成擦除的基础上,实现串口接收与存储的程序为: j=0;
WriteAddress = 0;
while(j<153600)
{
for(i=0;i<16;i++)
{
while(USART_GetFlagStatus(CW_UART1, USART_FLAG_RC)==RESET);
TxBuffer[i]=USART_ReceiveData_8bit(CW_UART1);
USART_ClearFlag(CW_UART1, USART_FLAG_RC);
j++;
}
SPI_FLASH_BufferWrite(TxBuffer, WriteAddress, 16);
WriteAddress = WriteAddress + 16;
}
经程序下载测试,其数据发送过程如图9至图11所示。
图9 打开数据文件
图10 执行发送
图11 完成发送 4. 图像再现 在完成图像数据存储的情况下,通过数据的读取可再现原图片内容,其主要程序为: Address_set(0,0,LCD_W-1,LCD_H-1);
ReadAddress=0;
j=0;
while(j<153600)
{
SPI_FLASH_BufferRead(RxBuffer, ReadAddress, 16);
ReadAddress = ReadAddress + 16;
for(i=0;i<16;i++)
{
LCD_WR_DATA8(RxBuffer[i]);
j++;
}
}
在程序下载后,其运行效果如图12所示。
图12 显示效果 5. 图库构建与图片浏览 1)图库构建 基于前面介绍的数据存储方法,要构建图库有2种方式,即逐次添加法和批次处理法。 所谓“逐次添加法”,就是在不连续处理的情况下,视实际需要通过不断地添加来完成图库构建。 以320*240像素的16位色图片为例,其每幅图片要占用153600个字节。在每次存储前就要擦除同样字节数的空间以备数据存储,并将存储位置衔接到已有数据之后。 例如: 第1幅图的首地址为: 0 第2幅图的首地址为:153600 第3幅图的首地址为:307200 第n幅图的首地址为:(n-1)*153600 所谓“批次处理法”,就是一次性完成多幅图片的处理,这就需要在处理过程中自动来完成擦除块的计算和擦除,并自动给出数据存储的地址。 2)图片浏览 基于前面介绍的图像再现方法,要实现图库的浏览,也有2种方式,即顺序浏览和键控浏览。 1)顺序浏览: 所谓“顺序浏览”就是从头到尾的不断循环显示,现实该功能的程序如下: ReadAddress=0;
c=0;
cc:
j=0;
while(j<153600)
{
SPI_FLASH_BufferRead(RxBuffer, ReadAddress, 16);
ReadAddress = ReadAddress + 16;
for(i=0;i<16;i++)
{
LCD_WR_DATA8(RxBuffer[i]);
j++;
}
}
c++;
c=c%N;
ReadAddress=c*153600;
goto cc;
2)键控浏览 所谓“键控浏览”就是按使用者的意愿通过按键K1和K2来控制浏览,即用K1键向下浏览,用K2键向上浏览。其主要程序为: while((gKey1Status == 1)&&(gKey2Status == 1));
if(gKey1Status == 0) c++;
if((gKey2Status == 0)&&(i>0)) c--;
c=c%N;
ReadAddress=c*153600;
goto cc;
视频演示:
|
由浅入深,一步步完成基于CW32F030开发板的图库构建与图片浏览的应用开发,开发过程详细,从串口的收发逐步推进,最终完成整个应用的开发测试。审核看了下视频,刷新率感人~