你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

PSSI_DMA 16位到32位的问题

[复制链接]
blankin604 提问时间:2023-5-9 15:29 / 未解决

我们最近在用H723的PSSI,由于我们需要对接收到的数据进行32位的累加,所以就在DMA初始化的时候将目标内存设置位了一个32bit的数组:HAL_PSSI_Receive_DMA(&hpssi, (uint32_t*)pData32_rec , pssi_points);。

cubemx中的设置为circular,data width都为word。

但是我们发现好像在DMA传输时这个32位的数据高16位写入了和低16位一样的数据,比如我的PSSI数据位1ff,那么pData32_rec则为01ff01ff,而我想要的是0x000001ff。

请问这个是什么问题?

收藏 评论6 发布时间:2023-5-9 15:29

举报

6个回答
butterflyspring 回答时间:2023-5-9 17:01:16
从手册上看,这个外设的传输数据就是按照32位传送的,虽然它的数据宽度只有16位。
所以DMA在访问数据寄存器时也是32位的。楼主只能得到这样的结果。
建议软件在累加时再单独拆分一下数据吧。
STM32H723 PSSI data 32bit transfer.png
xmshao 回答时间:2023-5-10 09:21:13
你现在使用DMA传输,结合你当前应用,两边应该都是Word到Word,即每次按字访问。


如果你使用16位接口,PSSI-DR寄存器里的数据是分2次填入的,先填低半字,


再填高半字的顺序进行。


但是,你说高低半字内容总是一样,那应该是有问题的。因为两个半字数据是来自


两次不同传输。 这个地方你可能要确认下。
blankin604 回答时间:2023-5-11 11:04:38
非常感谢两位,@butterflyspring ,@xmshao

我简单在我手头的两个开发板上试了下最简单的DMA功能,一个是H723ZG,一个是G474RE。

结果474的结果是对的,而723的结果不对。

474结果是这样的:

data in pData16[0] is: 000001ff
data in pData32[0] is: 00000000
data in pData16[1] is: 000001ff
data in pData32[1] is: 00000000
after DMA*********
data in pData16[0] is: 000001ff
data in pData32[0] is: 000001ff
data in pData16[1] is: 000001ff
data in pData32[1] is: 000001ff

这个跟我想的一样,而H723的开发板的输出是这样的:

data in pData16[0] is: 000001ff
data in pData32[0] is: 00000000
data in pData16[1] is: 000001ff
data in pData32[1] is: 00000000
after DMA*********
data in pData16[0] is: 000001ff
data in pData32[0] is: 01ff01ff
data in pData1661] is: 000001ff
data in pData32[1] is: 00000000

用的最新的cubemx和ide,6.8.1和1.12.1。库为STM32Cube_FW_H7_V1.11.0。

请问这可能是什么原因?

非常感谢。


代码都一样,很傻的,如下:


for (i = 0; i < data_size; i++) {
pData16 = 0x1ff;
pData32 = 0;
printf("data in pData16[%d] is: %08x\r\n", i, pData16);
printf("data in pData32[%d] is: %08x\r\n", i, pData32);
}

        HAL_DMA_Start(&hdma_memtomem_dma1_channel1, &pData16, &pData32, data_size);
        HAL_DMA_PollForTransfer(&hdma_memtomem_dma1_channel1, HAL_DMA_FULL_TRANSFER, 1000);


        printf("after DMA*********\r\n");
        for (i = 0; i < data_size; i++) {
                printf("data in pData16[%d] is: %08x\r\n", i, pData16);
                printf("data in pData32[%d] is: %08x\r\n", i, pData32);
        }

        printf("\r\n\r\n");

        HAL_Delay(2000);
xmshao 回答时间:2023-5-11 16:59:38

blankin604 发表于 2023-5-11 11:04
非常感谢两位,@butterflyspring ,@xmshao </p>
<p>我简单在我手头的两个开发板上试了下最简单的DMA功能,一个是 ...

从你代码来看,感觉只是纯粹的M to M的传输,跟PSSI有关系吗?

blankin604 回答时间:2023-5-11 17:23:13

xmshao 发表于 2023-5-11 16:59
从你代码来看,感觉只是纯粹的M to M的传输,跟PSSI有关系吗?

这个只是测试DMA的,我的实际用法是用HAL_PSSI_Receive_DMA(&hpssi, (uint32_t*)&pData16_rec, pssi_points)来传输16位的PSSI数据到pData16_rec里面去。

但是我需要后面用arm_add_q31做很多点的累加,所以想直接把PSSI用DMA传输到一个32位的数组中,比如HAL_PSSI_Receive_DMA(&hpssi, (uint32_t*)&pData32_rec, pssi_points)。

但是发现这样传输的结果就是一个32位的数据高16位也有数据。

所以想增加另外一个dma测试,结果发现纯的memory2memory的DMA也是一样。不知道为什么,同样的程序在另外一个G4的开发板上就是好的。。。

谢。

blankin604 回答时间:2023-5-11 17:28:03

butterflyspring 发表于 2023-5-9 17:01
从手册上看,这个外设的传输数据就是按照32位传送的,虽然它的数据宽度只有16位。
所以DMA在访问数据寄存器 ...

我读了下这个位置,原来没仔细看,好像是说他的目标地址就是固定的32位组织,4次8位的数据或者2次16位的数据拼起来往这里面写,所以我如果想要独立的16位的数据就得把得到的32位数据拆成俩。

试下。

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版