【CC2530 教程 二】CC2530定时器实现微秒、毫秒、秒延时函数

目录

一、CC2530定时器:

二、CC2530定时器:

(1)定时器1(Timer1):

(2)定时器2(Timer2):

(3)定时器3和定时器4(Timer3、Time4):

 三、CC2530时钟配置:

(1)时钟配置寄存器说明:

系统时钟概览:

(2)振荡器和时钟:

振荡器:

系统时钟:

(3)32 kHz 振荡器: 

(4) 时钟寄存器:

CLKCONCMD (0xC6) - 时钟控制命令:

CLKCONSTA (0x9E) - 时钟控制状态:

(5)32Mhz时钟配置:

(6) 16Mhz时钟配置:

四、定时器1(Timer1)实现精确延时:

(1)定时器 1 操作模式 :

自由运行模式:

模模式:

正计数/倒计数模式:

(2) 寄存器说明:

(3)微秒级延时函数:

(4)毫秒级延时函数:

(5)秒级延时函数:

五、延时实现LED闪烁:

六、代码下载:


一、CC2530定时器:

        定时器本质上可以看作是一种计数器。它通过对内部时钟信号或外部输入信号进行计数来测量时间间隔。当计数达到设定的值时,定时器会向处理器内核提出中断请求,通知内核某个时间间隔已经结束。

二、CC2530定时器:

CC2530有四个定时器:Timer1、Timer2、Timer3、Timer4 。

(1)定时器1(Timer1):

定时器 1 是一个独立的 16 位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和 PWM 功能。定时器有五个独立的捕获/比较通道。每个通道定时器使用一个 I/O 引脚。定时器用于范围广泛的控制和测量应用,可用的五个通道的正计数/倒计数模式将允许诸如电机控制应用的实现。

功能类别描述
通道数量定时器 1 配备了五个捕获 / 比较通道,可同时对多个信号进行处理和控制。
输入捕获功能支持在信号的上升沿、下降沿或任何边沿触发输入捕获,能准确记录事件发生时刻。
输出比较功能可设置、清除或切换输出比较功能,实现对外部设备的精确控制,如驱动电机等。
计数模式支持自由运行、模、正计数 / 倒计数等多种计数模式,满足不同应用场景需求。
时钟分频内置时钟分频器,可将输入时钟频率通过 1、8、32 或 128 的分频因子进行分频,灵活调整计数速度。
中断请求在每个捕获 / 比较事件以及最终计数结果上生成中断请求,及时通知处理器进行相应处理。
DMA 触发具备 DMA 触发功能,可在无需 CPU 干预的情况下自动完成大量数据传输,提高系统效率。

(2)定时器2(Timer2):

定时器 2 主要用于为 802.15.4 CSMA-CA 算法提供定时,以及为 802.15.4 MAC 层提供一般的计时功能。当定时器 2 和休眠定时器一起使用时,即使系统进入低功耗模式也会提供定时功能。定时器运行在CLKCONSTA.CLKSPD 指明的速度上。如果定时器 2 和睡眠定时器一起使用,时钟速度必须设置为 32 MHz,且必须使用一个外部 32 kHz XOSC 获得精确结果。

功能类别描述
计数类型16 位定时器,仅支持正计数。
计时精度可变周期可精确到 31.25 纳秒。
比较功能配备 2 个 16 位定时器比较功能,可实现精确的时间控制。
溢出计数具有 24 位溢出计数功能,扩展了定时器的计数范围。
溢出比较支持 2 个 24 位溢出计数比较功能,增强了定时控制的灵活性。
帧首定界符捕捉具有帧首定界符捕捉功能,便于在通信或数据帧同步中使用。
同步机制定时器的启动和停止可以同步到外部 32kHz 时钟,或者由睡眠定时器提供定时,确保定时器在低功耗模式下的精确运行。
中断功能在比较匹配和溢出事件发生时,能够产生中断,及时通知处理器进行处理。
DMA 触发支持 DMA 触发功能,可在无需 CPU 干预的情况下自动完成数据传输,提高系统效率。
延迟调整通过引入延迟机制,用户可以灵活调整定时器的计数值,以适应不同的定时需求。

(3)定时器3和定时器4(Timer3、Time4):

定时器 3 和 4 是两个8位的定时器。每个定时器有两个独立的比较通道,每个通道上使用一个 I/O 引脚。

功能类别描述
通道数量定时器 3/4 配备了两个捕获 / 比较通道,可同时处理两个信号的捕获或比较操作。
输出比较功能支持设置、清除或切换输出比较功能,能够灵活控制外部设备的运行状态。
时钟分频内置时钟分频器,可将输入时钟频率通过 1、2、4、8、16、32、64、128 的分频因子进行分频,灵活调整计数速度。
中断请求在每次捕获 / 比较事件以及最终计数事件发生时,定时器能够生成中断请求,及时通知处理器进行相应的处理。
DMA 触发具备 DMA 触发功能,可在无需 CPU 干预的情况下自动完成数据传输,提高系统整体效率。

 三、CC2530时钟配置:

(1)时钟配置寄存器说明:

系统时钟概览:

系统时钟不配置时,默认使用内部16MHz时钟。

(2)振荡器和时钟:

设备有一个内部系统时钟或主时钟。该系统时钟的源既可以用 16 MHzRC 振荡器也可以采用 32 MHz 晶体振荡器。时钟的控制可以使用 CLKCONCMD SFR 寄存器执行。

还有一个 32 MHz 时钟源,可以是 RC 振荡器或晶振,也由 CLKCONCMD 寄存器控制。

CLKCONSTA 寄存器是一个只读的寄存器,用于获得当前时钟状态。振荡器可以选择高精度的晶体振荡器,也可以选择低功耗的高频 RC 振荡器。注意,运行 RF 收发器,必须使用 32 MHz 晶体振荡器。 

振荡器:

CC2530带有可用时钟源的时钟系统。

设备有两个高频振荡器:32MHz 晶振和16MHz RC 振荡器。

32 MHz 晶振启动时间对一些应用程序来说可能比较长,因此设备可以运行在 16 MHz RC 振荡器,直到晶振稳定。16 MHz RC 振荡器功耗少于晶振,但是由于不像晶振那么精确,不能用于 RF 收发器操作。
设备有两个低频振荡器:32 kHz 晶振和32 kHz RC 振荡器。
32 kHz XOSC 用于运行在 32.768 kHz,为系统需要的时间精度提供一个稳定的时钟信号。校准时 32 kHzRCOSC 运行在 32.753 kHz 。 校准只能发生在 32 kHz XOSC 使能的时候 , 这个校 准 可 以通 过使能SLEEPCMD.OSC32K_CALDIS 位禁用。比起 32 kHz XOSC 解决方案,32 kHz RCOSC 振荡器应用于降低成本和电源消耗。这两个 32 kHz 振荡器不能同时运行。

系统时钟:

系统时钟是从所选的主系统时钟源获得的,主系统时钟源可以是 32 MHz XOSC 或 16 MHz RCOSC。
CLKCONCMD.OSC 位选择主系统时钟的源。注意要使用 RF 收发器,必须选择高速且稳定的 32 MHz 晶振。
注意改变 CLKCONCMD.OSC 位不会立即改变系统时钟。时钟源的改变首先在CLKCONSTA.OSC = CLKCONCMD.OSC 的时候生效。这是因为在实际改变时钟源之前需要有稳定的时钟 。还要注意CLKCONCMD.CLKSPD 位反映系统时钟的频率,因此是 CLKCONCMD.OSC 位的映像。选择了 32 MHz XOSC 且稳定之后,即当 CLKCONSTA.OSC 位从 1 变为 0,16 MHz RC 振荡器就被校准。

注意:

从 16 MHz 时钟变到 32 MHz 时钟源(反之亦然)与 CLKCONCMD.TICKSPD 的设置一致。当 CLKCONCMD.OSC 改变时,较慢的 CLKCONCMD.TICKSPD 设置导致实际源改变生效的时间较长。最快的转换是当 CLKCONCMD.TICKSPD 等于 000 时获得。

(3)32 kHz 振荡器: 

设备配备两个32kHz振荡器作为32kHz时钟源:32kHz XOSC和32kHz RCOSC。默认复位后,32kHz RCOSC被启用并选为32kHz时钟源。RCOSC功耗低,但精度不如XOSC。所选的32kHz时钟源用于驱动睡眠定时器、为看门狗定时器产生时钟信号,并在计算睡眠定时器睡眠时间时作为定时器2的选通命令。通过CLKCONCMD.OSC32K寄存器位选择振荡器作为32kHz时钟源,但在16MHz RCOSC成为活跃系统时钟源之前,该寄存器位的写入无效。

当系统时钟从16MHz RCOSC切换到32MHz XOSC时,若选中32kHz RCOSC,其校准开始,使RCOSC运行在32.753kHz,校准可能需2ms,可通过设置SLEEPCMD.OSC32K_CALDIS=1禁用。校准结束时,32kHz时钟源可能产生额外脉冲,使睡眠定时器增加1。

注意,切换到32MHz XOSC后,若从PM3唤醒且32MHz XOSC已启用,振荡器需多达500ms稳定在正确频率。在32MHz XOSC稳定前,睡眠定时器、看门狗定时器和时钟丢失探测器不可用。

(4) 时钟寄存器:

CLKCONCMD (0xC6) - 时钟控制命令:

名称复位R/W描述
7OSC32K1R/W

32kHz时钟振荡器选择。设置该位只能发起一个时钟源改变。CLKCONSTA.OSC32K反映当前的设置。当要改变该位必须选择16MHz RCOSC作为系统时钟。

0:32kHz XOSC

1:32kHz RCOSC

6OSC[1]1R/W

系统时钟源选择。设置该位只能发起一个时钟源改变。CLKCONSTA.OSC反映当前的设置。

0:32MHz XOSC

1:16MHz RCOSC

5:3TICKSPD[2:0]001R/W

定时器标记输出设置。不能高于通过OSC位设置的系统时钟设置。

000:32MHz

001:16MHz

010:8MHz

011:4MHz

100:2MHz

101:1MHz

110:500kHz

111:250kHz

注意CLKCONCMD.TICKSPD可以设置为任意值,但是结果受CLKCONCMD.OSC设置的限制,即如果CLKCONCMD.OSC=1且CLKCONCMD.TICKSPD=000,CLKCONCMD.TICKSPD读出001且实际TICKSPD是16MHz。

2:0CLKSPD001R/W

时钟速度。不能高于通过OSC位设置的系统时钟设置。表示当前系统时钟频率。

000:32MHz

001:16MHz

010:8MHz

011:4MHz

100:2MHz

101:1MHz

110:500kHz

111:250kHz

注意CLKCONCMD.CLKSPD可以设置为任意值,但是结果受CLKCONCMD.OSC设置的限制,即如果CLKCONCMD.OSC=1且CLKCONCMD.CLKSPD=000,CLKCONCMD.CLKSPD读出001且实际CLKSPD是16MHz。

还要注意调试器不能和一个划分过的系统时钟一起工作。当运行调试器,当CLKCONCMD.OSC=0时,CLKCONCMD.CLKSPD的值必须设置为000,或当CLKCONCMD.OSC=1设置为001。

CLKCONSTA (0x9E) - 时钟控制状态:

名称复位R/W描述
7OSC32K1R

当前选择的32kHz时钟源。

0:32kHz XOSC

1:32kHz RCOSC

6OSC1R

当前选择的系统时钟。

0:32MHz XOSC

1:16MHz RCOSC

5:3TICKSPD[2:0]001R

当前设置的定时器标记输出。

000:32MHz

001:16MHz

010:8MHz

011:4MHz

100:2MHz

101:1MHz

110:500kHz

111:250kHz

2:0CLKSPD001R

当前时钟速度。

000:32MHz

001:16MHz

010:8MHz

011:4MHz

100:2MHz

101:1MHz

110:500kHz

111:250kHz

(5)32Mhz时钟配置:

//设置系统主时钟频率为 32MHZ
void Clock_config_32MHz(void){CLKCONCMD &= ~0x40;                 //设置系统时钟源为32MHZ晶振while(CLKCONSTA & 0x40);           //等待晶振稳定为32MCLKCONCMD &= ~0x47;                //设置系统主时钟频率为32MHZ   }

(6) 16Mhz时钟配置:

//设置系统主时钟频率为 16MHZ
void Clock_config_16MHz(void){CLKCONCMD |= 0x40;             // 设置系统时钟源为 16MHz RCOSCwhile(CLKCONSTA & 0x40); CLKCONCMD &= ~0x3F;            // 先清除低6位CLKCONCMD |= 0x01;            // 设置定时器tick输出和时钟速度为16MHz
}

四、定时器1(Timer1)实现精确延时:

定时器1包含一个16位计数器,可在每个活动时钟边沿递增或递减。其活动时钟边沿周期由CLKCON.TICKSPD寄存器位定义,可设置全球系统时钟的划分,提供0.25MHz到32MHz的不同时钟频率,也可使用32MHz晶振作为时钟源。定时器1中的T1CTL.DIV设置的分频器值可进一步划分此频率,分频器值有1、8、32、128四种。当32MHz晶振作为系统时钟源时,定时器1的最低时钟频率为1953.125Hz,最高为32MHz;当16MHz RC振荡器作为系统时钟源时,定时器1的最高时钟频率为16MHz。

该计数器可作为自由运行计数器、模计数器或正计数/倒计数器运行,用于中心对齐的PWM。通过两个8位的SFR T1CNTH和T1CNTL读取16位计数器值,分别包含高位字节和低位字节。读取T1CNTL时,计数器的高位字节被缓冲到T1CNTH,以便读取,因此读取时需先读T1CNTL再读T1CNTH。写入T1CNTL寄存器会复位16位计数器。

计数器达到最终计数值(溢出)时产生中断请求,可通过T1CTL控制寄存器设置启动和停止计数器。写入非00值到T1CTL.MODE时计数器开始运行,写入00时计数器停止在当前值。

(1)定时器 1 操作模式 :

一般来说控制寄存器 T1CTL 用于控制定时器操作。状态寄存器 T1STAT 保存中断标志

自由运行模式:

在自由运行操作模式下,计数器从 0x0000 开始,每个活动时钟边沿增加 1。当计数器达到 0xFFFF(溢出),计数器载入 0x0000,继续递增它的值,如图下所示。当达到最终计数值 0xFFFF,设置标志 IRCON.T1IF 和T1STAT.OVFIF。如果设置了相应的中断屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,将产生一个中断请求。自由运行模式可以用于产生独立的时间间隔,输出信号频率。

模模式:

当定时器运行在模模式,16 位计数器从 0x0000 开始,每个活动时钟边沿增加 1。当计数器达到 T1CC0(溢出),寄存器 T1CC0H:T1CC0L 保存的最终计数值,计数器将复位到 0x0000,并继续递增。如果定时器开始于T1CC0 以上的一个值,当达到最终计数值(0xFFFF)时,设置标志 IRCON.T1IF 和 T1CTL.OVFIF。如果设置了相应的中断屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,将产生一个中断请求。模模式可以用于周期不是 0xFFFF的应用程序。

正计数/倒计数模式:

在正计数/倒计数模式,计数器反复从 0x0000 开始,正计数直到达到 T1CC0H:T1CC0L 保存的值。然后计数器将倒计数直到 0x0000,如图所示。这个定时器用于周期必须是对称输出脉冲而不是 0xFFFF 的应用程序,因此允许中心对齐的 PWM 输出应用的实现。在正计数/倒计数模式,当达到最终计数值时,设置标志IRCON.T1IF 和 T1CTL.OVFIF。如果设置了相应的中断屏蔽位 TIMIF.OVFIM 以及 IEN1.T1EN,将产生一个中断请求。 

(2) 寄存器说明:

T1CNTH (0xE3) - 定时器 1 计数器高位:

名称复位R/W描述
7:0CNTH[15:8]0x00R定时器计数器高字节。包含在读取T1CNTL的时候定时计数器缓存的高16位字节。

T1CNTL (0xE2) - 定时器 1 计数器低位:

名称复位R/W描述
7:0CNTL[7:0]0x00R/W定时器计数器低字节。包括16位定时器计数器低字节。往该寄存器中写任何值,导致计数器被清除为0x0000,初始化所有相通道的输出引脚。

T1CTL (0xE4) - 定时器 1 的控制和状态:

名称复位R/W描述
7:4-0000bR0保留
3:2DIV[1:0]00R/W

分频器划分值。产生主动的时钟边缘用来更新计数器。

00:标记频率/1       

01:标记频率/8        

10:标记频率/32 

11:标记频率/128

1:0MODE[1:0]00R/W

选择定时器1模式。定时器操作模式通过下列方式选择:

00:暂停运行。

01:自由运行,从0x0000到0xFFFF反复计数。

10:模,从0x0000到T1CC0反复计数。

11:正计数/倒计数,从0x0000到T1CC0反复计数并且从T1CC0倒计数到0x0000。

T1STAT (0xAF) - 定时器 1 状态:

名称复位R/W描述
7:6-0R0保留
5OVFlF0R/W0定时器1计数器溢出中断标志。当计数器在自由运行或模模式下达到最终计数值时设置,当在正计/倒计数模式下达到0时设置。写1没有影响。
4CH4IF0R/W0定时器1通道4中断标志。当通道4中断条件发生时设置。写1没有影响。
3CH3IF0R/W0定时器1通道3中断标志。当通道3中断条件发生时设置。写1没有影响。
2CH2IF0R/W0定时器1通道2中断标志。当通道2中断条件发生时设置。写1没有影响。
1CH1IF0R/W0定时器1通道1中断标志。当通道1中断条件发生时设置。写1没有影响。
0CH0IF0R/W0定时器0通道4中断标志。当通道0中断条件发生时设置。写1没有影响。

(3)微秒级延时函数:

/*定时器1 精确延时函数主频:32MHz
*/void Delay_us(unsigned int us) {// 寄存器 T1CC0H:T1CC0L 保存的最终计数值T1CC0L = 0x20;              // 低八位:0x20 = 32   T1CC0H = 0x00;              // 高八位:0x00 = 0 → 组合为0x0020// 计数值: 0x0020=32T1CTL = 0x02;               // 0000 0010 32Mhz  不分频  模模式
//  T1CTL = 0x06;               // 0000 0110 32Mhz  8分频   模模式
//  T1CTL = 0x0A;               // 0000 1010 32Mhz  32分频  模模式
//  T1CTL = 0x0E;               // 0000 1110 32Mhz  128分频 模模式while(us){ while(!((T1CNTL >= 0x20)&&(T1CNTH == 0x00)));us--;}T1CTL = 0x00;               //关闭定时器}

时钟频率32MHz,不分频,最大计数值为32,外层循环控制总的延时微秒数,内层循环等待定时器计数到目标值,每次达到目标值即表示经过1微秒,最后关闭定时器。(1/32000000)*32s=1us

(4)毫秒级延时函数:

void Delay_ms(unsigned int ms) {T1CC0L = 0xE8;               // 低八位:  0xE8 = 232        T1CC0H = 0x03;               // 高八位:  0x03 = 3 → 组合为0x03E8    // 计数值: 0x03E8=1000T1CTL  = 0x0A;               // 0000 1010 32分频  模模式while(ms){while(!((T1CNTL >= 0xE8)&&(T1CNTH >= 0x03)));ms--;}T1CTL = 0x00;               //关闭定时器
}

时钟频率32MHz,32分频,最大计数值为1000,外层循环控制总的延时微秒数,内层循环等待定时器计数到目标值,每次达到目标值即表示经过1毫秒,最后关闭定时器。(32/32000000)*1000s=1ms。

(5)秒级延时函数:

void Delay_s(unsigned int s) {T1CC0L = 0x24;   // 低八位:0x24 = 36T1CC0H = 0xF4;   // 高八位:0xF4 = 244 → 组合为0xF424// 计数值:0xF424 = 62500T1CTL = 0x0E;    // 0000 1110 32Mhz  128分频 模模式// 将秒数转换为 250ms 的循环次数(s × 4)s *= 4;while (s--) {// 等待定时器计数到62500(250ms)while(!((T1CNTL >= 0x24)&&(T1CNTH >= 0xF4)));}T1CTL = 0x00; // 关闭定时器
}

时钟频率32MHz,128分频,最大计数值为1000,外层循环控制总的延时微秒数,内层循环等待定时器计数到目标值,每次达到目标值即表示经过1毫秒,最后关闭定时器。(128/32000000)*62500*4s=1s。

五、延时实现LED闪烁:

#include <ioCC2530.h>
#include "LED.h"
#include "Delay.h"void main(void) {LED_Init();Clock_config_32MHz();// 主循环  while (1) {Delay_s(1);LED_Control(1);Delay_s(1);LED_Control(0);}
}

LED定时1s闪烁

六、代码下载:

代码下载链接

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

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

相关文章

23种设计模式-创建型模式-工厂方法

文章目录 简介场景问题1. 直接依赖具体实现2. 违反开闭原则3. 条件分支泛滥4. 代码重复风险 解决根本问题完整类图完整代码说明核心优势代码优化静态配置表动态策略 总结 简介 工厂方法是一种创建型设计模式&#xff0c;它提供了在父类中创建对象的接口&#xff0c;但允许子类…

Umi-OCR- OCR 文字识别工具,支持截图、批量图片排版解析

Umi-OCR 是免费开源的离线 OCR 文字识别软件。无需联网&#xff0c;解压即用&#xff0c;支持截图、批量图片、PDF 扫描件的文字识别&#xff0c;能识别数学公式、二维码&#xff0c;可生成双层可搜索 PDF。内置多语言识别库&#xff0c;界面支持多语言切换&#xff0c;提供命令…

【JavaEE】Mybatis基础使用注解 增删改查操作

目录 一、配置日志二、传递参数 #{}三、增(Insert)四、返回主键Options五、删&#xff08;Delete&#xff09;六、改&#xff08;Update&#xff09;七、查&#xff08;Select&#xff09; 一、配置日志 我们加上下面的代码在配置文件中&#xff0c;那么我们在日志中就可以看到…

4.2、网络安全体系与建设内容

目录 网络安全体系架构网络安全组织安全管理网络安全等级保护2.0等保项目流程等保标准变化等保2.0新增内容等保2.0变化智慧城市安全体系应用参考智能交通网络安全体系应用参考 网络安全体系架构 建设网络安全&#xff0c;要体系化&#xff0c;要从一个整体去做考虑&#xff0c…

TCP协议原理

TCP协议原理 本篇介绍 前面已经基本介绍了TCP编程的接口以及基本的步骤&#xff0c;但是并没有其中的原理进行解释。本篇主要聚焦于TCP原理部分&#xff0c;对TCP中重要的内容进行解释 TCP协议报格式 基本示意图如下&#xff1a; 下面针对每一个字段的作用进行简要的概括&a…

go中的文件、目录的操作

1.文件的概念 文件是数据源(保存数据的地方)的一种,比如大家经常使用的word文档,txt文件,excel文件等。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频,声音等。 文件在程序中以流的形式来操作的。 流:数据在数据源(文件)和程序(内存)之间…

electron js node vscode 调试electron

用npm会下到home里面不知道为什么可能是淘宝源的问题 --------------------------------- 安装cnpm&#xff08;可选&#xff09; sudo npm install -g cnpm --registryhttps://registry.npmmirror.com下下来还没办法直接用 sudo find / -name "cnpm"nano ~/.bashr…

深度解析 BPaaS:架构、原则与研发模式探索

在当今复杂多变的业务环境下&#xff0c;软件开发面临着诸多挑战&#xff0c;如何有效地管理业务复杂性并实现系统的可扩展性成为关键。BPaaS应运而生&#xff0c;它作为一种创新的理念和架构模式&#xff0c;改变着企业研发的方式。本文将深入探讨 BPaaS 是什么&#xff0c;以…

大模型架构记录2 【综述-相关代码】

一 简单聊天机器人搭建 1.1 openai调用 import os from openai import OpenAI from dotenv import load_dotenv, find_dotenvload_dotenv() client OpenAI()# 打印所支持的模型 model_lst client.models.list()for model in model_lst:print (model.id)# 调用API接口 comp…

三个print优雅打印datetime模块的“时间密码”

三个模块&三条print()&#xff0c;玩转python时间的上上下下&#xff0c;优雅打印“时间密码”。 笔记模板由python脚本于2025-03-23 22:50:43创建&#xff0c;本篇笔记适合正确研究时间/日期的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出…

【Android】VehiclePropertyAccess引起CarService崩溃

VehiclePropertyAccess引起CarService崩溃 VehiclePropertyAccess VehiclePropertyAccess属性&#xff0c;用于定义车辆属性的访问权限。权限包括 读&#xff1a;READ&#xff0c;只可以读取&#xff0c;不能写入。 VehiclePropertyAccess:READ写&#xff1a;WRITE&#xf…

深入理解traceroute命令及其原理

traceroute 是一个网络诊断工具&#xff08;Windows上叫tracert&#xff09;&#xff0c;用于显示数据包从本地主机到远程主机经过的路由&#xff08;跳数&#xff09;。它可以帮助您了解数据包在网络中的传输路径&#xff0c;以及每跳的延迟情况。这对于网络故障排除、分析网络…

Playwright + MCP:用AI对话重新定义浏览器自动化,效率提升300%!

一、引言&#xff1a;自动化测试的“瓶颈”与MCP的革新 传统自动化测试依赖开发者手动编写脚本&#xff0c;不仅耗时且容易因页面动态变化失效。例如&#xff0c;一个简单的登录流程可能需要开发者手动定位元素、处理等待逻辑&#xff0c;甚至反复调试超时问题。而MCP&#xf…

JVM 学习前置知识

JVM 学习前置知识 Java 开发环境层次结构解析 下图展示了 Java 开发环境的层级关系及其核心组件&#xff0c;从底层操作系统到上层开发工具&#xff0c;逐步构建完整的开发与运行环境&#xff1a; 1. 操作系统&#xff08;Windows, MacOS, Linux, Solaris&#xff09; 作用&…

【Java/数据结构】队列(Quque)

本博客将介绍队列的相关知识&#xff0c;包括基于数组的普通队列&#xff0c;基于链表的普通队列&#xff0c;基于数组的双端队列&#xff0c;基于链表的双端队列&#xff0c;但不包括优先级队列&#xff08;PriorityQueue&#xff09;&#xff0c;此数据结构将单独发一篇博客&…

深度学习Python编程:从入门到工程实践

第一章 Python语言概述与生态体系 1.3 Python在工业界的应用场景 # 示例:使用FastAPI构建RESTful接口 from fastapi import FastAPI from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: float@app.post("/items/") async def cr…

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听&#xff08;断网/网络恢复事件监听&#xff09; 一、简单介绍 二、conne…

matlab的meshgrid

文章目录 一、什么是 meshgrid&#xff1f;二、基本语法三、为什么需要 meshgrid&#xff1f;四、meshgrid 与 ndgrid 的区别 一、什么是 meshgrid&#xff1f; meshgrid 是 MATLAB 中用于生成网格点坐标矩阵的函数&#xff0c;常用于三维绘图&#xff08;如 surf, mesh, cont…

word插入Mathtype公式居中和自动更新

word插入公式自动更新 前提&#xff1a;安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…

用 pytorch 从零开始创建大语言模型(六):对分类进行微调

用 pytorch 从零开始创建大语言模型&#xff08;六&#xff09;&#xff1a;对分类进行微调 6 微调用于分类6.1 微调的不同类别6.2 准备数据集6.3 创建数据加载器6.4 使用预训练权重初始化模型6.5 添加分类头部6.6 计算分类损失和准确率6.7 在监督数据上微调模型6.8 使用LLM进…