使用串口DMA方式将SRAM的数据通过串口发送出发
1 #define USART1_DR_ADDR ( USART1_BASE + 4 )
2 #define BUFSIZE 28
3
4 char tx_buf [ BUFSIZE ] = { \
5 'a' , 'b' , 'c' , 'd' , 'e' , \
6 'f' , 'g' , 'h' , 'i' , 'j' , \
7 'k' , 'l' , 'm' , 'n' , 'o' , \
8 'p' , 'q' , 'r' , 's' , 't' , \
9 'u' , 'v' , 'w' , 'x' , 'y' , \
10 'z' , 'z' , 'z' };
11
12 void uart_dma_init ( void )
13 {
14 GPIO_InitTypeDef GPIO_InitStruct ;
15 USART_InitTypeDef USART_InitStruct ;
16
17 RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1 , ENABLE );
18 RCC_APB2PeriphClockCmd ( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | \
19 RCC_APB2Periph_AFIO , ENABLE );
20
21 //GPIO Init(PA9‐>TX,PA10‐>RX)
22 GPIO_InitStruct . GPIO_Pin = GPIO_Pin_9 ;
23 GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
24 GPIO_InitStruct . GPIO_Mode = GPIO_Mode_AF_PP ;
25 GPIO_Init ( GPIOA , & GPIO_InitStruct );
26 27 GPIO_InitStruct . GPIO_Pin = GPIO_Pin_10 ;
28 GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
29 GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IN_FLOATING ;
30 GPIO_Init ( GPIOA , & GPIO_InitStruct );
31
32 //usart init
33 USART_InitStruct . USART_BaudRate = 115200 ;//波特率
34 USART_InitStruct . USART_HardwareFlowControl = \ //硬件的流控
35 USART_HardwareFlowControl_None ;
36 USART_InitStruct . USART_Parity = USART_Parity_No ;//奇偶校验
37 USART_InitStruct . USART_StopBits = USART_StopBits_1 ;//停止位
38 USART_InitStruct . USART_WordLength = USART_WordLength_8b ;//数据位的长度
39 USART_InitStruct . USART_Mode = USART_Mode_Tx | USART_Mode_Rx ;//串口的模式
40 USART_Init ( USART1 , & USART_InitStruct );
41
42 //DMA init
43 DMA_InitStruct . DMA_PeripheralBaseAddr = USART1_DR_ADDR ;
44 DMA_InitStruct . DMA_MemoryBaseAddr = ( uint32_t ) tx_buf ;
45 DMA_InitStruct . DMA_DIR = DMA_DIR_PeripheralDST ;
46 DMA_InitStruct . DMA_BufferSize = BUFSIZE ;
47 DMA_InitStruct . DMA_PeripheralInc = DMA_PeripheralInc_Disable ;
48 DMA_InitStruct . DMA_MemoryInc = DMA_MemoryInc_Enable ;
49 DMA_InitStruct . DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte ;
50 DMA_InitStruct . DMA_MemoryDataSize = DMA_MemoryDataSize_Byte ;
51 DMA_InitStruct . DMA_Mode = DMA_Mode_Normal ;
52 DMA_InitStruct . DMA_Priority = DMA_Priority_High ;
53 DMA_InitStruct . DMA_M2M = DMA_M2M_Disable ;
54 DMA_Init ( DMA1_Channel4 , & DMA_InitStruct ); //usart1_tx
55
56 USART_DMACmd ( USART1 , USART_DMAReq_Tx , ENABLE );
57 USART_Cmd ( USART1 , ENABLE );
58 DMA_Cmd ( DMA1_Channel4 , ENABLE );
59
60 }
定义数据为的长度
#define USART WondLength 8b
#define USART_WordLength_9b
定于停止位,一般使用1
#define USART_StopBits_1 ((uint16_t) 0x0000)
#define USART_StopBits_0_5 ((uint16_t) 0x1000)
#define USART StopBits 2 ((uint16_t) 0x2000)
#define USART_StopBits_1_5 ((uint16_t) 0x3000)
#define IS_USART_STOPBITS (STOPBITS) (((STOPBITS) USART_StopBits_1) II\ 3 ( (STOPBITS) USART_StopBits_0_5) II\ ( (STOPBITS) USART_StopBits_2) II\ 5 ((STOPBITS) USART_StopBits_1_5))
选择校验的方式 8不验证,取得1个字节的数据
#define USART_Parity_NoI ((uint16_t) Ox0000)
#define USART_Parity_Even //奇校验
#define USART_Parity_Odd ((uint16_t) 0x0400) ((uint16_t) 0x0600) 偶校验
#define IS_USART_PARITY (PARITY) (((PARITY) USART_Parity_No) II\ ((PARITY) USART_Parity_Even) II \ ((PARITY) USART_Parity_Odd)) @}
/** @defgroup USART_Hardware_Flow_Control
* @{
*/
#define USART_HardwareFlowControl_None ((uint16_t)0x0000)
#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100)
#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200)
#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300)
#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\
(((CONTROL) == USART_HardwareFlowControl_None) || \
((CONTROL) == USART_HardwareFlowControl_RTS) || \
((CONTROL) == USART_HardwareFlowControl_CTS) || \
((CONTROL) == USART_HardwareFlowControl_RTS_CTS))
/**
* @}
*/ 选择串口的是受还是发,可以选择既可以收也可呀发
/** @defgroup USART_Mode
* @{
*/
#define USART_Mode_Rx ((uint16_t)0x0004)
#define USART_Mode_Tx ((uint16_t)0x0008)
#define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00))
/** @defgroup USART_Hardware_Flow_Control
* @{流空,一边选择USART_HardwareFlowControl_None 不留空
*/
#define USART_HardwareFlowControl_None ((uint16_t)0x0000)
#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100)
#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200)
#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300)
#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\
(((CONTROL) == USART_HardwareFlowControl_None) || \
((CONTROL) == USART_HardwareFlowControl_RTS) || \
((CONTROL) == USART_HardwareFlowControl_CTS) || \
((CONTROL) == USART_HardwareFlowControl_RTS_CTS))
//使能
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
//中断
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
4.3.2、串口DMA接收
串口接收不定长数据:使用串口空闲中断方式,判断一次通信的结束。
接下来配置gpio口,配置gpio9就是发送引脚;gpio10是接受引脚
配置串口USART_Init初始化串口,配置为串口1,第二个参数是串口的初始化结构体
配置中断
串口的使能
在main函数中调用串口初始化函数,传入波特率
![](https://img-blog.csdnimg.cn/direct/648f2a4ff90a442da31f37751d14f0b6.png)
调用格式化输出函数来完成数据的输出
![](https://img-blog.csdnimg.cn/direct/0a2ec0306c38417ba7289495d68e5939.png)
等待用户发送完成的标志,把这个数据发送出去,send的方式一个字节往外发送
编译代码
![](https://img-blog.csdnimg.cn/direct/3f4b8776449345caa09c9690f7d6e166.png)
没有错误编译成功
![](https://img-blog.csdnimg.cn/direct/03967368cf5c403ba9bc549e4e5e6b57.png)
下载数据到单片机中
接着打开串口助手
![](https://img-blog.csdnimg.cn/direct/f5702e7e311d4d2ab20259e34a31e761.png)
pc链接usb,接的时候通过一个u转串芯片把单片机的utl信号转换成电脑usb能够识别的信号,我们通过串口调试助手来跟STM32单片机进行通信
![](https://img-blog.csdnimg.cn/direct/a5f84830ad7946ec9605f6d4e345e9e1.png)
接受数据
![](https://img-blog.csdnimg.cn/direct/aac031b9b8ce443b8b70099764922f19.png)
串口接受函数,接收到用户接受数据串口函数被触发时候,调用接收数据的函数,把数据存入到队列中