STM32
直播中

吕珠峰

11年用户 868经验值
擅长:可编程逻辑
私信 关注
[问答]

STM32F103C8T6 DMA传送一次后,DMA-CCR-MINC位修改无效的原因?

我用的是STM32F103C8T6,HAL库中设置SPI2的DMA模式,初始化设置的是打开存储器地址增量模式MINC位=1,但在程序中要不停重复写入0x00,想把MINC位置零,用*( unsigned int * )(DMA1_BASE + 0x08 + 20*4)  = ~(1<<7);直接修改寄存器,结果发现这段代码放在SPI第一次传送之前,修改有效,一旦DMA传送一次后,用它修改MINC就无效了。

请问各位大神,这是怎么回事,看手册也没有找到MINC修改时必须满足什么条件。

回帖(1)

李鸿

2024-3-22 18:29:07
在STM32F103C8T6中,SPI的DMA模式下,每次传输完成后,DMA的寻址会根据设置的存储器地址增量模式(MINC)的值自动增加或保持不变。

根据你的描述,你初始化设置MINC位为1,即开启了存储器地址的自动增量模式。在第一次传输之前修改正常,但是传输完成后,你想通过直接修改DMA的控制寄存器来关闭存储器地址的自动增量,但是发现这样的修改无效。

这是因为DMA的控制寄存器(DMA_CCRx)是只读的,不能通过直接写寄存器的方式来修改MINC位。如果要修改DMA的配置,在每次传输完成后,你需要重新设置DMA的相关寄存器。

可以通过以下步骤来关闭MINC位:
1. 在传输完成后,禁用SPI的DMA传输(通过SPI的DMA传输完成中断回调函数或查询标志位来判断传输是否完成)。
2. 禁用DMA通道(通过DMA的禁用函数或者设置DMA_CCRx.EN位为0)。
3. 清除DMA的控制寄存器(DMA_CCRx)的所有位(通过将DMA_CCRx寄存器设置为0)。
4. 配置需要修改的DMA参数(例如设置MINC位为0)。
5. 重新使能DMA通道(通过DMA的使能函数或者设置DMA_CCRx.EN位为1)。
6. 启动SPI的DMA传输。

这样就可以在每次传输完成后重新设置DMA的参数,包括修改MINC位为0。

需要注意的是,在修改DMA的配置期间,要确保SPI的传输未启动,以免产生未定义的行为。

希望这可以解决你的问题!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分