繼上貼http://www.zg4o1577.cn/bbs/dpj-213781-1.html,今天發布STM32的串口2配置程序,話不多說。
1 /*===============================================================================
2 Copyright:
3 Version:
4 Author:
5 Date: 2021/11/1
6 Description:
7 函數功能是將接收固定長度的字符串,并將接收后的字符串通過串口發送出去
8 revise Description:
9 ===============================================================================*/
10 #include "stm32f10x_usart.h"
11 #include "stm32f10x.h"
12 #include "stm32f10x_iwdg.h"
13
14
15 u8 USART2_RX_BUF[250];
16 u8 USART2_RX_CNT=0;
17 u16 USART2_RX_STA=0; //接收狀態標記
18
19 void Usart2_Init(u32 bound)
20 {
21 GPIO_InitTypeDef GPIO_InitStructure;
22 USART_InitTypeDef USART_InitStructure;
23 NVIC_InitTypeDef NVIC_InitStructure;
24 //|RCC_APB2Periph_AFIO
25 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA時鐘
26 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2時鐘
27
28 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
29 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽
30 GPIO_Init(GPIOA, &GPIO_InitStructure);
31
32 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
33 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入
34 GPIO_Init(GPIOA, &GPIO_InitStructure);
35
36 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//復位串口2
37 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止復位
38
39 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級 0-3;
40 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中斷
41 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占優先級2級
42 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優先級2級
43 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
44 NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
45
46 USART_InitStructure.USART_BaudRate = bound;//波特率設置
47 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位數據長度
48 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
49 USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校驗位
50 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制
51 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收發模式
52
53 USART_Init(USART2, &USART_InitStructure); ; //初始化串口
54 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//開啟中斷
55 USART_Cmd(USART2, ENABLE); //使能串口
56
57 }
58 /**
59 * USART2發送len個字節.
60 * buf:發送區首地址
61 * len:發送的字節數(為了和本代碼的接收匹配,這里建議不要超過64個字節)
62 **/
63 void USART2_Send_Data(u8 *buf,u16 len)
64 {
65 u16 t;
66 for(t=0;t<len;t++) //循環發送數據
67 {
68 while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
69 USART_SendData(USART2,buf[t]);
70 }
71 while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
72 }
73 /**
74 * 這也是一個接收函數,可以用,也可以用下面main函數的方法調用
75 * USART2查詢接收到的數據
76 * buf:接收緩存首地址
77 * len:讀到的數據長度
78 **/
79 void USART2_Receive_Data(u8 *buf)
80 {
81 u8 rxlen=USART2_RX_CNT;
82 u8 i=0;
83 delay_ms(10); //等待10ms,連續超過10ms沒有接收到一個數據,則認為接收結束
84 while(rxlen!=USART2_RX_CNT)
85 {
86 rxlen=USART2_RX_CNT;
87 delay_ms(10);
88 }
89 for(i=0;i<(USART2_RX_CNT);i++)
90 {
91 buf[ i] = USART2_RX_BUF[ i];
92 USART2_RX_BUF[ i] = 0;
93 }
94 USART2_RX_CNT=0; //清零
95
96 }
97
98 void main(void)
99 {
100 Usart2_Init(9600);//串口1波特率設置為9600
101 while(1)
102 {
103 if(USART2_RX_STA)//數據接收完成
104 {
105 USART2_RX_STA=0;
106 //將接收到的數據發送出去
107 USART2_Send_Data(USART2_RX_BUF,USART2_RX_CNT);//通過串口1將接收到的固定長度字符發送出去
108 USART2_RX_CNT=0;//指針復位
109 }
110 }
111 }
112
113
114 void USART2_IRQHandler(void)
115 {
116 u8 res;
117 if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到數據
118 {
119 res =USART_ReceiveData(USART2); //讀取接收到的數據
120 if(USART2_RX_STA==0)
121 {
122 USART2_RX_BUF[USART2_RX_CNT] = res; //記錄接收到的值
123 //當數據結尾收到0xA0和0xA1代表數據接收完成,是一串完整的數據
124 if(USART2_RX_BUF[USART2_RX_CNT-1]==0xA0&&USART2_RX_BUF[USART2_RX_CNT]==0xA1)
125 USART2_RX_STA=1;//表示接收數據結束
126 USART2_RX_CNT++; //接收數據增加1
127 }
128 }
129 }
130 //溢出-如果發生溢出需要先讀SR,再讀DR寄存器則可清除不斷入中斷的問題
131 if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET)
132 {
133 USART_ReceiveData(USART2);
134 USART_ClearFlag(USART2,USART_FLAG_ORE);
135 }
136 USART_ClearFlag(UART2,USART_IT_RXNE); //一定要清除接收中斷
137 }
|