【STM32学习】——定时器输出比较功能&PWM脉宽调制&通用/高级定时器输出比较通道&舵机/直流电机简介&PWM驱动呼吸灯/舵机/直流电机代码实操

2023-10-27


声明:学习笔记根据b站江科大自化协stm32入门教程编辑,仅供学习交流使用!

前言

定时器输出比较功能比较重要,主要用来输出PWM波形,PWM波形又是驱动电机的必要条件,智能车、机器人的电机都可能用到!!
本次学习有三个实操,分别是PWM驱动LED呼吸灯、PWM驱动舵机、PWM驱动直流电机。


一、输出比较简介

在这里插入图片描述
1、OC(Output Compare)输出比较,IC(Input Capture)为输入捕获,CC(Capture/Compare)一般表示输入捕获和输出比较的单元!
2、输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。(可参考上节通用定时器或高级定时器图如上图)CNT为时基单元里的计数器,CCR即捕获/比较寄存器(输入捕获和输出比较共用的)。输出比较时,电路会比较CNT和CCR的值,CNT计数自增,CCR是我们给定的一个值,当CNT>CCR、<CCR或=CCR时,输出就会对应置1、置0、置1、置0,即得一个电平不断跳变的PWM波形!!
3、每个高级定时器和通用定时器都拥有4个输出比较通道,且高级定时器的前3个通道额外拥有死区生成和互补输出的功能

二、PWM波形

PWM(Pulse Width Modulation)脉冲宽度调制
在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域。也就是用来等效地实现一个模拟信号的输出(左图虚线余弦),也就是最开始提出的问题:数字输出端口控制LED,按理说只有完全亮和完全灭两种状态,但通过PWM就可实现呼吸灯,当不断点亮熄灭点亮熄灭…的频率足够大时就不会时闪烁而是呈现中等亮度!!
在这里插入图片描述
但是PWM波的应用场景必须是一个惯性系统,就是LED在熄灭时由于余晖和人眼视觉暂留现象,LED不会立马熄灭而是具有一定惯性,电机也是同样。
PWM参数:
频率 = 1 / TS 。一般在几十——几十千
占空比 = TON / TS
分辨率 = 占空比变化步距。分辨率是指输出电压梯度,而频率是指输出变化的次数,例如LED的分辨率为1%即说明LED的亮度时1%亮、2%亮、3%…一直到100%亮。
基本结构:
在这里插入图片描述
时基单元部分配置与上节相似,只不过更新事件的中断申请不再需要了,输出PWM暂时不需要中断,配置完了时基单元,CNT就可开始不断自增运行。
下面为输出比较单元,总共有4路,CNT不断自增的同时与CCR不断进行比较,此图为PWM模式1的执行逻辑(REF怎么置),右上角蓝线为CNT的值,黄线为ARR的值,蓝线从0开始自增一直到黄线ARR即99,之后清零继续自增,再设置一条红线CCR(此处为30),之后根据执行逻辑1得到绿色线输出,图中的REF就是一个频率可调,占空比也可调的PWM波形,再经过极性选择输出使能通向GPIO口完成PWM波的输出!!
参数计算:
PWM频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)
PWM占空比: Duty = CCR / (ARR + 1)
PWM分辨率: Reso = 1 / (ARR + 1)

三、输出比较通道

普通定时器没有这些通道,通用和高级的有!!

1.通用定时器

代码如下(示例):
CNT计数器与CRR1第一路的捕获/比较寄存器进行比较后,当>或=时会给输出模式控制器传一个信号,然后该控制器会改变输出oc1ref的高低电平(ref为reference的缩写,意思为参考信号),ETRF输入为定时器的一个小功能,一般不用!ref信号可前往主模式控制器,可以把REF映射到主模式的TRGO的输出上,但主要去向为下面的极性选择,给CC1P寄存器写0信号会往上走即信号电平不反转,写1经过非门反转后到输出使能电路,输出使能电路选择要不要输出,最后OC1引脚是CH1通道的引脚,在引脚定义表里可知道具体是哪个GPIO口了!
输出比较八种模式:
在这里插入图片描述
注:可把有效电平当作高电平,无效电平当作低电平;输出波形频率=更新频率/2,因为更新两次输出才为1个周期。

2.高级定时器

这个先了解下就行!!与通用定时器不同的只有红圈内的电路。以前在介绍高级定时器时也有相关介绍
在这里插入图片描述

三、外设简介

1.舵机

舵机是一种根据输入PWM信号占空比来控制输出角度的装置
输入PWM信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms
在这里插入图片描述
第二个图为拆解图,舵机并不是一个单独的直流电机,舵机内部电板是一个控制电路板,PWM信号输入到控制板,给控制板一个指定的目标角度,然后电位器检测输出轴的当前角度,如果大于目标角度电机反转,小于的话电机正转,最终使输出轴固定在指定角度!!
周期20ms指第一个上升沿到下一个上升沿的时间,0.5ms、1ms等指高电平的时间,这里的PWM波形被当作一个通信协议使用,与之前说的等效一个模拟输出关系不大!!
机器人关节,小车小船方向!!
在这里插入图片描述
一般推荐单独供电,供电的负极要与stm32共地,5v供电可从STLINK的5V输出引脚引一根线,如果没有单独供电条件要看电源功率是否达标,不达标驱动会遇到问题!

2.直流电机

直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转。
直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作。
TB6612是一款双路H桥型的直流电机驱动芯片(如下图两个推挽电路组合),可以驱动两个直流电机并且控制其转速和方向,舵机就不需要了内部有驱动电路。其他还有DRV8833、L9110、L298N等等。还有一些用分离元件MOS管搭建的电路,这种的功率可以做得更大!!
在这里插入图片描述
硬件电路,VM一般与电机额定电压保持一致,VCC与stm32保持一致3.3v;3个GND一样随便选一个;AO1、AO2、BO2、BO1为两路电机的输出,PWMA、AIN2、AIN1三个引脚控制A路电机,PWMA要接输出PWM波的GPIO口,B路电机同理;最后STBY(stand by)为待机控制脚,如果接GND芯片就不工作处于待机状态,若接VCC则正常工作:
在这里插入图片描述
右下角这个表说明了怎么控制正反转等!!
更多详细内容可多参考芯片手册!!

四、实操案例

1.PWM驱动LED呼吸灯

LED接线采用正极性驱动,即输出高电平点亮,现象更加直观,即占空比越大LED越亮反之越暗:
在这里插入图片描述

//PWM.c
#include "stm32f10x.h"                  // Device header
//初始化,也是根据PWM基本结构图把每个环节打通:
//1、RCC开启时钟,打开要用的TIM外设和GPIO外设的时钟
//2、配置时基单元,包括图中未画出的时钟源选择
//3、配置输出比较单元,包括CCR的值、输出比较模式、极性选择、输出使能这些参数(库函数也是用结构体统一配置)
//4、配置GPIO,把PWM对应的GPIO口初始化为复用推挽输出的配置,对应关系可参考引脚定义表
//5、运行控制,启动计数器就可以输出PWM波了
void PWM_Init(void){//上半部分可借鉴定时器中断
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE );//使用APB1的开启时钟函数,因为TIM2位APB1总线的外设
	TIM_InternalClockConfig(TIM2);//选择内部时钟
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode= TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period= 10000-1;//ARR自动重装器的值
	TIM_TimeBaseInitStructure.TIM_Prescaler= 7200-1;//PSC预分频器的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter= 0 ;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//给结构体赋初始值
	TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1;//Timing冻结模式、Active相等时置有效电平、Inactive相等置无效电平、Togg相等时电平翻转、PWM1、PWM2
	TIM_OCInitStructure.TIM_OCNPolarity= TIM_OCNPolarity_High;
	TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse= 0;//CCR寄存器的值,与上ARR和PSC值共同决定PWM的周期和占空比,此处为1KHz、占空比待定
	TIM_OC1Init(TIM2,&TIM_OCInitStructure);
	
	//GPIO配置,需要参照引脚定义表,IO口默认复用功能、重映射位置,哪个对应哪个是定死的
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//可放在最上面,这里为了便于分块理解就放这里
	
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用开漏/推挽输出模式,
	//因为对于普通的开漏/推挽输出引脚的控制权来自输出数据寄存器,
	//如果想用定时器控制引脚需要使用复用开漏/推挽输出模式(前期文章),这里输出数据寄存器断开的,控制权移交给片上外设
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	TIM_Cmd(TIM2,ENABLE);//启动定时器,PWM通过PA0输出
}

void PWM_SetCompare1(uint16_t Compare){//为了不断更改占空比,达到呼吸灯目的的函数
	TIM_SetCompare1(TIM2,Compare);//该函数可单独修改CCR的值,不断改变占空比	,参数在main.c中利用for循环赋予
}
//PWM.h
#ifndef __PWM_H
#define __PWM_H
void PWM_Init(void);
void PWM_SetCompare1(uint16_t Compare);
#endif
//main.c
#include "stm32f10x.h"   // Device header
#include "Delay.h"   
#include "OLED.h"
#include "PWM.h"

uint8_t i;

int main(void){
	OLED_Init();
	PWM_Init();
	
	while(1){
		for (i=0;i<=100;i++){
			PWM_SetCompare1(i);//不断更改CCR,以改变占空比(占空比由CCR和ARR共同决定,ARR为100一直不变),逐渐变亮
			Delay_ms(10);//防止太快
		}
		for (i=0;i<=100;i++){
			PWM_SetCompare1(100-i);//不断更改CCR以改变占空比,逐渐变暗
			Delay_ms(10);//防止太快
		}
	}
}

补充:试验下刚才所说的引脚重映射,例如引脚定义表上TIM2的CH1可以从PA0挪到PA15引脚上,怎么操作?需要用到AFIO
如果想让PA15、PB3、PB4三个引脚当作GPIO使用:
1、开启AFIO的时钟(第一句)
2、再用AFIO将JTAG复用解除掉(第三句)
如果想重映射定时器或者其他外设的复用引脚:
1、打开AFIO时钟(第一句)
2、再用AFIO重映射外设复用的引脚(第二句)
如果重映射的引脚正好是调试端口,三句代码都要!!
1、打开AFIO时钟
2、重映射引脚
3、解除调试端口

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2 ,ENABLE);//引脚重映射函数,手册第8章8.3复用功能I/O和调试配置(AFIO)
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//解除PA15调试端口的复用

2.PWM驱动舵机

在这里插入图片描述

//PWM.c
//与驱动呼吸灯大同小异
#include "stm32f10x.h"                  
void PWM_Init(void){
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE );
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode= TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period= 20000-1;//ARR不同
	TIM_TimeBaseInitStructure.TIM_Prescaler= 72-1;//PSC不同
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter= 0 ;//CCR(500-2500,对应0.5-2.5ms,对应0-180°
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCNPolarity= TIM_OCNPolarity_High;
	TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse= 0;
	TIM_OC2Init(TIM2,&TIM_OCInitStructure);//不同点,OC2通道2配置
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//不同点,用的是PA1口的通道2
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_SetCompare2(uint16_t Compare){//不同点,改为compare2
	TIM_SetCompare2(TIM2,Compare);//不同点,改为compare2
}

//Servo.c
#include "stm32f10x.h"                 
#include "PWM.h"

//为了使PWM输出与舵机角度的对应关系更加直观,特封装此.c文件
void Servo_Init(){
	PWM_Init();
	
}
//0°   500
//180° 2500
void Servo_SetAngle(float Angle){
	PWM_SetCompare2(Angle/180*2000 + 500);//角度到CCR值的映射
	
	
}

//main.c
#include "stm32f10x.h"   
#include "Delay.h"   
#include "OLED.h"
#include "Servo.h"
#include "key.h"
uint8_t KeyNum;
float Angle;//默认为0

int main(void){
	OLED_Init();
	Servo_Init();
	Key_Init();
	
	OLED_ShowString(1,1,"Angle:");
	
	while(1){
		KeyNum = Key_GetNum();
		if (KeyNum == 1){
			Angle +=30;//每按一下按键加30°
			if(Angle > 180){
				Angle = 0;
			}
		}
		Servo_SetAngle(Angle);
		OLED_ShowNum(1,7,Angle,3);//Angle:字符占了6列
	}
}

3.PWM驱动直流电机

在这里插入图片描述

//PWM.c
//同样与呼吸灯大同小异
#include "stm32f10x.h"                  
void PWM_Init(void){
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE );
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode= TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period= 10000-1;
	TIM_TimeBaseInitStructure.TIM_Prescaler= 7200-1;
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter= 0 ;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCNPolarity= TIM_OCNPolarity_High;
	TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse= 0;
	TIM_OC3Init(TIM2,&TIM_OCInitStructure);//不同点,通道3
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//不同点,电机接在通道3
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_SetCompare3(uint16_t Compare){//不同点,通道3
	TIM_SetCompare3(TIM2,Compare);
}
//Motor.c
#include "stm32f10x.h"                  
#include "PWM.h"

void Motor_Init(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4| GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化电机方向控制引脚
	
	PWM_Init();
}

void Motor_SetSpeed(int8_t Speed){//该函数参数可+可-
	if(Speed >= 0){//正转
		//方向设置
		GPIO_SetBits(GPIOA,GPIO_Pin_4);
		GPIO_ResetBits(GPIOA,GPIO_Pin_5);
		//速度设置
		PWM_SetCompare3(Speed);
	}
	else{
		//方向设置
		GPIO_SetBits(GPIOA,GPIO_Pin_5);
		GPIO_ResetBits(GPIOA,GPIO_Pin_4);
		//速度设置
		PWM_SetCompare3(-Speed);//该函数参数为无符号数,Speed为负,-Speed为正
	}
}

//main.c
#include "stm32f10x.h"   // Device header
#include "Delay.h"   
#include "OLED.h"
#include "Motor.h"
#include "key.h"

uint8_t KeyNum;
int8_t Speed;

int main(void){
	OLED_Init();
	Motor_Init();
	Key_Init();
	
	OLED_ShowString(1,1,"Speed:");
	
	while(1){
		KeyNum = Key_GetNum();//按键控制速度-100~100
		if (KeyNum == 1){
			Speed +=20;
			if (Speed >100){
				Speed = -100;
			}
		}
		Motor_SetSpeed(Speed);
	//电机旋转时会发出蜂鸣器的声音,这是因为PWM频率在人耳范围导致的,可通过改变预分频PSC完善
		OLED_ShowNum(1,7,Speed,3);
	}
}

总结

电机正反转的更改可以改变接线,也可以改变代码!在实操时注意与上面的理论相结合,三个实操之间也可对比学习,有助于加深理解!!
遇到挫折,要有勇往直前的信念,马上行动,坚持到底,决不放弃,成功者决不放弃,放弃者绝不会成功。成功的道路上,肯定会有失败;对于失败,我们要正确地看待和对待,不怕失败者,则必成功;怕失败者,则一无是处,会更失败。
在这里插入图片描述
往期精彩:
STM32定时中断
STM32外部中断
STM32GPIO精讲

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32学习】——定时器输出比较功能&PWM脉宽调制&通用/高级定时器输出比较通道&舵机/直流电机简介&PWM驱动呼吸灯/舵机/直流电机代码实操 的相关文章

  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 我当年自学黑客(网络安全)的一些心得!(内附学习笔记)

    前 言 写这篇教程的初衷是很多朋友都想了解如何入门 转行网络安全 实现自己的 黑客梦 文章的宗旨是 1 指出一些自学的误区 2 提供客观可行的学习表 3 推荐我认为适合小白学习的资源 大佬绕道哈 文末有福利 一 自学网络安全学习的误区和陷阱
  • 网络安全从入门到精通(超详细)学习路线

    首先看一下学网络安全有什么好处 1 可以学习计算机方面的知识 在正式学习网络安全之前是一定要学习计算机基础知识的 只要把网络安全认真的学透了 那么计算机基础知识是没有任何问题的 操作系统 网络架构 网站容器 数据库 前端后端等等 可以说不想
  • 通过一个寒假能学会黑客技术吗?看完你就知道了

    一个寒假能成为黑客吗 资深白帽子来告诉你 如果你想的是学完去美国五角大楼内网随意溜达几圈 想顺走一点机密文件的话 劝你还是趁早放弃 但是成为一名初级黑客还是绰绰有余的 你只需要掌握好渗透测试 Web安全 数据库 搞懂web安全防护 SQL注
  • 为什么C语言没有被C++所取代呢?

    今日话题 为什么C语言没有被C 所取代呢 C 的复杂编译器实现和嵌入式平台的限制 使C语言保持了其地位 嵌入式系统多数仅支持C 即使支持C 也会限制某些功能 尤其是异常处理和RTTI 此外 C 引入的功能增加了二进制文件大小和运行时内存占用
  • 太阳诱电 | 电容器为什么会发热?什么是纹波电流

    电容器中存在寄生于电极和电介质的电阻成分 当纹波电流等交流电流通过电容器时 电阻的成分会产生热量 为了抑制发热 选择ESR较低的电容器非常重要 陶瓷电容器在电容器中ESR较低 非常适合抑制发热 电容器中的纹波电流主要是指电源电路中由于IC的
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • msyql 异常,别干着急,70%的问题都在这里!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 【计算机毕业设计】OA公文发文管理系统_xtv98

    近年来 人们的生活方式以网络为主题不断进化 OA公文发文管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工作效率
  • 计算机Java项目|基于SSM的微课学习系统

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 为什么我强烈推荐大学生打CTF!

    前言 写这个文章是因为我很多粉丝都是学生 经常有人问 感觉大一第一个学期忙忙碌碌的过去了 啥都会一点 但是自己很难系统的学习到整个知识体系 很迷茫 想知道要如何高效学习 这篇文章我主要就围绕两点 减少那些罗里吧嗦的废话 直接上干货 CTF如
  • 【GRNN-RBFNN-ILC算法】【轨迹跟踪】基于神经网络的迭代学习控制用于未知SISO非线性系统的轨迹跟踪(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 第1部分 2 2 第2部分
  • 肿瘤的转录调控:Cell子刊揭示原发性肝癌中转录因子活性的全基因组图谱|国自然热点

    转录调控的研究历史比较长 相关研究在近十年来仍一直增长 也是近年来高分文章的焦点之一 在2023年最佳国自然 中标 研究热点 转录调控中标率高达189 作为国自然热点之一的肿瘤微环境的研究在近几年也一直处于上升趋势 转录调控在肿瘤发生 发展
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • Flutter开发中插件使用

    flutter的库是以package的方式来管理的 Package 分为两种 Dart package 它只能使用 Dart 和 Flutter 提供的 API 使用纯dart语言开发 一些Dart包可能包含Flutter特定功能 因此对F
  • chatgpt赋能python:Python编程优化技巧

    Python编程优化技巧 为什么需要编程优化 Python是一种解释性语言 运行速度较慢 编写高效的Python程序是很有必要的 当我们需要处理大量数据 或者运行时间敏感的任务时 优化Python程序对于提高效率是至关重要的 怎样提高Pyt
  • 华为OD机试 C++ 【查字典】

    题目 题目 描述 给你一个 头 就是词的开始部分 和一个单词清单 你需要找出哪些单词是以这个 头 开始的 输出 所有以这个 头 开始的单词 每个单词一行 如果一个都没有 输出 1 输入 abc 4 a ab abc abcd 输出 abc
  • 项目结构的合理性

    以下仅为个人观点 如有好的建议请多多指教 1 有时为了项目以后修改 迭代 或者相似功能的开发 可能会对某些模块进行封装 近期所做的项目整体进行了自动化封装 个人认为封装过度其实是对后续业务并没有太多好处 反而造成项目随着时间的推移 业务发展
  • sessionStorage 问题

    问题描述 列表页点击进详情页的时候数据没加载到 查看前端代码 在跳转的时候取的列表页数据存到sessionStorage里面 function getCollarDetails index var rows coupon list tabl
  • jQuery 入门教程(21): jQuery UI 示例

    上篇介绍了使用jQuery UI基本工作过程 后面就逐个介绍jQuery UI库内置的UI组件 支持的拖放 动画效果等 如果你之前看过Yii Framework教程 PHP Yii Framework封装了jQuery UI组件 有兴趣的可
  • SqlServer 存储过程(生成订单)

    当在 SQL Server 中处理订单时 使用存储过程可以提供更高效和可维护的解决方案 存储过程是一组预编译的 SQL 语句 可以在数据库中执行 并且可以通过参数进行自定义 通过使用存储过程 可以将常见的业务逻辑封装起来 以便在需要时进行重
  • error while loading shared libraries: ../../lib/libopencv_core.so

    error while loading shared libraries lib libopencv core so 原文 http blog chinaunix net uid 27134408 id 5122776 html 最近做Op
  • SonarQube - org.sonar.process.MessageException: Unsupported JDBC driver provider: mysql

    使用docker安装最新的SonarQube 启动SonarQube报错 Exception in thread main org sonar process MessageException Unsupported JDBC driver
  • [shell编程]、()、(())、[]、[[]]的区别

    默认的变量类型是字符串 所以 str1 str2 就是一串字符串 我们想要判断它们是否相等必须使用中括号 str1 str2 1 中括号 表示条件测试 注意这里的空格很重要 要注意在 后面和 前面都必须要有空格 常用判断 d FILE 如果
  • 企业为什么要融资和上市

    这里面涉及到两个概念 即融资和上市 让我们先来理理这两者之间的逻辑辩证关系 其实根据我们的观察和调研发现 目前市场上许多人对上市这件事有着十分魔性的认知 小A觉得上市前融资轮次越多越好 小B认为上市后就是为了圈钱 小C觉得IPO的速度越快越
  • ISP之DPC(坏点校正)模块

    DPC Defective Photosites Correction即坏点校正 一 DPC的意义 图像传感器上由于自身工艺技术造成的瑕疵 如光线采集的点存在缺陷 导致在光电转换过程中某些像素值不准确 我们称之为坏点 Defect Pixe
  • 星环科技线上技术分享课“星课堂”开播,快来一探究竟

    星课堂 深度解读系列上线啦 4 9月 10期线上课带你深度了解星环科技2021全系列新品细节 关于星环科技 星环科技致力于打造 云计算 大数据 数据库 人工智能 的基础平台产品 领航基础软件新纪元 经过多年自主研发 星环科技建立了多个产品系
  • Mysql事务隔离机制

    SQL隔离机制 所谓隔离机制 指的是读与写之间的隔离 指的是在多事务并行的时候 A事务的读与B事务的写之间的隔离 也就是说B事务的写对A事务的可见性 多事务并发运行的时候 同时读写一个数据 可能会出现脏写 脏读 不可重复读 幻读几个问题 脏
  • 业务系统从阿里云物联网平台获取设备数据的3种方案——实践类

    在企业IoT业务场景中 往往需要将设备上报到IoT物联网平台的数据进行加工处理 存储到数据库中 以便供业务系统使用 物联网平台提供了3种获取数据的方式 通过阿里云POP API获取设备数据 通过HTTP 2服务端订阅取设备数据 通过规则引擎
  • iframe框架标签(内嵌窗口)iframe和a标签的联合使用

    iframe框架 内嵌窗口 标题描述 iframe标签它可以在一个html页面上 打开一个小窗口 去加载一个单独的页面 iframe和a标签的联合使用的步骤 1 在iframe标签中使用name属性定义一个名称 2 在a标签的target属
  • C++实现集群聊天服务器

    写在前面 所有代码加起来两千行 里面用到了语言 数据结构 计网 操作系统 数据库 redis等知识 可谓是麻雀虽小五脏俱全 1 项目需求 客户端新用户注册 客户端用户登录 添加好友和添加群组 好友聊天 群组聊天 离线消息 nginx配置tc
  • ie11兼容方案(ant-design-vue在ie打开,系统白屏不报错)

    问题1 整个系统白屏 但不报错 原因 1 没有做路由懒加载 不做懒加载的话 默认是全部加载在首屏 ie浏览器性能差直接卡死 2 ie无法识别一些es6 的api Babel默认只转换新的js语法 如箭头函数 而不转换新的API 比如 Ite
  • jeesite前端页面与后台业务逻辑数据交互

    Key Word jsp controller json model parameter request response result param ajax data success http 1 jsp中提交请求的方式有哪些 get p
  • 【STM32学习】——定时器输出比较功能&PWM脉宽调制&通用/高级定时器输出比较通道&舵机/直流电机简介&PWM驱动呼吸灯/舵机/直流电机代码实操

    文章目录 前言 一 输出比较简介 二 PWM波形 三 输出比较通道 1 通用定时器 2 高级定时器 三 外设简介 1 舵机 2 直流电机 四 实操案例 1 PWM驱动LED呼吸灯 2 PWM驱动舵机 3 PWM驱动直流电机 总结 声明 学习