智*** 发表于 2026-6-13 09:41:48

STC32G144K246芯片,QSPI_DMA_P2P传送(图片取模的高低位在前的数据)问题

STC32G144K246芯片,QSPI_DMA_P2P传送(图片取模的高低位在前的数据)问题:
因为我原来的取模是高位在前,而现在的QSPI_DMA_P2P传送要求是低位在前,
现在可不可以改一下QSPI_DMA_P2P传送中的某个函数来适用我的高位在前的取模数据

智*** 发表于 2026-6-16 18:02:53

就是把Flash读出来的数高低字节对换后再送P2P,又谁知道怎改吗?

大明狐 发表于 2026-6-17 09:17:02

之前学DS18B20传感器的时候,因为传感器发送数据的顺序是低位在前的,所以看到过有的例程里用到过反转顺序的函数

unsigned char BitsReverse( unsigned char dat )
{
      unsigned char result, i;
      for( i=0; i<8; i++ )
      {
                result <<= 1;
                result |= dat & 0x01;
                dat >>= 1;
      }
      return result;
}

比如:
unsigned char AA = 0x03;
unsigned char BB = BitsReverse( AA );
那么BB的值就是 0xC0

这样在需要数据的地方使用 QSPI_DMA_P2P传送 ( BitsReverse( 图片取模的高位在前的数据 ) ) ,传送的就是低位在前的数值。
、、、、、、、、、、、、、、、、、、、、、、、、、、、

另外也可以从flash读取数据的时候,如果先读的是高位,直接按照反向存储每一个位
比如:
      for (i = 0; i < 8; i++)
      {
                SPI_SCK = 1;
                _nop_(); _nop_();
                dat <<= 1;
                dat |= SPI_MISO;
                SPI_SCK = 0;
      }

改成      
      for (i = 0; i < 8; i++)
      {
                SPI_SCK = 1;
                _nop_(); _nop_();
                dat >>= 1;
                if( SPI_MISO ) dat |= 0x80;
                SPI_SCK = 0;
      }

得到的dat就是高低位相反顺序




智*** 发表于 2026-6-17 11:49:41

图片取模是高低2个字节,我现在要求是把高低字节对换,可是P2P传送怎对换这高低字节我不知怎改

大明狐 发表于 2026-6-18 09:22:31

智*** 发表于 2026-6-17 11:49
图片取模是高低2个字节,我现在要求是把高低字节对换,可是P2P传送怎对换这高低字节我不知怎改 ...
不好意思把字节理解成位了 >_<||||||


根据AI助手的总结,QSPI_DMA_P2P是流水线式传输,读1个发1个。所以没法在这个过程中交换字节。

AI助手提供了几种解决方案,总结如下:

1、用新的顺序重新对图片取模
    如果没有原图了,这个方法就不好用了。

2、先预处理一下图片数据(推荐)
(1) 提前把每个数据的高低字节交换完再写入flash;
(2) 或者把flash里的数据提前读出来交换完再写回去。

这是交换字节的思路,buff是要处理的数组,num是要处理的字节数

void BytesReverse( unsigned char *buff, unsigned char num )
{
                unsigned char temp, i;
      
                for( i=0; i<num; i+=2 )
                {
                              temp = *(buff+i);
                              *(buff+i) = *(buff+i+1);
                              *(buff+i+1) = temp;
                }
}


比如 aaa= { 0x01, 0x02, 0x12, 0x34, 0x00, 0xFF };
执行 BytesReverse( aaa, 6 ); 之后
就变成 aaa= { 0x02, 0x01, 0x34, 0x12, 0xFF, 0x00 }; 了。

如果数据不多,可以直接在内存里做交换操作;如果数据量过大,可以分批交换。

3、放弃P2P,使用缓冲区进行交换
从flash取出来的数据放进缓冲区数组,用上面的函数思路进行交换,然后再发送给屏幕。
    缺点是效率下降了,而且占用额外的内存。

4、根据其它AI的提议,看使用的屏幕有没有指定数据顺序的配置
    根据常见的彩屏的说明文档,都只有像素显示的方向设置,而接收数据的顺序都是,没有改变解析顺序的指令,所以不适用。



智*** 发表于 2026-6-19 07:18:21

大明狐 发表于 2026-6-18 09:22
不好意思把字节理解成位了 >_

谢谢你的指点,可我的图片取模后的是BIN,文件,怎样对换字节

大明狐 发表于 2026-6-19 15:01:57

智*** 发表于 2026-6-19 07:18
谢谢你的指点,可我的图片取模后的是BIN,文件,怎样对换字节
把BIN文件的数据导出来编辑的方法有很多

导出来的方法挑两个简单的


1、用AiCube-ISP里的【串行Flash编辑器】把BIN文件写进Flash,然后按照前面说的方法,读取出来→交换字节→写回Flash。


其实用【串行Flash编辑器】打开BIN文件之后,就能够看到数据,只不过没有0x开头,但是是用空格分隔的,所以需要保存成文本文件之后,用记事本、Word之类的替换功能,替换出“0x”,省事儿程度不如写进Flash再读出来。


2、通过第三方工具把BIN文件转换成C文件
能查看和编辑BIN文件的工具有很多,比如WinHex、HxD、UltraEdit 等等。
这里推荐一个网页版的,https://hexed.it/ ,不用安装就能用。

浏览器打开 hexed.it ,打开你的BIN文件,可以看到里面的内容
然后 Ctrl+A 全选所有数据(这里打开的是试验箱例程里的飞鸟图片,320*240像素,有153600个数据)



在数据上点击鼠标右键,选择弹出菜单里的【导出为代码片段】或者直接按 Ctrl+C,就可以打开一个新的窗口,里面就是十六进制格式的所有数据了。
点击【复制并关闭】,然后就可以用记事本粘贴出来保存成文本或者Keil能用的文档了





经过跟例程里的图片取模的数据对比,完全一致


之后就可以使用前面说的方法交换数据了

==================================

挑出的上面这两种方法虽然相对简单,但是考虑到单片机内存的因素,用第二种方法的时候,过大的图片需要手动分批导入。所以用第一种方法先都写进flash,再通过指定内存地址分批交换更简单一些



智*** 发表于 2026-6-22 08:11:34

大明狐 发表于 2026-6-19 15:01
把BIN文件的数据导出来编辑的方法有很多

导出来的方法挑两个简单的


谢谢!P2P传送改不了高低字节只能按你的思路去做了{:4_196:}
页: [1]
查看完整版本: STC32G144K246芯片,QSPI_DMA_P2P传送(图片取模的高低位在前的数据)问题