STM32 USART 串口通讯

本贴最后更新于 1951 天前,其中的信息可能已经时移世易

STM32 串口简介

串口作为单片机最重要的外部接口之一,同时又是我们嵌入式开发过程中重要的调试手段之一,其重要性不言而喻。几乎所有的单片机都有串口,STM32 也不例外。STM32 的串口资源相当丰富,功能也相当强劲,我所使用的原子哥的 STM32mini 开发板(STM32F103RCT6),最多可提供 5 路串口。

今天的实验

  • 实现的功能

每隔一秒向电脑发送不同字符串

将接收到从电脑发送来的数据返回给电脑

  • 实验材料

STM32mini 开发板
串口调试助手(Windows),minicom(Linux),超级终端(Windows)

开发工具:sw4stm32

首先新建工程

新建工程

串口设置的一般步骤可以总结为如下几个步骤

串口时钟使能,GPIO 时钟使能
串口复位
GPIO 端口模式设置
串口参数初始化
开启中断并且初始化 NVIC
使能串口
编写中断处理函数

驱动代码

usart.h

#ifndef __USART_H__
#define __USART_H__

#include <stm32f10x.h>
#include <sys/_stdint.h>
 
void USART_INIT(u32 bound);
void USART_SendChar(USART_TypeDef* USARTx, uint8_t data);

void USART_SendStr(USART_TypeDef* USARTx, char *str);
 
#endif

usart.c

#include "usart.h"
#include <misc.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_usart.h>
 
//可以使用printf()函数输出
int __io_putchar(int ch) {
    USART_SendChar(USART1, ch);
    return ch;
}
//
发送单个字符
void USART_SendChar(USART_TypeDef* USARTx, uint8_t data){
    USART_SendData(USARTx, data);  // 操作USART_DR寄存器发送单个数据
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);//等待发送寄存器TDR为空,为空时则置1
}
 
//发送字符串函数,支持汉字,编码支持UTF-8
void USART_SendStr(USART_TypeDef* USARTx, char *str){
    uint8_t i = 0;
    do
    {
        USART_SendChar(USARTx, *(str+i));
        i++;
    }while(*(str+i) != '\0');
    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);//等待发送完成
}
 
//初始化串口1
void USART_INIT(u32 bound) {
 
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitTypeDef;
    USART_InitTypeDef USART_InitTypeDef;
    NVIC_InitTypeDef NVIC_InitTypeDef;
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE);    //使能USART1,GPIOA时钟
 
    //USART1_TX   GPIOA.9
    GPIO_InitTypeDef.GPIO_Pin         = GPIO_Pin_9;       //PA.9
    GPIO_InitTypeDef.GPIO_Speed       = GPIO_Speed_50MHz;
    GPIO_InitTypeDef.GPIO_Mode        = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitTypeDef);                 //初始化GPIOA.9
 
    //USART1_RX      GPIOA.10初始化
    GPIO_InitTypeDef.GPIO_Pin         = GPIO_Pin_10;           //PA10
    GPIO_InitTypeDef.GPIO_Mode        = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitTypeDef);                       //初始化GPIOA.10
 
 
    //Usart1 NVIC 配置
    NVIC_InitTypeDef.NVIC_IRQChannel                   = USART1_IRQn;
    NVIC_InitTypeDef.NVIC_IRQChannelPreemptionPriority = 3;         //抢占优先级3
    NVIC_InitTypeDef.NVIC_IRQChannelSubPriority        = 3;         //子优先级3
    NVIC_InitTypeDef.NVIC_IRQChannelCmd                = ENABLE;    //IRQ通道使能
    NVIC_Init(&NVIC_InitTypeDef);                                   //根据指定的参数初始化VIC寄存器
 
    //USART 初始化设置
 
    USART_InitTypeDef.USART_BaudRate      = bound;                          //串口波特率
    USART_InitTypeDef.USART_WordLength    = USART_WordLength_8b;            //字长为8位数据格式
    USART_InitTypeDef.USART_StopBits      = USART_StopBits_1;               //一个停止位
    USART_InitTypeDef.USART_Parity        = USART_Parity_No;                //无奇偶校验位
    USART_InitTypeDef.USART_Mode          = USART_Mode_Rx | USART_Mode_Tx;  //收发模式
    USART_InitTypeDef.USART_HardwareFlowControl    = USART_HardwareFlowControl_None; //无硬件数据流控制
 
    USART_Init(USART1, &USART_InitTypeDef);             //初始化串口1
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);      //开启串口接受中断
    USART_Cmd(USART1, ENABLE);                          //使能串口1
}

void USART1_IRQHandler(void) {//串口1中断服务程序
//   u8 Res;
//   Res = USART_ReceiveData(USART1);
     USART_SendData(USART1, (uint16_t) USART_ReceiveData(USART1));//将接收到的数据返回
}

main.c

#include <misc.h>
#include <stdio.h>
#include <stm32f10x.h>
#include "delay/delay.h" 
#include "usart/usart.h" 

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wuninitialized" 

int main(int argc, char **argv) { 

    delay_init(); 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 
    USART_INIT(115200); //串口初始化

    char* msg; 
    int i = 0; 
    while (1) 
    { 
        sprintf(msg,"你好_欢迎来到_杨海健_博客__USART1_%d\r\n",i++);
        //sprintf(msg,"TAKE_TODAY_USART1_%d\r\n",i++);
        USART_SendStr(USART1,msg); 
        delay_ms(1000); 
    } 
} 
#pragma GCC diagnostic pop

实验结果
ON Linux

Linux 测试结果

ON Windows
超级终端:

Today_20180502_200857png

串口调试助手:

串口调试助手 TODAY BLOG

以下是去掉发送的程序执行结果,电脑发送没有出错

Today_20180502_201257png

最后发送 LOGO哈哈

Today_20180502_203645png

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 24 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 8 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    710 引用 • 1173 回帖 • 176 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    915 引用 • 931 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 421 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 596 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 1 关注
  • 笔记

    好记性不如烂笔头。

    303 引用 • 777 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 44 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 641 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 438 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 44 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 15 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 431 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 22 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 604 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 10 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    185 引用 • 318 回帖 • 348 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    123 引用 • 168 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖 • 1 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    18591 引用 • 69184 回帖 • 1 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖