STM32F1库函数初始化系列:串口DMA空闲接收_DMA发送
生活随笔
收集整理的這篇文章主要介紹了
STM32F1库函数初始化系列:串口DMA空闲接收_DMA发送
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 void USART3_Configuration(void) //串口3配置---S
2 {
3 DMA_InitTypeDef DMA_InitStructure;
4 USART_InitTypeDef USART_InitStructure;
5 GPIO_InitTypeDef GPIO_InitStructure;
6 NVIC_InitTypeDef NVIC_InitStructure;
7 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
8 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1|RCC_AHBPeriph_DMA2, ENABLE);
9 //USART1
10 //TX
11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
12 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
13 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
14 GPIO_Init(GPIOB, &GPIO_InitStructure);
15 //RX
16 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
17 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
18 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
19 GPIO_Init(GPIOB, &GPIO_InitStructure);
20
21 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&( USART3->DR);
22 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)_code_rece;
23 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
24 DMA_InitStructure.DMA_BufferSize = 4000;
25 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
26 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
27 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //HalfWord
28 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
29 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ; // DMA_Mode_Normal
30 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA_Priority_Low DMA_Priority_Medium DMA_Priority_High
31 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
32 DMA_Init(DMA1_Channel3, &DMA_InitStructure);
33
34 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&( USART3->DR);
35 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)_send_data;
36 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
37 DMA_InitStructure.DMA_BufferSize = 14;
38 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
39 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
40 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //HalfWord
41 DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
42 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ; // DMA_Mode_Normal
43 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA_Priority_Low DMA_Priority_Medium DMA_Priority_High
44 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
45 DMA_Init(DMA1_Channel2, &DMA_InitStructure);
46
47 USART_OverSampling8Cmd(USART3, ENABLE);
48 USART_InitStructure.USART_BaudRate = 460800;
49 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
50 USART_InitStructure.USART_StopBits = USART_StopBits_1;
51 USART_InitStructure.USART_Parity = USART_Parity_No;
52 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
53 USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
54 USART_Init(USART3, &USART_InitStructure);
55
56 //NVIC 設置,使能中斷
57 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //選擇中斷分組1
58
59 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //選擇串口3中斷
60 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占式中斷優先級設置為1
61 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應式中斷優先級設置為1
62 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷
63 NVIC_Init(&NVIC_InitStructure);
64 USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//開啟中斷
65
66 USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE);
67 USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE);
68 DMA_Cmd(DMA1_Channel3, ENABLE);
69 USART_Cmd(USART3, ENABLE);
70 USART3->SR;
71 USART3->DR;
72 }
73
74 DmaSendDataProc( DMA1_Channel2, 14 );
75 //開啟一次DMA傳輸
76 void DmaSendDataProc(DMA_Channel_TypeDef *DMA_Streamx,u16 ndtr)
77 {
78
79 DMA_Cmd(DMA_Streamx, DISABLE); //關閉DMA傳輸
80
81 DMA_SetCurrDataCounter(DMA_Streamx,ndtr); //數據傳輸量
82
83 DMA_Cmd(DMA_Streamx, ENABLE); //開啟DMA傳輸
84
85 }
86 void USART3_IRQHandler(void) //客戶端傳來數據
87 {
88 if(USART_GetFlagStatus(USART3, USART_FLAG_IDLE)==SET) //RXNE一個字節接收完成標志位,
89 {
90 DMA_Cmd(DMA1_Channel3, DISABLE); //關閉DMA輸出
91
92 usart2_num = 2000 - DMA1_Channel3 ->CNDTR; //獲取讀到的字節數
93 //處理數據
94 DMA1_Channel3->CNDTR = 2000; //重新填充
95 DMA_Cmd(DMA1_Channel3, ENABLE); //開啟DMA傳輸
96 }
97
98 USART_ClearITPendingBit(USART3, USART_IT_IDLE); //清除接收中斷標志位
99 USART3->SR;
100 USART3->DR;
101
102 }
?
轉載于:https://www.cnblogs.com/penuel/p/11264220.html
總結
以上是生活随笔為你收集整理的STM32F1库函数初始化系列:串口DMA空闲接收_DMA发送的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python基础】14_Python中
- 下一篇: ORA-01036: 非法的变量名/编号