
我们最近在用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。 请问这个是什么问题? 谢 |
有提供 stm32h747 系列的 驱动 ek79007 mipi 的例程吗 ?
型号替代-STM32H5
正点原子阿波罗H743使用DMA2D后普通刷出现问题
STM32H7系列RMII用于TCP/IP 服务器
STM32H745I-DISCO的GUI DEMO演示。
关于GFX软件下载汇报
touchgfx 4.14版本
STM32STM32H745I demo板演示,以及点灯
关于STM32H745I demo板,M7下载正常,M4下载报错?请问是怎么回事
关于STM32H745I demo板,M7下载正常,M4下载报错?后续进程
所以DMA在访问数据寄存器时也是32位的。楼主只能得到这样的结果。
建议软件在累加时再单独拆分一下数据吧。
如果你使用16位接口,PSSI-DR寄存器里的数据是分2次填入的,先填低半字,
再填高半字的顺序进行。
但是,你说高低半字内容总是一样,那应该是有问题的。因为两个半字数据是来自
两次不同传输。 这个地方你可能要确认下。
我简单在我手头的两个开发板上试了下最简单的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);
从你代码来看,感觉只是纯粹的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的开发板上就是好的。。。
谢。
我读了下这个位置,原来没仔细看,好像是说他的目标地址就是固定的32位组织,4次8位的数据或者2次16位的数据拼起来往这里面写,所以我如果想要独立的16位的数据就得把得到的32位数据拆成俩。
试下。
谢