STM32 USART 串口通讯

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 65 回帖 • 439 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 1 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    75 引用 • 1737 回帖 • 3 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    149 引用 • 257 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 164 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    6 引用 • 38 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    568 引用 • 3532 回帖 • 1 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 2 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 2 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 431 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 1 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 1 关注
  • 思源笔记

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

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

    22378 引用 • 89573 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 597 关注
  • Maven

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

    186 引用 • 318 回帖 • 304 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 210 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 488 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 530 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 673 关注