第十二届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(第二套)

news2024/11/29 2:52:25

一.题目分析

(1).题目

 (2).题目分析

1.按键功能分析

a.B1界面切换

b.B2每次按下R加2

c.B3每次按下R减2

d.LED控制按键

2.信号输出功能分析

a.PA7信号输出-----信号的输出就需要使用到输入捕获和输出比较功能

b.输出信号的频率为输入信号频率的R分频

c.输出信号占空比和检测到的R37成正比

        (当前电压值/3.3V)*周期 = 占空比

 (3).逻辑导图

二.CubeMX配置

由于蓝桥杯使用的板子都是STM32G431RBT6,配置都是相同的,模板已经在第六届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)-CSDN博客配置完成,大家可以前往学习

三.相关代码实现

(1)MAIN

1.全局变量声明

#include "main.h"
#include "RCC\bsp_rcc.h"
#include "KEY_LED\bsp_key_led.h"
#include "LCD\bsp_lcd.h"
#include "ADC\bsp_adc.h"
#include "TIM\bsp_tim.h"

//***全局变量声明区
//*减速变量
__IO uint32_t uwTick_Key_Set_Point = 0;//控制Key_Proc的执行速度
__IO uint32_t uwTick_Led_Set_Point = 0;//控制Led_Proc的执行速度
__IO uint32_t uwTick_Lcd_Set_Point = 0;//控制Lcd_Proc的执行速度

//*按键扫描专用变量
uint8_t ucKey_Val, unKey_Down, ucKey_Up, ucKey_Old;

//*LED专用变量
uint8_t ucLed = 0x01;

//*LCD显示专用变量
uint8_t Lcd_Disp_String[21];//最多显示20个字符

//*pwm相关变量
uint16_t PWM_T_Count;
//*主逻辑使用变量
uint8_t Disp_Screen_Num;//0-数据,1-参数
uint8_t R_Freq = 4;//分频值,初试为4
uint16_t ADC_Voltage_X100;
uint16_t Frq;
uint8_t LED_Func = 1;//1-启用,0-禁用
uint32_t AUTORELOAD_Num;
uint32_t COMPARE_Num;


//***子函数声明区
void Key_Proc(void);
void Led_Proc(void);
void Lcd_Proc(void);

2.系统主函数

int main(void)
{

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

	/*bsp资源的初始化*/
	KEY_LED_Init();
	
	LCD_Init();
	LCD_Clear(Black);
  LCD_SetBackColor(Black);
  LCD_SetTextColor(White);	
  ADC2_Init();
	PWM_INPUT_TIM2_Init();
	PWM_OUTPUT_TIM17_Init();
		
	//*输入捕获PWM启动
	HAL_TIM_Base_Start(&htim2);  /* 启动定时器 */
  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);		

	//PA7黄色
	__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, 500);//没有波形输出
	__HAL_TIM_SET_AUTORELOAD(&htim17, 4999);	//200HZ
  HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);		//PA7

  while (1)
  {
		Key_Proc();
		Led_Proc();
		Lcd_Proc();
  }

}

3.按键扫描子函数

a. 逻辑框图

b. 程序源码

//***按键扫描子函数
void Key_Proc(void)
{
	if((uwTick -  uwTick_Key_Set_Point)<50)	return;//减速函数
		uwTick_Key_Set_Point = uwTick;

	ucKey_Val = Key_Scan();
	unKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val); 
	ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);	
	ucKey_Old = ucKey_Val;
	
	if(unKey_Down == 1)//完成界面的切换
	{
		Disp_Screen_Num ^= 0x01;
		LCD_Clear(Black);		
		if(Disp_Screen_Num == 0x00)//数据界面LD1点亮
		{
			ucLed &= (~0x03);
			ucLed |= 0x01;			
		}
		else if(Disp_Screen_Num == 0x01)//参数界面LD2点亮
		{
			ucLed &= (~0x03);		
			ucLed |= 0x02;				
		}			
	}
	if(Disp_Screen_Num == 0x01)//在参数设置界面的时候,才可以加减
	{
    if(unKey_Down == 2)//+2功能
		{
			R_Freq += 2;
			if(R_Freq > 10)
				R_Freq = 10;
		}	
		
    if(unKey_Down == 3)//-2功能
		{
			R_Freq -= 2;
			if(R_Freq < 2)
				R_Freq = 2;
		}	
	}
	
    if(unKey_Down == 4)//LED启用和停用功能
		{	
			LED_Func ^= 0x01;
		}

}

4.LED扫描子函数

a. 程序源码

void Led_Proc(void)
{
	if((uwTick -  uwTick_Led_Set_Point)<200)	return;//减速函数
		uwTick_Led_Set_Point = uwTick;

	if(LED_Func == 0x01)
		LED_Disp(ucLed);
	else if(LED_Func == 0x00)
		LED_Disp(0x00);		
}

5.LCD扫描子函数

a. 逻辑框图

b. 程序源码

void Lcd_Proc(void)
{
	if((uwTick -  uwTick_Lcd_Set_Point)<100)	return;//减速函数
		uwTick_Lcd_Set_Point = uwTick;
		ADC_Voltage_X100 = ((((float)getADC2())/4096)*330);
		Frq = (1000000/PWM_T_Count);

		//控制LED灯的变化
		if((ADC_Voltage_X100<100)||(ADC_Voltage_X100>=300))
		{
			ucLed |= 0x04;
		}
		else 
			ucLed &= (~0x04);			

		if((Frq<1000)||(Frq>=5000))
		{
			ucLed |= 0x08;
		}
		else 
			ucLed &= (~0x08);	

		
		//控制输出PWM的变化
		//AUTORELOAD_Num = 6289;	
		AUTORELOAD_Num = (1000000.0/(Frq/R_Freq));
		COMPARE_Num = (((330-ADC_Voltage_X100)/330.0)*AUTORELOAD_Num);	//求助各位大佬?究竟为什么?如果您告诉我,我以您的名义,补充录制一段,单独解释这个地方。
		
		
		//完成频率的设置
		__HAL_TIM_SET_AUTORELOAD(&htim17, AUTORELOAD_Num);			
					
    //完成占空比的设置
		__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, COMPARE_Num);

		if(Disp_Screen_Num == 0)//显示数据
		{
				sprintf((char *)Lcd_Disp_String, "       Data      ");		
				LCD_DisplayStringLine(Line1, Lcd_Disp_String);	
			
				sprintf((char *)Lcd_Disp_String, "   FRQ:%dHz        ",(unsigned int)Frq);
				LCD_DisplayStringLine(Line3, Lcd_Disp_String);				
			
				sprintf((char *)Lcd_Disp_String, "   R37:%4.2fV      ",(ADC_Voltage_X100*0.01));
				LCD_DisplayStringLine(Line5, Lcd_Disp_String);				
		}
		else if(Disp_Screen_Num == 1)//显示参数
		{
				sprintf((char *)Lcd_Disp_String, "       Para      ");		
				LCD_DisplayStringLine(Line1, Lcd_Disp_String);	
			
				sprintf((char *)Lcd_Disp_String, "      R:%2d",(unsigned int)R_Freq);
				LCD_DisplayStringLine(Line3, Lcd_Disp_String);				
		}
}

5.输入捕获PWM中断回调

a. 程序源码

//输入捕获PWM中断回调
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	  if(htim->Instance==TIM2)
  {
		if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
			{
				PWM_T_Count =  HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1;
			}			
	}	
}

(2)BSP

第六届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)-CSDN博客里面有详细的讲解,大家可前往此链接学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2189288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生(四十四) | 远程连接ECS服务器

文章目录 远程连接ECS服务器 一、自带连接工具连接ECS云服务器 二、为什么要使用远程连接工具 三、远程连接ECS服务器四要素 1、用户名 密码 2、IP地址&#xff08;公网IP&#xff09; 3、SSH端口号 4、阿里云安全组 四、使用MobaXterm远程连接ECS云服务器 五、ECS云…

前端练习小项目 —— 让图片变得更 “色”

前言&#xff1a;相信读者在学习完了HTML、CSS和JavaScript之后已经想要迫不及待的想找一个小型的项目来练练手&#xff0c;那么这篇文章就正好能满足你的 “需求”。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习…

【隐私计算篇】多方安全计算之函数秘密共享(FSS)

1. 函数秘密共享(FSS)定义 秘密共享是一种将一个值拆分为多个份额的方法&#xff0c;形式有多种&#xff0c;可以参考《安全多方计算(MPC)矩阵乘法算子的原理分析》。这里主要提及加法秘密共享&#xff0c;使得&#xff1a;这些份额可以重新组合以还原出秘密值&#xff1b;任…

HTMLCSS练习

1) 效果如下 2) 代码如下 2.1) HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conte…

IPS和IDS有啥区别

在网络安全领域&#xff0c;入侵检测系统 (IDS) 和入侵防御系统 (IPS) 是两种关键的技术&#xff0c;旨在保护网络免受各种威胁。这两者尽管名字相似&#xff0c;但在功能、配置、以及应用场景等方面都有着显著的差异。 入侵检测系统 (IDS) IDS 是一种被动监控系统&#xff0c…

自建动态IP代理为何无法使用及解决方法

在网络使用中&#xff0c;有时候我们自建动态IP代理来实现一些特定的需求&#xff0c;例如访问受限内容或保护隐私。然而&#xff0c;有时我们会遇到无法使用的情况。本文将探讨无法使用的可能原因&#xff0c;并提供相应的解决方法。 1. 可能原因 a. 网络配置问题 自建动态I…

Chromium 关闭 Google Chrome 后继续运行后台应用功能分析c++

此功能允许关闭 Google Chrome 后继续运行后台&#xff0c;控制此功能的开关是 // Set to true if background mode is enabled on this browser. //更改此值可以修改默认开启关闭 inline constexpr char kBackgroundModeEnabled[] "background_mode.enabled"; …

Python爬虫(五)--爬虫库的使用(Python Crawler (5) - Use of Crawler Libraries)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

如何解决在 nextjs 中使用 sequelize 连接 mysql 报错:Please install mysql2 package manually

解决方案 手动设置 dialectModule 的值为 mysql2。增加 dialectModule 配置即可。 import mysql2 from mysql2 import { Sequelize } from sequelizeconst { DB_DATABASE, DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_LOGGING, DB_POLL_MAX, DB_POLL_MIN, DB_POLL_ACQUIRE, …

Android Framework(八)WMS-窗口动效概述

文章目录 动画简述本地、远端动画的定义什么是“leash”图层“leash”图层的命令与创建 Winscope流程小结 动画流程概览分析Activity启动app_transition 动画的主要事件触发动画执行的套路动画真正执行动画的结束回调触发远端动画的Target 动画简述 1、动画的原理也是利用了视觉…

vue3 + Ant design vue formItem 无法使用嵌套的form表单校验

文章目录 前言一、背景在这里插入代码片二、操作步骤1.复现前的准备工作&#xff08;1&#xff09;vue版本和ant design vue 版本&#xff08;2&#xff09;任意页面的代码 2.解决问题3.自定义表单校验的代码 总结 前言 提示&#xff1a; 一、背景在这里插入代码片 背景&…

音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现

一、SCRIPTDATAVALUE类型 从《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中可以知道&#xff0c;根据《video_file_format_spec_v10_1.pdf》第80到81页&#xff0c;SCRIPTDATAVALUE类型由一个8位&#xff08;1字节&#xff09;的Type和…

go语言protoc的详细用法与例子

一. 原来的项目结构 二. 选择源proto文件及其目录&目的proto文件及其目录 在E:\code\go_test\simple_demo\api 文件夹下&#xff0c;递归创建\snapshot\helloworld\v1\ad.pb.go E:\code\go_test\simple_demo> protoc --go_outpathssource_relative:./api .\snapshot\h…

数据结构--二叉树的顺序实现(堆实现)

引言 在计算机科学中&#xff0c;二叉树是一种重要的数据结构&#xff0c;广泛应用于各种算法和程序设计中。本文将探讨二叉树的顺序实现&#xff0c;特别是堆的实现方式。 一、树 1.1树的概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n(n>0) 个有限结点组成…

新款平行进口奔驰GLS450升级原厂AR实景导航人机交互行车记录仪等功能

平行进口的24款奔驰GLS450升级原厂中规导航主机通常具备以下功能&#xff1a; 人机交互系统&#xff1a;该导航主机配备了人机交互系统&#xff0c;可以通过触摸屏、旋钮或语音控制等方式与导航系统进行交互&#xff0c;方便驾驶者进行导航设置和操作。 实景AR导航&#xff1…

使用 classification_report 评估 scikit-learn 中的分类模型

介绍 在机器学习领域&#xff0c;评估分类模型的性能至关重要。scikit-learn 是一个功能强大的 Python 机器学习工具&#xff0c;提供了多种模型评估工具。其中最有用的函数之一是 classification_report&#xff0c;它可以全面概述分类模型的关键指标。在这篇文章中&#xff…

字符串和字符数组(1)

1.字符串和\0 C语言中有字符类型&#xff0c;但没有字符串类型&#xff0c;C语言中字符串就是由双引号引起来的一串字符&#xff0c;比如&#xff1a;"asdf"&#xff1b; 一个字符串中我们能直观的看到一些字符&#xff0c;比如&#xff1a;字符串常量"asdfgh…

三、Java AI 编程助手

AI 对于我们来说是一个高效的编程助手&#xff0c;给我们提供了有效的建议和解决方案&#xff0c;高效利用&#xff0c;无疑是如虎添翼。接下来为大家推荐一个 AI 编程助手。 Fitten Code 1、简介 Fitten Code 免费且支持 80 多种语言&#xff1a;Python、C、Javascript、Type…

2024.9.29 问卷数据分析

最近拿到了一份受众回访的问卷数据&#xff0c;排到的任务是对它进行数据探索。 其实对于问卷数据的处理我只在参加正大杯那次做过&#xff08;正大杯拿了校三&#xff09;&#xff0c;可见这个处理水平还有待提高&#xff08;当然是各种原因促成的结果&#xff09;&#xff0…

python配置环境变量

方法一&#xff1a;首先卸载重新安装&#xff0c;在安装时勾选增加环境变量 方法二&#xff1a;我的电脑-属性-高级系统配置 手动添加环境变量&#xff0c;路径为python的安装路径 检查&#xff1a;查看环境变量是否安装成功 安装第三方lib winr&#xff0c;输入cmd pip ins…