我是靠谱客的博主 年轻发卡,这篇文章主要介绍STM32 USART1 USART2 UART3配置 接收函数和发送函数,现在分享给大家,希望可以做个参考。

    STM32F10x系列,串口1、串口2、串口3配置以及中断函数、接收数据和发送数据函数

uart.c

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
//硬件驱动 #include "usart.h" #include "delay.h" //C库 #include <stdarg.h> #include <string.h> /* ************************************************************ * 函数名称: Usart1_Init * * 函数功能: 串口1初始化 * * 入口参数: baud:设定的波特率 * * 返回参数: 无 * * 说明: TX-PA9 RX-PA10 ************************************************************ */ void Usart1_Init(unsigned int baud) { GPIO_InitTypeDef gpioInitStruct; USART_InitTypeDef usartInitStruct; NVIC_InitTypeDef nvicInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //打开USART1的时钟 //PA9 TXD gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //设置为复用模式 gpioInitStruct.GPIO_Pin = GPIO_Pin_9; //初始化Pin9 gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; //承载的最大频率 GPIO_Init(GPIOA, &gpioInitStruct); //初始化GPIOA //PA10 RXD gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置为浮空输入 gpioInitStruct.GPIO_Pin = GPIO_Pin_10; //初始化Pin10 gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; //承载的最大频率 GPIO_Init(GPIOA, &gpioInitStruct); //初始化GPIOA usartInitStruct.USART_BaudRate = baud; usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控 usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和发送 usartInitStruct.USART_Parity = USART_Parity_No; //无校验 usartInitStruct.USART_StopBits = USART_StopBits_1; //1位停止位 usartInitStruct.USART_WordLength = USART_WordLength_8b; //8位数据位 USART_Init(USART1, &usartInitStruct); USART_Cmd(USART1, ENABLE); //使能串口 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断 nvicInitStruct.NVIC_IRQChannel = USART1_IRQn; //usart1中断号 nvicInitStruct.NVIC_IRQChannelCmd = ENABLE; //中断通道使能 nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占中断优先级(值越小优先级越高) nvicInitStruct.NVIC_IRQChannelSubPriority = 2; //子中断优先级(值越小优先级越高) NVIC_Init(&nvicInitStruct); //初始化NVIC } /* ************************************************************ * 函数名称: Usart2_Init * * 函数功能: 串口2初始化 * * 入口参数: baud:设定的波特率 * * 返回参数: 无 * * 说明: TX-PA2 RX-PA3 ************************************************************ */ void Usart2_Init(unsigned int baud) { GPIO_InitTypeDef gpioInitStruct; USART_InitTypeDef usartInitStruct; NVIC_InitTypeDef nvicInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //PA2 TXD gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP; gpioInitStruct.GPIO_Pin = GPIO_Pin_2; gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpioInitStruct); //PA3 RXD gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; gpioInitStruct.GPIO_Pin = GPIO_Pin_3; gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpioInitStruct); usartInitStruct.USART_BaudRate = baud; usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控 usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和发送 usartInitStruct.USART_Parity = USART_Parity_No; //无校验 usartInitStruct.USART_StopBits = USART_StopBits_1; //1位停止位 usartInitStruct.USART_WordLength = USART_WordLength_8b; //8位数据位 USART_Init(USART2, &usartInitStruct); USART_Cmd(USART2, ENABLE); //使能串口 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能接收中断 nvicInitStruct.NVIC_IRQChannel = USART2_IRQn; nvicInitStruct.NVIC_IRQChannelCmd = ENABLE; nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0; nvicInitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&nvicInitStruct); } /* ************************************************************ * 函数名称: Usart3_Init * * 函数功能: 串口2初始化 * * 入口参数: baud:设定的波特率 * * 返回参数: 无 * * 说明: TX-PB10 RX-PB11 ************************************************************ */ void Usart3_Init(unsigned int baud) { GPIO_InitTypeDef gpioInitStruct; USART_InitTypeDef usartInitStruct; NVIC_InitTypeDef nvicInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //USART1_TX GPIOB.10        gpioInitStruct.GPIO_Pin = GPIO_Pin_10;         //PB.10      gpioInitStruct.GPIOSpeed = GPIO_Speed_50MHz;        gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出      GPIO_Init(GPIOB, &gpioInitStruct); //初始化GPIOB.10        //USART1_RX GPIOB.11初始化      gpioInitStruct.GPIO_Pin = GPIO_Pin_11;         //PB.11      gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;         //浮空输入      GPIO_Init(GPIOB, &gpioInitStruct); //初始化GPIOB.11 usartInitStruct.USART_BaudRate = baud; usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控 usartInitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //接收和发送 usartInitStruct.USART_Parity = USART_Parity_No; //无校验 usartInitStruct.USART_StopBits = USART_StopBits_1; //1位停止位 usartInitStruct.USART_WordLength = USART_WordLength_8b; //8位数据位 USART_Init(USART3, &usartInitStruct); USART_Cmd(USART3, ENABLE); //使能串口 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //使能接收中断 nvicInitStruct.NVIC_IRQChannel = USART3_IRQn; nvicInitStruct.NVIC_IRQChannelCmd = ENABLE; nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0; nvicInitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&nvicInitStruct); } /* ************************************************************ * 函数名称: Usart_SendString * * 函数功能: 串口数据发送 * * 入口参数: USARTx:串口组 * str:要发送的数据 * len:数据长度 * * 返回参数: 无 * * 说明: ************************************************************ */ void Usart_SendString(USART_TypeDef *USARTx, unsigned char *str, unsigned short len) { unsigned short count = 0; for(; count < len; count++) { USART_SendData(USARTx, *str++); //发送数据 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); //等待发送完成 } } /* ************************************************************ * 函数名称: UsartPrintf * * 函数功能: 格式化打印 * * 入口参数: USARTx:串口组 * fmt:不定长参 * * 返回参数: 无 * * 说明: ************************************************************ */ void UsartPrintf(USART_TypeDef *USARTx, char *fmt,...) { unsigned char UsartPrintfBuf[296]; va_list ap; unsigned char *pStr = UsartPrintfBuf; va_start(ap, fmt); vsprintf((char *)UsartPrintfBuf, fmt, ap); //格式化 va_end(ap); while(*pStr != 0) { USART_SendData(USARTx, *pStr++); while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); } } extern unsigned char usart1Buf[64]; extern unsigned char usart1Len; /* ************************************************************ * 函数名称: USART1_IRQHandler * * 函数功能: 串口1收发中断 * * 入口参数: 无 * * 返回参数: 无 * * 说明: ************************************************************ */ void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断 { if(usart1Len >= 64) //防止数据过多,导致内存溢出 usart1Len = 0; usart1Buf[usart1Len++] = USART1->DR; USART_ClearFlag(USART1, USART_FLAG_RXNE); } } extern char usart2Buf[64]; extern char usart2Len; /* ************************************************************ * 函数名称: USART2_IRQHandler * * 函数功能: 串口2收发中断 * * 入口参数: 无 * * 返回参数: 无 * * 说明: ************************************************************ */ void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断 { if(usart2Len >= 64) //防止数据过多,导致内存溢出 usart2Len = 0; usart2Buf[usart2Len++] = USART2->DR; USART_ClearFlag(USART2, USART_FLAG_RXNE); } } extern char usart3Buf[64]; extern char usart3Len; /* ************************************************************ * 函数名称: USART3_IRQHandler * * 函数功能: 串口3收发中断 * * 入口参数: 无 * * 返回参数: 无 * * 说明: ************************************************************ */ void USART3_IRQHandler(void) { if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断 { if(usart3Len >= 64) //防止数据过多,导致内存溢出 usart3Len = 0; usart3Buf[usart3Len++] = USART3->DR; USART_ClearFlag(USART3, USART_FLAG_RXNE); } }


最后

以上就是年轻发卡最近收集整理的关于STM32 USART1 USART2 UART3配置 接收函数和发送函数的全部内容,更多相关STM32内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(92)

评论列表共有 0 条评论

立即
投稿
返回
顶部