当前位置: 首页 > news >正文

STM32嵌入式编程学习到提高:【4】UART串口打印

-------------------------------------------------------------------------------------------------------------------------

工程文件:放在百度云盘里,需要的自行下载!!!
链接: https://pan.baidu.com/s/14gRne9kHhxPiXBfGEMTSgQ?pwd=xyza

提取码: xyza

-------------------------------------------------------------------------------------------------------------------------

在学习嵌入式时候,串口打印log输入输出是个很有用的工具,就像学硬件需要用到万用表,示波仪,当医生需要温度计一样。所以我们必须第一时间实现这个功能。

--------------------------------------------------------------------------------------------------------------------------

本文目标:

串口工具打印输出: "hello world!!!"

串口工具输入:“HI:”
单片机响应再输出:“How are you!!!”

----------------------------------------------------------------------------------------------------------------------------

1:创建文件: uart.c,uart.h并添加到工程

2:养成习惯,在.c文件里包含.h文件,.h里加上条件编译语句。

__UART_H__是一个约定俗成的写法,你也可以写成其它样式,需要保持唯一性,但最好这样写。

#ifndef

#define
#endif

这个是个条件编译语句,避免重复包含头文件。造成资源浪费,每个头文件都加上这几句,养成好的编程习惯。

3:接下来,我们实现第一步:打印"hello world!!!",通过前面的学习我们知道,单片机跑起来后会进入main函数,那我们就在mian里面写一个pirntf打印语句看看。

我们在while里和while外各加一个printf语句,看看打印出来后的区别,应该有点基础的同学大部分知道。这个自己观察~~~~,这个也是嵌入式一个很重要的特性!!!

4:编译一下,报警了,printf声明不合法

5:我们并没有去写printf的函数实现,也是直接用printf的库函数,所以我们需要把声明过printf函数的头文件包含进来:stdio.h

警告消除,这样就能打印了么?貌似没有这么简单,跟单片机相关的硬件我们还一点没处理呢,那软件的字符怎么就能通过硬件的特定pin传输到串口工具里去呢?

printf(); 底层调用的是fputc()库函数,这是一个weak函数,我们想用UART输出,就需要重写fputc()

/****************************************************************************************************************************************** 
* 函数名称: fputc()
* 功能说明: 重写fputc函数
* 输    入: 
*			
* 输    出: 无
* 注意事项: USART1->SR:状态寄存器,USART1->DR:数据寄存器
******************************************************************************************************************************************/
int fputc(int ch, FILE *f)
{      while((USART1->SR & 0X40)==0);     //发送寄存器空标志位,空:1,非空:0,发送完了接着发下一个数据,否则阻塞在这USART1->DR = (u8) ch;   					 //把待发送的数据写入数据寄存器,  USART1->DR return ch;
}

6:带着上面的问题,我们得想想自己的开发板硬件,那些pin是接在uart线上的。然后,我们需要把硬件相关的设置好,这样才能正确的工作起来。

我用的开发板,用的是uart1,对应的gpio管脚是:PA9和PA10 (这里需要对照硬件设计确定管脚)

那接下来第一步,就是初始化硬件,把PA9和PA10 GPIO引脚,配成uart1工作模式,并设置中断接收(RX线上来数据的时候,MCU产生中断,中断服务函数再去处理接收到的数据)

7:编译的时候记得勾选使用微库

8:然后再下载到开发板里,然后就打印出来了log。这样我们就完成了通过uart输出log的功能

9:接下来我们看一下通过串口工具给开发板发消息,我们通过接收中断来做

http://www.lryc.cn/news/447493.html

相关文章:

  • C 标准库 - <ctype.h>
  • linux:chown用法详解
  • 介绍GPT-o1:一系列解决困难问题( science, coding, and math )的推理模型
  • 2024 Python3.10 系统入门+进阶(十六):正则表达式
  • 书生大模型实战营学习[7] InternLM + LlamaIndex RAG 实践
  • 【MySQL】数据库--索引
  • [大语言模型-论文精读] ACL2024-长尾知识在检索增强型大型语言模型中的作用
  • “迷茫野路子到AI大模型高手:一张图解产品经理晋升之路和能力构建“
  • 可看见车辆行人的高清实时视频第2辑
  • 基于饥饿游戏搜索优化随机森林的数据回归预测 MATLAB 程序 HGS-RF
  • 一天面了8个Java后端,他们竟然还在背5年前的八股文!
  • python功能测试
  • 【秋招笔试】09.25华子秋招(已改编)-三语言题解
  • 【中级通信工程师】终端与业务(四):通信产品
  • 数据科学 - 字符文本处理
  • python之装饰器、迭代器、生成器
  • Go语言实现后台管理系统如何根据角色来动态显示栏目
  • 【深度学习】【TensorRT】【C++】模型转化、环境搭建以及模型部署的详细教程
  • LeetCode(Python)-贪心算法
  • 【C/C++】【基础数论】33、算数基本定理
  • 聚簇索引与非聚簇索引
  • “类型名称”在Go语言规范中的演变
  • c++----继承(初阶)
  • 数据库系列(1)常见的四种非关系型数据库(NoSQL)
  • 大规模预训练语言模型的参数高效微调
  • 一场大模型面试,三个小时,被撞飞了
  • Python每次for循环向list中添加多个元素
  • Java爬虫抓取数据的艺术
  • Unity场景内画车道线(根据五阶曲线系数)
  • IPLOOK百万级用户容量核心网惊艳亮相北京PT展