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.pswp.cn/web/78581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78581.shtml
英文地址,請注明出處:http://en.pswp.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…