STM32配置USART2的DMA传输,犯了一个低级错误

这两天重写了一下串口的DMA传输代码,结果发现串口发送的字符串始终只有首个字节。

/*DMA_USART2_TX, RAM->USART2, DMA1_Channel7*/
    DMA_DeInit(DMA1_Channel7);                                                        //将DMA的通道7寄存器重设为缺省值 
    DMA1_InitStructure.DMA_PeripheralBaseAddr    = (u32)(&(USART2->DR));                //启动传输前装入实际RAM地址
    DMA1_InitStructure.DMA_MemoryBaseAddr        = (u32)(USART2_TX_BUF);                //设置发送缓冲区首地址
    DMA1_InitStructure.DMA_PeripheralDataSize    = DMA_PeripheralDataSize_Byte;        //设置外设数据宽度为8位
    DMA1_InitStructure.DMA_MemoryDataSize        = DMA_MemoryDataSize_Byte;            //设置内存数据宽度为8位
    DMA1_InitStructure.DMA_PeripheralInc              = DISABLE;        //外设地址寄存器不变
    DMA1_InitStructure.DMA_MemoryInc            = ENABLE;                //内存地址寄存器递增
    DMA1_InitStructure.DMA_DIR                    = DMA_DIR_PeripheralDST;            //数据传输方向:内存->外设
    DMA1_InitStructure.DMA_BufferSize            = USART2_MAX_TX_LEN;                //DMA通道的DMA缓存的大小
    DMA1_InitStructure.DMA_Mode                    = DMA_Mode_Normal;                    //工作在正常模式,只发送一次
    DMA1_InitStructure.DMA_Priority                = DMA_Priority_High;                //拥有最高优先权
    DMA1_InitStructure.DMA_M2M                    = DMA_M2M_Disable;                    //禁能内存到内存传输
    DMA_Init(DMA1_Channel7, &DMA1_InitStructure);
 

想来想去,才怀疑有可能地址没有递增,细看了代码才发现原来习惯性地将使能/禁能,用了ENABLE/DISABLE,DMA_PeripheralInc和DMA_MemoryInc有自己的宏定义。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32 F103是一种高性能的微控制器,它是STMicroelectronics公司推出的基于ARM Cortex-M3内核的单片机。USART2是一种通用同步/异步收发器,它能够通过外设接口和其他设备进行通信。DMA是一种直接存储器访问技术,它能够使系统更加高效地使用处理器和内存资源。 在使用STM32 F103的USART2功能时,通过使用DMA技术可以有效减少处理器的负担,提高程序的效率。具体来说,通过配置USART2DMA传输控制器,可以将收到的数据自动传送到指定的存储器地址,或者将存储器中的数据自动发送到USART2输出端口,从而实现高效的数据传输和处理功能。 需要注意的是,在配置STM32 F103的USART2 DMA功能时,需要正确设置数据缓存区的大小和存储器地址,以保证数据的正确性和完整性。此外,需要注意DMA传输时的数据精度和数据长度,以保证数据的正确传输和处理。最后,应根据具体的应用场景和数据处理需求灵活选择USART2DMA传输方式和参数,以提高系统性能和稳定性。 ### 回答2: STM32 F103是STMicroelectronics的一款32位微控制器,它可以通过USART2进行串行通信。而DMA(Direct Memory Access)则是一种能够直接将数据从外设传输到内存的技术,从而减轻了CPU的负担,提供了更加高效的数据传输方式。 当使用STM32 F103进行USART2通信时,可以利用DMA技术进行数据传输,提高数据传输效率和响应速度,减轻CPU负担。具体实现方法如下: 1. 配置USART2DMA通道: 首先,需要配置USART2进行串行通信,包括波特率、数据位、停止位、校验位等参数。然后,需要配置DMA通道,包括DMA模式、数据大小、传输方向、中断/轮询模式等参数。 2. 启动DMA传输: 在配置完成之后,可以启动DMA传输,将外设数据传输到内存中。在传输过程中,DMA控制器会直接将数据从USART2中读取,将数据存储到内存中,无需CPU参与,从而提高了传输效率。 3. 处理接收数据: 在DMA传输完成后,需要对接收到的数据进行处理。可以通过中断/轮询的方式,从内存中读取数据进行处理。在处理接收数据时,需要注意数据的完整性和正确性,防止出现数据丢失或错误情况。 总的来说,STM32 F103与USART2结合使用,可以实现高效的串行通信,而DMA技术的应用则可以进一步提高传输效率和响应速度。当需要进行大量数据传输时,使用DMA技术可以极大地减轻CPU负担,提高系统的整体性能。 ### 回答3: STM32 F103 USART2 DMA是一种通信方式,其中DMA是直接内存访问的缩写。USART2代表使用串行通信的特定串行设备,而库存储(storage)器(memory)访问DMA使得数据传输变得更快,更有效。 由于DMA采用了一种直接控制器访问存储器的方式,因此系统的CPU无需参与到数据传输过程中,这降低了CPU负载,使得CPU更快地完成其它任务。在使用USART2时,DMA可将传输过程完全从CPU中释放,作为结果又更快地进行串行通信过程。 在使用DMA时需要将USART2配置修改为DMA模式,开发人员需要先设置DMA和ICR(接口控制寄存器),然后在接收或发送完毕后,必须清除DMA标志,否则后续的传输将无法进行。这段代码通常需要经过仔细的测试和调整,以确认它是否正确处理DMA中断以及USART和DMA之间的传输互动。 总之,STM32 F103 USART2 DMA可以提高通信速度,减轻CPU的负担,同时还需要仔细的配置和调整,以确保任何传输/接收乱码问题得到处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值