STM32学习笔记---RTC

目录

一、什么是RTC

二、如何配置RTC

1、标准实时时钟部分(万年历部分)

1.1 时钟源分类

1.2 RTC时钟源的选择

1.3 精密校正

1.4 异步7位预分频器

1.5 粗略校正

1.6 同步15位分频

1.7 日历寄存器

1.8 RTC的初始化与配置

1.9 程序设计

2、闹钟部分

2.1 闹钟的初始化与配置

2.2 程序设计

3、周期性自动唤醒部分

3.1 唤醒的初始化与配置

3.2 程序设计

三、具体使用RTC

需求1:利用RTC设计日历

需求2:利用RTC设计闹钟

需求3:周期性自动唤醒获取数据


一、什么是RTC

RTC:

        RTC能够持续记录当前的时间,包括年、月、日、时、分、秒等,自动计算闰年,能区分每个月的天数甚至可能包括星期几和时区信息

RTC框图:

二、如何配置RTC

1、标准实时时钟部分(万年历部分)

1.1 时钟源分类

1.2 RTC时钟源的选择

①LSE(32.768KHZ):外部低速时钟     分频=同步*异步=256*128        

//通常使用  外部低速时钟有独立备份电源可以让RTC独立运行

如何配置外部低速时钟源提供给RTC?

选择外部低速时钟(备份时钟)就找到RCC备份域控制寄存器相应的位

RCC备份域控制寄存器

使能外部低速振荡器       0位

等待外部低速振荡器就绪   1位

选择外部低速时钟         8:9位

LSI(32KHZ):内部低速时钟     分频=同步*异步=250*128        

选择内部低速时钟(备份时钟)就找到RCC备份域控制寄存器、RCC控制和状态寄存器应的位

RCC控制和状态寄存器:

使能内低速振荡器       0位

等待内部低速振荡器就绪 1位

RCC备份域控制寄存器

选择内部低速时钟      8:9位

1.3 精密校正

不做高精度需求是不需要此寄存器

1.4 异步7位预分频器

128分频     

1.5 粗略校正

不需要

1.6 同步15位分频

默认256分频   //1HZ    1次/s

1.7 日历寄存器

设置日期时间

获取日期时间

1.8 RTC的初始化与配置

总结:

①将电源控制寄存器(PWR->CR)的DBP位写1 -->解除RTC控制器和RTC备份寄存器的保护

        配置这个寄存器之前,要使能电源控制器时钟 RCC->APB1

②往RTC_WPR 中写 0xca、再写 0x53--->取消所有RTC寄存器的写保护

      往RTC_WPR寄存器中随便写一个数据就会再次激活写保护

总结: 

1、使能电源控制器(PWR)

2、使能备份域的访问

3、选择RTC时钟源

4、使能RTC时钟

设置日历寄存器的要求

总结:

要想改变日历寄存器的时间的值或者分频值,需要让日历进入初始化模式

(日历停止工作)

更改完以后,要想日历继续工作,需要退出初始化模式(自由模式)

0、取消写保护

1、进入初始化模式---> RTC->ISR 寄存器的INIT位写1

2、检测是否允许更新(改变)日历值位--->轮询RTC->ISR 寄存器的INITF位是否置1

3、分频--->同步、异步

4、设置日期和时间寄存器

5、退出初始化模式---> RTC->ISR 寄存器的INIT位写0

6、激活写保护

读取日历时间和日期

要想读时间和日期,要等待时间和日期同步(加载到影子寄存器)

如何等待时间和日期同步到影子寄存器

ISR寄存器中RSF位要先清零,然后等待置1,读时间或者日期值.

注意:在使用RTC寄存器之前需要进行取消写保护

1.9 程序设计

初始配置RTC:

初始化配置函数

{

//使能电源控制器的时钟

/*解除RTC控制器和备份域控制器寄存器的写保护*/

/*配置时钟源*/

//使能外部低速时钟

//等待外部低速时钟使能

//选择外部低速时钟作为RTC时钟

//使能RTC

/*解除RTC寄存器的写保护*/

//配置RTC相关寄存器

//CR

/*激活RTC寄存器的写保护*/

//设置初始时间

}

设置时间

设置时间和日期函数

{

//解除RTC寄存器的写保护

//进入日历初始化模式

//等待进入初始化模式完成

/*把十进制日期值转换成BCD码形式*/

//设置日期到DR寄存器

/*把十进制时间值转换成BCD码形式*/

//设置时间到TR寄存器

//退出日历初始化模式

//激活RTC寄存器的写保护

}

十进制Dec转BCD码:

BCD=(Dec/10)<<4 | (Dec%10)

获取时间

获取日期和时间函数

{

//解除RTC寄存器的写保护

将同步标志位清零

等待同步标志位置1

读日期寄存器的值

/*把BCD码形式转换成十进制日期值*/

将同步标志位清零

等待同步标志位置1

读时间寄存器的值

/*把BCD码形式转换成十进制时间值*/

//激活RTC寄存器的写保护

}

BCD码转十进制Dec:

Dec=(BCD>>4)*10+(BCD&0x0f)

2、闹钟部分

2.1 闹钟的初始化与配置

总结:

1、禁止闹钟

2、轮询RTC_ISR的ALRAWF(闹钟A)\ALRBWF(闹钟B)位是否置1

3、配置闹钟寄存器

4、使能闹钟

5、配置EXT控制器

6、使能闹钟中断

7、配置NVIC控制器

2.2 程序设计

设置RTC闹钟初始化函数

{

/*解除RTC寄存器写保护*/

/*闹钟初始化*/

//禁止闹钟运行

//等待更新闹钟

/*配置闹钟*/

//设置掩码

//获取日期BCD码

//使能闹钟

//激活RTC寄存器写保护

/*EXTI控制器配置*/

//系统配置控制器使能(APB2)

//检测边沿

//使能外部中断

/*NVIC控制器配置*/

//闹钟A中断使能

}

闹钟中断服务函数

闹钟中断服务函数

{

        //判断EXTI触发的中断信号

        {

                //清除EXTI中断标志位--->触发条件:闹钟标志位出现上升沿

                //清除闹钟中断标志位(此位是中断标志位)--->触发条件:到达预设的数值时便会触发

                                                                                                          中断

                //执行紧急事件

        }

}

不清除EXTI中断标志位则会一直执行闹钟中断服务函数;而不清除闹钟中断标志位,则不会再次进入执行闹钟中断服务函数。为什么?首先时间/日期寄存器( RTC_TR 和 RTC_DR)与闹钟寄存器 (RTC_ALRMAR) 匹配 时,RTC的闹钟标志位由0到1(上升沿跳变),而EXTI会实时监控ISR的变化,当检测到ISR由0到1(上升沿跳变)时就会触发NVIC。进入中断后清除EXTI中断标志位(以便下次再次进入),不清除闹钟标志位还是1,这时候当下一次时间匹配时,EXTI检测不到ISR由0到1(上升沿跳变)就无法再次触发NVIC。

3、周期性自动唤醒部分

3.1 唤醒的初始化与配置

 

总结:

  1. 禁止唤醒
  2. 轮询RTC_ISR的WUTW是否置1
  3. 配置时钟
  4. 配置重装载值
  5. 使能唤醒
  6. 配置EXTI控制器
  7. 使能唤醒中断
  8. 清除唤醒中断标志位
  9. 配置NVIC控制器
 3.2 程序设计

唤醒初始化函数

{

        

/*解除RTC寄存器写保护*/

//禁止唤醒定时器

//等待允许更新唤醒定时器

/*时钟源配置*/

//配置唤醒自动重载值    

//使能唤醒定时器

/*激活RTC寄存器写保护*/

/*EXTI控制器配置*/

/*NVIC控制器配置*/

//唤醒定时器中断使能

//清除中断标志位

}

唤醒中断服务函数

{

        //判断EXTI触发的中断信号

        {

                //清除EXTI中断标志位-->触发条件:唤醒标志位出现上升沿

                //清除唤醒标志位-->触发条件:计完数后便会触发

                //紧急事件

        }

}

总结:

不清除EXTI中断标志位则会一直执行唤醒中断服务函数;而不清除唤醒中断标志位,则不会再次进入执行唤醒中断服务函数。为什么?首先唤醒重载值递减到0时,RTC的唤醒标志位由0到1(上升沿跳变),而EXTI会实时监控ISR的变化,当检测到ISR由0到1(上升沿跳变)时就会触发NVIC。进入中断后清除EXTI中断标志位(以便下次再次进入),如果不清除闹钟标志位还是1,这时候下一次计完数时,EXTI检测不到ISR由0到1(上升沿跳变)就无法再次触发NVIC。

注意:使能唤醒中断后,需要清除一下中断标志位,因为在唤醒初始化中当使能唤醒定时器后,计数完成,中断标志位置1。若不清除一下中断标志位,则无法触发EXTI中断。

三、具体使用RTC

需求1:利用RTC设计日历

RTC初始化函数:

/*
函数名: rtc_init
函数功能:RTC初始化
返回值:void
形参:void
函数说明:

*/
void rtc_init(RTC_t date_time)
{
	/*解除RTC和相关寄存器保护*/
	RCC->APB1ENR |= (1 << 28);//使能电源控制器时钟
	PWR->CR |= (1 << 8);//解除RTC控制器控制 
	
	/*时钟源配置*/
	RCC->BDCR |= (1 << 0);//使能外部低速振荡器 0位
	while(!(RCC->BDCR & (1 <<  1)));//等待外部低速振荡器就绪   1位
	RCC->BDCR |= (1 << 8);//选择外部低速时钟 8:9位
	RCC->BDCR |= (1 << 15);//使能RTC时钟	15位
	
	/*解除RTC寄存器的写保护*/
	RTC->WPR = 0xCA;
	RTC->WPR = 0x53;
	
	/*配置相关寄存器*/
	//CR
	RTC->CR &= ~(1 << 6);//24小时制
	RTC->CR &= ~(1 << 5);//影子寄存器
	
	/*激活RTC寄存器的写保护*/
	RTC->WPR = 0xff;
	
	/*设置初始时间*/
	if(RTC->BKP0R != 0xff)
	{
		set_date_time(date_time);
		RTC->BKP0R = 0xff;
	}
	
}

设置初始时间的相关内容:

RTC备份寄存器和备份电源

没有备份电源,有RTC备份寄存器:只能做到复位后,时间继续走;断电后重新上电后时间会重置

如何做到复位后时间继续走?

正常情况下,在不使用RTC备份寄存器时,复位后时间将会被重置;而在使用备份寄存器后,

在RTC初始化函数里首次执行设置初始时间的地方做个标志(相当于”到此一游”),如果下次复位后,运行到此标记时,则不会重新设置初始时间。说白了,就是利用这个标志绕过初始化重新设置时间。

如何做到断电后时间不会被重置?

需要备份电源(纽扣电池)向RTC供电

总结:

备份电源作用是:

芯片断电可以让RTC继续工作,同时备份寄存器不复位

RTC备份寄存器的作用:

防止芯片复位后,CUP重置初始时间(执行RTC初始化函数-->重新设定原来的时间)

设置时间和日期:

/*
函数名: set_date_time
函数功能:设置日期和时间
返回值:void
形参:void
函数说明:

*/
void set_date_time(RTC_t date_time)
{
	
	//解除RTC寄存器的写保护
	RTC->WPR = 0xCA;
	RTC->WPR = 0x53;
	
	//进入日历初始化模式
	RTC->ISR |= (1 << 7);
	//等待进入初始化模式完成
	while(!(RTC->ISR & (1 << 6)));
	//把十进制日期值转换成BCD码形式
	//设置日期到DR寄存器
	RTC->DR = in_dec_out_bcd(date_time.year-2000)<<16           |
						in_dec_out_bcd(date_time.week)<<13      |
						in_dec_out_bcd(date_time.mon)<<8        |
						in_dec_out_bcd(date_time.day);
	
	
	
	//把十进制时间值转换成BCD码形式
	//设置时间到TR寄存器
	RTC->TR = in_dec_out_bcd(date_time.hour)<<16           |
						in_dec_out_bcd(date_time.min )<<8  |
						in_dec_out_bcd(date_time.sec );
	
	
	
	//退出日历初始化模式
	RTC->ISR &= ~(1 << 7);
	
	//激活RTC寄存器的写保护
	RTC->WPR = 0xff;
}

十进制日期值转换成BCD码形式函数:

/*
函数名: in_dec_out_bcd
函数功能:十进制日期值转换成BCD码形式
返回值:void
形参:u8 dec
函数说明:

*/
u8 in_dec_out_bcd(u8 dec)
{
	return (dec/10)<<4 | (dec%10);
}

获取日期和时间函数:

/*
函数名: get_date_time
函数功能:获取日期和时间
返回值:void
形参:void
函数说明:

*/
RTC_t get_date_or_time(void)
{
	u32 d_temp;
	u32 t_temp;
	RTC_t get_date_time;
	//解除RTC寄存器的写保护
	RTC->WPR = 0xCA;
	RTC->WPR = 0x53;
	
	//将同步标志位清零
	RTC->ISR &= ~(1 << 5);
	//等待同步标志位置1
	while(!(RTC->ISR & (1 << 5)));
	//读日期寄存器的值
	d_temp = RTC->DR;
	//把BCD码形式转换成十进制日期值
	get_date_time.year = in_bcd_out_dec(d_temp>>16)+2000;
	get_date_time.week = in_bcd_out_dec((d_temp>>13) & 0x07);
	get_date_time.mon  = in_bcd_out_dec(d_temp>>8& 0x1f);
	get_date_time.day  = in_bcd_out_dec(d_temp);
	
	//将同步标志位清零
	RTC->ISR &= ~(1 << 5);
	//等待同步标志位置1
	while(!(RTC->ISR & (1 << 5)));
	//读时间寄存器的值
	t_temp = RTC->TR;
	//把BCD码形式转换成十进制时间值
	get_date_time.hour = in_bcd_out_dec(t_temp>>16);
	get_date_time.min  = in_bcd_out_dec(t_temp>>8);
	get_date_time.sec  = in_bcd_out_dec(t_temp);
	//激活RTC寄存器的写保护
	RTC->WPR = 0xff;
	
	return get_date_time;
}

需求2:利用RTC设计闹钟

设置RTC闹钟初始化函数:

/*
函数名: alr_init
函数功能:设置RTC闹钟初始化
返回值:void
形参:void
函数说明:

*/
RTC_t alr =  {2024,9,26,4,19,41,5};
void alr_init(RTC_t alr)
{
	//解除RTC寄存器写保护
	RTC->WPR = 0xca;
	RTC->WPR = 0x53;
	/*设置闹钟*/

	//禁止闹钟运行
	RTC->CR &= ~(1<<8);
	while(!(RTC->ISR & (1 << 0)));//等待更新闹钟A
	
	//日期、时分秒比较
    //RTC->ALRMAR |= ;//日期掩码
    //RTC->ALRMAR |= ;//小时掩码
    //RTC->ALRMAR |= ;//分钟掩码
	RTC->ALRMAR &= ~(1 << 7);//秒掩码
	RTC->ALRMAR &= ~(1 << 30);//日期个位
	RTC->ALRMAR &= ~(1 << 22);//24小时
	
	//获取日期BCD码
	RTC->ALRMAR = in_dec_out_bcd(alr.day)<<24 |
								in_dec_out_bcd(alr.hour)<<16|
								in_dec_out_bcd(alr.min)<<8  |
								in_dec_out_bcd(alr.sec);
	//设置掩码							
	RTC->ALRMAR |= (1 << 31) | (1 << 23) | (1 << 15);
	
	
	//设置闹钟
	RTC->CR |= (1 << 8);//使能闹钟A
	
	//激活RTC寄存器写保护
	RTC->WPR = 0xff;
	
	/*EXTI控制器配置*/
	//系统配置控制器使能(APB2)
	RCC->APB2ENR |= 1 << 14;
	//检测边沿       上升沿:EXTI->RTSR |= 1<<x  下降沿:EXTI->FTSR |= 1<<x
	EXTI->RTSR |= 1 << 17;
	//使能外部中断   		 EXTI->IMR |= 1<<x
	EXTI->IMR |= 1 << 17;
	
	/*NVIC控制器配置*/
	RTC->CR |= (1 << 12);//闹钟A中断使能
	u32 pri = NVIC_EncodePriority (5, 1, 1);//计算优先级编码值,设置抢占和响应的级别值
	NVIC_SetPriority(RTC_Alarm_IRQn, pri);//设置具体某个中断源的优先级
	NVIC_EnableIRQ(RTC_Alarm_IRQn);//中断信号响应通道使能
	
	
}

RTC闹钟中断服务函数:

/*
函数名:RTC_Alarm_IRQHandler
函数功能:RTC中断服务函数
返回值:void
形参:void
函数说明:

*/
void RTC_Alarm_IRQHandler(void)
{
	//判断EXTI17触发的中断信号
	if(EXTI->PR & (1 << 17))
	{
	    //清除标志位
		EXTI->PR |= 1 << 17;
	    //清除闹钟标志位
	    RTC->ISR &= ~(1 << 8);
	    //紧急事件
		printf("响铃l!\r\n");
	}
	
}

需求3:周期性自动唤醒获取数据

唤醒初始化函数:

/*
函数名: wuck_init
函数功能:唤醒初始化
返回值:void
形参:void
函数说明:

*/
void wuck_init(u16 ms)
{
	//解除RTC寄存器写保护
	RTC->WPR = 0xca;
	RTC->WPR = 0x53;
	//禁止唤醒定时器
	RTC->CR &= ~(1 << 10);
	while(!(RTC->ISR & (1 << 2)));//允许更新唤醒定时器
	
	/*时钟源配置*/
	RCC->BDCR |= (1 << 0);//使能外部低速振荡器 0位
	RCC->BDCR |= (1 << 8);//选择外部低速时钟 8:9位
	RCC->BDCR |= (1 << 15);//使能RTC时钟	15位
	
	RTC->WUTR = ms;//唤醒自动重载值	
	
	//使能唤醒定时器
	RTC->CR |= (1 << 10);

	//激活RTC寄存器写保护
	RTC->WPR = 0xff;
	
	/*EXTI控制器配置*/
	//系统配置控制器使能(APB2)
	RCC->APB2ENR |= 1 << 14;
	//检测边沿    
	EXTI->RTSR |= 1 << 22;
	//使能外部中断   		 
	EXTI->IMR |= 1 << 22;
	/*NVIC控制器配置*/
	RTC->CR |= (1 << 14);//唤醒定时器中断使能
	RTC->ISR &= ~(1 << 10);//清除中断标志位
	u32 pri = NVIC_EncodePriority (5, 2, 1);//计算优先级编码值,设置抢占和响应的级别值
	NVIC_SetPriority(RTC_WKUP_IRQn, pri);//设置具体某个中断源的优先级
	NVIC_EnableIRQ(RTC_WKUP_IRQn);//中断信号响应通道使能
}

唤醒中断服务函数:

/*
函数名:RTC_WKUP_IRQHandler
函数功能:RTC唤醒中断服务函数
返回值:void
形参:void
函数说明:

*/
void RTC_WKUP_IRQHandler(void)
{
	//判断EXTI22触发的中断信号
	if(EXTI->PR & (1 << 22))
	{
		//清除标志位
		EXTI->PR |= 1 << 22;
		//清除闹钟标志位
		RTC->ISR &= ~(1 << 10);
		//紧急事件
		printf("启动!\r\n");
	}
	
	
}

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

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

相关文章

Python酷库之旅-第三方库Pandas(155)

目录 一、用法精讲 706、pandas.DatetimeTZDtype类 706-1、语法 706-2、参数 706-3、功能 706-4、返回值 706-5、说明 706-6、用法 706-6-1、数据准备 706-6-2、代码示例 706-6-3、结果输出 707、pandas.Timedelta.asm8属性 707-1、语法 707-2、参数 707-3、功能…

信息学CCF CSP-J/S 2024常见问题汇总,低年级考生重点关注

摘要 随着2024年CSP-J/S初赛的临近&#xff0c;各省报名要求细则陆续公布。为了帮助广大考生和家长准确了解各省政策&#xff0c;自主选拔在线团队特为汇总整理全国各省CSP-J/S2024认证相关问题&#xff0c;希望可以帮助各位考生更好的备考&#xff01; CCF CSP-J/S 2024 认证…

Android平台RTSP|RTMP播放器PK:VLC for Android还是SmartPlayer?

好多开发者&#xff0c;希望在Android端低延迟的播放RTMP或RTSP流&#xff0c;本文就目前市面上主流2个直播播放框架&#xff0c;做个简单的对比。 VLC for Android VLC for Android 是一款功能强大的多媒体播放器&#xff0c;具有以下特点和功能&#xff1a; 广泛的格式支持…

PDF-XChange PRO v10.4.2.390 x64 已授权中文特别版

PDF-XChange PRO是一款功能强大的PDF编辑和查看软件&#xff0c;PDF-XChange PRO 一个多合一的PDF解决方案。这是Tracker Software的三个最佳应用程序的套件&#xff1a;PDF-XChange Editor Plus&#xff0c;PDF-Tools和PDF-XChange Standard。使用 PDF-XChange Editor Plus&am…

vector的深入剖析与底层逻辑

前言&#xff1a; 上篇我们谈到vector的概念&#xff0c;使用&#xff0c;以及相关接口的具体应用&#xff0c;本文将对vector进行深入剖析&#xff0c;为读者分享其底层逻辑&#xff0c;讲解其核心细节。 上篇链接&#xff1a; 初始vector——数组的高级产物-CSDN博客 一.…

CDGA|数据治理:如何让传统行业实现数据智能

在当今这个数字化时代&#xff0c;数据已成为推动各行各业转型升级的关键力量。对于传统行业而言&#xff0c;如何从海量、复杂的数据中挖掘价值&#xff0c;实现“数据智能”&#xff0c;成为了提升竞争力、优化运营效率、创新业务模式的重要途径。本文将探讨数据治理如何助力…

【文献及模型、制图分享】干旱区山水林田湖草沙冰一体化保护与系统治理——基于土地退化平衡视角

文献介绍 目标明晰、统筹兼顾、干预适度是山水林田湖草沙冰一体化保护与系统治理的客观要求。基于土地退化平衡&#xff08;LDN&#xff09;视角&#xff0c;构建涵盖双重对象、双重法则、双重原则、指标体系、价值取向的理论框架&#xff0c;并以天山北坡城市群为例&#xff…

Flume抽取数据(包含自定义拦截器和时间戳拦截器)

flume参考网址&#xff1a;Flume 1.9用户手册中文版 — 可能是目前翻译最完整的版本了https://flume.liyifeng.org/?flagfromDoc#要求&#xff1a; 使用Flume将日志抽取到hdfs上&#xff1a;通过java代码编写一个拦截器&#xff0c;将日志中不是json数据的数据过滤掉&#xf…

模拟退火算法最常见知识点详解与原理简介控制策略

章节目录 模拟退火算法简介与原理 算法的基本流程与步骤 关键参数与控制策略 模拟退火算法的应用领域 如何学习模拟退火算法 资源简介与总结 一、模拟退火算法简介与原理 重点详细内容知识点总结 1. 模拟退火算法简介 模拟退火算法&#xff08;Simulated Annealing, SA&#x…

blender分离含有多个动作的模型,并导出含有材质的fbx模型

问题背景 笔者是模型小白&#xff0c;需要将网络上下载的fbx模型中的动作&#xff0c;分离成单独的动作模型&#xff0c;经过3天摸爬滚打&#xff0c;先后使用了blender&#xff0c;3d max&#xff0c;unity&#xff0c;最终用blender完成&#xff0c;期间参考了众多网络上大佬…

Spring Boot框架下大创项目流程自动化

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大创管理系统的相关信息成为必然。开发合适…

DETR[端到端目标检测](论文复现)

DETR[端到端目标检测](论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 DETR[端到端目标检测](论文复现)概述模型主体框架演示效果核心逻辑使用方式部署方式数据准备概述 在目标检测需要许多手工设计的组件,例如非极大值抑制(NMS),基于人工经验生成的先验…

【Trulens框架】用TruLens 自动化 RAG 应用项目评估测试

前言&#xff1a; 什么是Trulens TruLens是面向神经网络应用的质量评估工具&#xff0c;它可以帮助你使用反馈函数来客观地评估你的基于LLM&#xff08;语言模型&#xff09;的应用的质量和效果。反馈函数可以帮助你以编程的方式评估输入、输出和中间结果的质量&#xff0c;从而…

Gin框架操作指南10:服务器与高级功能

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

SICK系列激光雷达单点测距仪DT80-311111+SIG200配置和通信

文章目录 一、硬件连接与SOPAS连接测距仪二、从SOPAS读取数据三、通过JSON获取数据1. 使用Postman测试接口2. 通过代码实现 一、硬件连接与SOPAS连接测距仪 首先硬件设备连接如下&#xff1a; 电源厂家应该是不提供&#xff0c;需要自行解决。 安装完成后需要使用sick的SOPAS…

增量知识 (Incremental Knowledge, IK)

在语义通信系统中&#xff0c;增量知识&#xff08;IK, Incremental Knowledge&#xff09;是一种增强数据传输效率和可靠性的技术&#xff0c;特别是用于混合自动重传请求&#xff08;HARQ, Hybrid Automatic Repeat reQuest&#xff09;机制时。它的核心思想是在传输失败后&a…

图像中的融合

图像显示函数 def img_show(name, img):"""显示图片:param name: 窗口名字:param img: 图片对象:return: None"""cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()图像读取与处理 读取图片 cloud cv2.imread(bg.jpg) fish cv2.…

【uni-app】HBuilderX安装uni-ui组件

目录 1、官网找到入口 2、登录帐号 3、打开HuilderX 4、选择要应用的项目 5、查看是否安装完成 6、按需安装 7、安装完毕要重启 8、应用 前言&#xff1a;uniapp项目使用uni-ui组件方式很多&#xff0c;有npm安装等&#xff0c;或直接创建uni-ui项目&#xff0c;使用un…

threejs-光线投射实现3d场景交互事件

一、介绍 1.属性 // 创建射线 const raycaster new three.Raycaster() // 创建鼠标向量(保存鼠标点击位置) const mouse new three.Vector2() // 创建点击事件 window.addEventListener(click,(event)>{// 获取鼠标点击位置mouse.x (event.clientX / window.innerWidt…

HAL+M4学习记录_7

一、TIM 记录学习HAL配置TIM定时器 1.1 简介 TIM&#xff08;timer&#xff09;定时器&#xff0c;16位或32位&#xff08;TIM2和TIM5&#xff09;计数器、预分频器&#xff08;16位&#xff09;、自动重装寄存器的时基单元&#xff1b;可对输入时钟进行计数&#xff0c;在计数…