找回密码
 立即注册
查看: 137|回复: 7

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2026-07-05 07:53:50

24

主题

54

回帖

1050

积分

金牌会员

积分
1050
发表于 2026-6-13 09:41:48 | 显示全部楼层 |阅读模式
STC32G144K246芯片,QSPI_DMA_P2P传送(图片取模的高低位在前的数据)问题:
因为我原来的取模是高位在前,而现在的QSPI_DMA_P2P传送要求是低位在前,
现在可不可以改一下QSPI_DMA_P2P传送中的某个函数来适用我的高位在前的取模数据

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2026-07-05 07:53:50

24

主题

54

回帖

1050

积分

金牌会员

积分
1050
发表于 2026-6-16 18:02:53 | 显示全部楼层
就是把Flash读出来的数高低字节对换后再送P2P,又谁知道怎改吗?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:815
  • 最近打卡:2026-07-05 00:08:16

43

主题

524

回帖

4844

积分

荣誉版主

积分
4844
发表于 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就是高低位相反顺序




能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2026-07-05 07:53:50

24

主题

54

回帖

1050

积分

金牌会员

积分
1050
发表于 2026-6-17 11:49:41 | 显示全部楼层
图片取模是高低2个字节,我现在要求是把高低字节对换,可是P2P传送怎对换这高低字节我不知怎改

点评

不好意思把字节理解成位了 >_  详情 回复 发表于 2026-6-18 09:22
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:815
  • 最近打卡:2026-07-05 00:08:16

43

主题

524

回帖

4844

积分

荣誉版主

积分
4844
发表于 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[6]= { 0x01, 0x02, 0x12, 0x34, 0x00, 0xFF };
执行 BytesReverse( aaa, 6 ); 之后
就变成 aaa[6]= { 0x02, 0x01, 0x34, 0x12, 0xFF, 0x00 }; 了。

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

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

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



能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2026-07-05 07:53:50

24

主题

54

回帖

1050

积分

金牌会员

积分
1050
发表于 2026-6-19 07:18:21 | 显示全部楼层
大*** 发表于 2026-6-18 09:22
不好意思把字节理解成位了 >_

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

点评

把BIN文件的数据导出来编辑的方法有很多 导出来的方法挑两个简单的 1、用AiCube-ISP里的【串行Flash编辑器】把BIN文件写进Flash,然后按照前面说的方法,读取出来→交换字节→写回Flash。 其实用【串行Flash编  详情 回复 发表于 2026-6-19 15:01
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:815
  • 最近打卡:2026-07-05 00:08:16

43

主题

524

回帖

4844

积分

荣誉版主

积分
4844
发表于 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再读出来。
截图202606191443265168.jpg

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


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

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

截图202606191452304873.jpg

截图202606191454249253.jpg

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

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

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

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



能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2026-07-05 07:53:50

24

主题

54

回帖

1050

积分

金牌会员

积分
1050
发表于 2026-6-22 08:11:34 | 显示全部楼层
大*** 发表于 2026-6-19 15:01
把BIN文件的数据导出来编辑的方法有很多

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

谢谢!P2P传送改不了高低字节只能按你的思路去做了
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 14:04 , Processed in 0.087380 second(s), 85 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表