找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3042|回复: 0
打印 上一主题 下一主题
收起左侧

STM32串口配置(串口二的配置=初始化+中断配置+中断接收函数)

[复制链接]
跳转到指定楼层
楼主
ID:110875 发表于 2021-11-1 21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
继上贴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 }

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表