今天分析STM32一个相当重要的外设——串口,在我使用的这款单片机中有三个串口分别为USART1,USART2,USART3。其中USART1挂载在总线APB2上,USART2,3挂载在APB1上。这是什么意思呢!APB2可以看做是高速公路,传输速度很快。APB1可以看做是省道,传输速度会慢很多。这次以USART1为例,若要使用USART2,3只需要在时钟配置,以及端口配置的地方修改为相应的串口即可。

今天完成重定向,在主程序中使用printf()函数。重定向可以理解为在程序中重写相应的函数,使得在调用相关库函数时,不去调用库函数,而是调用你所重写的函数。

开发串口,主要分为以下几个步骤:

  1. 配置相关的时钟和端口
  2. 配置串口的相关的结构体
  3. 使能串口外设
  4. 完成配置在主函数收发数据

直接上代码了:

void USART_Config(void)
{GPIO_InitTypeDef gpio_struct;USART_InitTypeDef usart_struct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);gpio_struct.GPIO_Pin = GPIO_Pin_9;gpio_struct.GPIO_Mode = GPIO_Mode_AF_PP;gpio_struct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&gpio_struct);gpio_struct.GPIO_Pin = GPIO_Pin_10;gpio_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&gpio_struct);usart_struct.USART_BaudRate = 115200;usart_struct.USART_WordLength = USART_WordLength_8b;usart_struct.USART_StopBits = USART_StopBits_1;usart_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;usart_struct.USART_Parity = USART_Parity_No;usart_struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1,&usart_struct);USART_Cmd(USART1,ENABLE);
}int fputc(int ch,FILE* f)
{USART_SendData(USART1,(unsigned char)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);return ch;
}

这段代码中有两个函数,分别为USART_Config()和fputc()。其中USART_Config()函数为串口相关的配置函数。在这个函数中首先开启串口和GPIO的时钟,极为重要。并且在USART2,3中总线是APB1。接下来实复用GPIO的配置,在RX端口使用浮空输入。在TX端口使用推挽输出。接下来配置串口的结构体,比如字长,波特率等;这个在代码很容易看出来一把情况下,按照代码中的那样配置就行。配置完成后记得使能外设,USART_Cmd(USART1,ENABLE);

函数fputc()即为重定向的函数,在标准库中已经存在这个函数,在我们的代码中重新书写该函数,在函数体中实现我们想要实现的功能。切记该函数的返回类型,函数名,函数的形参要和库函数中的完全一致,这样才能在调用时调用自己书写的函数,否则仍旧调用库函数中的原本函数。接下来看看函数内部的东西。利用USART_SendData()函数通过串口发送数据。发送后判断是否传送成功,通过查看标志位。USART_GetFlagStatus()函数获得USART_FLAG_TC的状态,若为SET,则发送成功,等待发送。

很多人看到代码就开始骂娘了,为啥没有头文件!我就遇到过好多次,对于初学者,都不知道在哪个头文件中。下面是配置的头文件

#ifndef __USART_H
#define __USART_H#include"stdio.h"
#include"stm32f10x.h"
#include"stm32f10x_rcc.h"
#include"stm32f10x_gpio.h"
#include"stm32f10x_usart.h"void USART_Config(void);#endif

主函数的代码如下:

#include"usart.h"int main()
{USART_Config();printf("this is a demo!");
}

至此,串口结束。

STM32----摸石头过河系列(四)相关推荐

  1. 58同城如何摸石头过河?

    本文转自:http://www.huxiu.com/article/4397/1.html 这家典型"鼠标+水泥".不愿复制Cragslist模式的创业公司,摸爬滚打间的经验教训 ...

  2. oCPC实践录 | 摸石头过河,oCPC先跑起来再说

    oCPC才开始的实践基本上是摸着石头过河,不断测试实验.不过也可以参考已有的oCPC产品设计,oCPC首要需要解决的是转化目标和转化数据. 在解决转化数据之前,可以先看一下申探社:深入互联网广告中的出 ...

  3. 摸石头——NOde.js(四)

    一.一个错误引发的摸索 上回我们在获取 request 对象的 headers 属性的 'user-agent'  属性时,我使用了 request.headers.user-agent 这样的语法, ...

  4. STM32----摸石头过河系列(一)

    在学习stm32之前,我较为熟练的掌握了51单片机的开发,可以运用51中的输入.输出,以及定时器.中断等.今天第一天,学习stm32点亮LED灯. 在本次学习中使用的是stm32f103RC系列单片机 ...

  5. STM32----摸石头过河系列(八)

    在STM32中定时器(TIM)是很重要的外设,具有相当多的作用,并且用法多样,内容多.今天来分析一下定时器的理论知识,没有实例. 在STM32中定时可以分为三类:基本定时器.通用定时器.高级定时器. ...

  6. STM32----摸石头过河系列(六)

    今天了解一下ADC,stm32中的模数转换利用的是逐次逼近的方法,这个当时在考研时特别熟,现在又忘了,又去问了一下万能的百度.先是多少了解一下这个转换过程,在32的开发过程中用不到,但毕竟从事这个的, ...

  7. 中台,都他妈被你们说糊涂了,文内才是正宗解释,别摸石头过河了,石头早就有了

    (1)我们先说说技术架构分层 我们按技术架构通常是这样的: 1.UI交互层:Windows UI.PC Web UI.移动App UI.微信小程序UI.摄像头视觉识别人机界面.语音交互人机界面 2.逻 ...

  8. STM32----摸石头过河系列(七)

    今天练习了32中的SysTick定时器,通常叫做滴答定时器.定时器的作用,用过51的想必都知道.定时器主要用来处理一些周期性的,时间间隔固定的事件.同时定时器也可以用来得到一个事件所耗费的时间.下面来 ...

  9. STM32----摸石头过河系列(五)

    今天总结一下DMA(Direct Memory Access,直接存储器存储),在以往我们从串口读取数据到内存的流程是,cpu通过串口读取导数据,然后CPU再将数据写入固定的内存.这种读取方式占用了大 ...

最新文章

  1. ubuntu安装vmware(支持mac)与卸载
  2. 页面上水平飞舞的图片
  3. redux 和 react-redux 部分源码阅读
  4. yii2.0 elasticsearch模糊查询
  5. 第六届北京八大处新春祈福庙会大年初一迎客
  6. 用户注册的mysql代码_用户的注册登陆流程及代码实现
  7. c++编码风格指南_100%正确编码样式指南
  8. 工作99:任务加1逻辑
  9. 在c#使用Windows IOCP(完成端口)编程研究
  10. 17.2 无监督数据增强——UDA
  11. vs code html插件_VS插件CodeRush全新发布v20.1.7|支持HTML
  12. 光猫修改rms服务器地址大全,华为光猫备份jffs2及HG8321R-RMS切换HG8321版本教程
  13. 道路照明智能监控用5G智慧灯杆网关
  14. 解决Linux版Vivado下载bit流到FPGA Open target失败问题
  15. 伍斯特理工学院计算机,世界排名领先,伍斯特理工学院到底有多厉害?
  16. 中国IT产业人才分布地图
  17. 如何免费获取一个 Cloudflare 公网 IP
  18. VRP远程管理(华为设备telnet登录密码配置与测试环境搭建)——在物理机上创建回环网卡及eNSP模拟器与物理机实现连接通信
  19. Linux 虚拟机VMware安装失败,提示没有选择磁盘no disks selected
  20. IT经理的两条职业路做管理还是管理咨询

热门文章

  1. 面向大数据处理应用的广域存算协同调度系统
  2. 树状结构大数据类型的高效支持
  3. 【2017年第4期】工业大数据技术与架构
  4. 【2016年第5期】卫星影像大数据情报分析与应用
  5. C++——《算法分析》实验叁——贪心算法与回溯法
  6. 【项目管理】对RUP的几点深入思考
  7. win10系统同时安装python2和python3
  8. js中的对象、原型链机制、构造函数
  9. vue 使用axios
  10. 并发容器与框架——并发容器(一)