蓝桥杯嵌入式知识点回顾复习

文章描述了一个嵌入式系统中,通过GPIO进行输入读取,同时结合定时器、ADC、RTC、LCD、UART通信和PWM调制的功能,实现按键识别、状态监测和数据交换的过程。
摘要由CSDN通过智能技术生成

随便写写。

按键

相关定义

#define k1 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)
#define k2 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
#define k3 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)
#define k4 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)
#define key k1 | (k2 << 1) | (k3 << 2) | (k4 << 3) | 0xf0

u8 Tag, Cnt, Up;
void key_read()
{
	u8 keydate = (key) ^ 0xff;
	Tag = keydate & (keydate ^ Cnt);
	Up = ~keydate & (keydate ^ Cnt);
	Cnt = keydate;
}

长短键

u8 long_flag = 0,keystate = 0;
bool double_flag = 0;
u32 key_tick = 0;
u32 k1_time = 0,last_time = 0;
void key_proc()
{
	if (uwTick - key_tick < 20)
		return;
	key_tick = uwTick;
	key_read();
	if (Tag & 0x04)
	{
		k1_time = uwTick;
		if (!long_flag)
			long_flag = 2;
	}
	if ((Cnt & 0x04) && long_flag == 2)
	{
		if (uwTick - k1_time >= 2000)
		{
			//长按键
			long_flag = 1; 
		}
	}
	else if (!(Cnt & 0x04) && long_flag)
	{
		if (long_flag == 2)
		{
			//短按键
		}
		long_flag = 0;
	}
}

单双键

	if(Tag&0x01){
		if(keystate == 0){
			last_time = uwTick;
			keystate = 1;
		}
		else if(keystate == 1&&uwTick - last_time <=300){
			double_flag = 1;
			//双击代码
			keystate = 0;
		}
	}
	if(keystate == 1&&uwTick - last_time > 300&&!double_flag){
		//单击代码
		keystate = 0;
	}
	double_flag = 0;
//在key_proc()添加
	

LED

相关定义

void led_disp(u8 led)
{
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, 0xff00, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, led << 8, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

使用

u32 led_tick = 0;
u8 led_control;
void led_proc()
{
	if (uwTick - led_tick < 100)
		return;
	led_tick = uwTick;
	if (frq > 200 && frq < 400)
		led_control ^= 0x01;   //闪烁

	else
		led_control &= ~0x01;   //熄灭
	if (sec5_flag)
		led_control |= 0x02;     //亮
	else
		led_control &= ~0x02;
	led_disp(led_control);
}

ADC

float adc = 0;
void adc_proc()
{
	HAL_ADC_Start(&hadc2);
	adc = HAL_ADC_GetValue(&hadc2) * 3.3f / 4095.0f;
}


HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);//main函数添加

捕获频率

u32 frq,value;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if (htim->Instance == TIM2 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
	{
		HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
		value = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);  //注意除了开启其余都是htim
		__HAL_TIM_SetCounter(htim,0);
		frq = 1e6/value;
	}
}

RTC

RTC_TimeTypeDef T = {0};
RTC_DateTypeDef D = {0};

void rtc_proc()
{
	HAL_RTC_GetTime(&hrtc, &T, RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc, &D, RTC_FORMAT_BIN);
}
//T.

LCD

float lcd_val;
u8 text[20];
u32 lcd_tick = 0;

void lcd_proc()
{
	if (uwTick - lcd_tick < 100)
		return;
	lcd_tick = uwTick;

	if (!ui)
	{
		sprintf((char *)text, "     ADC:%3.2f  ", adc);
		LCD_DisplayStringLine(Line1, text);
		sprintf((char *)text, "     FRQ:%d  ", frq);
		LCD_DisplayStringLine(Line2, text);

		LCD_DisplayChar(Line5, (320 - (16 * 1)), 'a'); // 显示单个字符
	}
	if (ui)
	{
		sprintf((char *)text, "     World  ");
		LCD_DisplayStringLine(Line1, text);
		sprintf((char *)text, "     D:%d-%d-%d  ", D.Year, D.Month, D.Date);
		LCD_DisplayStringLine(Line2, text);
		sprintf((char *)text, "     T:%d-%d-%d  ", T.Hours, T.Minutes, T.Seconds);
		LCD_DisplayStringLine(Line3, text);
		if (!rk_flag)
			LCD_SetBackColor(Green);
		sprintf((char *)text, "     r:%d               ", r);
		LCD_DisplayStringLine(Line4, text);
		LCD_SetBackColor(Black);
		if (rk_flag)
			LCD_SetBackColor(Green);
		sprintf((char *)text, "     k:%d               ", k);
		LCD_DisplayStringLine(Line5, text);
		LCD_SetBackColor(Black);
	}
}

UART

u8 rx_buf[10], RX_BUF[10], rx_pointer = 0;
u32 uart_tick = 0;
_Bool err_flag = 0, rx_flag = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	rx_flag = 1;
	uart_tick = uwTick;
	RX_BUF[rx_pointer++] = rx_buf[0];
	HAL_UART_Receive_IT(&huart1, (u8 *)rx_buf, 1);
}

char str[10];
int num = 0;
void uart_proc()
{
	if (uwTick - uart_tick < 50)
		return;
	uart_tick = uwTick;
	if (rx_flag)
	{
		rx_flag = 0;
		sscanf((char *)RX_BUF, "%2s-%2d", str, &num);
		if (rx_pointer == 5 && RX_BUF[2] == '-')
		{
			printf("Received String: %s, Number: %d\r\n", str, num);
			if (!strcmp(str, "AB"))
				printf("OK\r\n");
			else
				printf("NULL\r\n");
		}
		else
			err_flag = 1;
	}
	if (err_flag)
		printf("NULL\r\n");
	err_flag = 0;
	rx_pointer = 0;
	memset(RX_BUF, '\0', sizeof(RX_BUF));
}

HAL_UART_Receive_IT(&huart1, (u8 *)rx_buf, 1);//main

PWM

u32 frq = 0;
u32 pwm_tick = 0;
void pwm_proc(){
	if(uwTick - pwm_tick <50) return;
	pwm_tick = uwTick;		
	float frq = 1e6/(TIM17->ARR+1);
	if(!pwm_mode){
		if(frq>200)
			frq-=10;
		else 
			frq = 200;
	}
	else{
		if(frq<400)
			frq+=10;
		else 
			frq = 400;
			
	}
	TIM17->ARR = 1e6/frq-1;
	TIM17->CCR1 = (TIM17->ARR+1)*0.1;//10%占空比   
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值