STM32HAL库快速入门教程——常用外设学习(2)

目录

一、STM32HAL库开发(8)——CubeMX配置DMA

1.1、什么是DMA?

1.2、内存内存之间的传输(单次)

​编辑

1.3、内存外设之间的传输(ADC)

二、STM32HAL库开发(9)——CubeMX配置RTC

2.1、RTC实时重要一环——BKP 寄存器

2.2、RTC实时时钟

三、STM32HAL库开发(10)——单片机工作模式

3.1、低功耗睡眠模式(Sleep)

3.2、低功耗停止模式(Stop)

3.3、低功耗待机模式(StandBy)

四、STM32HAL库开发(11)——看门狗

4.1、独立看门狗

4.2、窗口看门狗


前言:前面已经更新了7个常用外设了,所以这个文章就从8开始了!

一、STM32HAL库开发(8)——CubeMX配置DMA

1.1、什么是DMA?

DMA(Direct Memory Access),即直接存储器访问。 DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路, 能使 CPU 的效率大为提高。

STM32F103C8T6内部有 2 个 DMA 控制器(DMA2 仅存大容量产品中), DMA1 有 7 个通道。DMA2 有 5 个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。

众所周知,DMA中有另种模式,①内存内存之间,②内存外设之间

内存很多外设之间都有,比如:

还有更多的可以去看芯片手册!

② 通道:DMA 具有 12 个独立可编程的通道,其中 DMA1 有 7 个通道, DMA2 有 5 个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。

所以为什么同一时间只能接收一个通道呢?假如一次性有两个通道要转换,谁先谁后呢?为什么这么有规则呢?是因为有着一个大哥管理着:仲裁器

③ 仲裁器:当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器管理谁优先执行。

1.2、内存内存之间的传输(单次)

实验现象:

声明两个数组uint8_t DataA[]={1,2,3,4};uint8_t DataB[]={0,0,0,0};,刚开始显示1234和0000,经过DMA转运后,显示1234和1234!(将DataA的值传输给了DataB)

CubeMX配置:

1. 选择 DMA1 的通道 1
2. 地址选择自增
3. 传输数据宽度为 Byte

byte:字节,通用8位,与u8相同

word:字长,与硬件的位数相同,STM32是32位,所以对应是u32

Half Word:半个字长,所以对应是u16

代码实现:

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_I2C2_Init();/* USER CODE BEGIN 2 */OLED_Init();//OLED初始化OLED_CLS();//显示转运前数据DataA、DataBuint8_t DataA[]={1,2,3,4};uint8_t DataB[]={0,0,0,0};OLED_ShowStr(0,0,"DataA:",2);			//显示字符串OLED_ShowStr(0,10,"DataB:",2);			//显示字符串OLED_ShowNum(50, 0, DataA[0], 1, 16);OLED_ShowNum(60, 0, DataA[1], 1, 16);OLED_ShowNum(70, 0, DataA[2], 1, 16);OLED_ShowNum(80, 0, DataA[3], 1, 16);OLED_ShowNum(50, 10, DataB[0], 1, 16);OLED_ShowNum(60, 10, DataB[1], 1, 16);OLED_ShowNum(70, 10, DataB[2], 1, 16);OLED_ShowNum(80, 10, DataB[3], 1, 16);// 启动DMA传输HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)&DataA,(uint32_t)&DataB, 4);// 等待传输完成HAL_DMA_PollForTransfer(&hdma_memtomem_dma1_channel1,HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);HAL_Delay(1000);//延时显示,方便观看数字变化OLED_ShowStr(0,0,"DataA:",2);			//显示字符串OLED_ShowStr(0,10,"DataB:",2);			//显示字符串OLED_ShowNum(50, 0, DataA[0], 1, 16);OLED_ShowNum(60, 0, DataA[1], 1, 16);OLED_ShowNum(70, 0, DataA[2], 1, 16);OLED_ShowNum(80, 0, DataA[3], 1, 16);OLED_ShowNum(50, 10, DataB[0], 1, 16);OLED_ShowNum(60, 10, DataB[1], 1, 16);OLED_ShowNum(70, 10, DataB[2], 1, 16);OLED_ShowNum(80, 10, DataB[3], 1, 16);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

现象:

1.3、内存外设之间的传输(ADC)

前面讲解ADC的时候已经演示过了:STM32HAL库入门教程——常用外设学习(1)

二、STM32HAL库开发(9)——CubeMX配置RTC

2.1、RTC实时重要一环——BKP 寄存器

BKP寄存器简介
BKP(Backup Registers)备份寄存器
BKP可用于存储用户应用程序数据。当VDD(2.03.6V)电源被切断,他们仍然由
VBAT(1.83.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时他们也不会被复位
TAMPER引脚产生的侵入事件将所有备份寄存器内容清除
RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
存储RTC时钟校准寄存器
用户数据存储容量:
20字节(中容量和小容量)/ 84字节(大容量和互联型)

小实验将要实现的现象:单片机掉电后,不会遗忘BKP寄存器中的数值!

硬件连接:(需要额外供电给VB引脚)

第一次先写:

HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,100);
uint32_t Ret= HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1);//断电后靠VBAT供电

OLED_ShowNum(0, 0, Ret, 4, 12);

运行后,第二次注释掉HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,100);并且把单片机供电拔了,继续运行,按道理说,这个Ret数值就会随着单片机断电变成0,但是当VDD电源被切断,他仍然由VBAT维持供电!所以数值会维持不变!

CubeMX配置简单使用BKP寄存器:

BKP 寄存器通常与 RTC 一起使用,在CubeIDE中假如需要使用BKP寄存器,需要先打开RTC

代码实现:

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C2_Init();MX_RTC_Init();/* USER CODE BEGIN 2 */OLED_Init();//OLED初始化OLED_CLS();//	HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,100);//写BKPuint32_t Ret= HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1);//断电后靠VBAT供电。读BKPOLED_ShowNum(0, 0, Ret, 4, 12);//显示数值/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

2.2、RTC实时时钟

CubeMX配置:

1、打开RTC并设置时间

2 、打开外部低速时钟
配置 RTC 时钟源为 LSE 外部低速时钟
代码实现:
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_RTC_Init();MX_I2C2_Init();/* USER CODE BEGIN 2 */RTC_TimeTypeDef RTC_Time ;//时分秒RTC_DateTypeDef RTC_Date; //年月日OLED_Init();OLED_CLS();OLED_ShowStr(0, 0, "Data:20  -   -", 2);OLED_ShowStr(0, 2, "Time:", 2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_RTC_GetDate(&hrtc, &RTC_Date, RTC_FORMAT_BIN);HAL_RTC_GetTime(&hrtc,&RTC_Time, RTC_FORMAT_BIN);OLED_ShowNum(57, 0, RTC_Date.Year, 2, 16);OLED_ShowNum(78, 0, RTC_Date.Month, 2, 16);OLED_ShowNum(100, 0, RTC_Date.Date, 2, 16);OLED_ShowNum(57, 2, RTC_Time.Hours , 2, 16);OLED_ShowNum(78, 2, RTC_Time.Minutes, 2, 16);OLED_ShowNum(100, 2, RTC_Time.Seconds, 2, 16);}/* USER CODE END 3 */
}

效果:

三、STM32HAL库开发(10)——单片机工作模式

3.1、低功耗睡眠模式(Sleep)

使用
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);

打开睡眠模式。由Hal库与标准库在管理系统时钟和低功耗模式时的处理方式不同,Hal库中需要多手动关闭SysTick定时器,因为SysTick定时器会周期性触发中断,会唤醒睡眠模式。

HAL_SuspendTick();//关闭SysTick定时器
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();//恢复SysTick定时器

3.2、低功耗停止模式(Stop)

HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI);//进入Stop模式
SystemClock_Config();//恢复时钟

3.3、低功耗待机模式(StandBy)

配置 PA0 为唤醒引脚:
代码:
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);while(1)
{__HAL_RCC_PWR_CLK_ENABLE();HAL_PWR_EnterSTANDBYMode();
}

四、STM32HAL库开发(11)——看门狗

4.1、独立看门狗

打开独立看门狗并设置预分频器和重装值:
HAL_IWDG_Refresh(&hiwdg);//初始化完成后执行一次喂狗
//获取当前的复位是IWDG造成的复位还是按Rst键造成的复位
if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) 
{// IWDG reset flag is setOLED_ShowString(2, 1, "IWDGRST"); //OLED闪烁IWDGRST字符串HAL_Delay(500);OLED_ShowString(2, 1, " ");HAL_Delay(100);__HAL_RCC_CLEAR_RESET_FLAGS();
}
else
{OLED_ShowString(3, 1, "RST"); //OLED闪烁RST字符串HAL_Delay(500);OLED_ShowString(3, 1, " ");HAL_Delay(100);
}while (1)
{HAL_IWDG_Refresh(&hiwdg);//喂狗HAL_Delay(1100);
}

4.2、窗口看门狗

代码:

//获取当前的复位是WWDG造成的复位还是按Rst键复位,这里代码有大耗时,需要在
MX_WWDG_Init(); 之前
if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) 
{// IWDG reset flag is setOLED_ShowString(2, 1, "WWDGRST"); //OLED闪烁IWDGRST字符HAL_Delay(500);OLED_ShowString(2, 1, " ");HAL_Delay(100);__HAL_RCC_CLEAR_RESET_FLAGS();
}
else
{OLED_ShowString(3, 1, "RST"); //OLED闪烁RST字符HAL_Delay(500);OLED_ShowString(3, 1, " ");HAL_Delay(100);
}MX_WWDG_Init();
while (1)
{HAL_Delay(40);HAL_WWDG_Refresh(&hwwdg);//喂狗HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);//开
}

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

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

相关文章

Spring Boot 整合 SSE(Server-Sent Events)

1、简述 SSE(Server-Sent Events)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实时更新。与WebSocket不同,SSE更简单,使用HTTP/1.1协议即可,不需要额外的协议升级。 SSE的特点&#xff…

汽车ECU实现数据安全存储的一种方案

一、 综述 在车辆ECU中总是有一些密钥或重要数据需进行机密性保护,但因产品选型、成本等考虑,导致一些ECU的芯片不支持硬件安全模块(例如HSM、TEE等)。此时,为保障数据的机密性,可考虑通过软件实现数据的安…

十进制数到十六进制数的转换

十进制数x,若能表示为,n为大于等于0的整数。ni4j。i取值为0、1、2和3。综合i和j,若i为0,则该16进制数为1后面加j个0;若i为1,则该16进制数为2后面加j个0;若i为2,则该16进制数为4后面加…

基于YoloV11+PaddleOCR的车牌检测系统

文章目录 一、CCPD数据集进行处理1.1 从文件夹构建txt格式数据集1.2 运行脚本按照8:2划分训练集,测试集 二 、YOLOV11训练模型2.1 编写car_plate.yaml文件2.2 编写train脚本:2.3 训练过程 三、PaddleOCR识别车牌号3.1 安装paddleocr&#xff…

2月12日鸿蒙生态日日新PLOG,多款应用上架

2月12日鸿蒙生态日日新PLOG :北京医院挂号通、有度、远光商旅等多款应用上架;钉钉、得到、航班管家等多款重点应用功能更新。 ​​​

Python----PyQt开发(PyQt高级:手搓一个简单的记事本)

一、效果展示 二、设计PyQt界面 2.1、设置图标 self.setWindowIcon(QIcon(./images/icon/1.png)) # 窗口图标 2.2、设置标题 self.file_name 无标题-新建文本文档 # 默认文件名 self.setWindowTitle(self.file_name) # 窗口标题 2.3、添加菜单栏、工具栏、状态栏 # 创…

Java 大视界 -- 大数据伦理与法律:Java 技术在合规中的作用与挑战(87)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

什么是AI Agent、Chat、RAG、MoE

什么是AI Agent、Chat、RAG、MoE 目录 什么是AI Agent、Chat、RAG、MoE定义与原理功能特点应用场景AI Agent有哪些关键组成部分感知模块决策模块知识模块行动模块学习模块AI Agent、Chat、RAG、MoE是人工智能领域中不同的概念和技术,它们在功能、原理和应用等方面存在一些区别…

在 debian 12 上安装 mysqlclient 报错

报错如下 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting mysqlclientUsing cached https://pypi.tuna.tsinghua.edu.cn/packages/61/68/810093cb579daae426794bbd9d88aa830fae296e85172d18cb0f0e5dd4bc/mysqlclient-2.2.7.tar.gz (91 kB)Installi…

自反馈与流量震荡:从 TCP/IP 路由到交通导航

为什么不能基于流量或时延做路由度量,而不仅仅基于跳数。原因在于这里存在一个自反馈: 路由决策导致流量变化;时延由流量变化而变化;流量时延影响路由决策。 当某条链路流量减少时,路由协议会将其度量调低&#xff0…

Jtti:centos主机如何搭建lnmp环境

在 CentOS 主机上搭建 LNMP(Linux Nginx MySQL/MariaDB PHP)环境是构建高性能 Web 服务器的常见选择。以下是搭建 LNMP 环境的详细步骤: 步骤 1: 更新系统 首先,更新系统的包列表和安装的包,以确保你的系统是最新的: sudo y…

如果需要保护多个域名怎么办?

随着企业和个人在网上的存在越来越重要,管理和保护多个域名变得尤为关键,那么如果需要保护这些域名,应该采取什么样的措施呢? 许多企业会选择注册与其品牌相关的不同后缀,或者与其产品、服务相关的域名。这不仅可以防…

从Sora到有言:3D视频生成技术的突破与应用

近年来,AIGC领域飞速发展,这个词也越来越高频地出现在了大家的生活中。AIGC 能完成的任务也越来越多,大模型的能力飞速增长 —— 从Deepseek生成文字,到StableDiffusion生成图像,再到Sora可以生成视频。 而现在&#x…

Apollo 9.0 控制算法 -- lon based pid controller

文章目录 1. 纵向控制算法1.1 算法结构1.1.1 外环:位置环1.1.2 内环:速度环 1.2 参数整定 2. 代码解析2.1 控制器初始化 LonController::Init()2.1.1 PID控制参数和标定表参数加载2.1.2 PID控制器初始化2.1.3 超前/滞后控制器初始化2.1.4 俯仰角滤波器初…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter12-BOM

十二、BOM 虽然 ECMAScript 把浏览器对象模型(BOM,Browser Object Model)描述为 JavaScript 的核心,但实际上 BOM 是使用 JavaScript 开发 Web 应用程序的核心。BOM 提供了与网页无关的浏览器功能对象。 HTML5 规范中有一部分涵盖…

Qt信号槽调用出错:Qt: Dead lock detected while activating a BlockingQueuedConnection

目录 1.现象和原因分析 2. 总结 1.现象和原因分析 就在最近的开发过程中,程序一运行在控制台就打印: Qt: Dead lock detected while activating a BlockingQueuedConnection: 咋一看,怎么出现死锁了呢?仔细看下…

Jenkins项目CICD流程

Jenkins项目流程:1.配置git环境 git config --...2.把前后端的目录初始化位本地工作目录 #git init3.提交到本地git #git add ./ git commit -m "" git tag v14.然后提交到远程git(通过,用户,群组,项目,管理项目)git remote add origin http://...git push -…

Springboot_实战

项目开发 lombok使用 自动为实体类提供get、set、toString方法 引入依赖 实体类上添加注解 统一响应结果 注意要写get、set方法;下面是错误的,因此要加上Data注解 一个注册的接口的示例 Controller层 Service层 Mapper层 参数校验 但是同样存在一…

C++自研游戏引擎-碰撞检测组件-八叉树AABB检测算法实现

八叉树碰撞检测是一种在三维空间中高效处理物体碰撞检测的算法,其原理可以类比为一个管理三维空间物体的智能系统。这个示例包含两个部分:八叉树部分用于宏观检测,AABB用于微观检测。AABB可以更换为均值或节点检测来提高检测精度。 八叉树的…

Spring框架中都用到了哪些设计模式?

大家好,我是锋哥。今天分享关于【Spring框架中都用到了哪些设计模式?】面试题。希望对大家有帮助; Spring框架中都用到了哪些设计模式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring框架中使用了大量的设计模…