STM32 USART 串口通讯

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 53 关注
  • SSL

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

    70 引用 • 193 回帖 • 437 关注
  • Kafka

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

    36 引用 • 35 回帖 • 2 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    7932 引用 • 36284 回帖 • 169 关注
  • abitmean

    有点意思就行了

    30 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 541 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 3 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 383 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 911 回帖 • 237 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 606 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 3 关注
  • TensorFlow

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

    20 引用 • 19 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 337 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    190 引用 • 1057 回帖 • 1 关注
  • danl
    128 关注
  • 运维

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

    148 引用 • 257 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 461 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 533 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 53 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 465 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖 • 2 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖