STM32的串口配置代码

本文详细介绍了STM32的四个串口配置,包括串口一至四的初始化、中断配置以及中断接收函数的实现。串口四的中断优先级虽未展示,但与前三者相同。
摘要由CSDN通过智能技术生成

一、串口一的配置(初始化+中断配置+中断接收函数)

复制代码

  1 /*===============================================================================
  2 Copyright:
  3 Version:
  4 Author:    
  5 Date: 2017/11/3
  6 Description:
  7     配置独立看门狗初始化函数,在主函数中运行IWDG_ReloadCounter进行喂狗主函数必须在4s内进行一次喂狗不然系统会复位;
  8     函数功能是将接收固定长度的字符串,并将接收后的字符串通过串口发送出去
  9 revise Description:
 10 ===============================================================================*/
 11 #include "stm32f10x_usart.h"
 12 #include "stm32f10x.h"
 13 #include "stm32f10x_iwdg.h"
 14 
 15 u8 USART1_RX_BUF[21]; 
 16 u8 USART1_RX_CNT=0;
 17 
 18 void IWDG_Configuration(void); 
 19 
 20 void Usart1_Init(u32 bound)
 21 {
 22     //GPIO端口设置
 23     GPIO_InitTypeDef GPIO_InitStructure;
 24     USART_InitTypeDef USART_InitStructure;
 25     NVIC_InitTypeDef NVIC_InitStructure;
 26      
 27     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);//使能USART1,GPIOA,C时钟
 28       
 29     //USART1_TX   GPIOA.9
 30     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
 31     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 32     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
 33     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
 34 
 35     //USART1_RX      GPIOA.10初始化
 36     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
 37     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
 38     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
 39 
 40     //Usart1 NVIC 配置
 41     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级   0-3;
 42     
 43     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
 44     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
 45     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
 46     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
 47     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
 48   
 49    //USART 初始化设置
 50 
 51     USART_InitStructure.USART_BaudRate = bound;//串口波特率
 52     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
 53     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
 54     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
 55     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
 56     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式
 57 
 58     USART_Init(USART1, &USART_InitStructure); //初始化串口1
 59     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
 60     USART_Cmd(USART1, ENABLE);                    //使能串口1 
 61 }
 62 /**
 63 * USART1发送len个字节.
 64 * buf:发送区首地址
 65 * len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
 66 **/
 67 void USART1_Send_Data(u8 *buf,u16 len)
 68 {
 69     u16 t;
 70     GPIO_SetBits(GPIOC,GPIO_Pin_9);
 71 //  RS485_TX_EN=1;            //设置为发送模式
 72     for(t=0;t<len;t++)        //循环发送数据
 73     {           
 74         while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
 75         USART_SendData(USART1,buf[t]); 
 76     }     
 77     while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);        
 78     GPIO_ResetBits(GPIOC,GPIO_Pin_9);
 79 //    RS485_TX_EN=0;                //设置为接收模式    
 80 }
 81 void main(void)
 82 {
 83     Usart1_Init(9600);//串口1波特率设置为9600
 84     IWDG_Configuration();
 85     while(1)
 86     {
 87         IWDG_ReloadCounter();//4s内必须喂狗不然复位
 88         if(USART1_RX_CNT==21)//数据接收完成
 89         {
 90             USART1_RX_CNT=0;//指针复位
 91             //将接收到的数据发送出去
 92             USART1_Send_Data(USART1_RX_BUF,21);//通过串口1将接收到的固定长度字符发送出去            
 93         }
 94     }
 95     
 96 }
 97 /**
 98 * 接收指定长度的字符串
 99 * 比如接收固定大小为21个字节的字符串
100 **/
101 void USART1_IRQHandler(void)                    //串口1中断服务程序
102 {
103     u8 Res;
104     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) 
105         {
106             Res =USART_ReceiveData(USART1);    //读取接收到的数据     
107             if(USART1_RX_CNT<21)//对于接收指定长度的字符串
108             {
109                 USART1_RX_BUF[USART1_RX_CNT]=Res;        //记录接收到的值    
110                 USART1_RX_CNT++;                                        //接收数据增加1 
111             }             
112      }
113          //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题
114     if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET)
115     {
116         USART_ReceiveData(USART1);
117         USART_ClearFlag(USART1,USART_FLAG_ORE);
118     }
119      USART_ClearFlag(UART1,USART_IT_RXNE); //一定要清除接收中断
120 }
121 /*=================================================================
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值