当前位置: 首页 > article >正文

第十四届蓝桥杯嵌入式国赛

一. 前言

        本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目,包括STM32CubeMx的相关配置以及相关功能实现代码以及我在做题过程中所遇到的一些问题和总结收获。如果有兴趣的伙伴还可以去做做其它届的真题,可去 蓝桥云课 上搜索历届真题即可。

二. 题目概述

        下面是总体框架图:

本次国赛题目主要设计到使用LCD显示4个界面,包括 实时数据界面,报警参数界面,报警统计界面以及最后的回放设置界面(这应该对于大多数人来说是最难的,包括我自己,当时在做的时候没有理解它所说的是什么含义,好在后面还是开窍了)。

题目要求实现的功能概述如下:

主要设计到PWM波的输出和PWM的输入捕获,ADC数模转换数据的采集,以及通过配置相关的LED和LCD来展示一些效果和结果,DS18B20来获取环境温度数据等等。

题目大概就讲到这里,想知道具体题目的小伙伴们可去这里:第十四届蓝桥杯嵌入式国赛题目

三. CubeMx的相关配置

        由于要使用到LED和LCD,所以就可以根据产品手册确定引脚位置,将它们在CubeMx中的状态都设置为GPIO_Output。这个比较简单,要是有小伙伴有疑问可去我另外一篇博客关于蓝桥杯嵌入式学习中查看。如下所示,为了方便,这里我把整个国赛需要配置的芯片GPIO口都配置好,后面也会提到CubeMx左侧的配置的。

关于LCD相关代码,我们可以直接使用官方提供的资料代码,这在比赛中都是会给出的,所以这里我也不再展示有关LCD的相关代码了。

下面我们来一步一步完成这道国赛题目。首先因为涉及到数据界面之间的切换,所以我们先来搞好按键中断部分和LCD的显示,代码如下:

#include "interrupt.h"

struct keys key[4]={0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	 if(htim->Instance==TIM4)
	 {
		 key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		 key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		 key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		 key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
	 }
	for(int i=0;i<4;i++)
  {
	 switch(key[i].judge_sta)
	 {
		 case 0:
		 {
		 if(key[i].key_sta==0) key[i].judge_sta=1;
			 key[i].long_time=0;
			 break;
		 }
		 
		 case 1:
		 {
			 if(key[i].key_sta==0)
			 {
				 key[i].judge_sta=2;
			 }
			 else
			 {
				 key[i].judge_sta=0;
			 }
			 break;
		 }
		 
		 case 2:
		 {
			 if(key[i].key_sta==1)
			 {
				 key[i].judge_sta=0;
				 if(key[i].long_time<70)
						key[i].single_flag=1;
			 }
			 else
			 {
				 key[i].long_time++;
				 if(key[i].long_time>70)
					 key[i].long_flag=1;
			 }
			 break;
		 }
		 
	 }
 }
}

上面就是按键处理的代码,为了避免定时器之间的冲突,这里我选择了定时器4来控制按键的中断。在CubeMX中的配置如下:

由于题目还要求我们输入输出频率和占空比,这里我们可以选择定时器2来实现,为了获得占空比可以使用定时器2的两个通道,一个处于上拉状态,另外一个则相反。配置如下:

这里设置了通道一为直接模式,通道二为间接模式,下面的分频系数就设置为80-1就好了,重装载值就让它默认。 下面就给通道一和通道二设置了上拉和下拉。

 

获取相关频率和占空比的代码实现如下所示:

double ccrla_F=0;
double ccrlb_F=0;
double ccrl_F=0;
float ccrl_D=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM2)
	{
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
		{
			ccrla_F=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
			ccrlb_F=HAL_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配置和实现所有功能的完整源代码我都放在了我主页的资源当中,如果对此有需要的小伙伴们可以拿去使用,如不能使用都可以直接私信我获取。

四. 最终实现展示

 


http://www.kler.cn/news/318983.html

相关文章:

  • 【JVM】双亲委派模型
  • JDk17新特性
  • html TAB、table生成
  • netfilter和iptables--netfilter源码篇
  • 说说明计算机视觉(CV)技术的优势和挑战。
  • harmonyos面试题
  • 基于vue框架的宠物托管系统设计与实现is203(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • AI推介-大语言模型LLMs论文速览(arXiv方向):2024.08.25-2024.08.31
  • 52 文本预处理_by《李沐:动手学深度学习v2》pytorch版
  • PHP 递归遍历目录
  • C++20 模块化(Modules)
  • 物理学基础精解【17】
  • 等保测评新趋势:企业如何领跑网络安全赛道
  • 5--SpringBoot项目中菜品管理 详解(一)
  • Matlab进阶绘图第68期—带分组折线段的分区柱状图
  • 基于STM32的电压检测WIFI模拟
  • 常见服务器大全----都是什么?又有何作用?区别联系是什么?---web,应用,数据库,文件,消息队列服务器,Tomat,Nginx,vite.....
  • python 实现PPT转化为长图,代码如下
  • 面经 | webpack
  • langchain 提示词(一) 字符提示词和聊天提示词
  • 类似QQ聊天功能的Java程序
  • Linux —— Socket编程(一)
  • 叉车防撞报警系统解决方案:提高仓库、保障员工的安全性
  • 零基础学Axios
  • 每天学习一个技术栈 ——【Celery】篇(1)
  • C++20-协程
  • 短视频矩阵管理系统贴牌 源码开发
  • 数据库某字段要保存中文时,怎样确定长度(以Oracle为例)
  • 神经网络(四):UNet语义分割网络
  • 走向管理岗,必须懂这13个人才管理铁律