RTC:实时时钟

RTC:实时时钟

  • 1、实时时钟
  • 2、闹钟中断
  • 3、秒中断
  • 4、输出功能
  • 5、BKP的读写
  • 6、BKP的侵入事件

1、实时时钟

①RTC.c

#include "RTC.h"

/**
 * @brief:RTC初始化函数
 */
RCC_PeriphCLKInitTypeDef RTCPeriphClkInit;  //RTC时钟配置结构体
RTC_HandleTypeDef hrtc;                     //RTC配置结构体
void RTC_Init(void)
{
    /* 配置RTC的时钟源 */
    RTCPeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; //需要配置的外设:RTC
    RTCPeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; //RTC时钟源:LSE(外部低速时钟)
    HAL_RCCEx_PeriphCLKConfig(&RTCPeriphClkInit);
    
    /* RTC的初始化配置 */
    __HAL_RCC_RTC_ENABLE();                     //使能RTC的时钟
    __HAL_RCC_PWR_CLK_ENABLE();                 //使能PWR的时钟
    __HAL_RCC_BKP_CLK_ENABLE();                 //使能BKP的时钟
    hrtc.Instance = RTC;                        //选择RTC
    hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND; //时钟源的分频值,1Hz
    hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;   //无输出
    HAL_RTC_Init(&hrtc);
}

/**
 * @brief:HAL_RTC_Init()调用函数
 */
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
    /* 其他的配置 */
}

/**
 * @brief:日期转换为时间戳秒函数
 */
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec)
{
    struct tm DayData;              //定义结构体变量DayData
    DayData.tm_year = Year - 1900;  //设置为2025年
    DayData.tm_mon = Mon;           //设置为1月
    DayData.tm_mday = Day;          //设置为2号
    DayData.tm_hour = Hour;         //设置为20时
    DayData.tm_min = Min;           //设置为04分
    DayData.tm_sec = Sec;           //设置为40秒
    
    time_t temp = mktime(&DayData);                     //将设置的日期转换为时间挫数据
    __HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);           //关闭RTC写保护
    WRITE_REG(hrtc.Instance->CNTH,(temp >> 16));        //将转换好的时间挫写入RTC计数寄存器高16位
    WRITE_REG(hrtc.Instance->CNTL,temp & 0x0000FFFF);   //将转换好的时间挫写入RTC计数寄存器低16位
    __HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);            //开启RTC写保护
}


/**
 * @brief:将RTC中的计数器寄存器值转换为日期
 */
struct tm* Time_Get(void)
{
    /* 读取数据寄存器的值 */
    time_t temp = (READ_REG(hrtc.Instance->CNTH) << 16) | READ_REG(hrtc.Instance->CNTL);

    /* 将计数器的值转换为日期 */
    return localtime(&temp);//将时间戳转换为本地的年月日时分秒
}

②RTC.h

#ifndef __RTC_H
#define __RTC_H

#include "stm32f1xx_hal.h"
#include <time.h>
extern RTC_HandleTypeDef hrtc;  //RTC配置结构体
void RTC_Init(void);
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec);
struct tm* Time_Get(void);

#endif

③main.c

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "RTC.h"
#include "UART.h"

struct tm* Day; 
int main(void){
    
	HAL_Init();
	HSE_RCC_Init(); 
	UART1_Init(115200);
    RTC_Init();
    printf("代码测试\r\n");
    Time_Set(2025,1,2,21,8,30);//2025-01-02 20:55:30

	while(1){
       Day = Time_Get();
        printf("%d-%d-%d %d:%d:%d\r\n"
        ,Day->tm_year + 1900,Day->tm_mon,Day->tm_mday,Day->tm_hour,Day->tm_min,Day->tm_sec);
        HAL_Delay(1000);
	}	
}

在这里插入图片描述

2、闹钟中断

①RTC.c

#include "RTC.h"

/**
 * @brief:RTC初始化函数
 */
RCC_PeriphCLKInitTypeDef RTCPeriphClkInit;  //RTC时钟配置结构体
RTC_HandleTypeDef hrtc;                     //RTC配置结构体
void RTC_Init(void)
{
    /* 配置RTC的时钟源 */
    RTCPeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; //需要配置的外设:RTC
    RTCPeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; //RTC时钟源:LSE(外部低速时钟)
    HAL_RCCEx_PeriphCLKConfig(&RTCPeriphClkInit);
    
    /* RTC的初始化配置 */
    __HAL_RCC_RTC_ENABLE();                     //使能RTC的时钟
    __HAL_RCC_PWR_CLK_ENABLE();                 //使能PWR的时钟
    __HAL_RCC_BKP_CLK_ENABLE();                 //使能BKP的时钟
    hrtc.Instance = RTC;                        //选择RTC
    hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND; //时钟源的分频值,1Hz
    hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;   //无输出
    HAL_RTC_Init(&hrtc);
    
    /* 开启闹钟中断 */
    __HAL_RTC_ALARM_CLEAR_FLAG(&hrtc, RTC_FLAG_ALRAF);  //清除闹钟标志
    __HAL_RTC_ALARM_ENABLE_IT(&hrtc, RTC_IT_ALRA);      //开启闹钟中断
    __HAL_RTC_ALARM_EXTI_ENABLE_IT();                   //开启闹钟外部中断线,EXTI17为闹钟事件
    __HAL_RTC_ALARM_EXTI_ENABLE_RISING_EDGE();          //上升沿触发
    HAL_NVIC_SetPriority(RTC_Alarm_IRQn,3,0);
    HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}

/**
 * @brief:HAL_RTC_Init()调用函数
 */
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
    /* 其他的配置 */
}

/**
 * @brief:日期转换为时间挫函数
 */
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec)
{
    struct tm DayData;              //定义结构体变量DayData
    DayData.tm_year = Year - 1900;  //设置为2025年
    DayData.tm_mon = Mon;           //设置为1月
    DayData.tm_mday = Day;          //设置为2号
    DayData.tm_hour = Hour;         //设置为20时
    DayData.tm_min = Min;           //设置为04分
    DayData.tm_sec = Sec;           //设置为40秒
    
    time_t temp = mktime(&DayData);                     //将设置的日期转换为时间挫数据
    __HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);           //关闭RTC写保护
    WRITE_REG(hrtc.Instance->CNTH,(temp >> 16));        //将转换好的时间挫写入RTC计数寄存器高16位
    WRITE_REG(hrtc.Instance->CNTL,temp & 0x0000FFFF);   //将转换好的时间挫写入RTC计数寄存器低16位
    __HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);            //开启RTC写保护
    HAL_Delay(20);                                      //等待写保护成功,必须要有
}

/**
 * @brief:闹钟时间转换为时间挫函数
 */
void AlarmTime_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec)
{
    struct tm DayData;              //定义结构体变量DayData
    DayData.tm_year = Year - 1900;  //设置为2025年
    DayData.tm_mon = Mon;           //设置为1月
    DayData.tm_mday = Day;          //设置为2号
    DayData.tm_hour = Hour;         //设置为20时
    DayData.tm_min = Min;           //设置为04分
    DayData.tm_sec = Sec;           //设置为40秒
    
    time_t temp = mktime(&DayData);                     //将设置的日期转换为时间挫数据
    __HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);           //关闭RTC写保护
    WRITE_REG(hrtc.Instance->ALRH,(temp >> 16));        //将转换好的时间挫写入RTC闹钟寄存器高16位
    WRITE_REG(hrtc.Instance->ALRL,temp & 0x0000FFFF);   //将转换好的时间挫写入RTC闹钟寄存器低16位
    __HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);            //开启RTC写保护
    HAL_Delay(20);                                      //等待写保护成功,必须要有
}

/**
 * @brief:将RTC中的计数器寄存器值转换为日期
 */
struct tm* Time_Get(void)
{
    /* 读取数据寄存器的值 */
    time_t temp = (READ_REG(hrtc.Instance->CNTH) << 16) | READ_REG(hrtc.Instance->CNTL);

    /* 将计数器的值转换为日期 */
    return localtime(&temp);//将时间戳转换为本地的年月日时分秒
}

②RTC.h

#ifndef __RTC_H
#define __RTC_H

#include "stm32f1xx_hal.h"
#include <time.h>
extern RTC_HandleTypeDef hrtc;  //RTC配置结构体
void RTC_Init(void);
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec);
void AlarmTime_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec);
struct tm* Time_Get(void);

#endif

③main.c

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "RTC.h"
#include "UART.h"

struct tm* Day; 
int main(void){
    
	HAL_Init();
	HSE_RCC_Init(); 
	UART1_Init(115200);
    RTC_Init();
    printf("代码测试\r\n");
    Time_Set(2025,1,2,21,8,30);         //2025-01-02 20:55:30
    AlarmTime_Set(2025,1,2,21,8,35);    //闹钟时钟为2025-01-02 20:55:35
	while(1){
       Day = Time_Get();
        printf("%d-%d-%d %d:%d:%d\r\n"
        ,Day->tm_year + 1900,Day->tm_mon,Day->tm_mday,Day->tm_hour,Day->tm_min,Day->tm_sec);
        HAL_Delay(1000);
	}	
}

④stm32f1xx_it.c

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h" 
#include "RTC.h" 
#include "UART.h"

/**
 * @brief:RTC闹钟中断服务函数
 */
void RTC_Alarm_IRQHandler(void)
{
    HAL_RTC_AlarmIRQHandler(&hrtc);
}
/******************* 下面的中断的回调函数 ***************************/
/**
 * @brief:RTC闹钟中断回调函数函数
 */
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
    printf("起床啦!\r\n");
}

在这里插入图片描述

3、秒中断

①RTC.c

#include "RTC.h"

/**
 * @brief:RTC初始化函数
 */
RCC_PeriphCLKInitTypeDef RTCPeriphClkInit;  //RTC时钟配置结构体
RTC_HandleTypeDef hrtc;                     //RTC配置结构体
void RTC_Init(void)
{
    /* 配置RTC的时钟源 */
    RTCPeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; //需要配置的外设:RTC
    RTCPeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; //RTC时钟源:LSE(外部低速时钟)
    HAL_RCCEx_PeriphCLKConfig(&RTCPeriphClkInit);
    
    /* RTC的初始化配置 */
    __HAL_RCC_RTC_ENABLE();                     //使能RTC的时钟
    __HAL_RCC_PWR_CLK_ENABLE();                 //使能PWR的时钟
    __HAL_RCC_BKP_CLK_ENABLE();                 //使能BKP的时钟
    hrtc.Instance = RTC;                        //选择RTC
    hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND; //时钟源的分频值,1Hz
    hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;   //无输出
    HAL_RTC_Init(&hrtc);
    
    /* 开启秒中断 */
    HAL_RTCEx_SetSecond_IT(&hrtc);              //开启秒中断
    HAL_NVIC_SetPriority(RTC_IRQn,3,0);
    HAL_NVIC_EnableIRQ(RTC_IRQn);
}

/**
 * @brief:HAL_RTC_Init()调用函数
 */
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
    /* 其他的配置 */
}

/**
 * @brief:日期转换为时间挫函数
 */
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec)
{
    struct tm DayData;              //定义结构体变量DayData
    DayData.tm_year = Year - 1900;  //设置为2025年
    DayData.tm_mon = Mon;           //设置为1月
    DayData.tm_mday = Day;          //设置为2号
    DayData.tm_hour = Hour;         //设置为20时
    DayData.tm_min = Min;           //设置为04分
    DayData.tm_sec = Sec;           //设置为40秒
    
    time_t temp = mktime(&DayData);                     //将设置的日期转换为时间挫数据
    __HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);           //关闭RTC写保护
    WRITE_REG(hrtc.Instance->CNTH,(temp >> 16));        //将转换好的时间挫写入RTC计数寄存器高16位
    WRITE_REG(hrtc.Instance->CNTL,temp & 0x0000FFFF);   //将转换好的时间挫写入RTC计数寄存器低16位
    __HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);            //开启RTC写保护
    HAL_Delay(20);                                      //等待写保护成功,必须要有
}

/**
 * @brief:闹钟时间转换为时间挫函数
 */
void AlarmTime_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec)
{
    struct tm DayData;              //定义结构体变量DayData
    DayData.tm_year = Year - 1900;  //设置为2025年
    DayData.tm_mon = Mon;           //设置为1月
    DayData.tm_mday = Day;          //设置为2号
    DayData.tm_hour = Hour;         //设置为20时
    DayData.tm_min = Min;           //设置为04分
    DayData.tm_sec = Sec;           //设置为40秒
    
    time_t temp = mktime(&DayData);                     //将设置的日期转换为时间挫数据
    __HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);           //关闭RTC写保护
    WRITE_REG(hrtc.Instance->ALRH,(temp >> 16));        //将转换好的时间挫写入RTC闹钟寄存器高16位
    WRITE_REG(hrtc.Instance->ALRL,temp & 0x0000FFFF);   //将转换好的时间挫写入RTC闹钟寄存器低16位
    __HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);            //开启RTC写保护
    HAL_Delay(20);                                      //等待写保护成功,必须要有
}

/**
 * @brief:将RTC中的计数器寄存器值转换为日期
 */
struct tm* Time_Get(void)
{
    /* 读取数据寄存器的值 */
    time_t temp = (READ_REG(hrtc.Instance->CNTH) << 16) | READ_REG(hrtc.Instance->CNTL);

    /* 将计数器的值转换为日期 */
    return localtime(&temp);//将时间戳转换为本地的年月日时分秒
}

②RTC.h

#ifndef __RTC_H
#define __RTC_H

#include "stm32f1xx_hal.h"
#include <time.h>
extern RTC_HandleTypeDef hrtc;  //RTC配置结构体
void RTC_Init(void);
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec);
void AlarmTime_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec);
struct tm* Time_Get(void);

#endif

③main.c

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "RTC.h"
#include "UART.h"
#include "LED.h"

struct tm* Day; 
int main(void){
    
	HAL_Init();
	HSE_RCC_Init(); 
	UART1_Init(115200);
    LED_GPIO_Init();
    RTC_Init();
    printf("代码测试\r\n");
    Time_Set(2025,1,2,21,8,30);         //2025-01-02 20:55:30
    
	while(1){
       Day = Time_Get();
        printf("%d-%d-%d %d:%d:%d\r\n"
        ,Day->tm_year + 1900,Day->tm_mon,Day->tm_mday,Day->tm_hour,Day->tm_min,Day->tm_sec);
        HAL_Delay(1000);
	}	
}

④stm32f1xx_it.c

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h" 
#include "RTC.h" 
#include "UART.h"
#include "LED.h"

/**
 * @brief:RTC秒中断服务函数
 */
void RTC_IRQHandler(void)
{
    HAL_RTCEx_RTCIRQHandler(&hrtc);
}

/******************* 下面的中断的回调函数 ***************************/
/**
 * @brief:RTC秒中断回调函数
 */
void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc)
{
    LED_Turn();
}

4、输出功能

①RTC.c文件需要修改的代码如下

hrtc.Init.OutPut = RTC_OUTPUTSOURCE_SECOND; //输出:秒脉冲
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM ; //输出:闹钟脉冲
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_CALIBCLOCK; //输出:32768Hz/64后的脉冲

输出引脚是PC13,但是不用配置它。其他的代码不用修改

5、BKP的读写

BKP的读写需要RTC的配置,但是不需要开启LSE的时钟源。只需要打开RTC时钟+配置RTC总控结构体
①RTC.c文件的代码如下

#include "RTC.h"

/**
 * @brief:RTC初始化函数
 */
RTC_HandleTypeDef hrtc;                     //RTC配置结构体
void RTC_Init(void)
{    
    /* RTC的初始化配置 */
    __HAL_RCC_RTC_ENABLE();                     //使能RTC的时钟
    __HAL_RCC_PWR_CLK_ENABLE();                 //使能PWR的时钟
    __HAL_RCC_BKP_CLK_ENABLE();                 //使能BKP的时钟
    hrtc.Instance = RTC;                        //选择RTC
    HAL_RTC_Init(&hrtc);
}

/**
 * @brief:HAL_RTC_Init()调用函数
 */
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
    /* 其他的配置 */
}

②main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "RTC.h"
#include "UART.h"

uint16_t Data = 0x1234;
int main(void){
    
	HAL_Init();
	HSE_RCC_Init(); 
	UART1_Init(115200);
    RTC_Init();										//初始化BKP
    printf("代码测试\r\n");
   
    HAL_RTCEx_BKUPWrite(&hrtc, 1, Data);            //向BKP的第一个数据寄存器写入数据
    printf("%x\r\n",HAL_RTCEx_BKUPRead(&hrtc, 1));  //读取BKP的第一个数据寄存器的数据
    
	while(1){

	}	
}

在这里插入图片描述

6、BKP的侵入事件

若发生了侵入事件,会将BKP中的数据清除(主电源断电,侵入事件也有效)。侵入事件检测引脚为PC13且检测电平。但是我们不用配置PC13。
在这里插入图片描述当侵入事件产生后,应该先关闭侵入检测。需要侵入检测则重新调用API函数开启侵入检测。
①RTC.c文件的代码如下

#include "RTC.h"

/**
 * @brief:RTC初始化函数
 */
RTC_HandleTypeDef hrtc;                     //RTC配置结构体
RTC_TamperTypeDef Tamper;                   //侵入事件配置结构体
void RTC_Init(void)
{    
    /* RTC的初始化配置 */
    __HAL_RCC_RTC_ENABLE();                     //使能RTC的时钟
    __HAL_RCC_PWR_CLK_ENABLE();                 //使能PWR的时钟
    __HAL_RCC_BKP_CLK_ENABLE();                 //使能BKP的时钟
    hrtc.Instance = RTC;                        //选择RTC
    HAL_RTC_Init(&hrtc);
    
    /* 侵入事件配置 */
    Tamper.Tamper = RTC_TAMPER_1;                   //指定引脚:PC13
    Tamper.Trigger = RTC_TAMPERTRIGGER_HIGHLEVEL;   //高电平触发
    HAL_RTCEx_SetTamper_IT(&hrtc,&Tamper);          //配置侵入事件,开启中断
    HAL_NVIC_SetPriority(TAMPER_IRQn,3,0);
    HAL_NVIC_EnableIRQ(TAMPER_IRQn);
}

②main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "RTC.h"
#include "UART.h"


uint16_t Data = 0x1234;
int main(void){
    
	HAL_Init();
	HSE_RCC_Init(); 
	UART1_Init(115200);
    RTC_Init();										//初始化BKP,初始化侵入事件
    printf("代码测试\r\n");
   
    HAL_RTCEx_BKUPWrite(&hrtc, 1, Data);            //向BKP的第一个数据寄存器写入数据
    printf("%x\r\n",HAL_RTCEx_BKUPRead(&hrtc, 1));  //读取BKP的第一个数据寄存器的数据
    
	while(1){

	}	
}

③stm32f1xx_it.c文件的代码如下

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h" 
#include "RTC.h" 
#include "UART.h"

/**
 * @brief:RTC侵入事件中断服务函数
 */
void TAMPER_IRQHandler(void)
{
    HAL_RTCEx_TamperIRQHandler(&hrtc);
}

/******************* 下面的中断的回调函数 ***************************/
/**
 * @brief:RTC侵入中断回调函数
 */
void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc)
{
    printf("发生侵入事件了\r\n");
    HAL_RTCEx_DeactivateTamper(hrtc, RTC_TAMPER_1);//关闭侵入事件
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马JavaWeb开发跟学(十五).Maven高级

黑马JavaWeb开发跟学.十五.Maven高级 Maven高级1. 分模块设计与开发1.1 介绍1.2 实践1.2.1 分析1.2.2 实现 1.3 总结 2. 继承与聚合2.1 继承2.1.1 继承关系2.1.1.1 思路分析2.1.1.2 实现 2.1.2 版本锁定2.1.2.1 场景2.1.2.2 介绍2.1.2.3 实现2.1.2.4 属性配置 2.2 聚合2.2.1 介…

cka考试-03-k8s版本升级

一、原题 二、解答 [root@master ~]# kubectl get node NAME STATUS ROLES AGE VERSION master Ready control-plane,master 25h v1.22.12 node1 Ready worker 25h v1.22.12 node2 Ready worker …

【Java项目】基于SpringBoot的【垃圾分类系统】

【Java项目】基于SpringBoot的【垃圾分类系统】 技术简介&#xff1a;本系统使用采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介&#xff1a;使用者分为管理员和用户、垃圾分类管理员&#xff0c;实现功能包括管理员&#xff1a;首页、个人中心、用户管理、…

文本区域提取和分析——Python版本

目录 1. 图像预处理 2. 文本区域提取 3. 文本行分割 4. 文本区域分析 5. 应用举例 总结 文本区域提取和分析是计算机视觉中的重要任务&#xff0c;尤其在光学字符识别&#xff08;OCR&#xff09;系统、文档分析、自动化数据录入等应用中有广泛的应用。其目标是从图像中提…

华为的数字化转型框架和数字化转型成熟度评估方法

2016年&#xff0c;华为公司数字化转型变革规划汇报通过&#xff0c;一系列的变革项目由变革指导委员会(Executive Steering Committee,ESC)完成立项。8年多来&#xff0c;华为数字化转型工作初步取得了一些成果&#xff0c;比如&#xff1a; 实现“销售收入翻番&#xff0c;但…

算法 Class 006(二分搜索)

一、查找一个数 在一个有序数组中查找数字&#xff0c;每次一循环可 砍掉一半的值&#xff0c;只要确定了 arr[mid] 与 num 之间的关系。 大于num 忽略掉 mid及右边的数字 小于 num 忽略掉 mid 及左边的数字 二、 找大于等于 num 的最左位置 意思就是该下标及右边的数都是大于…

【工具整理】WIN换MAC机器使用工具整理

最近公司电脑升级&#xff0c;研发同学统一更换了 Mac Book Pro 笔记版电脑&#xff0c;整理一下安装了那些软件以及出处&#xff0c;分享记录下&#xff5e; 知识库工具 1、语雀 网址&#xff1a;语雀&#xff0c;为每一个人提供优秀的文档和知识库工具 语雀 个人花园&…

EdgeX规则引擎eKuiper

EdgeX 规则引擎eKuiper 一、架构设计 LF Edge eKuiper 是物联网数据分析和流式计算引擎。它是一个通用的边缘计算服务或中间件,为资源有限的边缘网关或设备而设计。 eKuiper 采用 Go 语言编写,其架构如下图所示: eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源…

Python脚本实现通过Vector VN1630A CAN盒子与ECU通信

1 安装 python-can 包 安装命令如下&#xff1a; pip install python-can安装完成后可用下面命令查看是否安装成功及版本。 pip show python-canName: python-can Version: 4.4.2 Summary: Controller Area Network interface module for Python Home-page: https://github.…

职场常用Excel基础04-二维表转换

大家好&#xff0c;今天和大家一起分享一下excel的二维表转换相关内容~ 在Excel中&#xff0c;二维表&#xff08;也称为矩阵或表格&#xff09;是一种组织数据的方式&#xff0c;其中数据按照行和列的格式进行排列。然而&#xff0c;在实际的数据分析过程中&#xff0c;我们常…

编程利器豆包MarsCode它来了

你在使用vsCode进行编写代码时是否遇到代码错误不知道如何修改&#xff1f;是否遇到代码复杂不知道逻辑业务&#xff1f;是否遇到只有思路不知道如何写出代码的情况&#xff1f; 现在&#xff0c;一款代码助手神器它来了&#xff0c;有了它&#xff0c;上面的问题和烦恼统统秒…

idea( 2022.3.2)打包报错总结

一 报错 class lombok.javac.apt.LombokProcessor (in unnamed module 0x4fe64d23) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing …

戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机硬件与操作系统之间的桥梁&#xff0c;它负责初始化和测试系统硬件组件&#xff0c;并加载启动操作系统。在某些情况下&#xff0c;如调整启动顺序、更改系统时间或日期、修改硬件配置等&#xff0c;您可能需要进入BIOS进…

小程序组件 —— 25 组件案例 - 商品导航区域

这一节主要实现商品导航区的结构和样式&#xff0c;商品导航区没有新的知识点&#xff0c;主要使用之前学习的三个组件&#xff1a; view&#xff1a;视图容器iamge&#xff1a;图片组件text&#xff1a;文本组件 商品导航区由五个商品导航来组成&#xff0c;每一个视频导航都…

数据结构(ing)

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

Vue 中el-table-column 进行循环,页面没渲染成功

文章目录 前言效果图代码示例可能出现的问题及原因解决思路 前言 实现效果&#xff1a;el-table-column 进行循环&#xff0c;使之代码简化 遇到的问题&#xff1a; data进行默认赋值&#xff0c;操作列的删除都可以出来&#xff0c;其他表格里面的数据没出来 效果图 示例&am…

OpenGL入门最后一章观察矩阵(照相机)

前面的一篇文章笔者向大家介绍了模型变化矩阵&#xff0c;投影矩阵。现在只剩下最后一个观察矩阵没有和大家讲了。此片文章就为大家介绍OpenGL入门篇的最后一个内容。 观察矩阵 前面的篇章当中&#xff0c;我们看到了即使没有观察矩阵&#xff0c;我们也能对绘制出来的模型有一…

教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件

1. 安装 PyCharm 访问 PyCharm 官方网站&#xff1a;https://www.jetbrains.com/pycharm/。下载社区版&#xff08;免费&#xff09;或专业版&#xff08;收费&#xff0c;提供更多功能&#xff09;。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm&#xff0c;并根…

springcloud篇3-docker需熟练掌握的知识点

docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充&#xff1a;配置镜像源 注意&#xff1a; yum安装是在线联网下载安装&#xff0c;而很多的资源…

ceph文件系统

ceph文件系统&#xff1a;高度可扩展&#xff0c;分布式的存储文件系统&#xff0c;旨在提高性能&#xff0c;高可靠性和高可用的对 象存储&#xff0c;块存储&#xff0c;文件系统的存储。使用分布式的算法保证数据的高可用和一致性。 ceph的组件 1、MON&#xff1a;ceph m…