利用STM32 的串口来发送和接收数据实验

发布者:rho27最新更新时间:2017-09-24 来源: eefocus关键字:STM32  串口  发送  接收数据 手机看文章 扫描二维码
随时随地手机看文章

0目标

1 STM32 串口简介

2 硬件设计

3 软件设计

4 下载验证

0.目标

利用串口 1 不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。  



1.STM32 串口简介


串口设置的一般步骤可以总结为如下几个步骤:
1) 串口时钟使能, GPIO 时钟使能
2) 串口复位
3) GPIO 端口模式设置
4) 串口参数初始化
5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)
6) 使能串口
7) 编写中断处理函数 
注:对于复用功能的 IO,我们首先要使能 GPIO 时钟,然后使能复用功能时钟,同时要把 GPIO 模式设置为复用功能对应的模式。

查看手册《STM32 中文参考手册 V10》P110 的表格“8.1.11 外设的 GPIO 配置:


2 硬件设计

(1)LED0接PA0

(2)串口1


3.软件设计

新建工程:


其中SYSTEM下放置原子哥提供的三个文件夹delay、sys、uart(及其文件),HARDWARE下建LED文件夹,及其内建LED.C与LED.H文件。

uart中串口函数:


  1. void uart_init(u32 bound){  

  2.     //GPIO端口设置  

  3.     GPIO_InitTypeDef GPIO_InitStructure;  

  4.     USART_InitTypeDef USART_InitStructure;  

  5.     NVIC_InitTypeDef NVIC_InitStructure;  

  6.        

  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟  

  8.      //USART1_TX   PA.9  

  9.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.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.   

  21.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  

  22.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3  

  23.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //子优先级3  

  24.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能  

  25.     NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器  

  26.     

  27.    //USART 初始化设置  

  28.   

  29.     USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;  

  30.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式  

  31.     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位  

  32.     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位  

  33.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制  

  34.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式  

  35.   

  36.     USART_Init(USART1, &USART_InitStructure); //初始化串口  

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

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

  39.   

  40. }
      

  41.   

  42. LED.c内容:  


  1. #include "led.h"  

  2.         

  3. //初始化PA0为输出口.并使能这个口的时钟            

  4. //LED IO初始化  

  5. void LED_Init(void)  

  6. {  

  7.    

  8.  GPIO_InitTypeDef  GPIO_InitStructure;  

  9.       

  10.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能PA端口时钟  

  11.   

  12.  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;               //LED0-->PA0 端口配置  

  13.  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出  

  14.  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //IO口速度为50MHz  

  15.  GPIO_Init(GPIOA, &GPIO_InitStructure);                  //根据设定参数初始化GPIOA0  

  16.  GPIO_SetBits(GPIOA,GPIO_Pin_0);                         //PA0 输出高  

  17. }  

  18.    

led.h:

  1. #ifndef __LED_H  

  2. #define __LED_H    

  3. #include "sys.h"  

  4.  

  5. #define LED0 PAout(0)// PA0  

  6.   

  7. void LED_Init(void);//初始化  

  8.                              

  9. #endif  


主函数:


  1. #include "led.h"  

  2. #include "delay.h"  

  3. #include "sys.h"  

  4. #include "usart.h"  

  5.  int main(void)  

  6.  {        

  7.     u8 t;  

  8.     u8 len;   

  9.     u16 times=0;  

  10.     delay_init();            //延时函数初始化      

  11.     NVIC_Configuration();    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级  

  12.     uart_init(9600);     //串口初始化为9600  

  13.     LED_Init();              //LED端口初始化  

  14.     while(1)  

  15.     {  

  16.         if(USART_RX_STA&0x8000)  

  17.         {                        

  18.             len=USART_RX_STA&0x3f;//得到此次接收到的数据长度  

  19.             printf("\r\n您发送的消息为:\r\n\r\n");  

  20.             for(t=0;t

  21.             {  

  22.                 USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据  

  23.                 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束  

  24.             }  

  25.             printf("\r\n\r\n");//插入换行  

  26.             USART_RX_STA=0;  

  27.         }else  

  28.         {  

  29.             times++;  

  30.             if(times%5000==0)  

  31.             {  

  32.                 printf("\r\n口袋里的超超 串口实验\r\n");  

  33.                 printf("真JB帅\r\n\r\n");  

  34.             }  

  35.             if(times%200==0)printf("请输入数据,以回车键结束\n");    

  36.             if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.  

  37.             delay_ms(10);     

  38.         }  

  39.     }      

  40.  }  

4 下载验证


关键字:STM32  串口  发送  接收数据 引用地址:利用STM32 的串口来发送和接收数据实验

上一篇:stm32f103初学之见
下一篇:通过USB转TTL串口下载stm32程序

推荐阅读最新更新时间:2024-03-16 15:38

WS2812灯珠(二)-- STM32 SPI+DMA方式驱动
通过硬件SPI的可以很巧妙的模拟出WS2812的通信时序,用spi的8位数据模拟ws281x的一位数据。 要将系统时钟设置为56M,SPI分频数设置为8,则SPI的通信频率为7M,1s/7M≈143ns 即传输一位数据的时间约为143纳秒(ns) 3*143 = 429ns 5*143 = 715ns 符合WS281X芯片的通信时序。 11111000 high level (十六进制:0XF8)表示WS281X的1码 11100000 low level (十六进制:0XE0)表示WS281X的0码 程序头文件部分: 通过宏的方式定义了灯珠个数和WS281X的0码和1码。 #ifndef __WS2812_
[单片机]
51单片机三种模拟串口的设计方案解析
随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。 本文所说的模拟串口, 就是利用51的两个输入输出引脚如P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。至于串口通信的波特率,说到底只是每位电平持续的时间,波特率越高,持续的时间越短。如波特率为9600BPS
[单片机]
STM32--对原子哥USART实验中printf重定向进行分析
原子哥的USART代码中,有一部分感觉看得不是很懂 #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is required. */ }; /* FILE is typedef
[单片机]
最近遇到的单片机串口设置问题
最近测试涉及到底层串口代码的修改。经过这次修改,突然发现其实自己对于串口的一些特性以前并不是十分清楚。 首先遇到的一些问题: 1)在使用IO的数据位的时候,没有考虑校验位所占的位数。 2)在设置串口输入的时候,使用悬空输入。 关于1),在一次使用 STM32 串口参数9600,N,8,1与另一个 8051MCU通信的时候发现偶校验没有问题,但是无校验通信就出现异常。但是,当将 STM32 与电脑通信的时候,偶校验与无校验通信又完全都是正确的。8051MCU单独与电脑通信也都是完全正确的。查看代码,还真不知道有什么不对劲的。因为这段代码,用了很长时间了。后来一个同事看代码后,提醒说对于数据位的设置,偶校验和无校验是一
[单片机]
STM32 用RS485进行半双工通信出现的问题
最近接了一个项目,需要用到RS485总线同时和多台机器通信,方式是半双工,但是当向总线一次发送大量数据的时候,STM32就会像出现死机一样,经过调试发现串口在既不是接收数据中断,也不是发送数据中断的情况下不断进入串口中断,当时瞬间怀疑的是:串口产生了什么错误导致一直进入中断。 经过调试和查找资料得出如下解决办法: 在串口中断中添加如下语句: if(USART_GetFlagStatus(USART1,USART_FLAG_ORE!=RESET)) { USART_ClearFlag(USART1,USART_FLAG_ORE); USART_ReceiveData(USART1); }
[单片机]
组态王与单片机多机串口通信的设计
1 引言 随着工业化要求提高,分布式系统发展以及控制设备与监控设备之间通讯需要,组态软件设计的监控系统逐步普及。现在组态软件繁多,比如KingVieW(组态王)、MCGS、WinCC等。KingView软件基于Microsoft Windows XP,NT/2000操作系统.具有友好的人机操作界面、强大的IO设备端口驱动能力,可与各种PLC、智能仪表、智能模块、板卡、变频器等实时通讯。由于在检测大量模拟量的工业现场使用PLC与组态软件通讯势必增加产品成本。而单片机接口丰富,与A/D转换模块组合可以完成相同的工作,并且系统可靠、成本低。 2 组态王与单片机的串口通讯方法 目前,组态王与单片机的通信多是通过动态数据交换(DD
[单片机]
组态王与单片机多机<font color='red'>串口</font>通信的设计
STM32笔记--ADC(DMA方式)
在上一次的博客中重新学习了DMA,这次我们便学以致用了,ADC的概念想必大家都是十分清楚了,模拟转数字,可以用在测信号,测电压,在我们的生活中有着十分巨大的作用,这次我们就来看看ADC又有哪些操作吧! ADC流程,首先ADC采集一个信号(信号范围大都为0-3.3V,ps:3.3V可通过更改Vref寄存器修改),每隔相同时间菜一次数值发送到一个可变16位数中,下面是我们的数组定义: __IO uint16_t ADC_ConvertedValue; //定义该16位数用来传输数据,原因是我们使用的12位AD,由于寄存器的定义方便,因此使用16位数 下面是ADC的初始化和配置代码: void ADC1_Init(void
[单片机]
STM32移植U8g2图形库的方法 实现OLED图形显示
之前的文章,介绍过ESP8266在Arduino IDE环境中使用U8g2库,实现OLED上的各种图形显示。 本篇,介绍一下U8g2库如何移植到STM32上,进行OLED的图形显示。 本次的实验硬件为: STM32:型号为最常见的STM32F103C8T6 OLED:0.96寸OLED,IIC接口(如果是SPI接口,文中也有对应的修改介绍) 1 U8g2简介 U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,并支持如SSD1306等多种类型的OLED驱动。 U8g2源码的开源库地址:https://github.com/olikraus/u8g2 2 移植步骤 首先下载U8g
[单片机]
<font color='red'>STM32</font>移植U8g2图形库的方法 实现OLED图形显示
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved