继上贴http://www.51hei.com/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 }
|