STM32 定时器

news2024/11/20 15:37:28

目录

TIM

定时器定时中断

定时器外部时钟

PWM驱动LED呼吸灯(OC)

PWM控制舵机

PWMA驱动直流电机

输入捕获模式测频率(IC)

输入捕获模式测占空比

编码器接口测速(编码器接口)


TIM

通用定时器

高级定时器

定时器定时中断

Timer.c

#include "stm32f10x.h"                  // Device header

//extern uint16_t Num;  //使用extern声明外部变量(如果要在文件中使用其他文件中的变量)

/**
  * @brief  定时器中断初始化
  * @param  无
  * @retval 无
  */
void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启RCC时钟
	//TIM2是APB1总线的外设
	
	TIM_InternalClockConfig(TIM2);//选择时基单元时钟
	//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重装值,(0-65535)
	//72000000/10000/7200 = 1s即1Hz
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
	//设置预分频器值(psc),(0-65535)
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	//配置重复计数器值(高级定时器会用到)
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//配置时基单元
	
    //在TIM_TimeBaseInit函数中,由缓冲寄存器,只有在更新事件时,
    //才会真正起作用,为了让值立刻起作用,手动生成了一个更新事件,
    //此时更新事件以及更新中断是同时发生的,更新中断会将置位标志位,故会进入中断进行中断中的操作
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除中断标志位
    
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断输出信号
	//更新中断到NVIC
	
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC优先级分组
	//选择分组2
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//配置中断通道
	//TIM2在NVIC的通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
	NVIC_Init(&NVIC_InitStructure);//初始化NVIC
	
	TIM_Cmd(TIM2,ENABLE);//启动定时器
}


/*TIM2中断函数模板
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//检查中断标志位
	{
        Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断待处理 位
	}
}
*/

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"

uint16_t Num;

int main(void)
{
	OLED_Init();
	Timer_Init();
	OLED_ShowString(1,1,"Num:");
	
	while(1)
	{
		OLED_ShowNum(1,5,Num,5);
	}
	
}

/**
  * @brief  TIM2的中断函数
  * @param  无
  * @retval 无
  */
void TIM2_IRQHandler()
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//检查中断标志位
	{
        Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位
	}
}
定时器外部时钟

Timer.c

#include "stm32f10x.h"                  // Device header

//extern uint16_t Num;  //使用extern声明外部变量(如果要在文件中使用其他文件中的变量)

/**
  * @brief  定时器外部时钟中断初始化
  * @param  无
  * @retval 无
  */
void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启TIM2时钟
	//TIM2是APB1总线的外设
	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIO时钟
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//这里使用上拉输入
    //手册推荐浮空输入当外部输入信号功率很小,内部上拉电阻可能会影响输入信号,防止影响外部输入的电平可以使用
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x05);
    //通过ETR引脚的外部时钟模式2配置(选择配置时钟,预分频器,选择上升/下降有效,滤波器工作模式)
    //在此之前还需要配置GPIO
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision =  TIM_CKD_DIV1;
	//设置时钟分频,选择一分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	//设置计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;
	//设置周期,即ARR重装值,(0-65535)
	//72000000/10000/7200 = 1s即1Hz
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;
	//设置预分频器值(psc),(0-65535)
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	//配置重复计数器值(高级定时器会用到)
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//配置时基单元
	
    //在TIM_TimeBaseInit函数中,由缓冲寄存器,只有在更新事件时,
    //才会真正起作用,为了让值立刻起作用,手动生成了一个更新事件,
    //此时更新事件以及更新中断是同时发生的,更新中断会将置位标志位,故会进入中断进行中断中的操作
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除中断标志位
    
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断输出信号
	//更新中断到NVIC
	
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC优先级分组
	//选择分组2
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//配置中断通道
	//TIM2在NVIC的通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
	NVIC_Init(&NVIC_InitStructure);//初始化NVIC
	
	TIM_Cmd(TIM2,ENABLE);//启动定时器
}

uint16_t Timer_GetCounter(void)
{
    return TIM_GetCounter(TIM2);
}

/*TIM2中断函数模板
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//检查中断标志位
	{
        Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断待处理 位
	}
}
*/

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"

uint16_t Num;

int main(void)
{
	OLED_Init();
	Timer_Init();
	OLED_ShowString(1,1,"Num:");
	OLED_ShowString(2,1,"CNT:");
	while(1)
	{
		OLED_ShowNum(1,5,Num,5);
		OLED_ShowNum(2,5,Timer_GetCounter(),5);
	}
	
}

/**
  * @brief  TIM2的中断函数
  * @param  无
  * @retval 无
  */
void TIM2_IRQHandler()
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//检查中断标志位
	{
        Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位
	}
}

PWM驱动LED呼吸灯(OC)

PWM.c

#include "stm32f10x.h"                  // Device header

/**
  * @brief  初始化PWM波形
  * @param  无
  * @retval 无
  */
void PWM_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第一步:使用RCC开启GPIO时钟
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//重映射到PA^15引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第二步:使用GPIO_Init()初始化GPIO
	
	//端口重映射
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟
	//GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);//设置重映射
	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//解除JTAG复用,保留SWD复用
	
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启RCC时钟
	//TIM2是APB1总线的外设
	
	TIM_InternalClockConfig(TIM2);//选择时基单元时钟
	//TIM2的时基单元就由内部时钟来驱动(定时器上电默认使用内部时钟)
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//初始化时基单元
	TIM_TimeBaseInitStructure.TIM_ClockDivision =  TIM_CKD_DIV1;
	//设置时钟分频,选择一分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	//设置计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;
	//设置周期,即ARR重装值,(0-65535)
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;
	//设置预分频器值(psc),(0-65535)
	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_OCPolarity = TIM_OCPolarity_High;//输出比较极性
	TIM_OCInitstructure.TIM_OutputState = TIM_OutputState_Enable;//设置输出使能
	TIM_OCInitstructure.TIM_Pulse = 0;//设置CCR
	//PWM频率 = 72MHz/PSC+1/ARR+1
	//PWM占空比 = CCR/ARR+1
	//PWM分辨率 = 1/(ARR+1)
	//1Hz = 1s
	TIM_OC1Init(TIM2,&TIM_OCInitstructure);//初始化输出比较单元(PA^0对应TIM_OC1Init)
	
	TIM_Cmd(TIM2,ENABLE);//启动定时器
}

/**
  * @brief  设置通道1中CCR的值
  * @param  被设定的CCR的值 
  * @retval 无
  */
void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2,Compare);
	
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"

uint8_t KeyNum;

int main(void)
{
	OLED_Init();
	PWM_Init();
	uint8_t tmp;
	
	while(1)
	{
		for(tmp = 0;tmp <= 100;tmp++)
		{
			PWM_SetCompare1(tmp);
			Delay_ms(10);
		}
		for(tmp = 0;tmp <= 100;tmp++)
		{
			PWM_SetCompare1(100 - tmp);
			Delay_ms(10);
		}
	}
	
}

PWM控制舵机

PWM.c

#include "stm32f10x.h"                  // Device header

/**
  * @brief  初始化PWM波形
  * @param  无
  * @retval 无
  */
void PWM_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第一步:使用RCC开启GPIO时钟
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第二步:使用GPIO_Init()初始化GPIO
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启RCC时钟
	//TIM2是APB1总线的外设
	
	TIM_InternalClockConfig(TIM2);//选择时基单元时钟
	//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重装值,(0-65535)
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;//这里可以得出频率为50Hz,
    //周期为0.02s,已知需要高电平0.5ms~2.5ms,周期X占空比=0.5ms,占空比为0.025
    //那么CCR = 500 ~ 2500
	//设置预分频器值(psc),(0-65535)
	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_OCPolarity = TIM_OCPolarity_High;//输出比较极性
	TIM_OCInitstructure.TIM_OutputState = TIM_OutputState_Enable;//设置输出使能
	TIM_OCInitstructure.TIM_Pulse = 0;//设置CCR
	//PWM频率 = 72MHz/PSC+1/ARR+1
	//PWM占空比 = CCR/ARR+1
	//PWM分辨率 = 1/(ARR+1)
	//1Hz = 1s
	TIM_OC2Init(TIM2,&TIM_OCInitstructure);//初始化输出比较单元(PA^1对应TIM_OC2Init,见引脚定义表)
	
	TIM_Cmd(TIM2,ENABLE);//启动定时器
}

/**
  * @brief  设置通道2中CCR的值
  * @param  被设定的CCR的值 
  * @retval 无
  */
void PWM_SetCompare2(uint16_t Compare)
{
	TIM_SetCompare2(TIM2,Compare);
	
}

Servo.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

/**
  * @brief  初始化PWM
  * @param  无
  * @retval 无
  */
void Servo_Init(void)
{
    PWM_Init(); 
}

/**
  * @brief  设置转动角度
  * @param  Angle 转动角度
  * @retval 无
  */
void Servo_SetAngle(float Angle)
{
    PWM_SetCompare2(Angle / 180 * 2000 + 500);//0   500;180    2500
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"

uint8_t KeyNum;
float Angle;

int main(void)
{
	OLED_Init();
	Servo_Init();
    Key_Init();
    
    OLED_ShowString(1,1,"Angle:");
	
	while(1)
	{
		KeyNum = Key_GetNum();//此前在Key.c中已初始化PB^1故能读出数据
        if(KeyNum == 1)
        {
            Angle += 30;
            if(Angle > 180)
            {
                Angle = 0;
            }
        }
        Servo_SetAngle(Angle);
        OLED_ShowNum(2,1,Angle,3);
	}
	
}

PWMA驱动直流电机

PWM.c

#include "stm32f10x.h"                  // Device header

/**
  * @brief  初始化PWM波形
  * @param  无
  * @retval 无
  */
void PWM_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第一步:使用RCC开启GPIO时钟
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//接在PA^3上
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第二步:使用GPIO_Init()初始化GPIO

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启RCC时钟
	//TIM2是APB1总线的外设
	
	TIM_InternalClockConfig(TIM2);//选择时基单元时钟
	//TIM2的时基单元就由内部时钟来驱动(定时器上电默认使用内部时钟)
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//初始化时基单元
	TIM_TimeBaseInitStructure.TIM_ClockDivision =  TIM_CKD_DIV1;
	//设置时钟分频,选择一分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	//设置计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;
	//设置周期,即ARR重装值,(0-65535)
	TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;
	//设置预分频器值(psc),(0-65535)
	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_OCPolarity = TIM_OCPolarity_High;//输出比较极性
	TIM_OCInitstructure.TIM_OutputState = TIM_OutputState_Enable;//设置输出使能
	TIM_OCInitstructure.TIM_Pulse = 0;//设置CCR
	//PWM频率 = 72MHz/PSC+1/ARR+1
	//PWM占空比 = CCR/ARR+1
	//PWM分辨率 = 1/(ARR+1)
	//1Hz = 1s
	TIM_OC3Init(TIM2,&TIM_OCInitstructure);//初始化输出比较单元(PA^2对应TIM_3C1Init)
	
	TIM_Cmd(TIM2,ENABLE);//启动定时器
}

/**
  * @brief  设置通道1中CCR的值
  * @param  被设定的CCR的值 
  * @retval 无
  */
void PWM_SetCompare3(uint16_t Compare)
{
	TIM_SetCompare3(TIM2,Compare);
	
}

Motor.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

/**
  * @brief  初始化电机方向控制脚以及PMW
  * @param  无
  * @retval 无
  */
void Motor_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第一步:使用RCC开启GPIO时钟
	
	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();
}

/**
* @brief  设置电机运行速度,为负时为反转
  * @param  Speed   电机运行速度
  * @retval 无
  */
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);
    }
}

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();
        if(KeyNum == 1)
        {
            Speed += 20;
            if(Speed > 60)
            {
                Speed = -60;
            }
        }
         Motor_SetSpeed(Speed);
         OLED_ShowSignedNum(2,1,Speed,3);
	}
	
}

注意:这里尽量不要满速,跑一下,香味就出来了

输入捕获模式测频率(IC)

PWM.c

#include "stm32f10x.h"                  // Device header

/**
  * @brief  初始化PWM波形
  * @param  无
  * @retval 无
  */
void PWM_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第一步:使用RCC开启GPIO时钟
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//重映射到PA^15引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第二步:使用GPIO_Init()初始化GPIO
	
	//端口重映射
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟
	//GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);//设置重映射
	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//解除JTAG复用,保留SWD复用
	
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启RCC时钟
	//TIM2是APB1总线的外设
	
	TIM_InternalClockConfig(TIM2);//选择时基单元时钟
	//TIM2的时基单元就由内部时钟来驱动(定时器上电默认使用内部时钟)
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//初始化时基单元
	TIM_TimeBaseInitStructure.TIM_ClockDivision =  TIM_CKD_DIV1;
	//设置时钟分频,选择一分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	//设置计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;
	//设置周期,即ARR重装值,(0-65535)
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;
	//设置预分频器值(psc),(0-65535)
	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_OCPolarity = TIM_OCPolarity_High;//输出比较极性
	TIM_OCInitstructure.TIM_OutputState = TIM_OutputState_Enable;//设置输出使能
	TIM_OCInitstructure.TIM_Pulse = 0;//设置CCR
	//PWM频率 = 72MHz/PSC+1/ARR+1
	//PWM占空比 = CCR/ARR+1
	//PWM分辨率 = 1/(ARR+1)
	//1Hz = 1s
	TIM_OC1Init(TIM2,&TIM_OCInitstructure);//初始化输出比较单元(PA^0对应TIM_OC1Init)
	
	TIM_Cmd(TIM2,ENABLE);//启动定时器
}

/**
  * @brief  设置通道1中CCR的值(占空比)
  * @param  被设定的CCR的值 
  * @retval 无
  */
void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2,Compare);
}

/**
  * @brief  写入PSC数值(修改频率)
  * @param  被设定的PSC数值
  * @retval 无
  */
void PWM_SetPrescaler(uint16_t Prescaler)
{
    TIM_PrescalerConfig(TIM2,Prescaler,TIM_PSCReloadMode_Immediate);
    //所使用定时器,设定数值,立刻重装载模式
}

IC.c

#include "stm32f10x.h"                  // Device header

/**
  * @brief  输入捕获初始化
  * @param  无
  * @retval 无
  */
void IC_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第一步:使用RCC开启GPIO时钟
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//使用TIM3通道1查表为PA^6
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第二步:使用GPIO_Init()初始化GPIO
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启RCC时钟
	//TIM3是APB1总线的外设(因为TIM2要放出被测的PWM)
	
	TIM_InternalClockConfig(TIM3);//选择时基单元时钟
	//TIM2的时基单元就由内部时钟来驱动(定时器上电默认使用内部时钟)
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//初始化时基单元
	TIM_TimeBaseInitStructure.TIM_ClockDivision =  TIM_CKD_DIV1;
	//设置时钟分频,选择一分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	//设置计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;
	//设置周期,即ARR重装值,(0-65535)
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
	//设置预分频器值(psc),(0-65535)
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	//配置重复计数器值(高级定时器会用到)
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//配置时基单元
    
    TIM_ICInitTypeDef IC_InitStructure;
    IC_InitStructure.TIM_Channel = TIM_Channel_1 ;//配置通道1
    IC_InitStructure.TIM_ICFilter = 0xF ;//配置输入捕获滤波器
    IC_InitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising ;//配置极性(上升沿触发)
    IC_InitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1 ;//配置触发信号分频器(不分频)
    IC_InitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI ;//配置数据选择器(直连)
    TIM_ICInit(TIM3,&IC_InitStructure);
    
    TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//配置TRGI
    
    TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//配置从模式
    
    TIM_Cmd(TIM3,ENABLE);//启动定时器
}

uint32_t IC_GetFreq(void)
{
    return 1000000 / (TIM_GetCapture1(TIM3) + 1); //1M是当前TIM3频率
    //待测PWM的频率为1000Hz,
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"

int main(void)
{
	OLED_Init();
	PWM_Init();
    IC_Init();
    
    OLED_ShowString(1,1,"Freq:00000Hz");
    
    PWM_SetPrescaler(720 - 1);//设置PSC   Freq = 72MHz / (PSC + 1) / (ARR + 1)
    PWM_SetCompare1(50);//设置CCR  Duty(占空比) =  CCR / (ARR + 1)
    
	while(1)
	{
		OLED_ShowNum(1,6,IC_GetFreq(),5);
	}
	
}

输入捕获模式测占空比

IC.c

#include "stm32f10x.h"                  // Device header

/**
  * @brief  输入捕获初始化
  * @param  无
  * @retval 无
  */
void IC_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//第一步:使用RCC开启GPIO时钟
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//使用TIM3通道1查表为PA^6
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第二步:使用GPIO_Init()初始化GPIO
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启RCC时钟
	//TIM3是APB1总线的外设(因为TIM2要放出被测的PWM)
	
	TIM_InternalClockConfig(TIM3);//选择时基单元时钟
	//TIM2的时基单元就由内部时钟来驱动(定时器上电默认使用内部时钟)
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//初始化时基单元
	TIM_TimeBaseInitStructure.TIM_ClockDivision =  TIM_CKD_DIV1;
	//设置时钟分频,选择一分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	//设置计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;
	//设置周期,即ARR重装值,(0-65535)
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
	//设置预分频器值(psc),(0-65535)
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	//配置重复计数器值(高级定时器会用到)
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//配置时基单元
    
    TIM_ICInitTypeDef IC_InitStructure;
    IC_InitStructure.TIM_Channel = TIM_Channel_1 ;//配置通道1
    IC_InitStructure.TIM_ICFilter = 0xF ;//配置输入捕获滤波器
    IC_InitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising ;//配置极性(上升沿触发)
    IC_InitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1 ;//配置触发信号分频器(不分频)
    IC_InitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI ;//配置数据选择器(直连)
    //TIM_ICInit(TIM3,&IC_InitStructure);
    TIM_PWMIConfig(TIM3,&IC_InitStructure);//会自动把剩下的一个通道(1或2)初始化成相反的配置
    
    TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//配置TRGI
    
    TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//配置从模式
    
    TIM_Cmd(TIM3,ENABLE);//启动定时器
}

/**
  * @brief  获取频率
  * @param  无
  * @retval 返回被测端口频率
  */
uint32_t IC_GetFreq(void)
{
    return 1000000 / (TIM_GetCapture1(TIM3) + 1); //1M是当前TIM3频率
    //待测PWM的频率为1000Hz,
}

/**
  * @brief  获取占空比
  * @param  无
  * @retval 返回被测端口占空比
  */
uint32_t IC_GetDuty(void)
{
    return (TIM_GetCapture2(TIM3)+1) * 100 / (TIM_GetCapture1(TIM3) + 1);
    //通道二存储有效电平计次,通道一存储整个周期计次
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "IC.h"

int main(void)
{
	OLED_Init();
	PWM_Init();
    IC_Init();
    
    OLED_ShowString(1,1,"Freq:00000Hz");
    OLED_ShowString(2,1,"Duty:000%");
    
    PWM_SetPrescaler(7200 - 1);//设置PSC   Freq = 72MHz / (PSC + 1) / (ARR + 1)
    PWM_SetCompare1(80);//设置CCR  Duty(占空比) =  CCR / (ARR + 1)
    
	while(1)
	{
		OLED_ShowNum(1,6,IC_GetFreq(),5);
        OLED_ShowNum(2,6,IC_GetDuty(),3);
	}
	
}

编码器接口测速(编码器接口)

Ecoder.c

#include "stm32f10x.h"                  // Device header

/**
  * @brief  对GPIO,时基单元,TIM捕获配置以及定时器编码器接口进行初始化
  * @param  无
  * @retval 无
  */
void Encoder_Init(void)
{
    //打开各自RCC时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    
    //GPIO配置
    GPIO_InitTypeDef GPIO_InitStructrue;
    GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_IPU ;//设置上拉输入
    //如果外部空闲模块默认输出高电平,就选择上拉输入,默认输入高电平
    //如果外部空闲模块默认输出低电平,就选择下拉输入,默认输入低电平
    //和外部模块保持状态一致,防止默认电平打架。
    //如果不确定外部模块输出的默认状态或外部信号输出功率非常小,这时候选择浮空输入
    //浮空输入:没有上拉电阻和下拉电阻去影响外部信号,但缺点是当引脚悬空时,
    //没有默认的电平了,输入就会收噪声干扰,来回不断的跳变
    GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 ;
    GPIO_InitStructrue.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_Init(GPIOA,&GPIO_InitStructrue);
    
    //时基单元配置
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;//ARR
    TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1 ;//PSC(不进行分频)
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
    
    //输入捕获配置
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    TIM_ICStructInit(&TIM_ICInitStructure);//为结构体赋初始值
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1 ;
    TIM_ICInitStructure.TIM_ICFilter = 0xf;
    //TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    //这里的极性选择不代表上升沿有效,这里代表的是高低电平极性不翻转(也就是TI1与TI2是否反向)
    //上升沿不反向,下降沿反向
    TIM_ICInit(TIM3,&TIM_ICInitStructure);
    
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2 ;
    TIM_ICInitStructure.TIM_ICFilter = 0xf;
    //TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    //这里的极性选择不代表上升沿有效,这里代表的是高低电平极性不翻转(也就是TI1与TI2是否反向)
    //上升沿不反向,下降沿反向(后面编码器接口会进行重复配置)
    TIM_ICInit(TIM3,&TIM_ICInitStructure);
    
    //配置编码器接口
    TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
    
    TIM_Cmd(TIM3,ENABLE);//启动定时器
}

/**
  * @brief  返回TIM3在1s的时间下CNT的值
  * @param  无
  * @retval 无
  */
int16_t Encoder_Get(void)
{
    int16_t tmp;
    tmp = TIM_GetCounter(TIM3);
    TIM_SetCounter(TIM3,0);//读取cnt并将其置零,用于测频法测频率以及测速
    return tmp;
}

Timer.c

#include "stm32f10x.h"                  // Device header

//extern uint16_t Num;  //使用extern声明外部变量(如果要在文件中使用其他文件中的变量)

/**
  * @brief  定时器中断初始化
  * @param  无
  * @retval 无
  */
void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启RCC时钟
	//TIM2是APB1总线的外设
	
	TIM_InternalClockConfig(TIM2);//选择时基单元时钟
	//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重装值,(0-65535)
	//72000000/10000/7200 = 1s即1Hz
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
	//设置预分频器值(psc),(0-65535)
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	//配置重复计数器值(高级定时器会用到)
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//配置时基单元
	
    //在TIM_TimeBaseInit函数中,由缓冲寄存器,只有在更新事件时,
    //才会真正起作用,为了让值立刻起作用,手动生成了一个更新事件,
    //此时更新事件以及更新中断是同时发生的,更新中断会将置位标志位,
    //故会进入中断进行中断中的操作
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除中断标志位
    
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断输出信号
	//更新中断到NVIC
	
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC优先级分组
	//选择分组2
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//配置中断通道
	//TIM2在NVIC的通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
	NVIC_Init(&NVIC_InitStructure);//初始化NVIC
	
	TIM_Cmd(TIM2,ENABLE);//启动定时器
}


/*TIM2中断函数模板
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//检查中断标志位
	{
        Num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断待处理 位
	}
}
*/

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "Encoder.h"

int16_t Speed;

int main(void)
{
	OLED_Init();
    Timer_Init();
	Encoder_Init();
    
	OLED_ShowString(1,1,"Speed:");
	
	while(1)
	{
		OLED_ShowSignedNum(1,7,Speed,5);
        //Delay_ms(1000);//防止阻塞将其移动至定时器中断进行配置
	}
	
}

/**
  * @brief  TIM2的中断函数(1s)
  * @param  无
  * @retval 无
  */
void TIM2_IRQHandler()
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//检查中断标志位
	{
        Speed = Encoder_Get();
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

材料非线性Matlab有限元编程:初应力法与初应变法

导读:本文主要围绕材料非线性问题的有限元Matlab编程求解进行介绍,重点围绕牛顿-拉普森法(切线刚度法)、初应力法、初应变法等三种非线性迭代方法的算法原理展开讲解,最后利用Matlab对材料非线性问题有限元迭代求解算法进行实现,展示了实现求解的核心代码。这些内容都将收…

Spring基础 - Spring核心之控制反转(IOC)

Spring基础 - Spring核心之控制反转(IOC) 引入 Spring框架管理这些Bean的创建工作&#xff0c;用户管理Bean转变为框架管理Bean&#xff0c;这个称之为控制翻转Spring框架托管创建的Bean放在IOC容器中Spring框架为了更好让用户配置Bean&#xff0c;必然会引入不同方式来配置B…

5G NR 频率计算

5G中引入了频率栅格的概念&#xff0c;也就是小区中心频点和SSB的频域位置不能随意配置&#xff0c;必须满足一定规律&#xff0c;主要目的是为了UE能快速的搜索小区&#xff1b;其中三个最重要的概念是Channel raster 、synchronization raster和pointA。 1、Channel raster …

OpenEuler20.03LTS SP2 上安装 OpenGauss3.0.0 单机部署过程(二)

开始安装 OpenGauss 数据库 3.1.7 安装依赖包 (说明:如果可以联网,可以通过网络 yum 安装所需依赖包,既可以跳过本步骤。如果网络无法连通,请把本文档所在目录下的依赖包上传到服务器上,手工安装后,即无需通过网络进行 Yum 安装了): 上传:libaio-0.3.111-5.oe1.x8…

微信小程序checkbox多选

效果图 <view class"block"><view class"header"><view class"header-left"><text class"pu-title">数据</text><text class"pu-tip">至少选择一个指标</text></view>&l…

Gateway API 实践之(八)FSM Gateway SSL 代理终端与 TLS 上游

FSM Gateway 流量管理策略系列&#xff1a; 故障注入黑白名单访问控制限速重试会话保持健康检查负载均衡算法TLS 上游双向 TLS 网关使用 HTTP 对外与客户端通信&#xff0c;而与上游服务使用 HTTPS 的功能&#xff0c;是一种常见的网络架构模式。在这种模式下&#xff0c;网关…

NOR Flash 存内计算芯片技术探幽

文章目录 NOR Flash 存内计算芯片技术探幽1. 核心技术与芯片架构的独特设计2. 强大性能与多样化应用场景3. 技术前景与面临挑战4. 模拟计算精度的突破5. 工具链完善与应用生态建设6. 跨层协同设计的推动7. 技术突破与挑战8. 工具链的完善与生态系统建设9. 跨层协同设计的加强10…

Red Panda Dev C++ Maker 使用说明

https://download.csdn.net/download/HappyStarLap/88804678https://download.csdn.net/download/HappyStarLap/88804678 下载https://download.csdn.net/download/HappyStarLap/88804678&#xff1a; ​ 这个&#xff0c;就是我们将运行的文件。 ​ 里面加了许多我…

Go内存优化与垃圾收集

Go提供了自动化的内存管理机制&#xff0c;但在某些情况下需要更精细的微调从而避免发生OOM错误。本文介绍了如何通过微调GOGC和GOMEMLIMIT在性能和内存效率之间取得平衡&#xff0c;并尽量避免OOM的产生。原文: Memory Optimization and Garbage Collector Management in Go 本…

Java编程构建高效二手交易平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

H12-821_73

73.某台路由器Router LSA如图所示&#xff0c;下列说法中错误的是&#xff1f; A.本路由器的Router ID为10.0.12.1 B.本路由器为DR C.本路由器已建立邻接关系 D.本路由器支持外部路由引入 答案&#xff1a;B 注释&#xff1a; LSA中的链路信息Link ID&#xff0c;Data&#xf…

学习笔记——ENM模拟

学习笔记——ENM模拟 文章目录 前言一、文献一1. 材料与方法1.1. 大致概念1.2. 生态模型的构建1.2.1. 数据来源&#xff1a;1.2.2. 数据处理&#xff1a;1.2.3. 模型参数优化&#xff1a; 1.3. 适生情况预测1.3.1. 预测模型构建1.3.2. 适生区划分 1.4. 模型的评估与验证 2. 结果…

MyBatisPlus之分页查询及Service接口运用

一、分页查询 1.1 基本分页查询 配置分页查询拦截器 package com.fox.mp.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springfra…

查看系统进程信息的Tasklist命令

Tasklist命令是一个用来显示运行在本地计算机上所有进程的命令行工具&#xff0c;带有多个执行参数。另外&#xff0c;Tasklist可以代替Tlist工具。通过任务管理器&#xff0c;可以查看到本机完整的进程列表&#xff0c;而且可以通过手工定制进程列表方式获得更多进程信息&…

【Web】基于Mybatis的SQL注入漏洞利用点学习笔记

目录 MyBatis传参占位符区别 不能直接用#{}的情况 in多参数值查询 like %%模糊查询 order by列名参数化 MyBatis传参占位符区别 在 MyBatis 中&#xff0c;#{} 和 ${} 都是用于传参的占位符&#xff0c;但它们之间有很大的区别&#xff0c;主要体现在两个方面&#xff1a…

C++初阶篇----新手进村

目录 一、什么是C二、C关键字三、命名空间3.1命名空间的定义3.2命名空间的使用 四、C输入和输出五、缺省参数5.1缺省参数的概念5.2缺省参数的分类 六、函数重载6.1函数重载的概念6.2函数重载的原理----名字修饰 七、引用7.1引用概念7.2引用特性7.3常引用7.4引用的使用7.5传值、…

【并发编程】享元模式

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 享元模式 简介 定义 英文名称&#xff1a;Flyweight pattern. 当需要重用数量有限的同一类对象时 享元模式是一种结构型的设计模式。它的主要目…

SparkJDBC读写数据库实战

默认的操作 代码val df = spark.read.format("jdbc").option("url", "jdbc:postgresql://localhost:5432/testdb").option("user", "username").option("password", "password").option("driver&q…

无心剑汉英双语诗《龙年大吉》

七绝龙年大吉 Great Luck in the Dragon Year 龙腾五岳九州圆 年吼佳音万里传 大漠苍鹰华夏梦 吉人天相铸奇缘 Dragon flies over five peaks watching the divine land so great and round, New Year’s call sends joyous tidal waves far across the world’s bound. The…

第二十六回 母夜叉孟州道卖人肉 武都头十字坡遇张青-Ubuntu 防火墙ufw配置

武松到县里投案&#xff0c;县官看武松是个汉子&#xff0c;就把诉状改成&#xff1a;武松与嫂一时斗殴杀死&#xff0c;后西门庆前来&#xff0c;两人互殴&#xff0c;打死西门庆。上报东平府。东平府尹也可怜武松&#xff0c;从轻发落&#xff0c;最后判了个&#xff1a;脊杖…