STM32

Unix时间戳

BKP

读写备份寄存器

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"uint8_t KeyNum;uint16_t ArrayWrite[] = {0x1234,0x2134};
uint16_t ArrayRead[2];int main(void)
{OLED_Init();Key_Init();OLED_ShowString(1,1,"W:");OLED_ShowString(2,1,"R:");RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);//使能备份访问控制//BKP_WriteBackupRegister(BKP_DR1,0x1234);//对DR1寄存器写入数据(4个字节数据)//OLED_ShowHexNum(1,1,BKP_ReadBackupRegister(BKP_DR1),4);//对DR1寄存器中进行读取操作while(1){KeyNum = Key_GetNum();if(KeyNum == 1){ArrayWrite[0]++;ArrayWrite[1]++;BKP_WriteBackupRegister(BKP_DR1,ArrayWrite[0]);BKP_WriteBackupRegister(BKP_DR2,ArrayWrite[1]);OLED_ShowHexNum(1,3,ArrayWrite[0],4);OLED_ShowHexNum(1,8,ArrayWrite[1],4);}ArrayRead[0] = BKP_ReadBackupRegister(BKP_DR1);ArrayRead[1] = BKP_ReadBackupRegister(BKP_DR2);OLED_ShowHexNum(2,3,ArrayRead[0],4);OLED_ShowHexNum(2,8,ArrayRead[1],4);}}
实时时钟

MyRTC.c

#include "stm32f10x.h"                  // Device header
#include "time.h"uint16_t MyRTC_Time[] = {2024,2,16,16,44,55};void MyRTC_SetTime(void);/*** @brief  初始化RTC* @param  无* @retval 无*/
void MyRTC_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);PWR_BackupAccessCmd(ENABLE);if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)//判断系统是否完全断电(没有标志位说明完全断电过,则进行重新初始化){RCC_LSEConfig(RCC_LSE_ON);//打开外部低速时钟while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);//等待LSE启动完成RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//选择RTCCLK时钟源RCC_RTCCLKCmd(ENABLE);//使能时钟RTC_WaitForSynchro();//等待时钟同步RTC_WaitForLastTask();//等待上次操作完成(进行写入操作后都进行一次等待)RTC_SetPrescaler(32768 - 1);//配置预分频器(对32768Hz分频)分频出来为1Hz即1s//对PRL,CNT,ALR寄存器写入前都需要配置CNF位,这里库函数已经进行封装过了RTC_WaitForLastTask();//等待上次操作完成(进行写入操作后都进行一次等待)//    RTC_SetCounter(1672588795);//从哪个数开始计时(起始数目)
//    RTC_WaitForLastTask();//等待上次操作完成(进行写入操作后都进行一次等待)MyRTC_SetTime();BKP_WriteBackupRegister(BKP_DR1,0xA5A5);//写入标志位}else{//则不会进行重新初始化RTC_WaitForSynchro();//等待时钟同步RTC_WaitForLastTask();//等待上次操作完成(进行写入操作后都进行一次等待)}}/*** @brief  设定RTC时间* @param  无* @retval 无*/
void MyRTC_SetTime(void)
{time_t time_cnt;struct tm time_date;time_date.tm_year = MyRTC_Time[0] - 1900;//从1900开始计数time_date.tm_mon = MyRTC_Time[1] - 1;//从0开始计数time_date.tm_mday = MyRTC_Time[2];time_date.tm_hour = MyRTC_Time[3];time_date.tm_min = MyRTC_Time[4];time_date.tm_sec = MyRTC_Time[5];time_cnt = mktime(&time_date);//将日期时间转换为秒数RTC_SetCounter(time_cnt);//从哪个数开始计时(起始数目)RTC_WaitForLastTask();//等待上次操作完成(进行写入操作后都进行一次等待)//将所得秒数转移到CNT作为起始数据
}/*** @brief  读取RTC时间* @param  无* @retval 无*/
void MyRTC_ReadTime(void)
{time_t time_cnt;struct tm time_date;time_cnt = RTC_GetCounter();time_date = *(localtime(&time_cnt));MyRTC_Time[0] = time_date.tm_year + 1900;//从1900开始计数MyRTC_Time[1] = time_date.tm_mon + 1;//从0开始计数MyRTC_Time[2] = time_date.tm_mday;MyRTC_Time[3] = time_date.tm_hour;MyRTC_Time[4] = time_date.tm_min;MyRTC_Time[5] = time_date.tm_sec;
}

PWR

如果要修改主频则在system_stm32f10x.c进行修改,将#define SYSCLK_FREQ_72MHz  72000000进行注释,将你所需要的频率解注释即可。

修改主频

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"uint8_t KeyNum;int main(void)
{OLED_Init();OLED_ShowString(1,1,"SYSCLK");OLED_ShowNum(1,8,SystemCoreClock,8);while(1){OLED_ShowString(2,1,"Running");Delay_ms(500);OLED_ShowString(2,1,"        ");Delay_ms(500);}}

将72M主频改为36M实验现象为Delay函数的延时翻倍

睡眠模式

使用之前写的串口发送+接收。

当加上 __WFI(); 这句指令后,程序进入睡眠模式,并通过中断唤醒

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"uint8_t RxData;int main(void)
{OLED_Init();OLED_ShowString(1,1,"RxData:");Serial_Init();while(1)    {//中断方式接收if(Serial_GetRxFlag() == 1){RxData = Serial_GetRxData();OLED_ShowHexNum(1,8,RxData,2);Serial_SendByte(RxData);//数据回传}OLED_ShowString(2,1,"Running");Delay_ms(100);OLED_ShowString(2,1,"       ");Delay_ms(100);__WFI();//使用中断唤醒(睡眠模式) }}

这时当没有数据收发时,字符不会显示,只有收发数据时,才会闪烁一次

停止(低功耗)模式

使用之前红外对射计次程序。因为其不需要内部晶振,故能使用低功耗模式

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"uint8_t KeyNum;int main(void)
{OLED_Init();CountSensor_Init();RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//先开启PWR时钟OLED_ShowString(1,1,"Count:");while(1){OLED_ShowNum(1,7,CountSensor_Get(),5);//如果外部一直没有中断信号,那么这个get就是没有意义的耗电操作OLED_ShowString(2,1,"Running");Delay_ms(100);OLED_ShowString(2,1,"       ");Delay_ms(100);PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);//进入停止模式SystemInit();//由于退出停止模式会进入HSI(8M)故会变慢,此时重新Init恢复72M主频}}
待机模式

这里使用的是实时时钟程序。待机模式下,LSE不会断电。

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"uint8_t KeyNum;int main(void)
{OLED_Init();MyRTC_Init();RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);OLED_ShowString(1,1,"CNT:");OLED_ShowString(2,1,"ALR:");OLED_ShowString(3,1,"ALRF:");PWR_WakeUpPinCmd(ENABLE);//wakeup功能,不需要进行引脚初始化//将PA^0接高电平即可唤醒uint32_t Alarm = RTC_GetCounter() + 10;//设定闹钟为当前计数十秒后,由于不能直接读出,使用中间变量完成RTC_SetAlarm(Alarm);OLED_ShowNum(2,6,Alarm,10);//显示闹钟响了的时间while(1){OLED_ShowNum(1,6,RTC_GetCounter(),10);OLED_ShowNum(3,6,RTC_GetFlagStatus(RTC_FLAG_ALR),1);//显示闹钟标志位OLED_ShowString(4,1,"Running");Delay_ms(100);OLED_ShowString(4,1,"       ");Delay_ms(100);OLED_ShowString(4,9,"STANDBY");Delay_ms(1000);OLED_ShowString(4,9,"       ");Delay_ms(1000);OLED_Clear();PWR_EnterSTANDBYMode();//进入待机模式}}

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

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

相关文章

【深度学习】Pytorch 系列教程(三):PyTorch数据结构:2、张量的数学运算(1):向量运算(加减乘除、数乘、内积、外积、范数、广播机制)

文章目录 一、前言二、实验环境三、PyTorch数据结构0、分类1、Tensor(张量)1. 维度(Dimensions)2. 数据类型(Data Types)3. GPU加速(GPU Acceleration) 2、张量的数学运算1. 向量运算…

Linux下解压tar.xz文件的命令

tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 ------------------------------------------ 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的…

互联网加竞赛 基于计算机视觉的身份证识别系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen…

​StableSwarmUI#超越文本的prompt

今天看到一个新的webui方案,是Stability-AI开源的: StableSwarmUI 是一个模块化的稳定扩散web用户界面,着重于使强大的工具易于访问、高性能和可扩展性。 由于项目还在开发中,我们可以先了解下,翻看了它的特点&#xf…

排序算法---计数排序

原创不易,转载请注明出处。欢迎点赞收藏~ 计数排序(Counting Sort)是一种线性时间复杂度的排序算法,其核心思想是通过统计待排序元素的个数来确定元素的相对位置,从而实现排序。 具体的计数排序算法步骤如下&#xff…

【c++】vector的增删查改

1.先定义一个类对象vector 为了防止和库里面发生冲突&#xff0c;定义一个命名空间&#xff0c;将类对象放在命名空间 里面 #include<iostream> using namespace std; namespace zjw {class vector {public:private:}; }2.定义变量&#xff0c;需要一个迭代器&#xff…

Sora:将文本转化为视频的创新之旅

一.能力 我们正致力于让 AI 掌握理解和模拟物理世界动态的能力&#xff0c;旨在培养能够协助人们解决现实世界互动问题的模型。 介绍 Sora——我们开发的文本到视频转换模型。Sora 能够根据用户的输入提示&#xff0c;生成最长达一分钟的高质量视频内容。 目前&#xff0c;Sora…

JDBC访问数据库

目录 加载Driver驱动配置驱动地址 获取数据库连接创建会话-SQL命令发送器通过Statement发送SQL命令并得到结果处理结果关闭数据库资源测试 加载Driver驱动 1.在模块JDBC中新建一个lib目录文件 2. 将mysql-connector-j-8.2.0包粘贴至lib目录中。 配置驱动地址 // 加载…

c++类和对象新手保姆级上手教学(上)

前言&#xff1a; c其实顾名思义就是c语言的升级版&#xff0c;很多刚学c的同学第一感觉就是比c语言难学很多&#xff0c;其实没错&#xff0c;c里的知识更加难以理解可以说杂且抽象&#xff0c;光是类和对象&#xff0c;看起来容易&#xff0c;但想完全吃透&#xff0c;真的挺…

2.13日学习打卡----初学RocketMQ(四)

2.13日学习打卡 目录&#xff1a; 2.13日学习打卡一.RocketMQ之Java ClassDefaultMQProducer类DefaultMQPushConsumer类Message类MessageExt类 二.RocketMQ 消费幂消费过程幂等消费速度慢的处理方式 三.RocketMQ 集群服务集群特点单master模式多master模式多master多Slave模式-…

js中函数缓存详解(如何实现和应用场景)

文章目录 一、是什么二、如何实现闭包柯里化高阶函数 三、应用场景参考文献 一、是什么 函数缓存&#xff0c;就是将函数运算过的结果进行缓存 本质上就是用空间&#xff08;缓存存储&#xff09;换时间&#xff08;计算过程&#xff09; 常用于缓存数据计算结果和缓存对象 …

【Java程序员面试专栏 Java领域】Java集合 核心面试指引

关于Java 集合部分的核心知识进行一网打尽,主要包括Java各类集合以及Java的HashMap底层原理,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 集合基本概念和比较 关于集合的基本分类和知识 Java集合有哪些种类 Java 集合, 也叫作容器…