定时器按键tim_key模版
低优先级放在高优先级内势必是程序卡死

把高优先级放到低优先级内,会使程序卡死

可修改
Debuger调试方法




Pwm

rcc

#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
void LED_Disp(uint8_t dsLED)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void setup()
{HAL_TIM_Base_Start_IT(&htim6);LED_Disp(0x00);//关掉所有LEDLCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);
}void loop()
{/* LCD演示 */sprintf(text," number:%x ",led_sta);LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{/* 按键操作演示 */if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET){led_sta=(led_sta&0xfe)|0x01;led_sta=(led_sta&0xfd)|0x00;LED_Disp(led_sta); }}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET){led_sta=(led_sta&0xfd)|0x02;led_sta=(led_sta&0xfe)|0x00;LED_Disp(led_sta); }} }
key_tim2
#include "key.h"#ifndef _KEY_H_
#define _KEY_H_#include "my_main.h"
struct Bkeys
{uint16_t age;uint8_t short_flag;uint8_t long_flag;uint8_t press;uint8_t double_ageEN;uint8_t double_age;uint8_t double_flag;
};
void key_serv(void);
void key_serv_long(void);
void key_serv_double(void);
#endifstruct Bkeys bkey[5]={0,0,0,0,0,0,0};uint8_t key_read()
{if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;else return 0;
}void key_serv()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age==2)bkey[key_sta].short_flag=1;}else{for(int i=0;i<5;i++) bkey[i].age=0;}
}
/*长按快速增加*/
//void key_serv_long()
//{
// uint8_t key_sta=key_read();
// if(key_sta!=0)
// {
// bkey[key_sta].age++;
// if(bkey[key_sta].age>1)bkey[key_sta].press=1;
// }
// else
// {
// for(int i=0;i<5;i++)
// {
// if(bkey[i].press==1&&bkey[i].long_flag==0)
// bkey[i].short_flag=1;
//
// bkey[i].press=0;
// bkey[i].age=0;
// bkey[i].long_flag=0;
// }
// }
// if(bkey[key_sta].age>69)bkey[key_sta].long_flag=1;
//}
/*长按后抬起执行*/
void key_serv_long()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1)bkey[key_sta].press=1;}else{for(int i=0;i<5;i++) {if(bkey[i].age>69)bkey[i].long_flag=1;if(bkey[i].press==1&&bkey[i].long_flag==0)bkey[i].short_flag=1;bkey[i].press=0;bkey[i].age=0;}}
}
/*融合按键双击*/
void key_serv_double()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1)bkey[key_sta].press=1;}else{for(int i=0;i<5;i++) {if(bkey[i].double_ageEN==1&&bkey[i].press==1){bkey[i].double_flag=1;bkey[i].press=0;bkey[i].double_ageEN=0; }if(bkey[i].press==1&&bkey[i].long_flag==0)bkey[i].double_ageEN=1;if(bkey[i].double_ageEN==1)bkey[i].double_age++;if(bkey[i].double_ageEN==1&&bkey[i].double_age>20){bkey[i].short_flag=1;bkey[i].double_age=0;bkey[i].double_ageEN=0;}bkey[i].press=0;bkey[i].age=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>69)bkey[key_sta].long_flag=1;
}
//PWM模版
/-----------------------------------------key------------------------------------------------------/
#include "key.h"struct Bkeys bkey[5]={0,0,0,0};uint8_t key_read()
{if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;else return 0;
}void key_serv()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1)bkey[key_sta].short_flag=1;}else{for(int i=0;i<5;i++) bkey[i].age=0;}
}
/*长按快速增加功能*/
void key_serv_long()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;i++) {if(bkey[i].press==1&&bkey[i].long_flag==0)bkey[i].short_flag=1;bkey[i].age=0;bkey[i].press=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
/*长按后抬起执行*/
//void key_serv_long()
//{
// uint8_t key_sta=key_read();
// if(key_sta!=0)
// {
// bkey[key_sta].age++;
// if(bkey[key_sta].age>1) bkey[key_sta].press=1;
// }
// else
// {
// for(int i=0;i<5;i++)
// {
// if(bkey[i].age>69) bkey[i].long_flag=1;
// if(bkey[i].press==1&&bkey[i].long_flag==0)
// bkey[i].short_flag=1;
// bkey[i].age=0;
// bkey[i].press=0;
// }
// }
//}void key_serv_double()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;i++) {if(bkey[i].double_ageEN==1&&bkey[i].press==1){bkey[i].double_flag=1;bkey[i].double_ageEN=0;bkey[i].press=0;}if(bkey[i].press&&bkey[i].long_flag==0){bkey[i].double_ageEN=1;}if(bkey[i].double_ageEN==1)bkey[i].double_age++;if(bkey[i].double_ageEN==1&&bkey[i].double_age>20){bkey[i].short_flag=1;bkey[i].double_ageEN=0;bkey[i].double_age=0;}bkey[i].age=0;bkey[i].press=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
extern struct Bkeys bkey[];void LED_Disp(uint8_t dsLED)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void setup()
{HAL_TIM_Base_Start_IT(&htim6);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);LED_Disp(0x00);//关掉所有LEDLCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);
}void loop()
{static uint16_t temp=0;if(bkey[1].short_flag==1){/* LCD演示 */sprintf(text," KEY_1 down! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 __HAL_TIM_SET_AUTORELOAD(&htim2,250-1);__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,125);bkey[1].short_flag=0;} if(bkey[2].short_flag==1){/* LCD演示 */sprintf(text," KEY_2 down! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 bkey[2].short_flag=0;} /*长按快速增加功能*/if(bkey[1].long_flag==1){/* LCD演示 */sprintf(text," KEY_1 long!,%d ",temp++);LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 } if(bkey[1].double_flag==1){/* LCD演示 */sprintf(text," KEY_1 double! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 bkey[1].double_flag=0;} /*长按后抬起执行*/
// if(bkey[1].long_flag==1)
// {
// /* LCD演示 */
// sprintf(text," KEY_1 long! ");
// LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新
// bkey[1].long_flag=0;
// }
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM6)key_serv_double();
}
TIM_CAP+systick
/---------------------------key----------------------------------/
#include "key.h"struct Bkeys bkey[5]={0,0,0,0};uint8_t key_read()
{if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;else return 0;
}void key_serv()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1)bkey[key_sta].short_flag=1;}else{for(int i=0;i<5;i++) bkey[i].age=0;}
}
/*长按快速增加功能*/
void key_serv_long()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;i++) {if(bkey[i].press==1&&bkey[i].long_flag==0)bkey[i].short_flag=1;bkey[i].age=0;bkey[i].press=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
/*长按后抬起执行*/
//void key_serv_long()
//{
// uint8_t key_sta=key_read();
// if(key_sta!=0)
// {
// bkey[key_sta].age++;
// if(bkey[key_sta].age>1) bkey[key_sta].press=1;
// }
// else
// {
// for(int i=0;i<5;i++)
// {
// if(bkey[i].age>69) bkey[i].long_flag=1;
// if(bkey[i].press==1&&bkey[i].long_flag==0)
// bkey[i].short_flag=1;
// bkey[i].age=0;
// bkey[i].press=0;
// }
// }
//}void key_serv_double()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;i++) {if(bkey[i].double_ageEN==1&&bkey[i].press==1){bkey[i].double_flag=1;bkey[i].double_ageEN=0;bkey[i].press=0;}if(bkey[i].press&&bkey[i].long_flag==0){bkey[i].double_ageEN=1;}if(bkey[i].double_ageEN==1)bkey[i].double_age++;if(bkey[i].double_ageEN==1&&bkey[i].double_age>20){bkey[i].short_flag=1;bkey[i].double_ageEN=0;bkey[i].double_age=0;}bkey[i].age=0;bkey[i].press=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
extern struct Bkeys bkey[];
uint32_t time500ms;void LED_Disp(uint8_t dsLED)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void LED_Chg(uint8_t num,uint8_t sta)
{uint8_t pos=0x01<<(num-1);led_sta=(led_sta&(~pos))|(pos*sta);LED_Disp(led_sta);
}
void setup()
{HAL_TIM_Base_Start_IT(&htim6);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);//TIM15_CH1输入演示HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_1);HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_2);//TIM3_CH2输入演示HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);LED_Disp(0x00);//关掉所有LEDLCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);time500ms=uwTick;
}void loop()
{static uint16_t temp=0;float frq1,frq2=0;float duty1,duty2=0;frq1=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1);duty1=((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_2)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1)));sprintf(text,"FRQ:%.2fHz ",frq1);LCD_DisplayStringLine(Line1,(uint8_t *)text);//局部刷新 sprintf(text,"DUTY:%.2f%% ",duty1);LCD_DisplayStringLine(Line2,(uint8_t *)text);//局部刷新 frq2=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1);duty2=((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1)));sprintf(text,"FRQ2:%.2fHz ",frq2);LCD_DisplayStringLine(Line3,(uint8_t *)text);//局部刷新 sprintf(text,"DUTY2:%.2f%% ",duty2);LCD_DisplayStringLine(Line4,(uint8_t *)text);//局部刷新 if(uwTick-time500ms>500){static uint8_t LED_sta=0;LED_Chg(2,LED_sta);LED_sta=!LED_sta;time500ms=uwTick;}if(bkey[1].short_flag==1){/* LCD演示 */sprintf(text," KEY_1 down! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 __HAL_TIM_SET_AUTORELOAD(&htim2,250-1);__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,125);bkey[1].short_flag=0;} if(bkey[2].short_flag==1){/* LCD演示 */sprintf(text," KEY_2 down! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 bkey[2].short_flag=0;} /*长按快速增加功能*/if(bkey[1].long_flag==1){/* LCD演示 */sprintf(text," KEY_1 long!,%d ",temp++);LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 } if(bkey[1].double_flag==1){/* LCD演示 */sprintf(text," KEY_1 double! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 bkey[1].double_flag=0;} /*长按后抬起执行*/
// if(bkey[1].long_flag==1)
// {
// /* LCD演示 */
// sprintf(text," KEY_1 long! ");
// LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新
// bkey[1].long_flag=0;
// }
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM6)key_serv_double();
}
RTC实验
#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
extern struct Bkeys bkey[];void LED_Disp(uint8_t dsLED)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void setup()
{HAL_TIM_Base_Start_IT(&htim6);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);//TIM15_CH1输入演示HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_1);HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_2);//TIM3_CH2输入演示HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);LED_Disp(0x00);//关掉所有LEDLCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);
}void loop()
{static uint16_t temp=0;float frq1,frq2=0;float duty1,duty2=0;RTC_TimeTypeDef time;RTC_DateTypeDef date;HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN);sprintf(text,"time:%d:%d:%d ",time.Hours,time.Minutes,time.Seconds);LCD_DisplayStringLine(Line9,(uint8_t *)text);//局部刷新 frq1=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1);duty1=((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_2)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1)));sprintf(text,"FRQ:%.2fHz ",frq1);LCD_DisplayStringLine(Line1,(uint8_t *)text);//局部刷新 sprintf(text,"DUTY:%.2f%% ",duty1);LCD_DisplayStringLine(Line2,(uint8_t *)text);//局部刷新 frq2=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1);duty2=((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1)));sprintf(text,"FRQ2:%.2fHz ",frq2);LCD_DisplayStringLine(Line3,(uint8_t *)text);//局部刷新 sprintf(text,"DUTY2:%.2f%% ",duty2);LCD_DisplayStringLine(Line4,(uint8_t *)text);//局部刷新 if(bkey[1].short_flag==1){/* LCD演示 */sprintf(text," KEY_1 down! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 __HAL_TIM_SET_AUTORELOAD(&htim2,250-1);__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,125);bkey[1].short_flag=0;} if(bkey[2].short_flag==1){/* LCD演示 */sprintf(text," KEY_2 down! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 bkey[2].short_flag=0;} /*长按快速增加功能*/if(bkey[1].long_flag==1){/* LCD演示 */sprintf(text," KEY_1 long!,%d ",temp++);LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 } if(bkey[1].double_flag==1){/* LCD演示 */sprintf(text," KEY_1 double! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 bkey[1].double_flag=0;} /*长按后抬起执行*/
// if(bkey[1].long_flag==1)
// {
// /* LCD演示 */
// sprintf(text," KEY_1 long! ");
// LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新
// bkey[1].long_flag=0;
// }
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM6)key_serv_double();
}
key
#include "key.h"struct Bkeys bkey[5]={0,0,0,0};uint8_t key_read()
{if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;else return 0;
}void key_serv()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1)bkey[key_sta].short_flag=1;}else{for(int i=0;i<5;i++) bkey[i].age=0;}
}
/*长按快速增加功能*/
void key_serv_long()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;i++) {if(bkey[i].press==1&&bkey[i].long_flag==0)bkey[i].short_flag=1;bkey[i].age=0;bkey[i].press=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
/*长按后抬起执行*/
//void key_serv_long()
//{
// uint8_t key_sta=key_read();
// if(key_sta!=0)
// {
// bkey[key_sta].age++;
// if(bkey[key_sta].age>1) bkey[key_sta].press=1;
// }
// else
// {
// for(int i=0;i<5;i++)
// {
// if(bkey[i].age>69) bkey[i].long_flag=1;
// if(bkey[i].press==1&&bkey[i].long_flag==0)
// bkey[i].short_flag=1;
// bkey[i].age=0;
// bkey[i].press=0;
// }
// }
//}void key_serv_double()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;i++) {if(bkey[i].double_ageEN==1&&bkey[i].press==1){bkey[i].double_flag=1;bkey[i].double_ageEN=0;bkey[i].press=0;}if(bkey[i].press&&bkey[i].long_flag==0){bkey[i].double_ageEN=1;}if(bkey[i].double_ageEN==1)bkey[i].double_age++;if(bkey[i].double_ageEN==1&&bkey[i].double_age>20){bkey[i].short_flag=1;bkey[i].double_ageEN=0;bkey[i].double_age=0;}bkey[i].age=0;bkey[i].press=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
adc相关配置及代码
#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
extern struct Bkeys bkey[];void LED_Disp(uint8_t dsLED)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
float adc_read(ADC_HandleTypeDef *hadc)
{uint16_t adc_val;float adc_f;HAL_ADC_Start(hadc);adc_val=HAL_ADC_GetValue(hadc);adc_f=adc_val*3.3f/4096.0f;return adc_f;
}
float adc_read_os(ADC_HandleTypeDef *hadc)
{uint16_t adc_val;float adc_f;HAL_ADC_Start(hadc);adc_val=HAL_ADC_GetValue(hadc);adc_f=adc_val*3.3f/65536.0f;return adc_f;
}
void setup()
{HAL_TIM_Base_Start_IT(&htim6);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);//TIM15_CH1输入演示HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_1);HAL_TIM_IC_Start(&htim15,TIM_CHANNEL_2);//TIM3_CH2输入演示HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_2);HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);LED_Disp(0x00);//关掉所有LEDLCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);
}void loop()
{static uint16_t temp=0;float frq1,frq2=0;float duty1,duty2=0;float adc_data_PB15;RTC_TimeTypeDef time;RTC_DateTypeDef date;HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN);sprintf(text,"time:%d:%d:%d ",time.Hours,time.Minutes,time.Seconds);LCD_DisplayStringLine(Line9,(uint8_t *)text);//局部刷新 frq1=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1);duty1=((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_2)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim15,TIM_CHANNEL_1)+1)));sprintf(text,"FRQ:%.2fHz ",frq1);LCD_DisplayStringLine(Line1,(uint8_t *)text);//局部刷新 sprintf(text,"DUTY:%.2f%% ",duty1);LCD_DisplayStringLine(Line2,(uint8_t *)text);//局部刷新 frq2=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1);duty2=((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2)+1)));sprintf(text,"FRQ2:%.2fHz ",frq2);LCD_DisplayStringLine(Line3,(uint8_t *)text);//局部刷新 sprintf(text,"DUTY2:%.2f%% ",duty2);LCD_DisplayStringLine(Line4,(uint8_t *)text);//局部刷新 adc_data_PB15=adc_read_os(&hadc2);sprintf(text,"PB15:%.4fV ",adc_data_PB15);LCD_DisplayStringLine(Line5,(uint8_t *)text);//局部刷新 if(bkey[1].short_flag==1){/* LCD演示 */sprintf(text," KEY_1 down! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 __HAL_TIM_SET_AUTORELOAD(&htim2,250-1);__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,125);bkey[1].short_flag=0;} if(bkey[2].short_flag==1){/* LCD演示 */sprintf(text," KEY_2 down! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 bkey[2].short_flag=0;} /*长按快速增加功能*/if(bkey[1].long_flag==1){/* LCD演示 */sprintf(text," KEY_1 long!,%d ",temp++);LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 } if(bkey[1].double_flag==1){/* LCD演示 */sprintf(text," KEY_1 double! ");LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新 bkey[1].double_flag=0;} /*长按后抬起执行*/
// if(bkey[1].long_flag==1)
// {
// /* LCD演示 */
// sprintf(text," KEY_1 long! ");
// LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新
// bkey[1].long_flag=0;
// }
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM6)key_serv_double();
}
key
#include "key.h"#ifndef _KEY_H_
#define _KEY_H_#include "my_main.h"
struct Bkeys
{uint16_t age;uint8_t short_flag;uint8_t press;uint8_t long_flag;uint8_t double_ageEN;uint8_t double_age;uint8_t double_flag;
};
void key_serv(void);
void key_serv_long(void);
void key_serv_double(void);
#endifstruct Bkeys bkey[5]={0,0,0,0};uint8_t key_read()
{if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;else return 0;
}void key_serv()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1)bkey[key_sta].short_flag=1;}else{for(int i=0;i<5;i++) bkey[i].age=0;}
}
/*长按快速增加功能*/
void key_serv_long()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;i++) {if(bkey[i].press==1&&bkey[i].long_flag==0)bkey[i].short_flag=1;bkey[i].age=0;bkey[i].press=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
/*长按后抬起执行*/
//void key_serv_long()
//{
// uint8_t key_sta=key_read();
// if(key_sta!=0)
// {
// bkey[key_sta].age++;
// if(bkey[key_sta].age>1) bkey[key_sta].press=1;
// }
// else
// {
// for(int i=0;i<5;i++)
// {
// if(bkey[i].age>69) bkey[i].long_flag=1;
// if(bkey[i].press==1&&bkey[i].long_flag==0)
// bkey[i].short_flag=1;
// bkey[i].age=0;
// bkey[i].press=0;
// }
// }
//}void key_serv_double()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;i++) {if(bkey[i].double_ageEN==1&&bkey[i].press==1){bkey[i].double_flag=1;bkey[i].double_ageEN=0;bkey[i].press=0;}if(bkey[i].press&&bkey[i].long_flag==0){bkey[i].double_ageEN=1;}if(bkey[i].double_ageEN==1)bkey[i].double_age++;if(bkey[i].double_ageEN==1&&bkey[i].double_age>20){bkey[i].short_flag=1;bkey[i].double_ageEN=0;bkey[i].double_age=0;}bkey[i].age=0;bkey[i].press=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}
相关文章:
定时器按键tim_key模版
低优先级放在高优先级内势必是程序卡死 把高优先级放到低优先级内,会使程序卡死 可修改 Debuger调试方法 Pwm rcc #include "my_main.h" uint8_t led_sta0x10; char text[30]; void LED_Disp(uint8_t dsLED) {HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPI…...
Kanass快速安装配置教程(入门级)
Kanass是一款国产开源免费的项目管理工具,工具简洁易用、开源免费,本文将介绍如何快速安装配置kanass,以快速上手。 1、快速安装 1.1 Linux 安装 点击官网 -> 演示与下载 ->下载,下载Linux安装包,…...
无用知识之:std::initializer_list的秘密
先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…...
论文阅读笔记 —— 英文论文常见缩写及含义
正文 缩写全称含义Reference发音w.r.twith reference to关于, 根据WRT - Wikiet al.拉丁语et alia的缩写等等Et Al. | Meaning & Use in APA, MLA & Chicago–etc拉丁语et cetera的缩写等等ETC - Cambridge DictionaryWhat’s ‘etc.’ an abbreviation of (and what …...
实验9 JSP访问数据库(二)
实验9 JSP访问数据库(二) 目的: 1、熟悉JDBC的数据库访问模式。 2、掌握预处理语句的使用 实验要求: 1、使用Tomcat作为Web服务器 2、通过JDBC访问数据库,实现增删改查功能的实现 3、要求提交实验报告,将代…...
[c语言日寄]C语言类型转换规则详解
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
Airflow:选择合适执行器扩展任务执行
Apache Airflow是面向开发人员使用的,以编程方式编写、调度和监控的数据流程平台。可伸缩性是其关键特性之一,Airflow支持使用不同的执行器来执行任务。在本文中,我们将深入探讨如何利用这些执行器在Airflow中有效地扩展任务执行。 理解Airfl…...
使用冒泡排序模拟实现qsort函数
1.冒泡排序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int arr[] { 0,2,5,3,4,8,9,7,6,1 };int sz sizeof(arr) / sizeof(arr[0]);//冒泡排序一共排序 sz-1 趟for (int i 0; i < sz - 1; i){//标志位,如果有序,直接…...
AI大模型开发原理篇-4:神经概率语言模型NPLM
神经概率语言模型(NPLM)概述 神经概率语言模型(Neural Probabilistic Language Model, NPLM) 是一种基于神经网络的语言建模方法,它将传统的语言模型和神经网络结合在一起,能够更好地捕捉语言中的复杂规律…...
Eigen::Tensor使用帮助
0 引言 用python实现了某些算法之后,想转成C来获取更高的性能。但是python数组的操作太灵活了,尤其是3维、4维、5维等高维数组,以及它们的广播、数组坐标、切片等机制。还有numpy的pad、where等操作更是给C转换带来了更多的麻烦。 查阅了相…...
git基础使用--3---git安装和基本使用
文章目录 git基础使用--3--git-安装和基本使用1. git工具安装1.1 git1.2 TortoiseGit1.3 远程仓2. git本地仓库版本管理2.1 git常用命令2.2 git基本操作2.2.1 设置用户名和邮箱 2.2 git基本操作2.2.1 初始化本地仓 git init2.2.2 查看本地库状态 git status2.2.3 添加暂缓区2.2…...
html的字符实体和颜色表示
在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…...
OpenAI发布o3-mini:免费推理模型,DeepSeek引发的反思
引言 在人工智能领域,OpenAI再次引领潮流,推出了全新的推理模型系列——o3-mini。这一系列包括low、medium和high三个版本,旨在进一步推动低成本推理的发展。与此同时,OpenAI的CEO奥特曼也在Reddit的“有问必答”活动中罕见地公开…...
Zemax 中带有体素探测器的激光谐振腔
激光谐振腔是激光系统的基本组成部分,在光的放大和相干激光辐射的产生中起着至关重要的作用。 激光腔由两个放置在光学谐振器两端的镜子组成。一个镜子反射率高(后镜),而另一个镜子部分透明(输出耦合器)。…...
大模型训练(5):Zero Redundancy Optimizer(ZeRO零冗余优化器)
0 英文缩写 Large Language Model(LLM)大型语言模型Data Parallelism(DP)数据并行Distributed Data Parallelism(DDP)分布式数据并行Zero Redundancy Optimizer(ZeRO)零冗余优化器 …...
C# 实现 “Hello World” 教程
.NET学习资料 .NET学习资料 .NET学习资料 C# 作为一种广泛应用于.NET 开发的编程语言,以其简洁、高效和类型安全等特性,深受开发者喜爱。在踏入 C# 编程领域时,编写经典的 “Hello World” 程序是重要的起点,它能帮助我们快速熟…...
LabVIEW无线齿轮监测系统
本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机,实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件,可以实现对齿轮箱振动信号的采集、传输和故障识别,集远程采集、数据库存储…...
IM 即时通讯系统-01-概览
前言 有时候希望有一个 IM 工具,比如日常聊天,或者接受报警信息。 其实主要是工作使用,如果是接收报警等场景,其实DD这种比较符合场景。 那么有没有必要再创造一个DD呢? 答案是如果处于个人的私有化使用࿰…...
【人工智能】 在本地运行 DeepSeek 模型:Ollama 安装指南
持续更新。。。。。。。。。。。。。。。 【人工智能】 在本地运行 DeepSeek 模型:Ollama 安装指南 安装 Ollama安装 DeepSeek 模型选择版本 ,版本越高,参数越多 性能越好使用 DeepSeek 模型 安装 Ollama 访问 Ollama 官网: 前往 https://oll…...
【Linux系统】信号:信号保存 / 信号处理、内核态 / 用户态、操作系统运行原理(中断)
理解Linux系统内进程信号的整个流程可分为: 信号产生 信号保存 信号处理 上篇文章重点讲解了 信号的产生,本文会讲解信号的保存和信号处理相关的概念和操作: 两种信号默认处理 1、信号处理之忽略 ::signal(2, SIG_IGN); // ignore: 忽略#…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
