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

发布者:美梦小狮子最新更新时间:2021-10-13 来源: eefocus关键字:STM32  串口  发送  接收数据 手机看文章 扫描二维码
随时随地手机看文章

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. }

 

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("rn您发送的消息为:rnrn");

  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("rnrn");//插入换行

  26. USART_RX_STA=0;

  27. }else

  28. {

  29. times++;

  30. if(times%5000==0)

  31. {

  32. printf("rn口袋里的超超 串口实验rn");

  33. printf("真JB帅rnrn");

  34. }

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

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

  37. delay_ms(10);

  38. }

  39. }

  40. }

  41.  

4 下载验证

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

上一篇:STM32之串口的使用
下一篇:物联网之STM32开发三(USART串口)

推荐阅读最新更新时间:2024-11-12 16:56

【STM32CubeMX】 串口通信(USART) Printf重定向
STM32CubeMX: Version 4.26.1 MDK-ARM: Version 5.24.2 开发板: 中移onenet 麒麟座MINI板 芯片: STM32F103CBT6 1.STM32CubeMX设置 设置外部时钟源 设置Debug 设置串口 使用USART1 PA9,PA10 设置时钟频率 设置USART1详细参数 生成MDK-ARM工程 2.重定向Printf 及 Scanf 主要用到两个函数 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size,
[单片机]
【STM32CubeMX】 <font color='red'>串口</font>通信(USART) Printf重定向
ESP8266应用案例 基于STM32核心板获取网络天气数据
硬件平台:ESP8266 WIFI模块、STM32核心板、OLED显示屏 实现方式: 1.ESP8266 WIFI工作模式为STA+TCPClinet; 2.通讯协议:HTTP 3.天气数据获取平台:心知天气网 ESP8266 WIFI模块自带TCP/IP网络协议栈,通过AT指令集完成网络模式配置。知心天气采用精准数据源授权预报信息,可查看全国各地的实时天气预告、24小时预报、15天预报、空气质量指数等预报信息。采样HTTP协议接入服务器。 HTTP:超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及
[单片机]
ESP8266应用案例 基于<font color='red'>STM32</font>核心板获取网络天气<font color='red'>数据</font>
STM32库函数USART_SendData的缺陷和解决方法
2.1 问题及现象 使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。若发送的数据量很小时,此时串口发送的只是最后一个字符,当发送数据量大时,就会导致发送的数据莫名其妙的丢失。 如: for(TxCounter = 0;TxCounter RxCounter; TxCounter++) USART_SendData(USART1, RxBuffer ); 2. 原因 此API函数不完善,函数体内部没有一个判断一个字符是否发送完毕的语句,而是把数据直接放入发送缓冲区,当连续发送数据时,由于发送移位寄存器的速度限制(与通信波特率有关),导
[单片机]
STM32单片机小Tips 玩转IAR开发STM32
BKP还没有搞完,怎么又换到了RTC上了,因为RTC和BKP有些联系,想不关联还不行呢。 以下是数据手册上有关RTC的介绍: RTC 简介 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。 系统复位后,禁止访问后备寄存器和RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备寄存器和RTC的访问: ● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位来使能电源和后备接口时
[电源管理]
<font color='red'>STM32</font>单片机小Tips 玩转IAR开发<font color='red'>STM32</font>
解析STM32的启动过程
当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择。如此一来main函数似乎成为了理所当然的起点 因为C程序往往从main函数开始执行。但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫 启动文件 ,用英文单词来描述是 Bootloader 。 无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须
[单片机]
AVR串口调试注意事项
这两天一直在调试AVR单片机的UASRT部分。可是不论我如何调试就是无法实现,AVR和PC机的COM1口进行串口通信,我也测试了电压,但是电压一切都很正常。这着实让我头痛了这么几天。 今天我偶然打开AVR单片机的说明书,才让我恍然大悟。呵呵! AVR单片机系统时钟,外围时钟熔丝设定 。 所以想写一点儿关于AVR串口调试事项,结合我这段时间AVR单片机调试经验:   1、就是关于AVR单片机USART通信时钟的设定,这是AVR和其他单片机的重要区别:它的时钟可以通过内带的熔丝为设定,你可以根据需要自行设定,增加设计的灵活性,但对于初学者这也是个让人很容易的地方。因为我们大多都是以MS-51单片机蓝本学
[单片机]
C51单片机之串口
/* 名称:C51单片机之串口 说明:在计算机之间进行通讯的时候,有两种方式,一个是串行通信,一个是并行通信。对于前者适合长距离通信、有一定的纠错能力。对于后者,适合短距离通信,速度较快。 对于C51单片机来说,其内部集成有一个功能很强的全双工通信口。设有两个相互独立的接受、发送缓冲器,可以同时发送数据和接收数据。发送缓冲器只能发送不能读出。接收缓冲器只能接收不能发送,而且两个缓冲器共用一个物理地址(0X99)。在编程时由编译器进行区分。还有,C51单片机的串口有4种工作方式,其中两种波特率时刻变的,另外两种是不可变的。 对于具体的使用来说,首先也是需要进行一系列初始化设置(包括工作方式设置、波特率设置等)。然后可以通
[单片机]
STM32的ISP方式和IAP方式下载程序有什么区别
都可以通过串口来下载啊 ISP方式:需要将BOOT管脚配置成上电从System Memory启动,System Memory中有一段BOOTLOADER来接收串口来的数据,把它们烧写到FLASH中。 IAP方式:是用户自己写一段烧写程序,通过ISP或者仿真器事先烧写到用户FLASH中,使用时通过某种方式触发这段程序,再来从串口接收数据,然后烧到相应的FLASH中,不需要改变BOOT管脚配置。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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