久芯网

PSSI_DMA 16位到32位的问题

avatar blankin604 提问时间: 2023-07-02 10:40:25 / 未解决

我们最近在用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个回答
  • avatar butterflyspring
    回答时间: 2023-07-02 10:59:16

    从手册上看,这个外设的传输数据就是按照32位传送的,虽然它的数据宽度只有16位。 所以DMA在访问数据寄存器时也是32位的。楼主只能得到这样的结果。 建议软件在累加时再单独拆分一下数据吧。

  • avatar xmshao
    回答时间: 2023-07-02 11:27:06

    你现在使用DMA传输,结合你当前应用,两边应该都是Word到Word,即每次按字访问。 如果你使用16位接口,PSSI-DR寄存器里的数据是分2次填入的,先填低半字, 再填高半字的顺序进行。 但是,你说高低半字内容总是一样,那应该是有问题的。因为两个半字数据是来自 两次不同传输。 这个地方你可能要确认下。

  • avatar blankin604
    回答时间: 2023-07-02 11:48:31

    非常感谢两位,@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);

  • avatar xmshao
    回答时间: 2023-07-02 12:12:30
    blankin604 发表于 2023-5-11 11:04
    非常感谢两位,@butterflyspring ,@xmshao

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

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

  • avatar blankin604
    回答时间: 2023-07-02 12:37:24
    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的开发板上就是好的。。。 谢。

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

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

会员中心 微信客服
客服
回到顶部