蓝桥杯嵌入式备赛bug持续记录中~

文章目的

用于记录笔者在备赛真题中遇到的种种问题,作为今后的自己和读者的参考。

1、15届嵌入式省赛真题
bug记录1 2025/1/20        变量大小没选对,天上馅饼也难接

问题:输入捕获的555定时器输出频率值过大,代码逻辑没有问题。

解决:输入捕获的输出的频率是计算出来的二手值。如果不是代码逻辑问题,那显然是参与计算频率的哪个值出现问题了。最后发现是一手的捕获值cal给的变量大小太小了,捕获值溢出导致计算出来的频率过大。

教训:故障输出值非一手值时,应该把参与输出值的逐个值用keil中的debug功能进行检查,尤其是变量大小。

bug记录2 2025/1/21        变量没设对,3w2变鸭蛋

问题:为了给输出频率设置溢出界限,使用了一个temp变量来存储计算后输出的频率(下面代码1),temp值不溢出时(下面代码2)才将temp值赋给fre,结果在原先频率最大的位置会出现fre=0的情况(即执行了代码3)。

        if(htim->Instance == TIM3) //频率输出1 R39 B PB4
	    {
	    	cap_val[1]= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
	    	TIM3 -> CNT=0;
		
	1	    temp[1]=HCLK/((PSC_TIM2_TIM3+1)*cap_val[1])+PX;//此处80是(PSC+1)      
		    if(temp[1]>=0)
		    {
	2	    	fre[1]=temp[1];//此处80是(PSC+1)      //单位Hz
		    	cycle[1]=1000000/(fre[1]);                           //单位us
		    }
	3	    else {fre[1]=0;cycle[1]=0;}
		
		    HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);//PB4 TIM2-chan1
	    }

解决:因为频率计算存在负值的情况,选用的fre、temp分别为uint16_t、int16_t,temp的范围是-32768 到 32767,计算频率值赋值有会出现值溢出导致temp<0的情况。

将temp使用int32_t型进行定义

教训:定义变量a时,如果后续将变量a用于赋值不同类型的变量时,要考虑二者变量直接是否能够接收。

bug记录3 2025/1/22        初始值要警觉 不要一给给默认

问题:为了进行捕获频率最大值最小值的获取,设置了另一个定时器中,将得到的最开始的捕获频率都赋给fre_max fre_min,最后却发现每次都是fre_max先赋到了值,但是fre_min最开始都为0.代码如下

	if(htim->Instance == TIM6)
	{
		//第一步:给出fre_max fre_min的初始值
		
		if(fre_D_Flag==0 && cap_flag==1)
		{
			fre_min[0]=fre[0];//明明这俩同时赋值的,怎么一个有值一个没有
			fre_max[0]=fre[0];//
			
			fre_min[1]=fre[1];			
			fre_max[1]=fre[1];
		
			fre_D_Flag=1;
			T0_count=1;
			
		}
		//第二步:在时间窗口3s内进行最大值最小值的捕获
		else if(T0_count < 300 && fre_D_Flag==1)
		{
			T0_count++;
			for(int i=0;i<2;i++)
			{
				if(fre_max[i]<fre[i])    {fre_max[i]=fre[i];}	
				if(fre_min[i]>fre[i])    {fre_min[i]=fre[i];}
			}
		}

解决:原来是最开始的时候,给到fre_min fre_max的初始fre是还没有输入捕获到的值fre=0,再接着第二步的代码,就只有fre_max能够先得到捕获后的值了。

获得的经验:给初始值的时候,一定要考虑到是否会直接给到上电时的默认值。

2、14届嵌入式省赛真题
bug记录4 2025/1/25        CRR:“PWM输出请勿忘我”

问题:在工程中同时用定时器输出PWM波和捕获PWM波,输入捕获的定时器相关配置没有问题,但是没法捕获到频率值

解决:最后发现是输出PWM波的定时器没有进行CRR值也就是占空比的配置,导致输出的PWM波无高电平,自然也就没法输入捕获到频率了。

——————————————持续更新中————————————————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值