做外贸网站企业,自适应网站搭建,网站营销推广,知乎 php网站开发书籍_一. 前言 本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目#xff0c;包括STM32CubeMx的相关配置以及相关功能实现代码以及我在做题过程中所遇到的一些问题和总结收获。如果有兴趣的伙伴还可以去做做其它届的真题#xff0c;可去 蓝桥云课 上搜索历届真题即可。 二. 题目概述 …一. 前言 本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目包括STM32CubeMx的相关配置以及相关功能实现代码以及我在做题过程中所遇到的一些问题和总结收获。如果有兴趣的伙伴还可以去做做其它届的真题可去 蓝桥云课 上搜索历届真题即可。 二. 题目概述 下面是总体框架图 本次国赛题目主要设计到使用LCD显示4个界面包括 实时数据界面报警参数界面报警统计界面以及最后的回放设置界面这应该对于大多数人来说是最难的包括我自己当时在做的时候没有理解它所说的是什么含义好在后面还是开窍了。
题目要求实现的功能概述如下 主要设计到PWM波的输出和PWM的输入捕获ADC数模转换数据的采集以及通过配置相关的LED和LCD来展示一些效果和结果DS18B20来获取环境温度数据等等。
题目大概就讲到这里想知道具体题目的小伙伴们可去这里第十四届蓝桥杯嵌入式国赛题目 三. CubeMx的相关配置 由于要使用到LED和LCD所以就可以根据产品手册确定引脚位置将它们在CubeMx中的状态都设置为GPIO_Output。这个比较简单要是有小伙伴有疑问可去我另外一篇博客关于蓝桥杯嵌入式学习中查看。如下所示,为了方便这里我把整个国赛需要配置的芯片GPIO口都配置好后面也会提到CubeMx左侧的配置的。 关于LCD相关代码我们可以直接使用官方提供的资料代码这在比赛中都是会给出的所以这里我也不再展示有关LCD的相关代码了。
下面我们来一步一步完成这道国赛题目。首先因为涉及到数据界面之间的切换所以我们先来搞好按键中断部分和LCD的显示代码如下
#include interrupt.hstruct keys key[4]{0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim-InstanceTIM4){key[0].key_staHAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].key_staHAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_staHAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_staHAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);}for(int i0;i4;i){switch(key[i].judge_sta){case 0:{if(key[i].key_sta0) key[i].judge_sta1;key[i].long_time0;break;}case 1:{if(key[i].key_sta0){key[i].judge_sta2;}else{key[i].judge_sta0;}break;}case 2:{if(key[i].key_sta1){key[i].judge_sta0;if(key[i].long_time70)key[i].single_flag1;}else{key[i].long_time;if(key[i].long_time70)key[i].long_flag1;}break;}}}
}
上面就是按键处理的代码为了避免定时器之间的冲突这里我选择了定时器4来控制按键的中断。在CubeMX中的配置如下 由于题目还要求我们输入输出频率和占空比这里我们可以选择定时器2来实现为了获得占空比可以使用定时器2的两个通道一个处于上拉状态另外一个则相反。配置如下 这里设置了通道一为直接模式通道二为间接模式下面的分频系数就设置为80-1就好了重装载值就让它默认。 下面就给通道一和通道二设置了上拉和下拉。 获取相关频率和占空比的代码实现如下所示
double ccrla_F0;
double ccrlb_F0;
double ccrl_F0;
float ccrl_D0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim-InstanceTIM2){if(htim-ChannelHAL_TIM_ACTIVE_CHANNEL_1){ccrla_FHAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);ccrlb_FHAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);__HAL_TIM_SetCounter(htim,0);ccrl_F(80000000/80)/ccrla_F;ccrl_D(ccrlb_F/ccrla_F)*100;HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);}}
} 其他的一些功能实现代码由于比较长我这里就不再展示出来。关于整个国赛题目的完整CubeMx配置和实现所有功能的完整源代码我都放在了我主页的资源当中如果对此有需要的小伙伴们可以拿去使用如不能使用都可以直接私信我获取。 四. 最终实现展示