|
繼上貼http://www.zg4o1577.cn/bbs/dpj-213781-1.html,今天發(fā)布STM32的串口2配置程序,話不多說。
1 /*===============================================================================
2 Copyright:
3 Version:
4 Author:
5 Date: 2021/11/1
6 Description:
7 函數(shù)功能是將接收固定長(zhǎng)度的字符串,并將接收后的字符串通過串口發(fā)送出去
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; //接收狀態(tài)標(biāo)記
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時(shí)鐘
26 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2時(shí)鐘
27
28 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
29 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽
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);//復(fù)位串口2
37 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止復(fù)位
38
39 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí) 0-3;
40 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中斷
41 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占優(yōu)先級(jí)2級(jí)
42 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優(yōu)先級(jí)2級(jí)
43 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
44 NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器
45
46 USART_InitStructure.USART_BaudRate = bound;//波特率設(shè)置
47 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位數(shù)據(jù)長(zhǎng)度
48 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個(gè)停止位
49 USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校驗(yàn)位
50 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
51 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收發(fā)模式
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發(fā)送len個(gè)字節(jié).
60 * buf:發(fā)送區(qū)首地址
61 * len:發(fā)送的字節(jié)數(shù)(為了和本代碼的接收匹配,這里建議不要超過64個(gè)字節(jié))
62 **/
63 void USART2_Send_Data(u8 *buf,u16 len)
64 {
65 u16 t;
66 for(t=0;t<len;t++) //循環(huán)發(fā)送數(shù)據(jù)
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 * 這也是一個(gè)接收函數(shù),可以用,也可以用下面main函數(shù)的方法調(diào)用
75 * USART2查詢接收到的數(shù)據(jù)
76 * buf:接收緩存首地址
77 * len:讀到的數(shù)據(jù)長(zhǎng)度
78 **/
79 void USART2_Receive_Data(u8 *buf)
80 {
81 u8 rxlen=USART2_RX_CNT;
82 u8 i=0;
83 delay_ms(10); //等待10ms,連續(xù)超過10ms沒有接收到一個(gè)數(shù)據(jù),則認(rèn)為接收結(jié)束
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波特率設(shè)置為9600
101 while(1)
102 {
103 if(USART2_RX_STA)//數(shù)據(jù)接收完成
104 {
105 USART2_RX_STA=0;
106 //將接收到的數(shù)據(jù)發(fā)送出去
107 USART2_Send_Data(USART2_RX_BUF,USART2_RX_CNT);//通過串口1將接收到的固定長(zhǎng)度字符發(fā)送出去
108 USART2_RX_CNT=0;//指針復(fù)位
109 }
110 }
111 }
112
113
114 void USART2_IRQHandler(void)
115 {
116 u8 res;
117 if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到數(shù)據(jù)
118 {
119 res =USART_ReceiveData(USART2); //讀取接收到的數(shù)據(jù)
120 if(USART2_RX_STA==0)
121 {
122 USART2_RX_BUF[USART2_RX_CNT] = res; //記錄接收到的值
123 //當(dāng)數(shù)據(jù)結(jié)尾收到0xA0和0xA1代表數(shù)據(jù)接收完成,是一串完整的數(shù)據(jù)
124 if(USART2_RX_BUF[USART2_RX_CNT-1]==0xA0&&USART2_RX_BUF[USART2_RX_CNT]==0xA1)
125 USART2_RX_STA=1;//表示接收數(shù)據(jù)結(jié)束
126 USART2_RX_CNT++; //接收數(shù)據(jù)增加1
127 }
128 }
129 }
130 //溢出-如果發(fā)生溢出需要先讀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 }
|
評(píng)分
-
查看全部評(píng)分
|