小兴教你做平衡小车-stm32程序开发(串口打印)

文章目录

  • 1 前言
  • 2 串口打印库函数版本
  • 3 串口打印寄存器版本
    • 3.1 配置时钟
    • 3.2 配置GPIO功能
    • 3.3 配置CR2寄存器
    • 3.4 配置CR1寄存器
    • 3.5 配置CR3寄存器

1 前言

我们在调试的过程中,都比较喜欢直观的数据,这时候我们可以使用芯片的串口功能,把数据打印到电脑上,这样就可以清晰的看到数据的变化。

2 串口打印库函数版本

下面呢,就到串口打印的程序啦。
首先,先分享一下库函数版本的代码。

main.c文件。

#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "stdio.h"int main(void)
{RCC->APB2ENR |= (uint32_t)0x00000010;//打开GPIOC时钟GPIOC->CRH   &= (uint32_t)0xFF0FFFFF;//使用前清零GPIOC->CRH   |= (uint32_t)0x00300000;//配置PC13为推挽输出,最大速度50MHzDelay_Init();Usart_Init(115200);printf("hello world!\r\n");while(1){GPIOC->BSRR  =  (uint32_t)0x00002000;//PC13引脚输出高电平Delay_ms(1800);                       //延时1800msGPIOC->BRR  =   (uint16_t)0x2000;    //PC13引脚输出低电平Delay_ms(1800);                       //延时1800ms}
}

usart.c文件。

#include "stm32f10x.h"
#include "usart.h"	
#include "stdio.h"int fputc(int ch,FILE *f)
{USART_SendData(USART1,(uint8_t)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成return ch;
}void Usart_Init(uint32_t bound)
{GPIO_InitTypeDef  GPIO_InitStructure;USART_InitTypeDef  USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//打开USART1和GPIOA的时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;        //PA9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHZGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出GPIO_Init(GPIOA,&GPIO_InitStructure);  //初始化PA9引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;        //PA10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHZGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入GPIO_Init(GPIOA,&GPIO_InitStructure);  //初始化PA10引脚USART_InitStructure.USART_BaudRate = bound;  //串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位为1位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//发送接收模式USART_Init(USART1,&USART_InitStructure); //初始化USART1USART_Cmd(USART1,ENABLE);  //使能USART1
}

usart.h文件。

#ifndef __USART_H
#define __USART_H#include "stm32f10x.h"void Usart_Init(uint32_t bound);#endif

当我们把需要的代码写好并编译通过后,可以把程序烧录到单片机中。
注意:这里是使用小马哥的下载器和stm32最小系统板,连线如下图所示。
在这里插入图片描述

这时候,打开串口助手,按下单片机上的复位按键,即可以看到信息被打印了出来。
在这里插入图片描述
当然也可以用逻辑分析仪抓取下芯片的TX引脚发出的波形。
在这里插入图片描述
用逻辑分析仪自带的解析工具,对usart的单片机Usart1_Tx(PA9)引脚波形进行解析,可以对着ascii表找到十进制对应的字符即可。
在这里插入图片描述

在这里插入图片描述

3 串口打印寄存器版本

3.1 配置时钟

	RCC->APB2ENR |= (uint32_t)0x00000004;//打开GPIOA时钟RCC->APB2ENR |= (uint32_t)0x00004000;//打开USART1时钟

打开GPIOA和USART1的时钟。
在这里插入图片描述

3.2 配置GPIO功能

PA9(Usart1_Tx)设置为复用推挽输出,速度为50mhz。

	GPIOA->CRH   &= (uint32_t)0xFFFFFF0F;//使用前清零GPIOA->CRH   |= (uint32_t)0x000000B0;//配置PB9为复用推挽输出,最大速度50MHz

PA10(Usart1_Rx)设置为浮空输入。

	GPIOA->CRH   &= (uint32_t)0xFFFFF0FF;//使用前清零GPIOA->CRH   |= (uint32_t)0x00000400;//配置PA10为浮空输入

在这里插入图片描述

3.3 配置CR2寄存器

控制CR2寄存器的代码如下,对12、13位进行操作。

	USART1->CR2  &= (uint16_t)0xCFFF; //使用前清零USART1->CR2  |= (uint16_t)0x0000; //停止位设置为1位

在这里插入图片描述

3.4 配置CR1寄存器

控制CR2寄存器的代码如下,对2、3、9、10、12位进行操作。

	USART1->CR1  &= (uint16_t)0xE9F3; //使用前清除 M, PCE, PS, TE and RE位USART1->CR1  |= (uint16_t)0x000C; //设置一个起始位,8个数据位,无奇偶校验,使能发送,使能接收

在这里插入图片描述
在这里插入图片描述
下图是几个关键位的介绍
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5 配置CR3寄存器

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/265885.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

智慧生活,从餐厅开始:开发智能扫码点餐系统的技术详解

本篇文章,小编将深入为大家讲解开发智能扫码点餐系统的技术细节,从系统架构到关键功能实现,为读者提供全面的技术指南。 一、智能扫码点餐系统概述 可实现在线浏览菜单、点餐、支付等操作,大大简化了点餐流程,提升了…

Spring Cloud Gateway官方文档学习

文章目录 推荐写在前面一、熟悉Gateway基本概念与原理1、三大概念2、工作流程 二、基本使用路由断言的两种写法 三、路由断言工厂1、After路由断言工厂2、Before路由断言工厂3、Between路由断言工厂4、Cookie路由断言工厂5、Header路由断言工厂6、Host路由断言工厂7、Method路由…

大话设计模式——4.装饰模式(Decorator Pattern)

1.定义 1)可以在不改动原有对象代码的情况下扩展对象的功能,通过聚合的方式相较于继承更加灵活。 2)UML图 2.示例 汽车有很多装饰可选,如座椅、音响、轮胎等都可以进行自定义组装 1)抽象汽车对象 public interfac…

代码库管理工具Git介绍

阅读本文同时请参阅-----免费的Git图形界面工具sourceTree介绍 Git是一个分布式版本控制系统,它可以帮助开发者跟踪和管理代码历史。Git的命令行工具是使用Git的核心方式,虽然它可能看起来有些复杂,但是一旦掌握了基本命令,你…

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基…

Pytorch添加自定义算子之(5)-配置GPU形式的简单add自定义算子

参考:https://zhuanlan.zhihu.com/p/358778742 一、头文件 命名为:add2.h void launch_add2(float *c,const float *a,const float *b,int n);

【Unity】构建简单实用的年份选择器(简单原理示范)

在许多应用程序和游戏中,年份选择是一个常见的需求。无论是在日历应用程序中查看事件,还是在历史类游戏中选择时间段,年份选择器都是用户体验的重要组成部分,下面实现一个简易的年份选择器。 一、效果预览: 目录 一、…

为什么会出现 targetId 与 senderUserId 相同的情况?

描述 单聊会话(两位用户聊天)中出现了消息的 targetId 和 senderUserId 相同的情况。 分析 融云 IM 设计如此。 senderUserId 是消息的发送者的用户 ID。targetId 是当前会话的 ID,该 ID 指向与本端用户对话的用户 ID、群组 ID、聊天室 I…

蓝桥杯_定时器的基本原理与应用

一 什么是定时器 定时器/计数器是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向cpu提出中断处理请求,从而实现,定时或者计数功能的外设。 二 51单片机的定时/计数器 单片机外部晶振12MHZ,…

Linux系统Docker部署StackEdit Markdown并实现公网访问本地编辑器

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

基于Redo log Undo log的MySQL的崩溃恢复

基于Redo log & Undo log的MySQL的崩溃恢复 Redo log Undo log Redo log 重做日志,记录,修改过的数据 Undo log 回滚日志,记录修改之前的数据 两个我不做详细的介绍了,redo log就是记录哪些地方被修改了 undo log是记录修改之前我们的数据长什么样 更新流程 我们来捋一…

海量物理刚体 高性能物理引擎Unity Physics和Havok Physics的简单性能对比

之前的博客中我们为了绕过ECS架构,相当于单独用Batch Renderer Group实现了一个精简版的Entities Graphics,又使用Jobs版RVO2实现了10w人同屏避障移动。 万人同屏对抗割草 性能测试 PC 手机端 性能表现 弹幕游戏 海量单位同屏渲染 锁敌 避障 非ECS 那么有…

【C语言】while循环语句

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

c#使用log4net的3种调用方法

https://blog.csdn.net/summer_top/article/details/107961245 第一步:下载log4net。 右键项目引用,进入管理NuGet包。 搜索log4net,下载安装。 第二步:创建LogHelper类。 public class LogHelper { private LogHelp…

【Android】View 的滑动

View 的滑动是 Android 实现自定义控件的基础,同时在开发中我们也难免会遇到 View 的滑动处理。其实不管是哪种滑动方式,其基本思想都是类似的:当点击事件传到 View 时,系统记下触摸点的坐标,手指移动时系统记下移动后…

docker 容器修改端口和目录映射

一、容器修改端口映射 一般在运行容器时,我们都会通过参数 -p(使用大写的-P参数则会随机选择宿主机的一个端口进行映射)来指定宿主机和容器端口的映射,例如 docker run -it -d --name [container-name] -p 8088:80 [image-name]…

Flask基础学习3

参考视频:41-【实战】答案列表的渲染_哔哩哔哩_bilibili flask 实现发送短信功能 pip install flask-mail # 安装依赖 我这里用登录的网易邮箱获取的授权码(登录QQ邮箱的授权码总是断开收不到邮件), # config # config mail MAI…

云尚办公-0.0.3

5. controller层 import pers.beiluo.yunshangoffice.model.system.SysRole; import pers.beiluo.yunshangoffice.service.SysRoleService;import java.util.List;//RestController:1.该类是控制器;2.方法返回值会被写进响应报文的报文体,而…

Dockerfile(4) - RUN 指令详解

RUN 运行命令 shell 形式 命令在 shell 中运行Linux 上默认为 /bin/sh -cWindows 上 cmd /S /C RUN <command> exec 形式 RUN ["executable", "param1", "param2"] 必须双引号&#xff0c;不能是单引号 两种写法的实际栗子 RUN …