文档章节

STM32串口向世界问好

OceanStack
 OceanStack
发布于 2014/10/10 16:13
字数 705
阅读 500
收藏 8

本文介绍串口通信最基本也是最常用的用法,全双工、异步通讯方式。它只需要3根线连接即可,发送(TX)、接收(RX)及地(GND)。

配置串口通信,至少要设置以下几个参数:字长(一次传送的数据长度)、波特率(每秒传输的数据位数)、奇偶校验位、还有停止位。

对于STM32可有多达5个串口(3个通用同步异步收发器USART和2个通用异步收发器UART),从驱动库中也可以发现:

#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)
#define RCC_APB1Periph_USART3            ((uint32_t)0x00040000)
#define RCC_APB1Periph_UART4             ((uint32_t)0x00080000)
#define RCC_APB1Periph_UART5             ((uint32_t)0x00100000)



下面以最常用到的USART1为倒来说明,其发送端(TX)默认的为管脚PA9,接收端(RX)默认为PA10,利用库函数其初始化代码为:


/
**
  * @brief  初始化IO 串口1
  * @param  bound:波特率
  * @retval None
  */
void USART1_Debug_Init(u32 bound)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    assert_param(bound > 0);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
    USART_DeInit(USART1);  //复位串口1
    //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
        //USART 初始化设置
    USART_InitStructure.USART_BaudRate = bound;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    USART_InitStructure.USART_Mode = USART_Mode_Tx;    //发送模式
    USART_Init(USART1, &USART_InitStructure); //初始化串口
    USART_Cmd(USART1, ENABLE);                 //使能串口
}

至此就可以进行发送了,需要调用USART_SendData函数。比如要发送"Hello" 
则要进行如下调用:

USART_SendData(USART1, 'H');
USART_SendData(USART1, 'e');
USART_SendData(USART1, 'l');
USART_SendData(USART1, 'l');
USART_SendData(USART1, 'o');
USART_SendData(USART1, '\n');

是不是感觉到很麻烦,能否像通用C语言中那样调用printf函数直接打印输出呢?
答案是肯定的,只需要进行简单的重定向就可以搞定,为了实现重定向printf()函数,我们需要重写 fputc() 这个c标准库函数,
因为printf()在 c标准库函数中实质是一个宏,最终是调用了 fputc()这个函数的。

/
**
  * @brief  重定义fputc函数
  * @param  int ch 要发送数据 , FILE *f 指向特定文件指针
  * @retval int ch
  */
int fputc(int ch, FILE *f)
{ 
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {
    }
    
    USART_SendData(USART1, (u8)ch);
    return ch;
}


另外要注意的是,需要在MDK下加选中如下图选项:



至此就可以轻松的向世界问好了,只需一句

printf("Hello World \n");


但有一点要注意的,利用这种技巧打印消息时会使嵌入式软件效率变低,我曾在调试软件时加入窗口看门狗,但系统总是莫名的复位,最后调试才发现是因主轮循中调用printf导致延时喂狗了。

© 著作权归作者所有

OceanStack
粉丝 29
博文 21
码字总数 19858
作品 0
武汉
程序员
私信 提问
STM32串口如何代码实现更稳定的接收消息

在 《STM32串口向世界问好》介绍过如何发送消息,那么又如何接收消息呢? 也很简单,只需要配置好串口接收,配置好中断,并在串口中断函数里面进行数据接收就可以了。通用配置代码如下: /*...

OceanStack
2014/11/06
3.9K
10
STM32串口通信乱码详细处理方法

STM32串口通信以及温度采集搞定,其中主要遇到STM32系列单片机时钟树的问题,串口通信遇到串口调试助手能够接收到数据但出现乱码现象,开始一直以为是串口配置和程序代码问题,因为是第一次上...

aizaiyueye
2018/01/13
0
0
STM32 串口ISP下载方式解读

 http://blog.sina.com.cn/s/blogb09739ab0102v4rm.html FlashLoaderDemonstrator下载工具的安装 1.硬件的连接和设置 串口ISP下载方式(对应开发板BOOT0为1、2引脚,BOOT1为2、3引脚) ...

chengde6896383
2017/12/13
0
0
STM32学习笔记(7)——USART串口的使用

1、 串口的基本概念 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用...

葫芦娃的后桌
2018/08/09
0
0
STM32单片机串口一键下载电路与操作方法详解

要了解STM32的几种启动模式. BOOT0接GND,BOOT1接GND.那就是正常的启动模式,从flash加载代码. 而BOOT0接V3.3,BOOT1接GND.则是ISP模式,也就是串口更新代码. 其次,你要了解STM32 ISP下载代码的过...

千山万水
2016/01/31
598
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
43分钟前
4
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
8
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
11
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
10
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部