STM32拓展 低功耗案例1:睡眠模式 (register)

需求描述

让MCU进入睡眠模式,然后通过串口发送消息来唤醒MCU退出睡眠模式。观察LED在进入休眠模式后是否仍然开启。

思考

首先睡眠模式,唤醒的条件是中断,外部内部都可以,这里的串口接收中断时内部中断。

拓展:中断分为三大类:内核中断也叫异常,片上外设中断对于stem32来说也是内部所以叫内部中断,片外外设的中断stem32外部的中断,叫外部中断

图解:

软件设计:

设计到的寄存器:

ARM内核:

代码:

    /* 1. 设置普通睡眠模式 */SCB->SCR &= ~SCB_SCR_SLEEPDEEP;

usart.h

#ifndef __USART_H
#define __USART_H#include "stm32f10x.h"
#include <stdio.h>// 初始化
void USART_Init(void);// 发送一个字符
void USART_SendChar(uint8_t ch);// 接收一个字符
uint8_t USART_ReceiveChar(void);// 发送字符串
void USART_SendString(uint8_t * str, uint8_t size);// 接收字符串
void USART_ReceiveString(uint8_t buffer[], uint8_t *size);#endif

usart.c

之前的代码新增3.4和4以及中断服务程序。

#include "usart.h"// 初始化
void USART_Init(void)
{// 1. 开启时钟RCC->APB2ENR |= RCC_APB2ENR_USART1EN;RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;// 2. GPIO 工作模式// 2.1 PA9 - TX,复用推挽输出,CNF = 10,MODE = 11GPIOA->CRH |= GPIO_CRH_MODE9;GPIOA->CRH |= GPIO_CRH_CNF9_1;GPIOA->CRH &= ~GPIO_CRH_CNF9_0;// 2.2 PA10 - RX,浮空输入,CNF = 01,MODE = 00GPIOA->CRH &= ~GPIO_CRH_MODE10;GPIOA->CRH &= ~GPIO_CRH_CNF10_1;GPIOA->CRH |= GPIO_CRH_CNF10_0;// 3. 串口模块配置// 3.1 设置波特率 115200USART1->BRR = 0x271;// 3.2 使能串口和收发模块USART1->CR1 |= USART_CR1_UE;USART1->CR1 |= (USART_CR1_TE | USART_CR1_RE);// 3.3 配置数据帧的格式USART1->CR1 &= ~USART_CR1_M;    // 长度为 8 位USART1->CR1 &= ~USART_CR1_PCE;  // 不使用校验位USART1->CR2 &= ~USART_CR2_STOP; // 1 位停止位// 3.4 开启串口接收中断USART1->CR1 |= USART_CR1_RXNEIE;// 4. NVIC配置NVIC_SetPriorityGrouping(3);NVIC_SetPriority(USART1_IRQn, 3);NVIC_EnableIRQ(USART1_IRQn);
}// 发送一个字符
void USART_SendChar(uint8_t ch)
{// 判断 TDR 是否为空,必须等待 TDR 为空才能继续发送while ((USART1->SR & USART_SR_TXE) == 0){}// 将要发送的数据写入TDRUSART1->DR = ch;
}// 接收一个字符
uint8_t USART_ReceiveChar(void)
{// 判断 RDR 是否非空,必须等待 RDR 有数据才能读取出来while ((USART1->SR & USART_SR_RXNE) == 0){}// 读取接收到的数据,返回return USART1->DR;
}// 发送字符串
void USART_SendString(uint8_t *str, uint8_t size)
{for (uint8_t i = 0; i < size; i++){USART_SendChar(str[i]);}
}// 接收字符串
void USART_ReceiveString(uint8_t buffer[], uint8_t *size)
{// 定义变量,保存当前接收到的字符个数uint8_t i = 0;// 不停地接收字符,直到检测到空闲帧// 错误写法:// while ( (USART1->SR & USART_SR_IDLE) == 0 )// {// 	buffer[i] = USART_ReceiveChar();// 	i++;// }// 正确写法:// 外层循环:不停读取下一个字符while (1){// 内层循环:判断当前数据帧是否结束while ((USART1->SR & USART_SR_RXNE) == 0){// 一旦已经检测到空闲帧,就立刻退出if (USART1->SR & USART_SR_IDLE){*size = i;USART1->DR;return;}}buffer[i] = USART1->DR;i++;}
}// 重写fputc函数
int fputc(int ch, FILE * file)
{USART_SendChar(ch);return ch;
}// 中断服务程序
void USART1_IRQHandler(void)
{if (USART1->SR & USART_SR_RXNE){// 读取接收到的数据,清除标志位uint8_t c = USART1->DR & 0xff;USART_SendChar(c);}
}

main.c

前面有__的命令,证明时底层的命令,汇编指令。

#include "usart.h"
#include "delay.h"
#include "led.h"void enter_sleep_mode(void);int main(void)
{// 初始化USART_Init();LED_Init();printf("低功率实验:睡眠模式...\n");// 1. 开启LED灯,延时2s,模拟正常程序执行过程LED_On(LED_1);Delay_s(2);while (1){// 2. 进入睡眠模式printf("正常代码执行完毕,3s后进入睡眠模式...\n");Delay_s(3);printf("进入睡眠模式");enter_sleep_mode();// 3. 以下代码只有在唤醒之后才会执行printf("从睡眠模式中唤醒...\n");Delay_s(2);}
}// 定义进入睡眠模式的函数
void enter_sleep_mode(void)
{// 1. 设置普通睡眠模式(默认)SCB->SCR &= ~SCB_SCR_SLEEPDEEP;// 2. 使用WFI指令,进入睡眠模式__WFI();
}

led.h

#ifndef __LED_H
#define __LED_H#include "stm32f10x.h"// 宏定义LED灯
#define LED_1 GPIO_ODR_ODR0
#define LED_2 GPIO_ODR_ODR1
#define LED_3 GPIO_ODR_ODR8// 初始化
void LED_Init(void);// 开关LED灯
void LED_On(uint16_t led);
void LED_Off(uint16_t led);// 翻转LED灯状态
void LED_Toggle(uint16_t led);// 控制所有LED灯的开关
void LED_OnAll(uint16_t leds[], uint8_t size);
void LED_OffAll(uint16_t leds[], uint8_t size);#endif

led.c

#include "led.h"// 初始化
void LED_Init(void)
{// 1. 时钟配置,打开GPIOA时钟RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;// 2. 工作模式配置,PA0、PA1、PA8 通用推挽输出,CNF = 00,MODE = 11GPIOA->CRL |= GPIO_CRL_MODE0;GPIOA->CRL &= ~GPIO_CRL_CNF0;GPIOA->CRL |= GPIO_CRL_MODE1;GPIOA->CRL &= ~GPIO_CRL_CNF1;GPIOA->CRH |= GPIO_CRH_MODE8;GPIOA->CRH &= ~GPIO_CRH_CNF8;// 3. 初始状态所有引脚输出高电平,关灯LED_Off(LED_1);LED_Off(LED_2);LED_Off(LED_3);
}// 开关LED灯
void LED_On(uint16_t led)
{GPIOA->ODR &= ~led;
}
void LED_Off(uint16_t led)
{GPIOA->ODR |= led;
}// 翻转LED灯状态
void LED_Toggle(uint16_t led)
{// 根据IDR对应位的值,判断当前LED状态if ((GPIOA->IDR & led) == 0){LED_Off(led);}else{LED_On(led);}
}// 控制所有LED灯的开关
void LED_OnAll(uint16_t leds[], uint8_t size)
{for (uint8_t i = 0; i < size; i++){LED_On(leds[i]);}
}
void LED_OffAll(uint16_t leds[], uint8_t size)
{for (uint8_t i = 0; i < size; i++){LED_Off(leds[i]);}
}

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

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

相关文章

CSS 学习之 padding 与图形绘制

padding 属性和 background-clip 属性配合&#xff0c;可以在有限的标签下实现一些 CSS 图形绘制效果&#xff0c;我这里举两个小例子&#xff0c;重在展示可行性。 例 1:不使用伪元素&#xff0c;仅一层标签实现大队长的“三道杠”分类图标效果。此效果在移动端比较常见&…

机器学习 学习知识点

机器学习 学习知识点 什么是消融实验&#xff08;Ablation experiment&#xff09;&#xff1f;num_step与batch_size的区别python glob.glob()函数认识python的条件判断之is not、is not None、is Nonetqdm介绍及常用方法softmax 激活函数。type_as(tesnor)Python OpenCV cv2.…

【网络安全 | 漏洞挖掘】硬编码凭据泄露实现支付系统账户接管

未经许可,不得转载。 文章目录 前言在APK中寻找硬编码凭据+账户接管在APP流程中寻找硬编码凭据+账户接管总结前言 硬编码凭据是指直接嵌入应用程序源代码中的敏感信息,例如 API 密钥、密钥、用户名或密码。这些凭据通常为了开发便捷而添加,但往往在发布到生产代码或应用路径…

【数据库系列】Spring Boot 中整合 MyBatis-Plus详细步骤

在 Spring Boot 中整合 MyBatis-Plus 可以按照以下步骤进行&#xff1a; 一、整合步骤 1. 创建 Spring Boot 项目 首先&#xff0c;使用 Spring Initializr&#xff08;https://start.spring.io/&#xff09;创建一个新的 Spring Boot 项目。在创建过程中&#xff0c;选择以…

JVM实战—8.如何分析jstat统计来定位GC

大纲 1.使用jstat了解线上系统的JVM运行状况 2.使用jmap和jhat了解线上系统的对象分布 3.如何分析JVM运行状况并合理优化 4.使用jstat分析模拟的BI系统JVM运行情况 5.使用jstat分析模拟的计算系统JVM运行情况 6.问题汇总 1.使用jstat了解线上系统的JVM运行状况 (1)JVM的…

[人工智能] 结合最新技术:Transformer、CLIP与边缘计算在提高人脸识别准确率中的应用

随着人工智能的快速发展&#xff0c;特别是深度学习和自然语言处理领域的革命性技术&#xff0c;越来越多的前沿技术被应用于人脸识别中。Transformer架构、CLIP模型以及边缘计算的结合&#xff0c;正成为提升人脸识别准确率和应用效能的关键技术路径。特别是在多样化场景下&am…

DataV数据可视化

阿里云 DataV 是一个强大的数据可视化工具&#xff0c;可以帮助用户通过创建丰富的图表、仪表盘、地图和互动视图&#xff0c;将复杂的数据转化为易于理解和分析的可视化信息。DataV主要用于大数据和实时数据的展示&#xff0c;可以帮助企业和个人更直观地理解数据背后的含义&a…

【国产NI替代】基于STM32+FPGA的8振动+4温度(16bits)数据采集板卡解决方案,支持全国产

一、8振动4温度&#xff08;16bits&#xff09;数据采集板卡解决方案 采用STM32H743做为主控芯片&#xff0c;针对工业现场 环境设计的12通道数据采集装置&#xff0c;采集器模 拟信号调理电路采用模块化设计&#xff0c;前通道模 块可配置&#xff0c;可扩展&#xff0c;其…

SpringMVC(一)配置

目录 引入 第一章&#xff1a;Java web的发展历史 一、Model I和Model II 1.Model I开发模式 2.Model II开发模式 二. MVC模式 第二章&#xff1a;SpringMVC的入门案例 搭建SpringMVC的入门程序 1.创建新项目 2.等待加载导入坐标 3.处理xml文件和其他 导入tomcat 运…

数据结构(ing)

学习内容 指针 指针的定义&#xff1a; 指针是一种变量&#xff0c;它的值为另一个变量的地址&#xff0c;即内存地址。 指针在内存中也是要占据位置的。 指针类型&#xff1a; 指针的值用来存储内存地址&#xff0c;指针的类型表示该地址所指向的数据类型并告诉编译器如何解…

Java网络套接字

在Java的开发中&#xff0c;有一个很重要&#xff01;很重要&#xff01;很重要&#xff01;的东西&#xff0c;叫做网络套接字&#xff0c;它被广泛的用来二次开发服务&#xff0c;比如大数据中台的服务链路调用等。 它的实现原理是依靠三次握手来完成通信的建立&#xff0c;…

Mac 安装Mysql启动Mysql以及数据库的常规操作

Mac 安装Mysql启动Mysql以及数据库的常规操作 一、mysql的安装 1、登录官方网站:dev.mysql.com/downloads/mysql/ 二、查看系统架构 uname -m 在MAC中&#xff1a; 如果输出结果是 x86_64&#xff0c;则表示你的系统是 x86-64 架构。 如果输出结果是 arm64&#xff0c;则表示…

OpenCV的人脸检测模型FaceDetectorYN

OpenCV的人脸检测模型FaceDetectorYN 1. 官网地址2. 如何使用2.1.到opencv_zoo下载模型文件和代码2.2. 下载文件展示2.3. 修改了demo支持读取视频文件&#xff0c;默认是图片和摄像头## 2.4 效果展示 1. 官网地址 https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetector…

DeepSeek-VL2

《DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding》是 DeepSeek-AI 团队发布的关于视觉语言模型 DeepSeek-VL2 的论文&#xff0c;以下是对该论文的详细介绍&#xff1a; 研究背景与动机 多模态理解的重要性&#xff1a;在当…

电子应用设计方案82:智能 AI 椅子系统设计

智能 AI 椅子系统设计 一、引言 智能 AI 椅子旨在为用户提供更加舒适、个性化和智能化的坐乘体验&#xff0c;结合了先进的技术和人体工程学原理。 二、系统概述 1. 系统目标 - 自动适应用户的体型和坐姿&#xff0c;提供最佳的支撑和舒适度。 - 实时监测用户的健康数据&…

Ps:创建数据驱动的图像

在设计实践中&#xff0c;常常需要处理大量内容变化但设计格式统一的任务&#xff0c;例如批量生成名片、工作证、学生证、胸牌、奖状或证书甚至图册。这些工作如果逐一手动制作&#xff0c;不仅耗时费力&#xff0c;还容易出错。 为解决这一问题&#xff0c;Photoshop 提供了强…

彻底解决 Selenium ChromeDriver 不匹配问题:Selenium ChromeDriver 最新版本下载安装教程

在 Python 的 Selenium 自动化测试中&#xff0c;ChromeDriver 是不可或缺的工具。它作为代码与 Chrome 浏览器的桥梁&#xff0c;但如果版本不匹配&#xff0c;就会导致各种报错&#xff0c;尤其是以下常见问题&#xff1a; selenium.common.exceptions.SessionNotCreatedExc…

天猫推荐数据集实践

参考自 https://github.com/xufengtt/recom_teach_code&#xff0c;学习记录。 环境配置&#xff08;maxcomputedataworks&#xff09; 下载天猫推荐数据集&#xff1b;开启 aliyun 的 maxcompute&#xff0c;dataworks&#xff0c;pai&#xff1b;使用 odpscmd 上传本地数据…

人脑处理信息的速度与效率:超越计算机的直观判断能力

人脑处理信息的速度与效率&#xff1a;超越计算机的直观判断能力 关键词&#xff1a; #人脑信息处理 Human Brain Information Processing #并行处理 Parallel Processing #视觉信息分析 Visual Information Analysis #决策速度 Decision Speed #计算机与人脑比较 Computer v…

checked 溢出问题

{try{int i int.MaxValue;int j;checked{j i 1;}}catch (OverflowException er){Console.WriteLine($"加Checked——>{er.Message}");}}{try{int i int.MaxValue;int j;j i 1;}catch (OverflowException er){Console.WriteLine($"没有加Checked——&g…