在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的传输未启动,以免产生未定义的行为。
希望这可以解决你的问题!
在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的传输未启动,以免产生未定义的行为。
希望这可以解决你的问题!
举报