博主学习蓝桥杯遇到的坑

延时函数的坑

在hal库里面的延时函数HAL_Delay(N); 其实是延时了N+1ms 如果我们想延时1s的话 就应该写成HAL_Delay(999);

在数据处理中

如果能加括号的话 就一定要加,不要吝啬括号!!!因为没加括号会出现大问题

(uint8_t)(AVE_AD_R37*30.3); //可以显示整数

(uint8_t)AVE_AD_R37*30.3; //只会显示整十的数

32里面的ADC的中值滤波

因为32处理小数的速度会占用大量的CUP的内存,建议能减少小数的运行就减少,做好能够变成整数,或者等着后面再进行运行,不然数据很容易出错。

小数运算的话比较大小也会有精度的问题的,所以一定要转化为整数进行比较大小!!!

 

如果330没有.0的话 会取整数 后面导致数据变成

(((330-ADC_Voltage_X100)/330.0)*(100000*R_Freq/Frq)))   //如果330没有.0的话 会取整数 后面导致数据变成0

ASCII的问题 字符减‘0’就是相应的整数

就是如果要把字符串数字 转化为相应的数值的话 就要减去0x30——>"0"

 下面就说说为什么字符减'0'可以到相应的整数。现在比如我们要字符‘1’转换成数字1,就这么一个变化,我们看到了大家注意了字符型常量用''括起来的原因是,它们在计算机中都以各自的ASCII表示。而‘1’的对应编码是49的二进制码,但是我们的数字1,就等于1呀,所以为了由原来的‘1’实际上就是49的二进制变成现在的1对应的二进制1,只好用49-48=1了。但是在ASCII码里‘0’对应的刚好是48的二进制码,所以我们转换的时候只需要‘1’-‘0’=1;就可以了。而数字的ASCII码是按顺序规定的。所以其它字符要转换成数字都可以用减‘0’来表示。比如‘2’的ASCII是50,而我们要得到数字2,于是用‘2’-48=2了。看来当我们知道数据在计算机中的存储规则的时候,问题就迎刃而解了。

memset 清零的操作

memset(&Car_Data_Storage[in_locate],0,sizeof(Car_Data_Storage[in_locate]));//清空该位置所有内容,为0

 ADC的校准问题

 只要再初始化的时候加上校准函数就好了

ADC2_Init();
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);    //AD校准

自动重装载值的坑:方波需要用到Disable

设定计数器的工作模式(向上还是向下计数),设定自动重装载值,当计数器记满进入定时器中断中。然后自动重装载值载入计数器中重新开始计数(这是向上计数,向下技术类似)。

参考资料:

PWM 的输出其实就是对外输出脉宽可调(即占空比调节)的方波信号,信号频率 是由自动重装寄存器ARR 的值决定,占空比由比较寄存器CCR的值决定。 底下这幅图是PWM输出占空比调节图

 对应博客的链接:

搬运 auto_reload preload_理地叉的博客-CSDN博客_自动重装载预装载允许位

1. auto-reload preload=Disable:自动重装载寄存器写入新值后,计数器立即产生计数溢出,然后开始新的计数周期

2. auto-reload preload=Enable:自动重装载寄存器写入新值后,计数器完成当前旧的计数后,再开始新的计数周期

判断数字是否为1~9

代码编写:

判断接收的数据是否为 k0.1\n的格式

到点上报一次电压值+k值+时间+命令结束标志位

例如: 2.21+0.1+123030\n

字符对应的ASCLL码k:0x6b 0:0x30 .:0x2e \:0x5C n:0x6E

//串口接受的数据处理
	if(((uwTick - Uart_Rev_Data_Delay_Time)<=300)&&(uwTick - Uart_Rev_Data_Delay_Time)>=200)//200ms~300ms之内处理数据
	{
		if(rx_buf_index==6)//接收到了6个数据
		{
			if((rx_buf[0] == 0x6B)&&(rx_buf[1] == 0x30)&&(rx_buf[2] == 0x2E)&&(rx_buf[4] == 0x5C)&&(rx_buf[5] == 0x6E))  //0x6B k 0x30 0
			{
				if((rx_buf[3]>=0x31)&&(rx_buf[3]<=0x39))  //判断数字在1到9之间
				{
					k_int = rx_buf[3] - 0x30; 
					sprintf(str, "OK\n");
					HAL_UART_Transmit(&huart1,(unsigned char *)str, strlen(str), 50);		
					iic_24c02_write(&k_int, 0, 1);					
				}
			}			
		}
	  rx_buf_index = 0;	
     Start_Flag = 0;

 百分号的含义

 

 长按短按的写法

之前有篇博客是写三行代码的逻辑的,如果不懂的可以去看看

//***按键扫描子函数
void Key_Proc(void)
{
	if((uwTick - uwTick_Key_Set_Point)<50) return;//减速函数
		uwTick_Key_Set_Point = uwTick;
	
	ucKey_Val = Key_Scan();
	ucKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val);
	ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);
	ucKey_Old = ucKey_Val;
	
//	if(ucKey_Down == 4)
//	{
//		 ucLed = 0x88;
//	}
	
	
	if(ucKey_Down)
	{
		uwTick_Long_Short_Judge = uwTick;
		
	}
	if((uwTick - uwTick_Long_Short_Judge) < 800)//短按识别
	{
		switch(ucKey_Up)
		{
			case 2://如果B2短按
				if(++ucState == 4)
					ucState = 1;
			break;
			
			case 4://如果B4短按
				if(ucState  != 4)
				{
					ucState = 4;
					Sec_Boss = (__IO uint32_t)(3600*ucHour_Min_Sec[0] + 60*ucHour_Min_Sec[1] + ucHour_Min_Sec[2]);
					HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);	//PA6,启动PWM的产生
				}
				else
					ucState = 5;
			break;
				
			case 3://如果B3短按,时分秒进行+1操作
				B3_Ctrl();
			break;
			
			case 1://如果B1短按,切换存储位置
				if(++Storage_Num == 6) Storage_Num = 1;
				iic_24c02_read(ucHour_Min_Sec,(3*(Storage_Num-1)),3);					
				
			break;			
			
		}			
	}
	else//长按
	{
		switch(ucKey_Val)
		{
			case 2://如果B2长按,进入状态0
				if((ucState == 1)||(ucState == 2)||(ucState == 3))
				{
					iic_24c02_write(ucHour_Min_Sec,(3*(Storage_Num-1)) , 3);	
					ucState = 0;
				}
			break;
			
			case 3://如果B3长按,时分秒连续进行+1操作
				B3_Ctrl();
			break;			

			case 4://如果B4长按,运行状态下进入状态0
				if(ucState == 4)
				{
					ucLed = 0x00;		//关闭LED闪烁
					HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1); //关闭PWM生成		
					iic_24c02_read(ucHour_Min_Sec, (3*(Storage_Num-1)), 3);		
					ucState = 0;
				}
			break;	
			
		}	
		
	}	
}

 

EEPROM的坑

ps:I2CInit() 一定要放在lcd后面 不然读取不了数据!!!!

还有那个延时需要注意的 改成10

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值