给新手的两轮自平衡小车开发实战指南
  • Introduction
  • 前言
    • 前言
    • 推荐学习路线
  • 套件上手
    • 必看开箱组装
    • 参数特点一览
    • 蓝牙遥控模式
    • 红外循迹模式
    • 超声跟随模式
    • 超声避障模式
    • 提起识别
    • 着陆识别
    • OLED显示说明
    • 烧录程序指南
    • 修改遥控APP
    • 修改开机模式
    • 硬件组成概述
    • IO引脚分配
    • 软件功能说明
    • 程序框架介绍
    • 分析排除故障
  • 原理分析篇
    • 平衡原理
    • 动力学分析
    • 数学建模
    • Simulink仿真
  • 电路开发篇
    • 系统框架一览
    • 主控模块
    • 稳压模块
    • 驱动模块
    • 蓝牙模块
    • 传感器模块
    • 底板功能说明
    • 电机参数说明
    • 洞洞板底板手工焊接教程
  • 软件开发篇
    • 约定代码编写规则
    • 安装MDK-ARM软件
    • 使用MDK-ARM软件编译代码
    • 安装STM32CubeMX软件
    • STM32CubeMX软件生成工程
    • GPIO与LED闪烁的仪式感
    • Timer与按键消抖的应用
    • Usart与Printf函数重定向
    • Timer编码器模式读取编码器
    • PWM与TB6612FNG驱动电机
    • 硬件I2C读取MPU6050原始数据
    • 加速度计、陀螺仪的工作原理和数据融合
    • MPU6050姿态解算和数据融合
    • PID控制原理与增量式PID算法
    • 电机速度闭环内环PID控制
    • 直立平衡角度环PID控制
    • 运动速度闭环外环PID控制
    • 提高PWM频率为24kHz
    • 移植U8g2单色图形库驱动OLED
  • 其他
    • 扩展投稿
由 GitBook 提供支持
在本页
  • 预先了解
  • 具体步骤

这有帮助吗?

  1. 软件开发篇

Usart与Printf函数重定向

上一页Timer与按键消抖的应用下一页Timer编码器模式读取编码器

最后更新于5年前

这有帮助吗?

本小节教你使用 STM32CubeMX 软件配置 MiaowLabs-STM32F1-Micro 核心板的 Usart1 的底层驱动,并使用 MDK-ARM 5.17 编写代码对 Printf 函数进行重定向,实现使用 Printf 函数通过 Usart1 发送数据到上位机的功能。

预先了解

MiaowLabs-STM32F1-Micro 核心板板载 CP2102 USB to TTL 芯片,该芯片连接 STM32F103C8T6 芯片的 Usart1 引脚。

具体步骤

进入我们上一小节修改过的 MiaowLabs-Demo 文件夹,找到 MiaowLabs-Demo.ioc 工程文件,双击,打开工程。在左侧 Pinout&Configuration 界面中的 Connectivity 下拉中点击 USART1,然后在 USART1 Mode and Configuration 的 Mode 中选择 Asynchronous。Asynchronous 为异步通信的意思。Parameter Setting(基础设置)为默认设置,其中波特率为 115200 Bits/s,字节长度为 8 Bits。

点击 NVIC Setting,对 USART1 global interrupt 的选择框打钩,启用 USART1 的全局中断。

在 Project Manager 的 Code Generator 中勾选 generate periheral initialization as apair of “.c/.h” files per periheral,可以让每个外设都生成一个文件,不用全部都堆在 Main.c 文件中。我们的前两个实验都只是配置 GPIO 外设,所以没勾选该选项也没问题。但是,现在我们的外设用到了 Usart,在使用较多外设的情况下,应该勾选该选项。

点击 GENERATE CODE,重新生成代码。

打开 MDK-ARM 工程,你会发现在左侧栏的 Application/User 文件夹中多了 gpio.c 和 usart.c 文件,这是因为我们刚才勾选了 generate periheral initialization as apair of “.c/.h” files per periheral,STM32CubeMX 会把我们用到的外设都单独生成一个文件(在这里我们只用到了 GPIO 和 USART),方便我们另行修改。而且,你在 Main 函数中会发现多了初始化函数 MX_USART1_UART_Init(),即 USART1 的初始化函数。

在实际项目中通常使用串口打印调试信息进行 Debug,调试 STM32 的时候,需要标准库里面的 printf函数。我们使用 STM32CubeMX 生成工程,HAL_USART_Transmit 函数即是工程里串口输出的函数。由于printf 最终是调用 fputc 输出数据,而 fputc 是一个 weak(弱引用)函数,覆写即可重定向 printf。

注意,在 MDK-ARM 工程里要把 USE MicroLIB 选上。

打开 usart.c,在 /* USER CODE BEGIN 0 */ 和 /* USER CODE END 0 */ 把标准输入输入头文件 stdio.h 加进去,并且加入以下代码:

#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

在 /* USER CODE BEGIN 1 */ 和 /* USER CODE END 1 */ 之间加入以下代码:

/**
* @brief  Retargets the C library printf function to the USART.
* @param  None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
    /* Place your implementation of fputc here */
    /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

    return ch;
}

到这步,就搞掂了 printf 函数的重定向。接下来,就是我们如何使用 printf 函数的问题了。

在主函数 main 里面的主循环中加入以下代码:

    if(g_iButtonState == 1){            
        HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//翻转LED引脚(PB12)的电平
        printf("LED GPIO TOGGLE! \n");//打印一次 LED GPIO TOGGLE! 文字出来        
    }

这段代码的意思是,我们按一下用户按键,控制 LED 亮灭,同时每按一次按钮,都会打印 LED GPIO TOGGLE! 这段话出来。

代码已经编写好了。这时候,点击编译按钮,会提示没有错误和警告。

先把代码烧录进 MiaowLabs-STM32F1-Micro 核心板,接着,用数据线接上 MiaowLabs-STM32F1-Micro 核心板,然后打开喵呜地面站(曾用名:喵呜多功能调试助手)或其他任意串口助手,设置波特率为 115200 ,校验位为无校验,停止位为 1 位,选择文本模式,点击打开串口,这时每按一下用户按键,都能看到打印出 LED GPIO TOGGLE!。

CP2102 电路原理图
USART1 基础设置
启用 USART1 全局中断
选项打钩
重新生成代码
USART1 初始化函数
选择 USE MicroLIB
代码截图
代码截图
打印出 LED GPIO TOGGLE!