×
单片机 > 单片机程序设计 > 详情

【实验二】串口实验

发布时间:2020-08-27 发布时间:
|

一、实验目的


STM32 通过串口和上位机的对话,STM32 在收到上位机发过来的字符串后,原原本本的返回给上位机。 


二、STM32串口简介


STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持 LIN、 支持调制解调器操作、 智能卡协议和 IrDA SIR

 ENDEC 规范、具有 DMA等。


我们这里使用的是USART1。

串口设置的步骤:

1) 串口时钟使能, GPIO 时钟使能
2) 串口复位
3) GPIO 端口模式设置
4) 串口参数初始化
5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)
6) 使能串口
7) 编写中断处理函数

三、硬件设计


LED灯、串口1。



四、软件设计

usart.c文件

对串口和IO进行设置!


  1. void uart_init(u32 bound)  


  1. {  

  2.     GPIO_InitTypeDef GPIO_InitStructure;  

  3.     USART_InitTypeDef USART_InitStructure;  

  4.     NVIC_InitTypeDef NVIC_InitStructure;  

  5.        

  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能时钟  

  7.     USART_DeInit(USART1);  //串口复位  

  8.     //USART1_TX   PA.9 IO口设置  

  9.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   

  10.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

  11.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   

  12.     GPIO_Init(GPIOA, &GPIO_InitStructure);   

  13.      

  14.     //USART1_RX   PA.10  

  15.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  

  16.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  

  17.     GPIO_Init(GPIOA, &GPIO_InitStructure);    

  18.   

  19.     //Usart1 NVIC 初始化  

  20.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  

  21.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;  

  22.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        

  23.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           

  24.     NVIC_Init(&NVIC_InitStructure);   

  25.     

  26.     //USART参数初始化  

  27.   

  28.     USART_InitStructure.USART_BaudRate = bound;;  

  29.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;  

  30.     USART_InitStructure.USART_StopBits = USART_StopBits_1;  

  31.     USART_InitStructure.USART_Parity = USART_Parity_No;  

  32.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  

  33.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  

  34.   

  35.     USART_Init(USART1, &USART_InitStructure);   

  36.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断  

  37.     USART_Cmd(USART1, ENABLE);                    //串口使能  

  38.   

  39. }  


在串口的接收方面,原子哥设计了一个接受协议,学习啦!就是自己定义一个全局变量,将这个变量看作是一个寄存器,是16位的,最高位当作接收完成的标识位,第14位当作接收到0x0D标识(回车的表示由两个字节组成0x0D 和 0x0A,当接收到这个两个字节时表示接收完成);第13位-第0位,表示接受到的数据数目。


具体的程序是:


  1. if((USART_RX_STA&0x8000)==0)//接收未完成  
  2.         {  

  3.             if(USART_RX_STA&0x4000)//接收到了0x0d  

  4.             {  

  5.                 if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始  

  6.                 else USART_RX_STA|=0x8000;  //接收完成了   

  7.             }  

  8.             else //还没收到0X0D  

  9.             {     

  10.                 if(Res==0x0d)USART_RX_STA|=0x4000;  

  11.                 else  

  12.                 {  

  13.                     USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;  

  14.                     USART_RX_STA++;  

  15.                     if(USART_RX_STA>(USART_REC_LEN-1))  

  16.                         USART_RX_STA=0;//接收数据错误,重新开始接收      

  17.                 }          

  18.             }  

  19.         }              



五、实验结果

成功!


关键字:串口实验  STM32 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于arm的指纹识别门禁系统是如何设计的