RTC、ADC

news/2024/12/21 22:40:47/

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);  // 函数声明,初始化USART1int __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();  // 初始化GPIOMX_RTC_Init();  // 初始化RTCMX_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();  // 初始化GPIOMX_ADC1_Init();  // 初始化ADC1MX_USART1_UART_Init();  // 初始化UART1HAL_ADC_Start(&hadc1);  // 启动ADC1while (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;  // 选择外部高速振荡器HSERCC_OscInitStruct.HSEState = RCC_HSE_ON;  // 启动HSE振荡器RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;  // HSE预分频值设置为1RCC_OscInitStruct.HSIState = RCC_HSI_ON;  // 启动内部高速振荡器HSIRCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;  // 启动PLLRCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;  // PLL时钟源选择HSERCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;  // PLL倍频因子设置为8if (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;  // 系统时钟源选择PLLRCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;  // AHB时钟分频设置为1RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;  // APB1时钟分频设置为2RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  // APB2时钟分频设置为1if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)  // 配置时钟{Error_Handler();  // 如果配置失败,进入错误处理}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;  // 外设时钟选择为ADCPeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV8;  // ADC时钟分频设置为8if (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;  // 设置转换通道数为1if (HAL_ADC_Init(&hadc1) != HAL_OK)  // 初始化ADC1{Error_Handler();  // 如果初始化失败,进入错误处理}sConfig.Channel = ADC_CHANNEL_8;  // 选择ADC通道8sConfig.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;  // 配置波特率为115200huart1.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.ppmy.cn/news/1527453.html

相关文章

在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作

在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作。以下是几种方法: ### 方法 1: 使用 VS Code 图形界面 1. **连接到远程 VM**: - 在 VS Cod…

Android Glide:让图片加载从未如此简单

在 Android 开发中,图片加载一直是一个关键环节。无论是从网络还是本地加载图片,都需要考虑到性能、内存管理和用户体验等多个方面。而在这方面,Glide 成为了众多开发者的首选库之一。本文将带你深入了解 Glide 的强大之处,并介绍如何在项目中快速集成和使用 Glide。 为什…

Quartz框架介绍

一、何为Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组…

collocate join,bucket join,broadcast join,shuffle join对比分析

在分布式计算和大数据处理中,尤其是在使用像 Apache Spark、Hive 等大数据处理框架时,Join 操作是非常常见的。根据数据分布方式和执行机制,Join 操作可以分为不同的类型,如 Collocate Join、Bucket Join、Broadcast Join 和 Shuffle Join。以下是它们的详细对比分析: 1.…

【鸿蒙 HarmonyOS NEXT】popup弹窗

一、背景 给组件绑定popup弹窗,并设置弹窗内容,交互逻辑和显示状态。 常见场景:点击按钮弹出popup弹窗,并对弹窗的内容进行交互逻辑处理,如:弹窗内点击跳转到其他页面 二、给组件绑定Popup弹窗 PopupOp…

果蔬识别系统性能优化之路(五)

目录 前情提要剩下问题 解决方案新建storeFeature表实现ivf的动态增删改查 结语 前情提要 果蔬识别系统性能优化之路(四) 剩下问题 新建store_feature表,关联storeCode和featureId表,对数据库进行规范化,创建一个新…

Docker torchserve 部署模型流程

1.拉取官方镜像 地址: https://hub.docker.com/r/pytorch/torchserve/tags docker pull pytorch/torchserve:0.7.1-gpu2. docker启动指令 CPU docker run --rm -it -d -p 8380:8080 -p 8381:8081 --name torch-server -v /path/model-server/extra-files:/home/model-serve…

计算机四级操作系统考试大纲.md

基本要求 1.掌握操作系统的基本概念、基本结构及运行机制。 操作系统(Operating System,简称OS)是计算机系统中负责管理和控制计算机硬件与软件资源的核心软件,它提供了用户与计算机硬件之间的接口&#…