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

Cortex-M3-STM32F1 开发:(十三)HAL 库开发 ➤ printf 函数的使用与重定向

上一篇下一篇
SysTick 系统滴答定时器

目 录

  • printf 函数的使用与重定向
    • ① 使用
    • ② 重定向
      • 1. 避免使用半主机模式
      • 2. 实现 fputc 函数(重定向到 USART1 )


printf 函数的使用与重定向

我们常用 printf 函数来调试程序,printf 函数输出流程:

在这里插入图片描述

① 使用

在这里插入图片描述

② 重定向

printf 函数支持:

  1. 避免使用半主机模式

    两种方法:微库法、代码法

  2. 实现 fputc 函数(重新定义该函数就可以实现 printf 的重定向,一般是重定向到串口 USART1 )

    实现单个字符的输出

1. 避免使用半主机模式

半主机模式是用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。简单来说:就是通过仿真器实现开发板在电脑上的输入和输出。但是我们一般不使用半主机模式,我们使用的是串口

  • 方法一:微库法

    在 魔术棒 → Target选项卡,勾选:UseMicro LIB,即可避免半主机模式。

    在这里插入图片描述

    虽然微库法实现简单,但是某些标准 C 库函数运行慢、兼容性差。

  • 方法二:代码法(√)

    ( 1 个预处理、2 个定义、3 个函数)(大概了解就行,不用深入探究

    1. #pragma import(__use_no_semihosting),确保不从 C 库中使用半主机函数
    2. 定义 __FILE 结构体,避免 HAL 库某些情况下报错
    3. 定义 FILE__stdout,避免编译报错
    4. 实现 _ttywrch_sys_exit_sys_command_string 等三个函数

    正点原子的 usart.c 文件里已经内置了代码法(不过下面是针对编译器 AC5 的,只做参考,实际应用中要去复制新代码):

    // ------加入以下代码,支持printf函数,而不需要选择use MicroLIB------	  
    #if 1
    #pragma import(__use_no_semihosting)             
    //标准库需要的支持函数                 
    struct __FILE 
    { int handle; 
    }; FILE __stdout;       
    //定义_sys_exit()以避免使用半主机模式    
    void _sys_exit(int x) 
    { x = x; 
    } 
    //重定义fputc函数 
    int fputc(int ch, FILE *f)
    {      while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
    }
    #endif 
    

    虽然代码法稍微复杂,但是标准 C 库函数运行快、兼容性好。

2. 实现 fputc 函数(重定向到 USART1 )

//重定义fputc函数 
int fputc(int ch, FILE *f)
{      while((USART1->SR&0X40)==0);  // 等待上一个字符发送完成   USART1->DR = (u8) ch;         // 将要发送的字符 ch 写入到 DR 寄存器return ch;
}

其中 SR 是 USART1 的状态寄存器,其位 6 是发送完成标志位,0 表示未完成,1 表示完成;

其中 DR 是 USART1 的数据寄存器,用于存储要发送的字符(8 位)。


http://www.dtcms.com/a/533326.html

相关文章:

  • 客户制作网站时的问题个人备案网站放什么资料
  • 【JDBC】----- MySql数据库驱动jar包下载流程
  • C++中的LCA(最近公共祖先)详解
  • 防止过拟合相关技术
  • 重庆网站建设哪里比较好呢遵义市做网站的电话
  • 【补题】The 3rd Universal Cup. Stage 15: Chengdu B. Athlete Welcome Ceremony
  • SZU大学物理1实验报告|薄透镜
  • 深入理解sigaction函数:Linux信号处理机制与使用指南
  • 网站设计公司哪家专业在线种子资源网
  • 便宜做网站如何免费做网站赚钱
  • 4 Initialization and Training(初始化和训练)
  • 简易银行系统->多线程高并发
  • 【系统分析师】高分论文:论基于构件的软件开发(气象灾害影响评估系统)
  • 【java面向对象进阶】------多态综合案例
  • 做一个内容网站多少钱wordpress调用导航
  • 惠州网站开发公司电话个人兴趣图片集网站建设
  • C++ list 类的使用
  • 怎么利用QQ空间给网站做排名没有专项备案的网站
  • 显示官网字样的网站怎么做wordpress 多站点主题
  • 如何建设一个新的网站快手推广软件免费版
  • 国内十大搜索引擎网站安徽网络关键词优化
  • 【Linux】定制Linux系统
  • 个人网站备案取消网站建设管理分工
  • 企业网站建设的趋势手机网站建设的整体流程图
  • 松原做招聘的网站有哪些系统优化的意义
  • 业务流程图 —— 讲清“谁做了什么事”
  • 天津网站建设咨询杭州景观设计公司排行
  • 10.5 小项目:如何用 JavaScript 实现一个高效的时间+Token过期容器?
  • 网站备案帐号找回密码免费友链平台
  • Every other Cycle Command Input(隔循环命令输入)