STM32F1xx DMA+USART1发送+接收+USART1空闲中断
文章目录
编译器平台及例程说明
编译器平台说明
1. Toolchain : MDK-ARM Community Version: 5.30.0.0(Kile V5)
2. Encoding : Chinese GB2312(Simplified)
3. Device Specific Packs : Keil.STM32F1xx_DFP.2.3.0.pack
4. C/C++ Preprocessor Symbols : STM32F10X_HD,USE_STDPERIPH_DRIVER
USE_STDPERIPH_DRIVER :允许使用标准外设驱动
STM32F10X_HD :STM32F10x大容量产品
5. Chip Type :STM32F103RET6, Flash:512KByte, ROM:48KByte, LQFP64
6. 在stm32hf10x.h文件中HSE_VALUE为外部高速振荡器,默认8MHZ。此值必须与硬件保持一致。
例程说明
1. 使用DMA1通道5,来传输USART1接收的数据,将数据存储在RXD1BUF中。
2. 使用DMA1通道4,来传输USART1发送的数据,要发送的数据存储在RXD1BUF中。
3. 使用USART1空闲中断,来通知数据已接收完成待处理,将接收到的数据原样转发到USART1,便于在串口调试助手中显示。
4. USART1空闲中断标志位无法直接用USART_ClearITPendingBit(USART1, USART_IT_IDLE)清除,必须读取SR和DR寄存器值可清除。
5. 使用DMA_GetCurrDataCounter()前,必须将DMA失能。
一、 DMA简介
DMA全称Direct Memory Access,即直接存储器访问。用来提供外设和存储器之间,或者存储器和存储器之间的高速数据传输。无须CPU控制,数据可以通过DMA传输,它通过硬件为RAM与I/O设备之间开辟一条直接传送数据的通道,这节省CPU的资源,使CPU效率提高。
二、 DMA框图
1. DMA2仅存在于大容量产品和互联型产品。
2. SPI/I2S3、 UART4、 TIM5、 TIM6、 TIM7和DAC的DMA请求仅存在于大容量产品和互联型产品。
3. ADC3、 SDIO和TIM8的DMA请求仅存在于大容量产品。

三、 DMA1/DMA2请求映像
DMA1控制器
从外设(TIMx[x=1、 2、 3、 4]、 ADC1、 SPI1、 SPI/I2S2、 I2Cx[x=1、 2]和USARTx[x=1、 2、 3])产生的7个请求,通过逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。参见下图的DMA1请求映像。外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭。

DMA2控制器
从外设(TIMx[5、 6、 7、 8]、 ADC3、 SPI/I2S3、 UART4、 DAC通道1、 2和SDIO)产生的5个请求,经逻辑或输入到DMA2控制器,这意味着同时只能有一个请求有效。参见下图的DMA2请求映像。外设的DMA请求,可以通过设置相应外设寄存器中的DMA控制位,被独立地开启或关闭。
注意: DMA2控制器及相关请求仅存在于大容量产品和互联型产品中。

四、 DMA1/DMA2通道请求
DMA1通道请求

DMA2通道请求

五、 DMA相关宏定义
5.1 DMA传输方向
//DMA_data_transfer_direction
#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010)
#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000)
5.2 DMA外设/存储器基地址自增模式
//DMA_peripheral_incremented_mode
#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040)
#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000)
//DMA_memory_incremented_mode
#define DMA_MemoryInc_Enable ((uint32_t)0x00000080)
#define DMA_MemoryInc_Disable ((uint32_t)0x00000000)
5.3 DMA外设/存储器传输数据格式
//DMA_peripheral_data_size
#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000)
#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100)
#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200)
//DMA_memory_data_size
#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000)
#define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00000400)
#define DMA_MemoryDataSize_Word ((uint32_t)0x00000800)
5.4 DMA传输模式
//DMA_circular_normal_mode
#define DMA_Mode_Circular ((uint32_t)0x00000020)
#define DMA_Mode_Normal ((uint32_t)0x00000000)
5.4 DMA传输优先级
//DMA_priority_level
#define DMA_Priority_VeryHigh ((uint32_t)0x00003000)
#define DMA_Priority_High ((uint32_t)0x00002000)
#define DMA_Priority_Medium ((uint32_t)0x00001000)
#define DMA_Priority_Low ((uint32_t)0x00000000)
5.5 DMA储存器与存储器间传输
//DMA_memory_to_memory
#define DMA_M2M_Enable ((uint32_t)0x00004000)
#define DMA_M2M_Disable ((uint32_t)0x00000000)
5.6 DMA状态标志
// DMA1_FLAG_GL1: DMA1 Channel1 global flag.
// DMA1_FLAG_TC1: DMA1 Channel1 transfer complete flag.
// DMA1_FLAG_HT1: DMA1 Channel1 half transfer flag.
// DMA1_FLAG_TE1: DMA1 Channel1 transfer error flag.
// DMA1_FLAG_GL2: DMA1 Channel2 global flag.
// DMA1_FLAG_TC2: DMA1 Channel2 transfer complete flag.
// DMA1_FLAG_HT2: DMA1 Channel2 half transfer flag.
// DMA1_FLAG_TE2: DMA1 Channel2 transfer error flag.
// DMA1_FLAG_GL3: DMA1 Channel3 global flag.
// DMA1_FLAG_TC3: DMA1 Channel3 transfer complete flag.
// DMA1_FLAG_HT3: DMA1 Channel3 half transfer flag.
// DMA1_FLAG_TE3: DMA1 Channel3 transfer error flag.
// DMA1_FLAG_GL4: DMA1 Channel4 global flag.
// DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag.
// DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag.
// DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag.
// DMA1_FLAG_GL5: DMA1 Channel5 global flag.
// DMA1_FLAG_TC5: DMA1 Channel5 transfer complete flag.
// DMA1_FLAG_HT5: DMA1 Channel5 half transfer flag.
// DMA1_FLAG_TE5: DMA1 Channel5 transfer error flag.
// DMA1_FLAG_GL6: DMA1 Channel6 global flag.
// DMA1_FLAG_TC6: DMA1 Channel6 transfer complete flag.
// DMA1_FLAG_HT6: DMA1 Channel6 half transfer flag.
// DMA1_FLAG_TE6: DMA1 Channel6 transfer error flag.
// DMA1_FLAG_GL7: DMA1 Channel7 global flag.
// DMA1_FLAG_TC7: DMA1 Channel7 transfer complete flag.
// DMA1_FLAG_HT7: DMA1 Channel7 half transfer flag.
// DMA1_FLAG_TE7: DMA1 Channel7 transfer error flag.
// DMA2_FLAG_GL1: DMA2 Channel1 global flag.
// DMA2_FLAG_TC1: DMA2 Channel1 transfer complete flag.
// DMA2_FLAG_HT1: DMA2 Channel1 half transfer flag.
// DMA2_FLAG_TE1: DMA2 Channel1 transfer error flag.
// DMA2_FLAG_GL2: DMA2 Channel2 global flag.
// DMA2_FLAG_TC2: DMA2 Channel2 transfer complete flag.
// DMA2_FLAG_HT2: DMA2 Channel2 half transfer flag.
// DMA2_FLAG_TE2: DMA2 Channel2 transfer error flag.
// DMA2_FLAG_GL3: DMA2 Channel3 global flag.
// DMA2_FLAG_TC3: DMA2 Channel3 transfer complete flag.
// DMA2_FLAG_HT3: DMA2 Channel3 half transfer flag.
// DMA2_FLAG_TE3: DMA2 Channel3 transfer error flag.
// DMA2_FLAG_GL4: DMA2 Channel4 global flag.
// DMA2_FLAG_TC4: DMA2 Channel4 transfer complete flag.
// DMA2_FLAG_HT4: DMA2 Channel4 half transfer flag.
// DMA2_FLAG_TE4: DMA2 Channel4 transfer error flag.
// DMA2_FLAG_GL5: DMA2 Channel5 global flag.
// DMA2_FLAG_TC5: DMA2 Channel5 transfer complete flag.
// DMA2_FLAG_HT5: DMA2 Channel5 half transfer flag.
// DMA2_FLAG_TE5: DMA2 Channel5 transfer error flag.
//DMA_flags_definition
#define DMA1_FLAG_GL1 ((uint32_t)0x00000001)
#define DMA1_FLAG_TC1 ((uint32_t)0x00000002)
#define DMA1_FLAG_HT1 ((uint32_t)0x00000004)
#define DMA1_FLAG_TE1 ((uint32_t)0x00000008)
#define DMA1_FLAG_GL2 ((uint32_t)0x00000010)
#define DMA1_FLAG_TC2 ((uint32_t)0x00000020)
#define DMA1_FLAG_HT2 ((uint32_t)0x00000040)
#define DMA1_FLAG_TE2 ((uint32_t)0x00000080)
#define DMA1_FLAG_GL3 ((uint32_t)0x00000100)
#define DMA1_FLAG_TC3 ((uint32_t)0x00000200)
#define DMA1_FLAG_HT3 ((uint32_t)0x00000400)
#define DMA1_FLAG_TE3 ((uint32_t)0x00000800)
#define DMA1_FLAG_GL4 ((uint32_t)0x00001000)
#define DMA1_FLAG_TC4 ((uint32_t)0x00002000)
#define DMA1_FLAG_HT4 ((uint32_t)0x00004000)
#define DMA1_FLAG_TE4 ((uint32_t)0x00008000)
#define DMA1_FLAG_GL5 ((uint32_t)0x00010000)
#define DMA1_FLAG_TC5 ((uint32_t)0x00020000)
#define DMA1_FLAG_HT5 ((uint32_t)0x00040000)
#define DMA1_FLAG_TE5 ((uint32_t)0x00080000)
#define DMA1_FLAG_GL6 ((uint32_t)0x00100000)
#define DMA1_FLAG_TC6 ((uint32_t)0x00200000)
#define DMA1_FLAG_HT6 ((uint32_t)0x00400000)
#define DMA1_FLAG_TE6 ((uint32_t)0x00800000)
#define DMA1_FLAG_GL7 ((uint32_t)0x01000000)
#define DMA1_FLAG_TC7 ((uint32_t)0x02000000)
#define DMA1_FLAG_HT7 ((uint32_t)0x04000000)
#define DMA1_FLAG_TE7 ((uint32_t)0x08000000)
#define DMA2_FLAG_GL1 ((uint32_t)0x10000001)
#define DMA2_FLAG_TC1 ((uint32_t)0x10000002)
#define DMA2_FLAG_HT1 ((uint32_t)0x10000004)
#define DMA2_FLAG_TE1 ((uint32_t)0x10000008)
#define DMA2_FLAG_GL2 ((uint32_t)0x10000010)
#define DMA2_FLAG_TC2 ((uint32_t)0x10000020)
#define DMA2_FLAG_HT2 ((uint32_t)0x10000040)
#define DMA2_FLAG_TE2 ((uint32_t)0x10000080)
#define DMA2_FLAG_GL3 ((uint32_t)0x10000100)
#define DMA2_FLAG_TC3 ((uint32_t)0x10000200)

本文详细介绍了如何在STM32F1xx微控制器上使用DMA1通道4和5配合USART1实现数据的发送和接收,并利用USART1的空闲中断来处理接收完成的数据。文章涵盖了DMA和USART1的初始化、中断配置、DMA传输模式以及相关宏定义的解释,还提供了完整的测试代码和运行结果,展示了数据的传输过程。
最低0.47元/天 解锁文章





