【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,指的是可以在行维度和列维度放入一个或多个维度,显示维度之间相互关系的一种表格。用户可以一目了然地分析出各种场景指标以及对比,旨在帮助业务分析推动决策。 假设需要分析如下表格…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...