STM32F1xx DMA+USART1发送+接收+USART1空闲中断

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

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)
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值