| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 【windows下基于Eclipse和GCC搭建stm32开发环境(6)】通过串口USRAT1实现Printf()打印 -> 正文阅读 |
|
[嵌入式]【windows下基于Eclipse和GCC搭建stm32开发环境(6)】通过串口USRAT1实现Printf()打印 |
通过串口USRAT1实现Printf打印串口调试是开发STM32必不可多少的工具,printf()直接打印到串口,配上超级终端监控软件运行,简单又实用,那么下面就开始搞!!!: 注意: 本教程基于Eclipse+GCC+Eclipse Embedded C/C++插件搭建的STM32工程 ,STM32在Eclipse下的开发环境搭建请移步: 【windows下基于Eclipse和GCC搭建stm32开发环境(1)】 一、串口初始化配置:要想通过串口USART打印信息,首先得把串口初始化和驱动搞起来: 1、 串口简介:USART:通用同步/异步串行接收发送器,即串口。一般使用串口都使用异步收发模式。 以USART1为例,需要用到的HAL库函数有:
异步串口初始化函数,在源文件:stm32f1xx_hal_uart.c
串口MSP初始化,其实就是GPIO口模式、速度的初始化,该函数由HAL_UART_Init()函数自动调用,但是原HAL库中是(_weak)声明的空函数,需要我们重写! 串口发送函数
串口接收函数
2、启用HAL库UART代码块:在建立一个新的工程时,HAL库的很多模块代码是没有启动的,包括UART和DMA模块: 所以我们要启用UAST库文件,具体操作如下图: 去掉Exclude resource from build前面的勾子! 3、 串口初始化(基于HAL库编程):基于HAL_UART_Init(),我们创建自己的UART初始化函数:void Usart1Init(int baudRate) 后续我们所有模块的驱动代码都放到app路径下,然后我们在usart.c中写如下初始化代码:
/重定义HAL_UART_MspInit函数/
usart.h文件:
二、USART1中断函数重定向虽然进行了UART模块的初始化,但是中断函数也需要我们配置一下,那中断在哪里引用的呢? 答案是:向量表! 可以看到向量表中USART1串口对应的中断函数是名为USART1_IRQHandler 找一下这个USART1_IRQHandler函数: 可以看到这个中断函数是一个若定义,并且指定了一个别名!也就是说只要执行USART1中断,就运行名为Default_Handler的函数,这是在工程建立时默认的,所有中断都这样,这是需要我们后面重定义的 可以看到默中断中啥也没干,就是个死循环,也就是说我们如果不重新指明USART1中断的话,只要触发串口中断,就会进入死循环 然后新建这个别名函数: 这样的话只要有中USART1断函数就会进入我们自己的中断函数: 同时我们要把app.h头文件包含进来: 引入app.h主要是为了引入usart.h进而引用extern UART_HandleTypeDef UART1_Handle; 句柄 好了,到这里未知,USART的配置就完成了! 三、串口收发消息调试1、超级终端连接串口:超级终端软件推荐:MobaXterm(非常好,开源免费)、Xshell(收费,需破解)
打开串口后,可以看到串口不停的打印出字符串“测试!”,但是好像有一个问题,为啥不是从头开的? 加上“\r”之后,烧录程序,再次测试: 三、newlib库printf函数重定向串口已经配置好了,并且能够在超级终端打印信息,那么用printf()打印会怎么样呢? 1、newlib库:这时候我们了解一下newlib库是个啥东西:
Newlib是一个面向嵌入式系统的与GNU兼容的嵌入式C运行库的其中一种。最初是由Cygnus Solutions收集组装的一个源代码集合,取名为newlib 但是从成熟度来讲,newlib是最优秀的。newlib具有独特的体系结构,使得它能够非常好地满足深度嵌入式系统的要求。newlib可移植性强,具有可重入特性、功能完备等特点,已广泛应用于各种嵌入式系统中。 Newlib的所有库函数都建立在20个桩函数的基础上,这20个桩函数完成一些newlib无法实现的功能:
那么newlib库和printf()函数啥关系呢? printf()是C标准库中的函数,在prinf函数运行时会调用C运行库中的桩函数_write() 这个函数是写的意思,往哪儿写呢?先看一下该函数: 可以看到,原工程是_write函数是调用了DMA串口发送函数,关于DMA的应用,后续文章讲解! 那么我们如果想让printf打印的东西显示在串口连接的超级终端中,我们是不是只需要修改_write函数就行了! 2、write函数重定向:我们在_write函数中调用串口发送函数,ptr是要发送的字符串指针,len是长度,这个不用管,因为这是printf传给_write函数的,改变_write函数中字符串的写通道,就是所谓的重定向 当然头文件还是要引用进来: 好了,测试一下: 窗口中打印出来printf的内容了!完美!这样我们printf()函数就实现在超级终端的打印了! 结语:版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:24:27- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |