stm32wb55rg (4) 启用usart串口

code repo: 访问gitee
上节课成功点亮了LED,这次来把usart 用起来,毕竟有交互才是系统。

技术准备

首先查看手册,发现mcu有1个usart和1个 lpuart。
usart 的使用需要两个pin,一个接收一个发送。继续查看pin and ball definitions, 寻找使用usart可用的pin,发现可选择PA9+PA10 或者 PB6+PB7。
通过原理图发现,如果使用PA9+PA10组合,需要单独接线。而根据圈出的数字顺序号,发现PB7,PB6通过转换连接到了st-link usb接口的DM和DP,因此使用stlink的虚拟串口功能。
在这里插入图片描述

查看memory mapping, 得到USART的寻址为:AHB1 --> APB2 --> USART1.
在这里插入图片描述
查看时钟树,usart 的clock source有4个选择,分别是PCLKn, SYSCLK, HSI16, LSE.
在这里插入图片描述
除此之外,还应当了解有哪些寄存器,以及各个寄存器的作用和意义。但开发优先,可以调用api来开发,多数api都是自注释的。所以可以等到需要的时候再查询寄存器。

代码实现

在main函数中,首先定义一个usart 变量,方便配置usart相关参数,然后新增一个usart初始化函数,并在main中进行调用。初始化函数中定义了串口的配置,波特率,长度等等。

UART_HandleTypeDef huart1;void USART1_UART_Init(void)
{/* USER CODE END USART1_Init 1 */huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK){Error_Handler();}if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK){Error_Handler();}
}

还要实现一个HAL_UART_MspInit 接口,该接口是usart初始化的回调接口,用于设置用于usart功能的pin,使能gpio和usart的时钟

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};if(uartHandle->Instance==USART1){/** Initializes the peripherals clock*/PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1;PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK){Error_Handler();}/* USART1 clock enable */__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**USART1 GPIO ConfigurationPB6     ------> USART1_TXPB7     ------> USART1_RX*/GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF7_USART1;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}
}

最后实现一个fputc

int fputc(int ch, FILE *f)
{uint8_t data = (uint8_t)ch;if (HAL_UART_Transmit(&huart1, &data, 1, 10) != HAL_OK) // Reduced timeout to 10ms{// Handle transmission errorError_Handler();}return ch;
}

这样我们就可以使用printf来输出了。但是别忘记了在工程设置里面使用lib库,如图所示。
在这里插入图片描述

bugfix:如果在main中调用printf仍旧没有输出,可以使用setvbuf设置标准输出流(stdout)的缓冲模式

setvbuf(stdout, NULL, _IONBF, 0);

效果如下:
在这里插入图片描述
code repo: 访问gitee
commit: 89cba38e2296
搞定收工

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

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

相关文章

Python生活手册-NumPy数组创建:从快递分拣到智能家居的数据容器

一、快递分拣系统(列表/元组转换) 1. 快递单号录入(np.array()) import numpy as np快递单号入库系统 快递单列表 ["SF123", "JD456", "EMS789"] 快递数组 np.array(快递单列表) print(f"…

数据库-数据类型,表的约束和基本查询操作

一、数值类型 1. 整数类型 类型字节有符号范围无符号范围操作注意事项TINYINT1-128 ~ 1270 ~ 255默认有符号,UNSIGNED定义无符号SMALLINT2-32768 ~ 327670 ~ 65535无符号需显式声明INT4-2^31 ~ 2^31-10 ~ 2^32-1推荐优先使用INTBIGINT8-2^63 ~ 2^63-10 ~ 2^64-1存…

【C语言编译】编译原理和详细过程

文章目录 1. C 语言编译原理和详细过程1.1 预处理阶段1.2 编译阶段1.3 汇编阶段1.4 链接阶段 2. 疑问点解析2.1 三地址码是什么?有什么作用2.2 符号表是什么?有何作用2.3 重定位的含义与作用2.3 符号表和重定位在整个编译过程中的作用2.4 动态链接库.so和…

游戏引擎学习第251天:完成调试层级结构

运行游戏,查看当前调试层级的状态。 我们正在直播中开发一个完整的游戏,目前正进行调试代码的整理和清理工作。现在我们直接进入正题,虽然还不完全确定今天要完成哪些具体内容,但有几个明确的目标: 首先,…

关于Python:9. 深入理解Python运行机制

一、Python内存管理(引用计数、垃圾回收) Python(CPython)采用的是: “引用计数为主,垃圾回收为辅” 的内存管理机制。 也就是说: 引用计数机制:负责大部分内存释放,简…

【STM32单片机】#13 RTC实时时钟

主要参考学习资料: B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 目录 Uni…

SecureCRT 使用指南:安装、设置与高效操作

目录 一、SecureCRT 简介 1.1 什么是 SecureCRT? 1.2 核心功能亮点 1.3 软件特点 二、SecureCRT 安装与激活 2.1 安装步骤(Windows 系统) 2.2 激活与破解(仅供学习参考) 三、基础配置与优化 3.1 界面与编码设…

3.5/Q1,GBD数据库最新一区文章解读

文章题目:Global burden of low vision and blindness due to age-related macular degeneration from 1990 to 2021 and projections for 2050 DOI:10.1186/s12889-024-21047-x 中文标题:1990年至2021年因年龄相关性黄斑变性导致的低视力和失…

【Hive入门】Hive安全管理与权限控制:基于SQL标准的授权GRANT REVOKE深度解析

目录 引言 1 Hive权限模型概述 2 SQL标准授权基础 2.1 核心概念解析 2.2 授权模型工作流程 3 GRANT/REVOKE语法详解 3.1 基础授权语法 3.2 权限回收语法 3.3 参数说明 4 授权场景 4.1 基础授权示例 4.2 列级权限控制 4.3 视图权限管理 5 权限查询与验证 5.1 查看…

无缝监控:利用 AWS X-Ray 增强 S3 跨账户复制的可见性

您准备好提升您的云和 DevOps 技能了吗? 🐥《云原生devops》专门为您打造,我们精心打造的 30 篇文章库,这些文章涵盖了 Azure、AWS 和 DevOps 方法论的众多重要主题。无论您是希望精进专业知识的资深专业人士,还是渴望学习相关知识的新手,这套资源库都能满足您的需求。 …

Python Cookbook-7.2 使用 pickle 和 cPickle 模块序列化数据

任务 你想以某种可以接受的速度序列化和重建Python 数据结构,这些数据既包括基本Python 对象也包括类和实例。 解决方案 如果你不想假设你的数据完全由基本 Python 对象组成,或者需要在不同的 Python 版本之间移植,再或者需要将序列化后的…

2025.5.5总结

今日感悟:这假期就这样结束了,玩了一次滑板,打扫了一次租房,出去逛了一次街,看完了一本书,追了一部剧。既没有家人,也没有能一同畅饮的同学,更没有对象,显得确实有些孤独…

MySQL | DQL语句-连接查询

MySQL | DQL语句-连接查询 🪄个人博客:https://vite.xingji.fun 什么是连接查询 从一张表中查询数据称为单表查询。从两张或更多张表中联合查询数据称为多表查询,又叫做连接查询。什么时候需要使用连接查询? 比如这样的需求&…

Vite简单介绍

Vite 是一个现代化的前端构建工具,由 Vue.js 的创始人 Evan You 开发,旨在提供更快的开发体验和更高效的构建流程。它的名字来源于法语单词“vite”,意为“快速”,这也反映了它的核心优势——极速的冷启动和热模块替换&#xff08…

C语言-回调函数

回调函数 通过函数指针调用函数,而这个被调用的函数称为回调函数 回调函数是C语言中一种强大的机制,允许将函数作为参数传递给其他函数,从而在特定时机由后者调用。它的核心在于函数指针的使用 以下是回调函数的使用例子 先创建好一个函数…

启发式算法-禁忌搜索算法

禁忌搜索是一种可以用于解决组合优化问题的启发式算法,通过引入记忆机制跳出局部最优,避免重复搜索。该算法从一个初始解开始,通过邻域搜索策略来寻找当前解的邻域解,并在邻域解中选择一个最优解作为下一次迭代的当前解&#xff0…

Python 整理3种查看神经网络结构的方法

1. 网络结构代码 import torch import torch.nn as nn# 定义Actor-Critic模型 class ActorCritic(nn.Module):def __init__(self, state_dim, action_dim):super(ActorCritic, self).__init__()self.actor nn.Sequential(# 全连接层,输入维度为 state_dim&#xf…

Linux 查询CPU飙高的原因

获取进程ID ps -efgrep xxxx查询占用最高的线程ID top -Hp 线程ID线程ID 转 16进制数 printf 0x%x\n 线程ID基于jstack工具 跟踪堆栈定位代码位置 jstack 进程ID | grep 16禁止线程ID -A 20

Oracle OCP认证考试考点详解083系列09

题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 41. 第41题: 题目 解析及答案: 关于应用程序容器,以下哪三项是正确的? A) 它可以包含单个…

GESP2024年3月认证C++八级( 第二部分判断题(1-5))

孙子定理参考程序&#xff1a; #include <iostream> #include <vector> using namespace std;// 扩展欧几里得算法&#xff1a;用于求逆元 int extendedGCD(int a, int b, int &x, int &y) {if (b 0) {x 1; y 0;return a;}int x1, y1;int gcd extende…