返回列表 发新帖我要提问本帖赏金: 100.00元(功能说明)

[CW32F030系列] 基于CW32F030开发板的图库构建与图片浏览

[复制链接]
3692|1
 楼主| jinglixixi 发表于 2022-8-17 19:52 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2022-8-17 19:57 编辑

#申请原创#

CW32F030CxTx StartKit是一款基于CW32F030C8 微控制器的评估板,其最高主频为64MHz,有64K 字节 FLASH和8K 字节 RAM。
对于这样一款开发板,要直接进行图片显示是较为困难的,因受程序空间的限制,你无法将图片的数据存放到数组中来支持其显示。
那如何才能实现图1所示的显示效果呢?
1.jpg
1 显示效果
好在还开发板的外设资源是相对比较丰富的,它板载了一个W25Q64存储芯片,使用它可以解决图像数据的读写问题,并可凭此来构建图库。
因为W25Q64的存储空间为8MB,每个扇区为4KB, 每个块为64KB。也就是说,对于一幅320*240像素点的图片,它可以存储8000/(320*240*2)=52幅。
解决了存储的问题,还存在一个如何来提供数据的问题。因为正是由于CW32F030C8的程序空间小,才导致无法将显示数据存放到程序中,没有了数据又何谈存储呢?
问题的解决方法就是通过串行通讯来提供存储数据。
1. 串口数据收发
CW32F030C8提供了多个串行通讯接口,并板载了USB转TTL芯片CH340,其原理图见图2所示。
2.jpg
图2  CH340接口电路
在使用时,需通过CN9为其提供电源支持,并将串口的发送引脚连接到PA9,将串口的接收引脚连接到PA8,见图3所示。
3.jpg
图3 引脚连接
在硬件的基础上,实现数据收发的程序如下:
  1. UART_Configuration();
  2. while(1)
  3. {
  4.          while(USART_GetFlagStatus(CW_UART1, USART_FLAG_RC)==RESET);
  5.          a=USART_ReceiveData_8bit(CW_UART1);
  6.          USART_ClearFlag(CW_UART1, USART_FLAG_RC);
  7.          USART_SendData_8bit(CW_UART1, a);
  8. }

其中,语句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.jpg
图4 测试效果
当然在此基础上,也可实现文件数据的发送及保存。
2.数据接收与图像显示
我们使用串口收发数据的目的是显示图像,那通过串口发送的文本数据能否支撑起图像显示呢?
这里以320*240像素点的TFT显示屏为例,其引脚连接关系如下:
CLK ---PB5
DIN ---PB4
DC --- PB3
RST--- PA14
CS ---- PA7
实现图像再现的主要程序为:
  1. app_tft_init();
  2. tft_Init();
  3. LCD_Clear(RED);
  4. Address_set(0,0,LCD_W-1,LCD_H-1);
  5. UART_Configuration();
  6. while(1)
  7. {
  8.           while(USART_GetFlagStatus(CW_UART1, USART_FLAG_RC)==RESET);
  9.           a=USART_ReceiveData_8bit(CW_UART1);
  10.           USART_ClearFlag(CW_UART1, USART_FLAG_RC);
  11.           USART_SendData_8bit(CW_UART1, a);
  12.           LCD_WR_DATA8(a);
  13. }

经编译和下载,其测试效果如图5和图6所示,由此证明发送文本数据是可以实现图像再现的。
5.jpg
图5 发送文本数据
6.jpg
图6  图像再现
3.Flash数据存储
板上的W25Q64是一款 FLASH 芯片,它是通过CN10的排针来为其配置工作电压。
此外,需按以下关系进行连接:
NCS---PA15
MISO---PA11
MOSI---PA12
SCK---PA10
7.jpg
图7 FLASH电路
8.jpg
图8 线路连接
在硬件的基础上,要进行数据的读写需先进行擦除处理。所使用的擦除方式有分为扇区擦除和块擦除,其中每个扇区为4KB, 每个块为64KB。
对于一幅320*240像素的16位色画面来讲,共需320*240*2=153600字节,所以使用扇区方式进行擦除是不可取的,应使用块擦除方式,且要擦除3个数据块,其语句如下:
SPI_FLASH_BlockErase(0x00000);
SPI_FLASH_BlockErase(0x10000);
SPI_FLASH_BlockErase(0x20000);
在完成擦除的基础上,实现串口接收与存储的程序为:
  1. j=0;
  2. WriteAddress = 0;
  3. while(j<153600)
  4. {
  5.           for(i=0;i<16;i++)
  6.           {
  7.                        while(USART_GetFlagStatus(CW_UART1, USART_FLAG_RC)==RESET);
  8.                        TxBuffer[i]=USART_ReceiveData_8bit(CW_UART1);
  9.                        USART_ClearFlag(CW_UART1, USART_FLAG_RC);
  10.             j++;
  11.           }
  12.          SPI_FLASH_BufferWrite(TxBuffer, WriteAddress, 16);
  13.          WriteAddress = WriteAddress + 16;
  14. }

经程序下载测试,其数据发送过程如图9至图11所示。
9.jpg
图9 打开数据文件
10.jpg
图10 执行发送
11.jpg
图11 完成发送
4. 图像再现                        
在完成图像数据存储的情况下,通过数据的读取可再现原图片内容,其主要程序为:
  1. Address_set(0,0,LCD_W-1,LCD_H-1);
  2. ReadAddress=0;
  3. j=0;
  4. while(j<153600)
  5. {
  6.             SPI_FLASH_BufferRead(RxBuffer, ReadAddress, 16);
  7.             ReadAddress = ReadAddress + 16;
  8.        for(i=0;i<16;i++)
  9.             {
  10.                             LCD_WR_DATA8(RxBuffer[i]);
  11.                             j++;
  12.             }
  13. }

在程序下载后,其运行效果如图12所示。
12.jpg
图12 显示效果
5. 图库构建与图片浏览
1)图库构建
基于前面介绍的数据存储方法,要构建图库有2种方式,即逐次添加法和批次处理法。
所谓“逐次添加法”,就是在不连续处理的情况下,视实际需要通过不断地添加来完成图库构建。
以320*240像素的16位色图片为例,其每幅图片要占用153600个字节。在每次存储前就要擦除同样字节数的空间以备数据存储,并将存储位置衔接到已有数据之后。
例如:
第1幅图的首地址为: 0
第2幅图的首地址为:153600
第3幅图的首地址为:307200
第n幅图的首地址为:(n-1)*153600
所谓“批次处理法”,就是一次性完成多幅图片的处理,这就需要在处理过程中自动来完成擦除块的计算和擦除,并自动给出数据存储的地址。
2)图片浏览
基于前面介绍的图像再现方法,要实现图库的浏览,也有2种方式,即顺序浏览和键控浏览。
1)顺序浏览:
所谓“顺序浏览”就是从头到尾的不断循环显示,现实该功能的程序如下:
  1. ReadAddress=0;
  2. c=0;
  3. cc:
  4. j=0;
  5. while(j<153600)
  6. {
  7.             SPI_FLASH_BufferRead(RxBuffer, ReadAddress, 16);
  8.             ReadAddress = ReadAddress + 16;
  9.        for(i=0;i<16;i++)
  10.             {
  11.                             LCD_WR_DATA8(RxBuffer[i]);
  12.                             j++;
  13.             }
  14. }
  15. c++;
  16. c=c%N;
  17. ReadAddress=c*153600;
  18. goto cc;

2)键控浏览
所谓“键控浏览”就是按使用者的意愿通过按键K1和K2来控制浏览,即用K1键向下浏览,用K2键向上浏览。其主要程序为:
  1. while((gKey1Status == 1)&&(gKey2Status == 1));
  2. if(gKey1Status == 0) c++;
  3. if((gKey2Status == 0)&&(i>0)) c--;
  4. c=c%N;
  5. ReadAddress=c*153600;
  6. goto cc;


视频演示:


打赏榜单

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

评论

由浅入深,一步步完成基于CW32F030开发板的图库构建与图片浏览的应用开发,开发过程详细,从串口的收发逐步推进,最终完成整个应用的开发测试。审核看了下视频,刷新率感人~  发表于 2022-8-18 15:41
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部