【stm32】hal库学习笔记-UART/USART串口通信(超详细!)
【stm32】hal库学习笔记-UART/USART串口通信
hal库驱动函数


CubeMX图形化配置
导入LCD.ioc
RTC设置

时钟树配置
设置LSE为RTC时钟源
USART设置
中断设置

程序编写
编写主函数
/* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 16, "Demo12_1:USART1-CH340", RED);lcd_show_str(10, 30, 16, "Please connect board with PC", RED);lcd_show_str(10, 50, 16, "via MiniUSB line before power on", RED);uint8_t hello1[] = "Hello, blocking\n";HAL_UART_Transmit(&huart1, hello1, sizeof(hello1), 500);HAL_Delay(10);uint8_t hello2[] = "Hello, none blocking\n";HAL_UART_Transmit_IT(&huart1, hello2, sizeof(hello2));lcd_show_str(10, 90, 16, "Received command string is: ", RED);HAL_UART_Receive_IT(&huart1, rxBuffer, RX_CMD_LEN);/* USER CODE END 2 */
在rtc.c中重写回调函数
/* USER CODE BEGIN 1 */
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) {RTC_TimeTypeDef sTime;RTC_DateTypeDef sDate;if (HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK) {HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);uint8_t timeStr[20];sprintf(timeStr, "%2d:%2d:%2d\n", sTime.Hours, sTime.Minutes, sTime.Seconds);lcd_show_str(30, 70, 16, timeStr, BLACK);if (isUploadTime) {HAL_UART_Transmit(&huart1, timeStr, strlen(timeStr), 200);}}
}
/* USER CODE END 1 */
在usart.h文件中编写定义
/* USER CODE BEGIN Private defines */
#define RX_CMD_LEN 5
extern uint8_t rxBuffer[];
extern uint8_t isUploadTime;
/* USER CODE END Private defines */
编写usart.c
/* USER CODE BEGIN 0 */
#include "rtc.h"
#include "lcd.h"
#include <string.h>uint8_t proBuffer[10] = "#S45;\n";
uint8_t rxBuffer[10] = "#H12;\n";
uint8_t rxCompleted = RESET;
uint8_t isUploadTime = 1;
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if (huart->Instance == USART1) {rxCompleted = SET;for (uint16_t i = 0; i < RX_CMD_LEN; i++) {proBuffer[i] = rxBuffer[i];__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);}}
}void on_UART_IDLE(UART_HandleTypeDef *huart) {if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == RESET) {return;}__HAL_UART_CLEAR_IDLEFLAG(huart);__HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);if (rxCompleted) {HAL_UART_Transmit(huart, proBuffer, strlen(proBuffer), 100);HAL_Delay(10);updateRTCTime();lcd_show_str(30, 110, 16, proBuffer, BLACK);rxCompleted = RESET;HAL_UART_Receive_IT(huart, rxBuffer, RX_CMD_LEN);}
}void updateRTCTime() {if (proBuffer[0] != '#') {return;}uint8_t timeSection = proBuffer[1];uint8_t temp10 = proBuffer[2] - '0';uint8_t temp1 = proBuffer[3] - '0';uint8_t value = 10 * temp10 + temp1;if (timeSection == 'U') {isUploadTime = value;return;}RTC_TimeTypeDef sTime;RTC_DateTypeDef sDate;if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK) {HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);sTime.DayLightSaving = 0;sTime.StoreOperation = 0;if (timeSection == 'H') {sTime.Hours = value;} else if (timeSection == 'M') {sTime.Minutes = value;} else if (timeSection == 'S') {sTime.Seconds = value;}HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);}
}/* USER CODE END 1 */
实现效果


相关文章:
【stm32】hal库学习笔记-UART/USART串口通信(超详细!)
【stm32】hal库学习笔记-UART/USART串口通信 hal库驱动函数 CubeMX图形化配置 导入LCD.ioc RTC设置 时钟树配置 设置LSE为RTC时钟源 USART设置 中断设置 程序编写 编写主函数 /* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 16, "Demo12_1:USART1-CH340&q…...
通俗易懂理解GhostNetV1轻量级神经网络模型
一、参考资料 原始论文:[1] PyTorch代码链接:Efficient-AI-Backbones MindSpore代码:ghostnet_d 解读模型压缩5:减少冗余特征的Ghost模块:华为Ghost网络系列解读 GhostNet论文解析:Ghost Module CVPR…...
P8630 [蓝桥杯 2015 国 B] 密文搜索
P8630 [蓝桥杯 2015 国 B] 密文搜索 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P8630 题目分析 基本上是hash的板子,但实际上对于密码串,只要判断主串中任意连续的八个位置是否存在密码串即可;那么我们…...
Electron实战之环境搭建
工欲善其事必先利其器,在进行实战开发的时候,我们最终的步骤是搞好一个舒服的开发环境,目前支持 Vue 的 Electron 工程化工具主要有 electron-vue、Vue CLI Plugin Electron Builder、electron-vite。 接下来我们将分别介绍基于 Vue CLI Plu…...
【0259】inval.h/inval.c的理解
1. inval.h/inval.c inval.h、inval.c是缓存无效消息(invalidation message)调度程序定义。 2. inval.h/inval.c特性 inval.h/inval.c的实现是一个非常微妙的东西,所以需要注意: 当一个元组被更新或删除时,我们的标准可见性规则(standard visibility rules)认为只要我…...
力扣爆刷第77天--动态规划一网打尽打家劫舍问题
力扣爆刷第77天–动态规划一网打尽打家劫舍问题 文章目录 力扣爆刷第77天--动态规划一网打尽打家劫舍问题一、198.打家劫舍二、213.打家劫舍II三、337.打家劫舍 III 一、198.打家劫舍 题目链接:https://leetcode.cn/problems/house-robber/ 思路:小偷不…...
深入理解C语言(5):程序环境和预处理详解
文章主题:程序环境和预处理详解🌏所属专栏:深入理解C语言📔作者简介:更新有关深入理解C语言知识的博主一枚,记录分享自己对C语言的深入解读。😆个人主页:[₽]的个人主页🏄…...
ESP8266智能家居(3)——单片机数据发送到mqtt服务器
1.主要思想 前期已学习如何用ESP8266连接WIFI,并发送数据到服务器。现在只需要在单片机与nodeMCU之间建立起串口通信,这样单片机就可以将传感器测到的数据:光照,温度,湿度等等传递给8266了,然后8266再对数据…...
lvm逻辑卷创建raid阵列(不常用)—— 筑梦之路
RAID卷介绍 逻辑卷管理器(LVM)不仅仅可以将多个磁盘和分区聚合到一个逻辑卷中,以此提高单个分区的存储容量,还可以创建和管理独立磁盘的冗余阵列(RAID)卷,防止磁盘故障并提高性能。它支持常用的RAID级别,支持的RAID的级别有 0、1…...
LayUI发送Ajax请求
页面初始化操作 var processData null $(function () {initView();initTable();// test(); })function initView() {layui.use([laydate, form], function () {var laydate layui.laydate;laydate.render({elem: #applyDateTimeRange,type: datetime,range: true});}); }初始…...
平时积累的FPGA知识点(10)
平时在FPGA群聊等积累的FPGA知识点,第10期: 41 ZYNQ系列芯片的PL中使用PS端送过来的时钟,这些时钟名字是自动生成的吗? 解释:是的。PS端设置的是ps_clk,用report_clocks查出来的时钟名变成了clk_fpga_0&a…...
使用Streamlit构建纯LLM Chatbot WebUI傻瓜教程
文章目录 使用Streamlit构建纯LLM Chatbot WebUI傻瓜教程开发环境hello Streatelit显示DataFrame数据显示地图WebUI左右布局设置st.sidebar左侧布局st.columns右侧布局 大语言模型LLM Chatbot WebUI设置Chatbot页面布局showdataframe()显示dataframeshowLineChart()显示折线图s…...
电脑死机卡住怎么办 电脑卡住鼠标也点不动的解决方法
在我们使用电脑的过程中,可能由于电脑硬件或者软件的问题,偶尔会出现电脑卡住的情况,很多电脑小白都不知道电脑卡住了怎么办,鼠标也点不动,键盘也没用,一旦发生了这种情况,大家可以来参考一下小编分享的电脑死机卡住的解决方法。 电脑卡住鼠标也点不动的解决方法 方…...
RAG 语义分块实践
每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 原文标题:Semantic chunking in practice 原文地址:https://medium.com/@boudhayan-dev/semantic-chunking-in-practice-23a8bc33d56d 语义分块的实践 回顾 …...
12 Autosar_SWS_MemoryMapping.pdf解读
AUTOSAR中MemMap_autosar memmap-CSDN博客 1、Memory Map的作用 1.1 避免RAM的浪费:不同类型的变量,为了对齐造成的空间两份; 1.2 特殊RAM的用途:比如一些变量通过位掩码来获取,如果map到特定RAM可以通过编译器的位掩码…...
【Linux取经路】文件系统之缓冲区
文章目录 一、先看现象二、用户缓冲区的引入三、用户缓冲区的刷新策略四、为什么要有用户缓冲区五、现象解释六、结语 一、先看现象 #include <stdio.h> #include <string.h> #include <unistd.h>int main() {const char* fstr "Hello fwrite\n"…...
华为OD机试真题-查找接口成功率最优时间段-2023年OD统一考试(C卷)--Python3--开源
题目: 考察内容: for 时间窗口list(append, sum, sort) join 代码: """ 题目分析:最长时间段 且平均值小于等于minLost同时存在多个时间段,则输出多个,从大到小排序未找到返回 NULL 输入…...
缓存篇—缓存雪崩、缓存击穿、缓存穿透
缓存异常会面临的三个问题:缓存雪崩、击穿和穿透。 其中,缓存雪崩和缓存击穿主要原因是数据不在缓存中,而导致大量请求访问了数据库,数据库压力骤增,容易引发一系列连锁反应,导致系统奔溃。不过࿰…...
Python实现视频转音频、音频转文本的最佳方法
文章目录 Python实现视频转音频和音频转文字视频转音频步骤 1:导入moviepy库步骤 2:选择视频文件步骤 3:创建VideoFileClip对象步骤 4:提取音频步骤 5:保存音频文件 音频转文字步骤 1:导入SpeechRecognitio…...
阿里云SSL免费证书到期自动申请部署程序
阿里云的免费证书只有3个月的有效期,不注意就过期了,还要手动申请然后部署,很是麻烦,于是写了这个小工具。上班期间抽空写的,没有仔细测试,可能存在一些问题,大家可以自己clone代码改改…...
树莓派命令行保姆级避坑指南:从sudo权限到安全关机,别再乱敲命令了
树莓派命令行深度避坑手册:从权限管理到系统维护的黄金法则 当你第一次拿到树莓派时,那种兴奋感可能让你迫不及待地想尝试各种命令。但很快,你会发现这个小小的设备背后隐藏着许多"陷阱"——一个错误的sudo命令可能导致系统崩溃&am…...
通过Taotoken审计日志功能追踪与分析API调用情况
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken审计日志功能追踪与分析API调用情况 对于使用大模型API进行开发的项目团队而言,清晰、透明地掌握API调用情…...
6.滑动窗口和双指针
文章目录双指针对撞指针快慢指针滑动窗口双指针 双指针:指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描&…...
终极音乐歌词获取指南:163MusicLyrics让你的每首歌都有完美字幕
终极音乐歌词获取指南:163MusicLyrics让你的每首歌都有完美字幕 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为音乐播放器缺少歌词而烦恼?…...
对AI工程问题的一些思考
AI Agent 编程正在重塑软件工程的底层逻辑 过去三到五年,AI 编程工具经历了从「辅助插件」到「协作主体」的范式迁移。 最早以 GitHub Copilot 为代表的产品,本质上是一种上下文感知的智能补全引擎——它能根据当前文件的光标位置,预测并生成…...
如何为FF14国际服实现完整中文汉化:FFXIVChnTextPatch实战指南
如何为FF14国际服实现完整中文汉化:FFXIVChnTextPatch实战指南 【免费下载链接】FFXIVChnTextPatch 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIVChnTextPatch 还在为《最终幻想14》国际服的英文界面而烦恼吗?FFXIVChnTextPatch项目为你提…...
3分钟解决游戏操作冲突:Hitboxer SOCD工具让你的键盘操作职业化
3分钟解决游戏操作冲突:Hitboxer SOCD工具让你的键盘操作职业化 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否在玩《街头霸王6》时连招总是失败?或者在《Apex英雄》中急停转向时…...
GPT-4V食物识别实测:准确率真能到87.5%?我们复现了那篇论文的实验
GPT-4V食物识别技术深度测评:从实验室数据到真实场景的挑战 当一张摆盘精致的牛排照片被上传到GPT-4V界面,三秒后系统不仅识别出"肋眼牛排",还精确标注出"约350克"和"780千卡"时,这种看似科幻的场景…...
教育工作者速看!Perplexity学术搜索正在悄然替代Google Scholar(2024教育AI搜索白皮书首发)
更多请点击: https://codechina.net 第一章:教育工作者为何需要重新定义学术搜索范式 在数字学术资源呈指数级增长的今天,传统基于关键词匹配与单一数据库检索的学术搜索方式,已难以支撑教育工作者开展跨学科教学设计、证据本位课…...
2026年光电传感器在不同检测距离中的选型方法与检测距离参数
在自动化产线、物流分拣、包装机械、电子制造等领域,光电传感器的检测距离是选型时最先映入眼帘的参数。然而,很多工程师在实际应用中会发现:标称检测距离为10米的传感器,装上后检测5米的黑色物体就不稳定了;标称0.5米…...
