STM32 USART 串口通讯

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    438 引用 • 1250 回帖 • 593 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 3 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    949 引用 • 1460 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 53 关注
  • Electron

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

    15 引用 • 136 回帖 • 5 关注
  • RemNote
    2 引用 • 16 回帖 • 14 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 198 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖 • 1 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 123 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 28 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    90 引用 • 122 回帖 • 623 关注
  • OneNote
    1 引用 • 3 回帖 • 2 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 510 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    54 引用 • 44 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • MyBatis

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

    173 引用 • 414 回帖 • 365 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 222 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 86 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 678 关注
  • SEO

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

    35 引用 • 200 回帖 • 31 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖 • 2 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 565 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    216 引用 • 291 回帖 • 368 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    186 引用 • 1020 回帖 • 1 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 115 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 398 关注