发新帖本帖赏金 100.00元(功能说明)我要提问
返回列表
打印
[CW32F030系列]

基于CW32F030开发板的图库构建与图片浏览

[复制链接]
3123|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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;


视频演示:


使用特权

评论回复

打赏榜单

21小跑堂 打赏了 100.00 元 2022-08-18
理由:恭喜通过原创文章审核!请多多加油哦!

评论
21小跑堂 2022-8-18 15:41 回复TA
由浅入深,一步步完成基于CW32F030开发板的图库构建与图片浏览的应用开发,开发过程详细,从串口的收发逐步推进,最终完成整个应用的开发测试。审核看了下视频,刷新率感人~ 
发新帖 本帖赏金 100.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

463

主题

2774

帖子

38

粉丝