【GD32系列--基本定时器Timer + 定时1ms 灯光间隔1s闪烁例程】
这里写目录标题
- 一、定时器的作用
- 二、定时器简介
- 1、定时器类型
- 2、时钟树
- 3、定时器功能配置框图
- 三、定时器寄存器分析
- 1、控制寄存器(TIMERx_CTL0))
- 2、DMA 和中断使能寄存器 (TIMERx_DMAINTEN)
- 3、预分频寄存器 (TIMERx_PSC)
- 4、计数器自动重载寄存器 (TIMERx_CAR)
- 5、中断标志寄存器 (TIMERx_INTF)
- 四、定时器的配置
- (1)时钟使能
- (2)初始化定时器参数
- (3)设置允许更新中断。(即:TIMERx-DMAINTEN)
- (4)中断优先级设置。
- (5)使能定时器
- (6)编写中断服务函数
- 五、定时器核心配置示例(定时1ms)
- 六、定时器定时(溢出)时间计算
- 1、定时器的时钟源。
- 2、定时器频率
- 3、自动重装载值
一、定时器的作用
- 定时功能,设置不同时间长度的定时。(系统滴答定时器一般用来提供“心跳”作用)如延时操作、周期性任务调度、测试某段代码的执行时间等。
- 中断触发:定时器可以在达到设定的计数值时产生中断,从而触发中断服务程序。这种机制使得CPU可以在处理其他任务的同时,响应定时器的中断请求,执行相应的中断服务程序。这对于需要实时响应的应用场景非常有用,如实时数据采集、实时控制等。
- 与GPIO一起实现外设功能。如
PWM
输入捕获、输出比较、DMA
、占空比
等。其中PWM(脉冲宽度调制)输出,应用于控制电机、调节亮度、产生音频等场景的信号。通过配置定时器的PWM模式和相关参数,可以精确地控制PWM信号的频率
和占空比
,从而实现对外部设备的精确控制。 - 外部事件计数:GD32F350的定时器还可以用于测量外部事件的频率或计数外部事件的发生次数。通过将定时器的输入连接到外部信号源,可以实现对外部信号的精确测量和计数。
二、定时器简介
1、定时器类型
以GD32为例,此款芯片共有8个定时器。分三大类:高级定时器、通用定时器和基本定时器。
2、时钟树
各定时器挂载总线不同。
3、定时器功能配置框图
(1)高级定时器
高级定时器(TIMER0)是四通道定时器,支持输入捕获和输出比较。可以产生PWM信号控制电机和电源管理。
高级定时器含有一个16位无符号计数器。
高级定时器是可编程的,可被用来计数,其外部事件可以驱动其他定时器
高级定时器包含了一个死区时间插入模块,非常适合电机控制。
定时器和定时器之间是相互独立,但是它们可以被同步在一起形成一个更大的定时器,这些定时器的计数器一致地增加。
(2)通用定时器
(3)基本定时器
基本定时器可以由内部时钟源
CK_TIMER驱动。
基本定时器时钟内部连接到TIMER_CK。
基本定时器仅有一个时钟源TIMER_CK,用来驱动计数器预分频器。当CEN置位,TIMER_CK 经过预分频器(预分频值由TIMERx_PSC寄存器确定)产生PSC_CLK。
三、定时器寄存器分析
以常用的通用定时器为例。
1、控制寄存器(TIMERx_CTL0))
最低位 CEN 为计数器使能
0:计数器禁能
1:计数器使能
在软件将CEN位置1后,外部时钟、暂停模式和编码器模式才能工作。触发模式可
以自动地通过硬件设置CEN位。
第7位 ARSE 自动重载影子使能
0:禁能TIMERx_CAR寄存器的影子寄存器
1:使能TIMERx_CAR寄存器的影子寄存器
第8、9位 CKDIV[1:0] 时钟分频。
其中,使用定时器的前提是要使能时钟 enable a TIMER ,即TIMER_CTL0_CEN置1
此设置一般在timer_enable()函数里。
TIMER_CTL0(timer_periph) |=(uint32_t)TIMER_CTL0_CEN;
2、DMA 和中断使能寄存器 (TIMERx_DMAINTEN)
最低位:UPIE 更新中断使能
0:禁止更新中断
1:使能更新中断
第1位:CH0IE 通道0比较/捕获中断使能
0:禁止通道0中断
1:使能通道0中断
第8位:UPDEN 更新DMA请求使能
0:禁止更新DMA请求
1:使能更新DMA请求
第9位:CH0DEN 通道0比较/捕获 DMA请求使能
0:禁止通道0比较/捕获DMA请求
1:使能通道0比较/捕获DMA请求
第14位 TRGDEN 触发DMA请求使能
0:禁止触发DMA请求
1:使能触发DMA请求
常用在enable the TIMER DMA 和 enable the TIMER interrupt 里。
TIMER_DMAINTEN(timer_periph) |= (uint32_t)interrupt;//timer_interrupt_enable()
TIMER_DMAINTEN(timer_periph) |= (uint32_t)dma;//timer_dma_enable()
3、预分频寄存器 (TIMERx_PSC)
TIMER_PSC(timer_periph) =(uint16_t)initpara->prescaler;//设置预分频值
常用在定时器的初始化中,如:timer_init()
4、计数器自动重载寄存器 (TIMERx_CAR)
计数器自动重载寄存器 (TIMERx_CAR)在物理上对应着两个寄存器。一个是可以直接操作的,一个是看不到的。看不到的那个寄存器叫影子寄存器,其实真正起作用的是影子寄存器。由控制寄存器(TIMERx_CTL0))中的ARSE位的设置
:
当ARSE = 0
:禁能TIMERx_CAR寄存器的影子寄存器。在这种情况下,对TIMERx_CAR寄存器的直接写操作将直接修改该寄存器的值,而没有备份或影子值。预装载寄存器的内容可随时传送到改寄存器,此时两者是相通的。
当ARSE=1
:使能TIMERx_CAR寄存器的影子寄存器,当启用影子寄存器时,对TIMERx_CAR寄存器的写操作实际上首先会更新影子寄存器的值。在某些特定的条件或事件(如硬件复位或特定的同步事件)发生时,影子寄存器的值会被复制到主寄存器中,从而确保主寄存器中的值始终是一个可靠和一致的备份。在每一次更新事件时,才把预装载寄存器的内容传送到影子寄存器,自动重装载寄存器的位描述如上所示。
5、中断标志寄存器 (TIMERx_INTF)
该寄存器用来标记当前与定时器相关的各种事件/中断是否发生。其位描述如下:
第7位 BRKIF 中止中断标志位
一旦中止输入有效,由硬件对该位置‘1’。如果中止输入无效,则该位可由软件清‘0’。
0:无中止事件产生
1:中止输入上检测到有效电平
最低位UPIF 更新中断标志
此位在任何更新事件发生时由硬件置1,软件清0。
0:无更新中断发生
1:发生更新中断
四、定时器的配置
通过库函数进行配置,相关的库函数有gd32f20x_timer.h 和 stm32120x_timer.c 文件。
(1)时钟使能
TIMERx是挂在APB1之下的,通过APB1总线下的使能函数来使能TIMERx。例如:
rcu_periph_clock_enable(RCU_TIMER5)
(2)初始化定时器参数
如设置自动重装值、分频系数 、计数方式等。
定时器的初始化参数是通过初始化函数timer_init实现的。例如:
timer_init(TIMER5, &timer_initpara);
第一个参数:确定定时器;
第二个参数:定时器初始化化参数结构体指针,结构体类型为 timer_parameter_struct
,其结构体定义为:
typedef struct
{ uint32_t prescaler; // 预分频值 uint32_t alignedmode; // 对齐模式 uint32_t countermode; // 计数器模式 uint32_t period; // 自动重载值 uint32_t clockdivision; // 时钟分频因子 uint32_t repetitioncounter; // 重复计数器值
} timer_parameter_struct;
(3)设置允许更新中断。(即:TIMERx-DMAINTEN)
因为我们要使用TIMER5的更新中断,寄存器的相应位便可使能更新中断。在库函数里面定时器中断使能是通过timer-interrupt-enable()函数来实现的。
void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt)
timer_periph:选择定时器,取值为TIMERx(x=0.13).
interrupt:用来指明使能的定时器中断的类型,定时器中断的类型有很多种,包括TIMER-INTUP、TIMER_INT_TRG、TIMER_INT_BRK、TIMER_INT_CH0等。
例如:
timer_interrupt_enable(TIMER5,TIMER_INT_UP);
(4)中断优先级设置。
定时器中断使能后,因为要产生中断,所以要设置中断NVIC相关寄存器,设置中断优先级。
例如:
void timer1_nvic_config(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);nvic_irq_enable(TIMER5_IRQn, 0, 1);
}
(5)使能定时器
允许定时器工作,即开启定时器。配置完定时器后要启动定时器,通过TIMER_CTL0的TIMER_CTL0_CEN来设置,通常是通过函数timer_enable(TIMERx)来实现。例如:
timer_enable(TIMER5);
(6)编写中断服务函数
此函数的功能是用来处理定时器产生的相关中断。在中断产生后,通过状态寄存器的值去判断此次产生的中断属于什么类型。
然后,执行相关的操作,大多使用更新(溢出)中断,即中断标志寄存器TIMER_INTF的最低位。处理完中断之后应想TIMER_INTF最低位写零,来清楚中断标志。
来读取中断状态寄存器的值来判断中断类型的函数是:
timer_interrupt_flag_get
读取该函数的目的是:判断定时器的中断类型是否发生中断。例如:
判断定时器5是否发生更新(溢出)中断,方法为:
if(SET == timer_interrupt_flag_get(TIMER1,TIMER_INT_UP))
{timer_interrupt_flag_clear(TIMER1,TIMER_INT_UP);//清除中断标志位//其它程序……}
五、定时器核心配置示例(定时1ms)
/*brief configure the TIMER peripheralparam[in] noneparam[out] noneretval none*/
void timer5_init(void)
{/* TIMER5 configuration: generate 1msSystemCoreClock =72MHZTIMER1CLK = SystemCoreClock / 72= 1MHz */timer_parameter_struct timer_initpara; //定时器参数// 时钟使能 rcu_periph_clock_enable(RCU_TIMER1); timer_deinit(TIMER5);/*初始化定时器参数*//* TIMER1 configuration */timer_initpara.prescaler = 71;timer_initpara.alignedmode = TIMER_COUNTER_EDGE;timer_initpara.counterdirection = TIMER_COUNTER_UP;timer_initpara.period = 999;timer_initpara.clockdivision = TIMER_CKDIV_DIV1;timer_init(TIMER5, &timer_initpara);timer_auto_reload_shadow_enable(TIME5);timer_interrupt_flag_clear(TIMER5,TIMER_INT_UP);/* 设置允许更新中断TIMERx-DMAINTEN*/ timer_interrupt_enable(TIMER5,TIMER_INT_UP); /*中断优先级设置*///TIMER1 interrupt setting, preemptive priority 0, sub-priority 3nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);nvic_irq_enable(TIMER5_IRQn, 0, 3); /* 使能定时器*/timer_enable(TIMER5); // rcu_periph_clock_disable(RCU_TIMER5);/*先关闭等待使用*/
}/** 中断服务程序* @brief This function handles TIMER1 interrupt request.* @param None* @retval None*/
void TIMER5_IRQHandler(void)
{if ( SET == timer_interrupt_flag_get(TIMER5 , TIMER_INT_UP) ) {timer_interrupt_flag_clear(TIMER5 , TIMER_INT_UP);time++;}
}/*主函数*/
volatile uint32_t time = 0; // ms 计时变量
int main(void)
{//system clocks configurationsystemclk_init();/* configure the TIMER peripheral */timer5_init();/* configure LED1 GPIO port */led_init(LED1);//Enable TIMER1 clock// rcu_periph_clock_enable(RCU_TIMER1);while(1) {if ( time ==1000 ) /* 1000 * 1 ms = 1s 时间到 */{time = 0;/* LED 取反 */ led_toggle(LED1); } }
}
或者直接定时1s,进行使用。
void TIME_Ms(uint32_t ms)
{timer_val = ms;while(timer_val);
}
void TIMER5_IRQHandler(void)
{if(SET == timer_interrupt_flag_get(TIMER5, TIMER_INT_FLAG_UP)){timer_interrupt_flag_clear(TIMER5, TIMER_INT_FLAG_UP);if(timer_val) --timer_val;}
}/*主函数*/
volatile uint32_t timer_val= 0; // ms 计时变量
int main(void)
{//system clocks configurationsystemclk_init();/* configure the TIMER peripheral */timer5_init();/* configure LED1 GPIO port */led_init(LED1);//Enable TIMER1 clock// rcu_periph_clock_enable(RCU_TIMER1);while(1) {TIME_Ms(1000); /* 1000 * 1 ms = 1s 时间到 */led_toggle(LED1); }
}
六、定时器定时(溢出)时间计算
1、定时器的时钟源。
(以下均以基本定时器time5为例,time5在APB1后分频所得)
定时器时钟CK_TIMER5经 APB1 预分频器后分频提供。
如果 APB1 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是 2,关注 RCU_APB1_CKAHB_DIV2;,即 PCLK1=36M,所以定时器时钟 CK_TIMER=36*2=72M,即和系统时钟的值相同。
参考:【GD32】_时钟架构及系统时钟频率配置
其时钟初始化代码在system_stm32f20x.c定义的,这里使用的默认配置,具体时钟设置函数是system_clock_72m_hxtal(),代码如下:
static void system_clock_72m_hxtal(void)
{uint32_t timeout = 0U;uint32_t stab_flag = 0U;/* enable HXTAL */RCU_CTL |= RCU_CTL_HXTALEN;/* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */do {timeout++;stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);} while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));/* if fail */if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)) {while(1) {}}/* HXTAL is stable *//* AHB = SYSCLK */RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;/* APB2 = AHB/2 */RCU_CFG0 |= RCU_APB2_CKAHB_DIV2;/* APB1 = AHB/2 */RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;/* CK_PLL = (CK_PREDIV0) * 9 = 72 MHz *///当晶振为8M时RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLDV | RCU_CFG0_PLLSEL);RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M| RCU_PLL_MUL6);//选择外部晶振12M/* enable PLL1 */RCU_CTL |= RCU_CTL_PLL1EN;/* wait till PLL1 is ready */while((RCU_CTL & RCU_CTL_PLL1STB) == 0U) {}/* enable PLL */RCU_CTL |= RCU_CTL_PLLEN;/* wait until PLL is stable */while(0U == (RCU_CTL & RCU_CTL_PLLSTB)) {}/* select PLL as system clock */RCU_CFG0 &= ~RCU_CFG0_SCS;RCU_CFG0 |= RCU_CKSYSSRC_PLL;/* wait until PLL is selected as system clock */while(0U == (RCU_CFG0 & RCU_SCSS_PLL)) {}
}
2、定时器频率
TIMER5上的时钟为72Mhz,定时器分频系数为71,因此TIME5的频率为
CK_CNT=TIMERxCLK/(PSC+1)=1MHz
3、自动重装载值
Prtscaler (定时器分频系数) : 71
Counter Mode(计数模式) :Up(向上计数模式)
Counter Period(自动重装载值) : 999
CKD(时钟分频因子) : No Division 不分频
所以溢出时间Tout = 1/1MHZ *(999+1) =1ms
自动重装载值计算溢出时间要加1,这是因为自动重装载寄存器 TIMERx_CAR是从0开始计数的。
相关文章:

【GD32系列--基本定时器Timer + 定时1ms 灯光间隔1s闪烁例程】
这里写目录标题 一、定时器的作用二、定时器简介1、定时器类型2、时钟树3、定时器功能配置框图 三、定时器寄存器分析1、控制寄存器(TIMERx_CTL0))2、DMA 和中断使能寄存器 (TIMERx_DMAINTEN)3、预分频寄存器 (TIMERx_PSC)4、计数器自动重载寄存器 (TIME…...

第11章 集合与迭代器
目录 目录 目录 11.1 Collection集合 11.1.1 集合的概念 11.1.2 Collection接口 1、添加元素 2、删除元素 3、查询与获取元素 11.2 List 有序集合 11.2.1 新增方法 11.2.2 ArrayList 11.2.3 LinkedList 1、单向链表 2、双向链表 3、删除元素 11.3 Set 无序集合 …...

探索Linux中的神奇工具:探秘tail命令的妙用
探索Linux中的神奇工具:探秘tail命令的妙用 在Linux系统中,tail命令是一个强大的工具,用于查看文件的末尾内容。本文将详细介绍tail命令的基本用法和一些实用技巧,帮助读者更好地理解和运用这个命令。 了解tail命令 tail命令用…...

1688商品API接口:电商数据自动化的新引擎
1688作为中国领先的B2B电子商务平台,为广大商家和制造商提供了一个展示和交易商品的广阔市场。随着1688商品API接口的推出,开发者和商家现在能够通过编程方式自动化获取和管理商品数据,极大地提高了工作效率和数据处理的灵活性。 一、1688商…...

路由器不能端口映射什么原因?如何设置内网映射?
近期有小伙伴发来求助信息,他以前开游戏服务器和别人一起玩,那个时候端口映射还好,不知道哪一天开始突然不行了,已经是公网了,光猫是桥接的状态,连路由器都换了,就是不能端口映射开服务器&#…...

开源RAG,本地mac启动 dify源码服务
一、Dify文档 参考官方文档来操作,基本没太大的问题。一些细节,我在本篇文章中补充了出来。 这篇文章主要讲以源码的方式启动后端服务,前端服务使用容器启动。 dify 文档地址 欢迎使用 Dify | 中文 | Dify Dify 本地源码部署文档ÿ…...

【Linux取经路】基于信号量和环形队列的生产消费者模型
文章目录 一、POSIX 信号量二、POSIX 信号量的接口2.1 sem_init——初始化信号量2.2 sem_destroy——销毁信号量2.3 sem_wait——等待信号量2.4 sem_post——发布信号量 三、基于环形队列的生产消费者模型3.1 单生产单消费模型3.2 多生产多消费模型3.3 基于任务的多生产多消费模…...

计算机SCI期刊,中科院2区,收稿范围非常广泛!
一、期刊名称 Journal of Web Semantics 二、期刊简介概况 期刊类型:SCI 学科领域:计算机科学 影响因子:2.5 中科院分区:2区 出版方式:开放出版 版面费:$1600 三、期刊征稿范围 《网络语义学杂志》…...

JDK、JRE、编译指令和垃圾回收机制详解
JDK 全称 Java SE Development Kit (Java 开发工具包) JVM虚拟机:Java运行的地方 核心类库:Java提前编好的东西 开发工具: javac,java,jdb,jhat javac:Java编译器,用于将Java源代码编译成Java字节码文件(.class)。 java: java…...

【ARM 嵌入式 C 入门及渐进 6.2 -- ARMv8 C 内嵌汇编读系统寄存器的函数实现】
请阅读【嵌入式开发学习必备专栏】 文章目录 ARMv8 C 内嵌汇编读系统寄存器 ARMv8 C 内嵌汇编读系统寄存器 要在ARMv8架构中通过C代码和内嵌汇编来读取系统寄存器s3_0_c15_c5_5的值,并将其返回,可以按照以下方式实现system_read_reg函数: #…...

使用 LlamaParse 进行 PDF 解析并创建知识图谱
此 Python 笔记本提供了有关利用 LlamaParse 从 PDF 文档中提取信息并随后将提取的内容存储到 Neo4j 图形数据库中的综合指南。本教程在设计时考虑到了实用性,适合对文档处理、信息提取和图形数据库技术感兴趣的开发人员、数据科学家和技术爱好者。 该笔记本电脑的主…...

Oracle行迁移解析
行迁移(Row Migration)是Oracle数据库中的另一个现象,它与行链接类似,都是由于数据行大小的变化导致的存储问题,但其本质和影响有所不同。 触发条件:行迁移发生在当一个已存在的、原先能够完全存储在一个数…...

【k8s】 busybox镜像、挂载volume卷
1. 概述 busybox是一个包含了nslookup,ping,wget等网络处理命令的Pod容器(不含curl命令),它的体积非常小,适合做一些容器内的网络调试。 即创建一个docker ,进去执行 ping 命令等 2. 启动容器 2.1 会自动退出&…...

文本三剑客之 sed 编辑器
一.sed 概述 1.sed 介绍 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个 命令文本文件中。 2.sed 的工…...

【MySQL精通之路】SQL优化(1)-查询优化(3)-索引合并
主博客: 【MySQL精通之路】SQL优化(1)-CSDN博客 上一篇: 【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客 下一篇: 目录 1.索引合并-交集访问算法 2.索引合并联合访问算法 3.索引合并-排序联合访问算法 4.影响索引合…...

Linux中安装配置并使用samba服务(Centos以及Ubuntu)
目录 前言1. 基本知识2. Centos3. Ubuntu3.1 物理服务器3.2 云服务器前言 在window与linux系统中配置一个共享文件夹,可以做很多时间,比如映射器或者像linux中定时存放文件等 1. 基本知识 在Ubuntu上安装和配置Samba服务可以让你的Ubuntu机器与Windows、macOS以及其他Linu…...

three.js能实现啥效果?看过来,这里都是它的菜(06)
这是第五期了,本期继续分享three.js可以实现的3D动画案例,有老铁反馈再发案例的时候,是否可以顺道分享一下three.js的知识点,好吧,安排。 材质动画 材质动画可以实现各种复杂的视觉效果,包括但不限于以下…...

利用ESP32-C3将TF卡内容变成U盘进行读取
利用ESP32-C3将TF卡内容变成U盘进行读取 ESP32-C3是一款高性价比的微控制器,具备WiFi和蓝牙功能,广泛应用于物联网(IoT)项目中。除了常见的无线通信功能外,ESP32-C3还可以用来模拟U盘读取TF卡内容。本文将介绍如何通过…...

C++小病毒
C小病毒(注:对电脑无过大伤害) 短短行,创造奇迹! 把这个文件命名为virus.exe就可以使用了。 #include<bits/stdc.h> #include<windows.h> using namespace std; int main() {HWND hwnd GetForegroundW…...

使用VUE3+TS+elementplus创建一个增加按钮
一、前言 在上一篇文章中分享了创建table的过程,详见(VUE3TSelementplus创建table,纯前端的table),本文在创建好的table的基础上,再创建一个增加按钮。 二、程序展示 1、前面创建table的程序 <templ…...

Python面试宝典:文件读写和上下文管理器以及输入输出流面试题(1000加python面试题助你轻松捕获大厂Offer)
Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第一部分:Python基础:第八章:文件操作和输入输出:第一节:文件读写和上下文管理器以及输入输出流】 第八章:文件操作和输入输出第一节:文件读写和上下文管理器以及输入输出流1.1、文件读写基本操作1.1.1、打开…...

Spring Boot | Spring Boot 实现 “记住我“ 功能
目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 )二、实现 "记住我" 功能 ( 通过 "HttpSecurity类" 的 rememberMe( )方法来实现 "记住我" 功能 ) :2.1 基于 "简单加密 Token" 的方式 ( 实现 "记住我&…...

AGM AG32 MCU替代GD32F407/STM32F407的手持示波器方案
一、AG32 MCU替代GD32F407/STM32F407的数字示波器方案 市场上有多款数字迷你示波器,特别小巧,携带非常方便。单通道,标注100Mhz带宽,500MS采样率。 这样高的采样率需要使用高速AD及很高性能的处理器。原方案使用AD9288双通道8bit …...

MongoDB基础入门到深入(八)MongoDB整合SpringBoot、Chang Streams
文章目录 系列文章索引十五、MongoDB整合SpringBoot1、环境准备2、集合操作3、文档操作(1)相关注解(2)创建实体(3)添加文档(4)查询文档(5)更新文档࿰…...

linux下的nfs概述与实验(openEuler22.03)
目录 什么是NFSNFS工作原理NFS常用文件/etc/exports文件/etc/exports格式 /var/lib/nfs/etab文件 NFS常用选项NFS配置方式1. 安装NFS和RPC2. 启动rpcbind和nfs3. 准备目录4. 配置/etc/exports并重启服务5. 连接测试服务端自我测试客户端测试 补充常用命令永久挂载注意 什么是NF…...

影响Oracle数据库打开速度的因素
当Oracle发起一个事务需要更改数据时,如果所涉及的数据块不在BUFFER CACHE中,那么Oracle服务进程首先会将相关数据块从数据文件中读进BUFFER CACHE进行更改(直接路径读除外),更改后的数据块称之为脏块(DIRT…...

dify:开源 LLMOps平台。
单纯笔记: 一、关于 Dify dify/README_CN.md at main langgenius/dify GitHub Dify 是一款开源的大语言模型(LLM)应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以…...

CCF20220601——归一化处理
CCF20220601——归一化处理 代码如下: #include<bits/stdc.h> using namespace std; int main() {int n,a[1000],sum0;scanf("%d",&n);for(int i1;i<n;i){scanf("%d",&a[i]);suma[i];}double aver1.0,b0.0,d1.0;aversum/(n*1…...

用Ai编写一个电机驱动程序
问:帮我写一个步进电机的控制程序,要有包括加减速,以及电机步中断处理函数。 答:编写一个步进电机的控制程序涉及到硬件层面的操作,通常需要依赖特定的硬件平台和相应的驱动程序。以下是一个简化的示例,它展…...

【C++入门】—— C++入门 (下)_内联函数
前言:在了解完前面的C基础内容后,马上我们就要真正不如C的学习了,但在之前让我们最后了解最后一点点C入门知识!来迟的520特别篇! 本篇主要内容: 内联函数 auto关键字 范围for 指针空值nullptr C入门 1. 内联…...