完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用的是STM32F103C8T6,HAL库中设置SPI2的DMA模式,初始化设置的是打开存储器地址增量模式MINC位=1,但在程序中要不停重复写入0x00,想把MINC位置零,用*( unsigned int * )(DMA1_BASE + 0x08 + 20*4) = ~(1<<7);直接修改寄存器,结果发现这段代码放在SPI第一次传送之前,修改有效,一旦DMA传送一次后,用它修改MINC就无效了。
请问各位大神,这是怎么回事,看手册也没有找到MINC修改时必须满足什么条件。 |
|
相关推荐
1个回答
|
|
在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的传输未启动,以免产生未定义的行为。 希望这可以解决你的问题! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1659 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1571 浏览 1 评论
998 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
695 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1617 浏览 2 评论
1888浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
668浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
531浏览 3评论
549浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
520浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 03:05 , Processed in 1.271471 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号