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

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

一. 前言

        本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目,包括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配置和实现所有功能的完整源代码我都放在了我主页的资源当中,如果对此有需要的小伙伴们可以拿去使用,如不能使用都可以直接私信我获取。

四. 最终实现展示

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • react开发环境搭建
  • 输入5个数,求中值,verilog实现
  • Splunk、Snort在入侵检测中的应用
  • Lodash库
  • 一.python入门
  • Go 综合题面试题
  • VMware Workstation 17.5安装教程
  • Java日期处理:将字符串yyyyMMdd转换为yyyy年MM月dd日
  • 云栖大会Day1:云应用开发平台 CAP 来了
  • 武汉正向科技 格雷母线检测方式 :车检,地检
  • 2024年房租水电费卡片记账本:改成卡片布局在手机上好用,添加了localStorage保存数据
  • c/c++八股文
  • oracle各种版本在各种系统上安装配置需求快速参考
  • 第十章:园区网组网简介
  • 基于Ambari搭建大数据分析平台(30分钟速成)全网最全最详细的Ambari搭建大数据分析平台:
  • CSS盒模型深入
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Hibernate最全面试题
  • javascript 哈希表
  • js面向对象
  • Laravel 实践之路: 数据库迁移与数据填充
  • python docx文档转html页面
  • Python学习之路13-记分
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 人脸识别最新开发经验demo
  • 深入 Nginx 之配置篇
  • 实战|智能家居行业移动应用性能分析
  • 使用Swoole加速Laravel(正式环境中)
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 正则表达式小结
  • Nginx实现动静分离
  • ​flutter 代码混淆
  • #13 yum、编译安装与sed命令的使用
  • #QT项目实战(天气预报)
  • #vue3 实现前端下载excel文件模板功能
  • (2)leetcode 234.回文链表 141.环形链表
  • (C++20) consteval立即函数
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (六)Flink 窗口计算
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (转)memcache、redis缓存
  • (转)母版页和相对路径
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .Net 4.0并行库实用性演练
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET程序员迈向卓越的必由之路
  • .skip() 和 .only() 的使用