【STM32】Systick定时器
一、STM32的5种定时器简介
1.独立看门狗(IWDG) VS 窗口看门狗(WWDG)
1.独立看门狗(IWDG)
独立看门狗:当没有到设定时间之前,给它喂了狗,就会回到初始值。

2.窗口看门狗(WWDG)
窗口看门狗:只有在设定的窗口时间范围内喂才可以起效果
最适合哪些要求看门狗在精确计时窗口起作用。

2.Systick定时器
3.高级定时器(TIM1+TIM8)



4.通用定时器(TIMx)
1)输入捕获:通过输入电平进行捕获
2)产生中断:
定时器时间到
触发事件
3)正交编码器和霍尔传感器(测小车速度)

5.基本定时器(TIM6 & TIM7)
1)最多只能计数65535(2的16次方)
2)预分频器(因为在定时器的频率不需要那么快)
3)可以产生中断

二、SYSTICK定时器
0.SYSTICK的提出
我们之前的51只有一个主线(无操作系统),一个进程走到死
我们想要多种进程并行工作,但是实际上无法这样。因为后面的程序可能还没有等到执行,时间就结束了。所以我们将每一个程序都分成多个小进程,第一个进程的第一个小部分执行完成在执行第二个进程的第一小部分....【从而实现微观上的串行,宏观上的并行】
1.SYSTICK定时器的作用
1)专用于生产RTOS的系统滴答时钟【因为RTOS需要多进程执行】
2)可用于裸机程序中短时间精确延时函数
3)可用于普通定时器中断功能
2.SYSTICK定时器的数据手册
https://www.st.com/resource/en/programming_manual/cd00228163-stm32f10xxx-20xxx-21xxx-l1xxxx-cortex-m3-programming-manual-stmicroelectronics.pdf
SYSTICK和NVIC不属于SoC部分【属于内核外设】
1.24个定时器

2.各种寄存器

1.STK_CTRL(控制状态)

2.STK_LOAD(初始值)
我们计算出来的值要-1
因为计时是4 3 2 1 0 4 3 2 1 0【0才表示结束】

3.STK_VAL(计数值)

4.STK_CALIB
校准

3.SYSTICK寄存器在标准库中的封装
SYSTICK放在misc.c中
1. SysTick_CLKSourceConfig--分频设置
本函数在misc.c中
SYSTICK本身没有分频器。所以需要通过本函数进行设置
/*** @brief Configures the SysTick clock source.* @param SysTick_CLKSource: specifies the SysTick clock source.* This parameter can be one of the following values:* @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.* @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.* @retval None*/
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{/* Check the parameters */assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));if (SysTick_CLKSource == SysTick_CLKSource_HCLK){SysTick->CTRL |= SysTick_CLKSource_HCLK;}else{SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;}
}
全局搜索SYSTICK

2.SysTick_Config--触发systick中断
本函数在core_cm3.h中
Systick config函数配置的状况是: 默认使用AHB时钟。会产生中断,中断优先级为最低,并且最末尾启动了定时器
/*** @brief Initialize and start the SysTick counter and its interrupt.** @param ticks number of ticks between two interrupts* @return 1 = failed, 0 = successful** Initialise the system tick timer and its interrupt and start the* system tick timer / counter in free running mode to generate * periodical interrupts.*//**Systick config函数配置的状况是:默认使用AHB时钟。会产生中断中断优先级为最低,并且最末尾启动了定时器
*/
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//检验有没有超过24位寄存器
//SysTick_LOAD_RELOAD_Msk: 0xFFFFFFulif (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
//减一:因为我们是从0开始的 ,但是一般我们都不在乎因为影响不大 SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
//设置中断优先级,默认设置最低NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */SysTick->VAL = 0; //让它上来直接完了 /* Load the SysTick Counter Value *///SysTick_CTRL_CLKSOURCE_Msk(1):默认使用AHB//SysTick_CTRL_TICKINT_Msk:默认会产生中断//SysTick_CTRL_ENABLE_Msk:启动了定时器SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */return (0); /* Function successful */
3.注意点:SysTick_Config VS SysTick_CLKSourceConfig的调用顺序
我们在调用库函数进行初始化的时候,要先调用【SysTick_Config】然后再调用【SysTick_CLKSourceConfig】,因为再【SysTick_Config】中对Systick_CTRL中是对其中几位bit进行直接赋值,而不是位或。所以如果先定义【SysTick_CLKSourceConfig】则相关寄存器的值可能被覆盖掉。
4.SYSTICK定时器的2种工作方式
1.中断方式
使能后,到中断处理程序查
2.查询方式
检测STK_VAL,因为VAL会不断减少
5.SYSTICK定时器的定时计算
1.公式:重装载值=systick时钟频率(Hz)*想要定的时间(s)
2.例子:1ms
我们使用原始的频率:72MHZ=72 000 000HZ
以1s为单位---》1ms==0.001s
CNT=72 000 000*0.001=72 000
查看是否超过2的24次方
3.查询方式和中断方式都这样计算
6.SYSTICK中断实现LED每200ms闪烁一次【中断方式-interrupt】
https://www.cnblogs.com/kinson/p/7967332.html
0.注意点:
1)SYSTICK是自动清除中断,不需要手动将其清除
2)SYSTICK是内核中的,所以不需要打开SYSTICK时钟,它一直都是打开的
1.接线
我们将led的j19接到PB0-PB7,但是实际上我们就操作led1,所以使用到PB0


2.NVIC_Configuration


void NVIC_Configuration(void)
{// NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //分配中断向量表
#else /* VECT_TAB_FLASH *///表示从FLASH中启动;;/* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif/* Configure one bit for preemption priority */// NVIC_PriorityGroup_1:2个抢占优先级,8个次优先级/*NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置中断优先级// Enable the SYSTICK Interrupt //设置为SYSTICK//这里我们将下面代码注释起来是因为【NVIC_IRQChannel】只接受正整数//但是我们【SysTick_IRQn】是负数,所以不能正确输出NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn; //中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //强占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//次优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能NVIC_Init(&NVIC_InitStructure);//初始化中断*/
}
3.GPIO_Configuration
//GPIO初始化
void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;//PB0 ---LED1【LED的显示输出】GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);// 默认输出0让LED亮//RESET=0//SET=1GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_RESET); }
4.RCC_Configuration
//RCC的配置
void RCC_Configuration(void){//因为起始代码中已经调用SystemInit将主时钟设置为72MHZ//所以我们这里RCC直接使能时钟就可以//使能GPIO端口//通过PB0控制LED1//因为我们使用到的是PB0,所以只使用到GPIOBRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//因为systick属于cpu部分的,所以时钟始终打开的,不需要再去打开//所以这里只是打开GPIO的时钟即可}
5. SYSTICK_Configuration
//SysTick_Config:是SYSTICK的启动函数
void SYSTICK_Configuration(void){/*这个时间超时了//主频是72MHZ,定时时间是500ms//ticks=72 000 000*0.5 =3600 000SysTick_Config(36000000);//1677 7216*///100毫秒//范围:233ms//ticks=72 000 000*200ms=14400000SysTick_Config(14400000);//SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
6.main
#include "stm32f10x.h" // Device header
/**使用SYSTICK控制led的闪烁【中断式】PB8控制LED8
*///函数声明
//RCC的配置
void RCC_Configuration(void);
//GPIO初始化
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void SYSTICK_Configuration(void);//全局变量定义
EXTI_InitTypeDef EXTI_InitStructure;
ErrorStatus HSEStatartUpStatus;int main(){//系统时钟配置RCC_Configuration();//NVIC配置NVIC_Configuration();//配置GPIOGPIO_Configuration();SYSTICK_Configuration();while(1);return 0;
}//RCC的配置
void RCC_Configuration(void){//因为起始代码中已经调用SystemInit将主时钟设置为72MHZ//所以我们这里RCC直接使能时钟就可以//使能GPIO端口//通过PB0控制LED1//因为我们使用到的是PB0,所以只使用到GPIOBRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//因为systick属于cpu部分的,所以时钟始终打开的,不需要再去打开//所以这里只是打开GPIO的时钟即可}//GPIO初始化
void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;//PB0 ---LED1【LED的显示输出】GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);// 默认输出0让LED亮//RESET=0//SET=1GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_RESET); }void NVIC_Configuration(void)
{// NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //分配中断向量表
#else /* VECT_TAB_FLASH *///表示从FLASH中启动;;/* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif/* Configure one bit for preemption priority */// NVIC_PriorityGroup_1:2个抢占优先级,8个次优先级/*NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置中断优先级// Enable the SYSTICK Interrupt //设置为SYSTICK//这里我们将下面代码注释起来是因为【NVIC_IRQChannel】只接受正整数//但是我们【SysTick_IRQn】是负数,所以不能正确输出NVIC_InitStructure.NVIC_IRQChannel = SysTick_IRQn; //中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //强占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//次优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能NVIC_Init(&NVIC_InitStructure);//初始化中断*/
}//SysTick_Config:是SYSTICK的启动函数
void SYSTICK_Configuration(void){/*这个时间超时了//主频是72MHZ,定时时间是500ms//ticks=72 000 000*0.5 =3600 000SysTick_Config(36000000);//1677 7216*///100毫秒//范围:233ms//ticks=72 000 000*200ms=14400000SysTick_Config(14400000);//SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
7.注意点:ticks的时间设置
我们已经知道systick有24个寄存器,所以我们最大的数值范围不能超过2的24次方。
所以我们计算出来的值不能超过上面那个
而根据我们单片机上面使用的是72MHZ的频率
则我们ticks的范围是16 777 216/72 000 000
举个例子
如果我们想要设置100ms
则ticks=72 000 000 *0.1=7,200,000
8.SYSTICK中断实现LED每200ms闪烁一次【查询方式--delay】
0.解释
我们通过使用delay进行精确的延时
1.代码解析
1.GPIO_Configuration
//GPIO初始化
void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;//PB0 ---LED1【LED的显示输出】GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);// 默认输出0让LED亮//RESET=0//SET=1GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_RESET); }
2.RCC_Configuration
//RCC的配置
void RCC_Configuration(void){//因为起始代码中已经调用SystemInit将主时钟设置为72MHZ//所以我们这里RCC直接使能时钟就可以//使能GPIO端口//通过PB0控制LED1//因为我们使用到的是PB0,所以只使用到GPIOBRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//因为systick属于cpu部分的,所以时钟始终打开的,不需要再去打开//所以这里只是打开GPIO的时钟即可}

3.delay_us
此代码要根据频率来进行修改
//用systick计数器来帮我们实现us级别的精确延时
//这个函数成立有2个条件:
//1.主频必须是72MHZ
//2.us要小于(2的24次方)=1864 135us=1.8s
void delay_us(unsigned int us){//记录CTRL的countflag位的值unsigned int tmp=0;//思路是先把systick的时钟源设置好,然后给一个正确的ticks//然后使能systick,while循环等待countflag置位则时间到//72MHZ主频,我们使用8分频,72/8=9MHZ systickSysTick->LOAD=us*9;SysTick->VAL=0;//我们要先设置上面的LOAD和VAL,在进行使能//时钟源是AHB/8,禁止中断,使能systickSysTick->CTRL =0x01;//检测什么时候时间结束//查看CTRL中的countflagdo{tmp=SysTick->CTRL;}while(!(tmp&(1<<16)));//时间到,关闭定时器SysTick->VAL=0;SysTick->CTRL =0x00;
}
4.delay_ms
//不能大于 1864
void delay_ms(unsigned int ms){//记录CTRL的countflag位的值unsigned int tmp=0;//思路是先把systick的时钟源设置好,然后给一个正确的ticks//然后使能systick,while循环等待countflag置位则时间到//72MHZ主频,我们使用8分频,72/8=9MHZ systickSysTick->LOAD=ms*9000;SysTick->VAL=0;//我们要先设置上面的LOAD和VAL,在进行使能//时钟源是AHB/8,禁止中断,使能systickSysTick->CTRL =0x01;//检测什么时候时间结束//查看CTRL中的countflagdo{tmp=SysTick->CTRL;}while(!(tmp&(1<<16)));//时间到,关闭定时器SysTick->VAL=0;SysTick->CTRL =0x00;}
5.main
#include "stm32f10x.h" // Device header
/**使用delay控制led的闪烁--与systick进行等价实现【查询式】PB8控制LED8
*///函数声明
//RCC的配置
void RCC_Configuration(void);
//GPIO初始化
void GPIO_Configuration(void);void delay_ms(unsigned int ms);
void delay_us(unsigned int us);//全局变量定义
EXTI_InitTypeDef EXTI_InitStructure;
ErrorStatus HSEStatartUpStatus;int main(){//系统时钟配置RCC_Configuration();//配置GPIOGPIO_Configuration();while(1){GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_RESET);//亮delay_ms(200);GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_SET);//灭delay_ms(200);}return 0;
}//RCC的配置
void RCC_Configuration(void){//因为起始代码中已经调用SystemInit将主时钟设置为72MHZ//所以我们这里RCC直接使能时钟就可以//使能GPIO端口//通过PB0控制LED1//因为我们使用到的是PB0,所以只使用到GPIOBRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//因为systick属于cpu部分的,所以时钟始终打开的,不需要再去打开//所以这里只是打开GPIO的时钟即可}//GPIO初始化
void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;//PB0 ---LED1【LED的显示输出】GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);// 默认输出0让LED亮//RESET=0//SET=1GPIO_WriteBit(GPIOB, GPIO_Pin_8, Bit_RESET); }//用systick计数器来帮我们实现us级别的精确延时
//这个函数成立有2个条件:
//1.主频必须是72MHZ
//2.us要小于(2的24次方)=1864 135us=1.8s
void delay_us(unsigned int us){//记录CTRL的countflag位的值unsigned int tmp=0;//思路是先把systick的时钟源设置好,然后给一个正确的ticks//然后使能systick,while循环等待countflag置位则时间到//72MHZ主频,我们使用8分频,72/8=9MHZ systickSysTick->LOAD=us*9;SysTick->VAL=0;//我们要先设置上面的LOAD和VAL,在进行使能//时钟源是AHB/8,禁止中断,使能systickSysTick->CTRL =0x01;//检测什么时候时间结束//查看CTRL中的countflagdo{tmp=SysTick->CTRL;}while(!(tmp&(1<<16)));//时间到,关闭定时器SysTick->VAL=0;SysTick->CTRL =0x00;
}//不能大于 1864
void delay_ms(unsigned int ms){//记录CTRL的countflag位的值unsigned int tmp=0;//思路是先把systick的时钟源设置好,然后给一个正确的ticks//然后使能systick,while循环等待countflag置位则时间到//72MHZ主频,我们使用8分频,72/8=9MHZ systickSysTick->LOAD=ms*9000;SysTick->VAL=0;//我们要先设置上面的LOAD和VAL,在进行使能//时钟源是AHB/8,禁止中断,使能systickSysTick->CTRL =0x01;//检测什么时候时间结束//查看CTRL中的countflagdo{tmp=SysTick->CTRL;}while(!(tmp&(1<<16)));//时间到,关闭定时器SysTick->VAL=0;SysTick->CTRL =0x00;}
2.中断 VS 查询
查询和中断方式差异:
查询方式是阻塞式的,中断方式是非阻塞的
相关文章:
【STM32】Systick定时器
一、STM32的5种定时器简介 1.独立看门狗(IWDG) VS 窗口看门狗(WWDG) 1.独立看门狗(IWDG) 独立看门狗:当没有到设定时间之前,给它喂了狗,就会回到初始值。 2.窗口看门狗…...
ZooKeeper监控
ZooKeeper Monitor Guide Zookeeper集群进行监控,发现的方案有三种: JMXzookeeper exporterZK Monitor(Since 3.6.0)采用JMX 进行监控,可获取到的指标项不够丰富。Zookeeper Exporter监控可获得的指标项亦不太够丰富。从3.6.0之后,Zookeeper自带的Monitor结合Prometheus、…...
lua # 获取table数组长度
目录 实测结果展示 情况分类 数组开始索引与数组长度 数组元素中间有nil 数组最后的元素为nil...
前端框架Vue学习 ——(七)Vue路由(Vue Router)
文章目录 Vue路由使用场景Vue Router 介绍Vue Router 使用 Vue路由使用场景 使用场景:如下图,点击部门管理的时候显示部门管理的组件,员工管理的时候显示员工管理的组件。 前端路由:指的是 URL 中的 hash(#号)与组件之间的对应关…...
2023-2024-1高级语言程序设计-一维数组
7-1 逆序输出数组元素的值 从键盘输入n个整数存入一维数组中,然后将数组元素的值逆序输出。 输入格式: 第一行输入整数个数n; 第二行输入n 个整数,数据之间以空格隔开。 输出格式: 逆序输出数组元素的值,每个数据之后跟一个空…...
史上最全,从初级测试到高级测试开发面试题汇总,冲击大厂年50w+
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口测试面试相关…...
Python基础入门例程42-NP42 公式计算器(运算符)
最近的博文: Python基础入门例程41-NP41 二进制位运算(运算符)-CSDN博客 Python基础入门例程40-NP40 俱乐部的成员(运算符)-CSDN博客 Python基础入门例程39-NP39 字符串之间的比较(运算符)-C…...
C#的LINQ to XML 类中使用最多的三个类:XElement、XAttribute 和 XDocument
目录 一、XElement 类 1.使用 XElement 类创建一个 xml 文档 (1)示例源码 (2)xml文件 2.使用LINQ to SQL或者LINQ to Object获取数据源 (1)示例源码 (2)xml文件 3.XElement …...
2023软考-系统架构师一日游
上周六(11月4号)参见了软考,报的系统架构师,今年下半年是第一次推行机考,简单来分享下大致流程,至于考试难度、考点什么的,这个网上有很多专门研究这些的机构,本人无权发言。考试的经…...
维乐 Prevail Glide带你做破风王者,无阻前行!
对于自行车骑手来说,需要应对的问题有很多,其中最大的问题之一,就是「风阻」。风阻永远都是你越反抗越强,因此为了克服风阻的力量,时间久了,身体自然会造成一定程度的损伤。如何才能调整前行的步伐…...
企业通配符SSL证书的特点
企业通配符SSL证书是一种数字证书,其可以用于保护多个企业网站,对网站传输信息进行加密服务。这种证书通常适用于拥有多个子域名或二级域名的企事业单位。今天就随SSL盾小编了解企业通配符SSL证书的相关信息。 1. 保护所有域名和子域名:企业通…...
1.2 HTML5
一.HTML5 简介 1.什么是HTML5 HTML5是新一代的 HTML 标准,2014年10月由万维网联盟( W3C)完成标准制定。官网地址: w3c提供:HTML StandardWHATWG提供: HTML Standard HTML5在狭义上是指新—代的 HTML 标准,在广义上是指:整个前端。 2.HTML…...
一个例子!教您彻底理解索引的最左匹配原则!
最左匹配原则的定义 简单来讲:在联合索引中,只有左边的字段被用到,右边的才能够被使用到。我们在建联合索引的时候,区分度最高的在最左边。 简单的例子 创建一个表 CREATE TABLE user ( id INT NOT NULL AUTO_INCREMENT, code…...
Docker容器技术实战4
11、docker安全 proc未被隔离,所以在容器内和宿主机上看到的东西是一样的 容器资源控制 cpu资源限制 top命令,查看cpu使用率 ctrlpq防止退出回收,容器会直接调用cgroup,自动创建容器id的目录 cpu优先级设定 测试时只保留一个cpu…...
vue3中使用better-scroll
文章目录 需求分析安装htmlcssjs 需求分析 假设现在有这么一个需求,页面顶部有几个tabs导航,每一个tab下都有一个可以滑动的切换按钮。咱们就可以引入better-scroll来实现这个需求。 安装 首先下载better-scroll npm install better-scroll/core --…...
RK3568禁用调试口改成普通口
RK3568共10个串口,需要用到8个串口,无耐其他UART都被外设复用了,只好将调试口也拿出来作为普通口,方法:禁用调试口、增加UART2 1. vi kernel/arch/arm64/boot/dts/rockchip/OK3568-C-linux.dts 2. #include &quo…...
腾讯云CVM服务器标准型S5、SA3、S6详细介绍
腾讯云CVM服务器标准型实例的各项性能参数平衡,标准型云服务器适用于大多数常规业务,例如:web网站及中间件等,常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格,腾讯云服务器网txyfwq.com来详细说下云服务…...
【PC电脑windows环境下-[jetson-orin-NX]Linux环境下-下载工具esptool工具使用-相关细节-简单样例-实际操作】
【PC电脑windows环境下-[jetson-orin-NX]Linux环境下-下载工具esptool工具使用-相关细节-简单样例-实际操作】 1、概述2、实验环境3、 物品说明4-2、自我总结5、本次实验说明1、准备样例2、设置芯片3、编译4、下载5、验证 (1)windows环境下进行烧写1、下…...
什么是flink
flink的起源 Flink的起源可以追溯到2010年,当时它作为一个研究项目开始。该项目最初由德国柏林工业大学(Berlin Institute of Technology)的一群研究人员发起,包括Matei Zaharia、Kostas Tzoumas和Stephan Ewen等。 项目最初被称为…...
基于 VTable 的多维数据展示的原理与实践
多维表格介绍 多维表格又名透视表、交叉表、Pivot Table,指的是可以在行维度和列维度放入一个或多个维度,显示维度之间相互关系的一种表格。用户可以一目了然地分析出各种场景指标以及对比,旨在帮助业务分析推动决策。 假设需要分析如下表格…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...







