RTC、ADC

news2025/1/17 6:12:24

RTC

  • RTC(Real-Time Clock)是实时时钟模块,用于跟踪实际时间(年、月、日、时、分、秒),即使在系统断电或处于低功耗模式下也能保持时间的准确性。
特点
  • 时间和日期跟踪
  • 低功耗模式支持
  • 可编程闹钟和定时器
  • 备份寄存器
使用方法
  1. 开启RCC的High SPeed Clock的Crystal/Ceramic模式
  2. 配置时钟电路。
  3. RTC所用时钟
    在这里插入图片描述
  4. 配置RTC
    - active clock source
    - active Calendar
  5. 使用USART1将其改为异步通信
  6. 具体代码
#include "main.h"  // 包含主头文件,定义了所需的外设和函数

RTC_HandleTypeDef hrtc;  // 声明RTC句柄,用于RTC外设的配置和操作
UART_HandleTypeDef huart1;  // 声明UART句柄,用于串口1的配置和操作

void SystemClock_Config(void);  // 函数声明,配置系统时钟
static void MX_GPIO_Init(void);  // 函数声明,初始化GPIO
static void MX_RTC_Init(void);  // 函数声明,初始化RTC
static void MX_USART1_UART_Init(void);  // 函数声明,初始化USART1

int __io_putchar(int ch)  // 重定向`printf`函数的输出,将其通过串口发送
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);  // 使用UART1发送字符
    return ch;  // 返回发送的字符
}

int main(void)  // 主函数,程序从此处开始执行
{
    HAL_Init();  // 初始化HAL库,设置时钟、外设以及NVIC中断优先级
    SystemClock_Config();  // 调用系统时钟配置函数
    MX_GPIO_Init();  // 初始化GPIO
    MX_RTC_Init();  // 初始化RTC
    MX_USART1_UART_Init();  // 初始化USART1,用于串口通信
        RTC_DateTypeDef date;  // 定义RTC日期结构体
    date.Year = 24;  // 设置年份为2024年
    date.Month = 9;  // 设置月份为9月
    date.Date = 13;  // 设置日期为13日
    date.WeekDay = RTC_WEEKDAY_FRIDAY;  // 设置星期为星期五
    HAL_RTC_SetDate(&hrtc, &date, RTC_FORMAT_BIN);  // 设置RTC的日期为二进制格式
    
    RTC_TimeTypeDef time;  // 定义RTC时间结构体
    time.Hours = 16;  // 设置小时为16点
    time.Minutes = 10;  // 设置分钟为10分
    time.Seconds = 50;  // 设置秒为50秒
    HAL_RTC_SetTime(&hrtc, &time, RTC_FORMAT_BIN);  // 设置RTC的时间为二进制格式
    while (1)  // 主循环,程序将一直执行
    {
        HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);  // 获取当前RTC日期
        HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);  // 获取当前RTC时间
        printf("TIME:20%02d-%02d-%02d %02d:%02d:%02d \r\n",
         date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);  // 格式化输出当前时间,发送到串口
       HAL_Delay(1000);  // 延时1000毫秒(1秒),用于控制时间输出的刷新间隔
    }
}

ADC (Analog-to-Digital Converter)

  • 模式转换器,负责将模拟信号转换成数字信号。
  • 允许微控制器读取来自传感器或其它模拟输入的电压变化,并将其转换为可以处理的数字值。
  • 使用方法
    1. 查找电路图选择要进行模数转换的接口,我的是ADC的通道8
    2. 设置ADC1的通道8的continuous为Enabled。
    3. 开启USART1串口为异步通信,用于调试。
    4. 设置RCC为Crystal
    5. 配置时钟,设置ADC1为8MHZ。
    6. 获取对应的值,并进行*3300/4095(其中3300是参考电压,4095是最大值ADC值)
    在这里插入图片描述
    7. 通过这种方式,你可以准确地将ADC读取的数字值转换为对应的电压值,从而实现对模拟信号的有效监测。
    8. 代码示例
#include "main.h"  // 包含主头文件

ADC_HandleTypeDef hadc1;  // 声明ADC句柄
UART_HandleTypeDef huart1;  // 声明UART句柄

void SystemClock_Config(void);  // 系统时钟配置函数声明
static void MX_GPIO_Init(void);  // GPIO初始化函数声明
static void MX_ADC1_Init(void);  // ADC1初始化函数声明
static void MX_USART1_UART_Init(void);  // UART1初始化函数声明

int __io_putchar(int ch)  // 重定向printf函数,将其通过串口发送
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);  // 使用UART1发送字符
    return ch;  // 返回发送的字符
}

int main(void)  // 主函数
{
  HAL_Init();  // 初始化HAL库
  SystemClock_Config();  // 配置系统时钟
  MX_GPIO_Init();  // 初始化GPIO
  MX_ADC1_Init();  // 初始化ADC1
  MX_USART1_UART_Init();  // 初始化UART1
  HAL_ADC_Start(&hadc1);  // 启动ADC1

  while (1)  // 无限循环
  {
	  uint32_t regVal = HAL_ADC_GetValue(&hadc1);  // 获取ADC转换后的值
	  uint32_t mv = regVal * 3300 / 4095;  // 将ADC值转换为电压值,单位为毫伏
	  printf("voltage = %d mv\r\n", mv);  // 通过UART输出电压值
	  HAL_Delay(500);  // 延时500毫秒
  }
}

void SystemClock_Config(void)  // 系统时钟配置
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};  // 配置结构体初始化
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};  // 配置结构体初始化
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};  // 外设时钟配置结构体初始化

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 选择外部高速振荡器HSE
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;  // 启动HSE振荡器
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;  // HSE预分频值设置为1
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;  // 启动内部高速振荡器HSI
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;  // 启动PLL
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;  // PLL时钟源选择HSE
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;  // PLL倍频因子设置为8
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)  // 配置振荡器
  {
    Error_Handler();  // 如果配置失败,进入错误处理
  }
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;  // 配置HCLK, SYSCLK, PCLK1和PCLK2时钟
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;  // 系统时钟源选择PLL
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;  // AHB时钟分频设置为1
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;  // APB1时钟分频设置为2
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  // APB2时钟分频设置为1

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)  // 配置时钟
  {
    Error_Handler();  // 如果配置失败,进入错误处理
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;  // 外设时钟选择为ADC
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV8;  // ADC时钟分频设置为8
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)  // 配置外设时钟
  {
    Error_Handler();  // 如果配置失败,进入错误处理
  }
}

static void MX_ADC1_Init(void)  // ADC1初始化
{
  ADC_ChannelConfTypeDef sConfig = {0};  // ADC通道配置结构体初始化

  hadc1.Instance = ADC1;  // 设置ADC实例
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;  // 禁用扫描模式
  hadc1.Init.ContinuousConvMode = ENABLE;  // 启用连续转换模式
  hadc1.Init.DiscontinuousConvMode = DISABLE;  // 禁用不连续转换模式
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;  // 软件触发ADC转换
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;  // 数据右对齐
  hadc1.Init.NbrOfConversion = 1;  // 设置转换通道数为1
  if (HAL_ADC_Init(&hadc1) != HAL_OK)  // 初始化ADC1
  {
    Error_Handler();  // 如果初始化失败,进入错误处理
  }

  sConfig.Channel = ADC_CHANNEL_8;  // 选择ADC通道8
  sConfig.Rank = ADC_REGULAR_RANK_1;  // 设置通道为第1转换顺序
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;  // 设置采样时间为1.5个周期
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)  // 配置ADC通道
  {
    Error_Handler();  // 如果配置失败,进入错误处理
  }
}

static void MX_USART1_UART_Init(void)  // UART1初始化
{
  huart1.Instance = USART1;  // 设置UART实例
  huart1.Init.BaudRate = 115200;  // 配置波特率为115200
  huart1.Init.WordLength = UART_WORDLENGTH_8B;  // 设置数据位长度为8位
  huart1.Init.StopBits = UART_STOPBITS_1;  // 设置停止位为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;  // 设置16倍过采样
  if (HAL_UART_Init(&huart1) != HAL_OK)  // 初始化UART1
  {
    Error_Handler();  // 如果初始化失败,进入错误处理
  }
}

static void MX_GPIO_Init(void)  // GPIO初始化
{
  __HAL_RCC_GPIOD_CLK_ENABLE();  // 启用GPIOD时钟
  __HAL_RCC_GPIOB_CLK_ENABLE();  // 启用GPIOB时钟
  __HAL_RCC_GPIOA_CLK_ENABLE();  // 启用GPIOA时钟
}

void Error_Handler(void)  // 错误处理函数
{
  __disable_irq();  // 禁用中断
  while (1)  // 进入死循环
  {
  }
}

#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)  // 断言失败处理函数
{
}
#endif

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

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

相关文章

贪心算法day31|56. 合并区间、738. 单调递增的数字(整数与字符串的转换)、贪心刷题总结

贪心算法day31|56. 合并区间、738. 单调递增的数字、贪心刷题总结 56. 合并区间738. 单调递增的数字贪心刷题总结 56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 …

大模型微调 - 自动加载预训练模型

大模型微调 - 自动加载预训练模型 flyfish AutoModelFor 是 Hugging Face transformers 库中的一个通用接口,这里用的是modelscope ,用于自动加载预训练模型,涵盖多种任务的模型。AutoModelFor 后面接不同的任务名称会对应不同的模型架构&a…

基于 CycleGAN 对抗网络的自定义数据集训练

目录 生成对抗网络(GAN) CycleGAN模型训练 训练数据生成 下载开源项目CycleGAN 配置训练环境 开始训练 模型测试 可视化结果 生成对抗网络(GAN) 首先介绍一下什么是GAN网络,它是由生成器(Generator…

工具、环境等其他小问题归纳

此篇文章内容会不定期更新,仅作为学习过程中的笔记记录 一、查询Windows 10环境下python版本与安装路径 若电脑成功安装了python环境,不小心忘了版本。 I、查询版本 1、cmd窗口快捷查询 Win R 输入cmd 进入窗口; 直接输入 python --version …

2024.9.13 系统运维

学习目标:了解 云计算运维 “云计算是中国的骄傲!” 企业向云服务商租用云服务(省钱、省心、省力) 云计算:公有云、私有云(大公司,数据隐私性)、混合云(私有云跑重要…

前端刷新进不了登录页面

报错props.ts:15 Uncaught (in promise) SyntaxError: Unexpected token 错误截图: 原因:谷歌浏览器版本过低,升级浏览器 比如这边版本就过低了

ThinkCMF框架任意内容包含漏洞的讲解

本文来自无问社区,更多网安资料可前往查看http://www.wwlib.cn 背景描述 ThinkCMF是一款基于PHPMYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。 ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可…

CSP 2023 提高级第一轮单项选择题解析

CSP 2023 提高级第一轮单项选择题解析 第1题第2题第3题第4题第5题第6题第7题第8题第9题第10题第11题第12题第13题第14题第15题 第1题 在 Linux 系统终端中,以下哪个命令用于创建一个新的目录?(B) A.newdir B.mkdir C.create D.mkfold 解析:记…

部署Tomcat和抓包

部署Tomcat 复制文件到桌面 查看自己是否有java环境,下图所示是有的,若没有需另行下载 解压tomcat文件 tar -xzvf apache-tomcat-7.0.96.tar.gz 下列为tomcat文件的几个重要文件 进入到bin文件中 启动tomcat ./startup.sh 可以先用本机查看是否启动…

【PostgreSQL里的restartpoint重启点】

不知道大家有没有关注过,配置文件里archive_cleanup_command参数的注释部分有着这么一句"command to execute at every restartpoint",意思是在每个restartpoint时执行的命令。 提起checkpoint大家可能比较熟悉,对于这个restartpoint&#xff…

英文软件汉化中文软件教程asi exe dll 等汉化教程

相信大家在使用国际软件的时候,会经常碰到英文类型的软件 或者玩一些游戏使用一些工具,也基本都是外网的,那么对于用户来讲 就会非常的不方便! 小编为大家整理了一些国内大佬出的的英文软件汉化中文软件的视频教程 教程分为EX…

HarmonyOS开发实战( Beta5.0)滑动视频自动播放案例实践

鸿蒙HarmonyOS开发往期文章必看: HarmonyOS NEXT应用开发性能实践总结 最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) 介绍 本示例主要介绍视频列表滑动到屏幕中间自动播放场景&…

[项目] -登录框

前言 各位师傅大家好,我是qmx_07,今天来给大家讲解登录框的小练习,就此SDK的相关学习就此结束 登录框 对话框绘制 通过添加DIaLog对话框,添加 static test文本、Edit Control输入框、Button按钮,制作登录框passwor…

快速入门编写一个Java程序

一、jdk配置 下载完jdk后需要配置环境变量 以下是其步骤 1、我的电脑-属性-高级系统设置-环境变量 2、在系统变量中新建JAVA_HOME环境变量,指向jdk的安装目录 3、编辑path环境变量,新建%JAVA_HOME%\bin 4、打开Dos命令行,任意目录下敲入j…

CGAL and the Boost Graph Library

CGAL and the Boost Graph Library 许多几何数据结构都可以解释为图,因为它们由顶点和边组成。对于halfedge数据结构、多面体曲面、arrangement以及二维三角剖分类来说,情况都是如此。利用对偶性,人们也可以将面解释为顶点,相邻面…

AcWing119 袭击

目录 AcWing119 袭击题目描述背景输入输出数据范围 题解解法优化 打赏 AcWing119 袭击 题目描述 背景 特工进入据点突袭发电站,已知所有发电站的位置和所有特工的降落位置,求任意特工距离任意核电站的最短距离 输入 第一行一个整数 T T T&#xff0…

基于SpringBoot实现SpringMvc上传下载功能实现

SpringMvc上传下载功能实现 1.创建新的项目 1)项目信息填写 Spring Initializr (单击选中)Name(填写项目名字)Language(选择开发语言)Type(选择工具Maven)Group()JDK(jdk选择17 &…

深度学习——D1(环境配置)

课程内容 W-H-W 资源 AI地图 物体检测和分割 样式迁移 人脸合成 文字生成图片 预测与训练 本地安装

【IPV6从入门到起飞】5-2 IPV6+Home Assistant(ESP32+MQTT+DHT11+BH1750)传感器采集上传监测

IPV6Home Assistant[ESP32MQTTDHT11BH1750]传感器采集上传监测 1 背景2 实现效果3 Home Assistant配置3-1 MQTT配置3-2 yaml 配置3-3 加载配置 4 ESP32搭建4-1 开发环境4-2 工程代码 5 实现效果 1 背景 在上一小节【IPV6从入门到起飞】5-1 IPV6Home Assistant(搭建基本环境)我…

luogu基础课题单 入门 上

【深基2.例5】苹果采购 题目描述 现在需要采购一些苹果,每名同学都可以分到固定数量的苹果,并且已经知道了同学的数量,请问需要采购多少个苹果? 输入格式 输入两个不超过 1 0 9 10^9 109 正整数,分别表示每人分到…