STC32G144K246芯片,QSPI_DMA_P2P传送(图片取模的高低位在前的数据)问题
STC32G144K246芯片,QSPI_DMA_P2P传送(图片取模的高低位在前的数据)问题:因为我原来的取模是高位在前,而现在的QSPI_DMA_P2P传送要求是低位在前,
现在可不可以改一下QSPI_DMA_P2P传送中的某个函数来适用我的高位在前的取模数据
就是把Flash读出来的数高低字节对换后再送P2P,又谁知道怎改吗? 之前学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就是高低位相反顺序
图片取模是高低2个字节,我现在要求是把高低字节对换,可是P2P传送怎对换这高低字节我不知怎改 智*** 发表于 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-18 09:22
不好意思把字节理解成位了 >_
谢谢你的指点,可我的图片取模后的是BIN,文件,怎样对换字节 智*** 发表于 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-19 15:01
把BIN文件的数据导出来编辑的方法有很多
导出来的方法挑两个简单的
谢谢!P2P传送改不了高低字节只能按你的思路去做了{:4_196:}
页:
[1]