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

一.题目分析

(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);	//200HZHAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);		//PA7while (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.xdnf.cn/news/1554704.html

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

相关文章

融媒体服务中PBO进行多重采样抗锯齿(MSAA)

如果不理解pbo 那先去了解概念&#xff0c;在此不再解释&#xff0c;这是我为了做融合服务器viewpointserver做的一部分工作&#xff0c;融合服务器的功能是将三维和流媒体&#xff0c;AI融合在一起&#xff0c;viewpointserver会直接读取三维工程的文件&#xff0c;同时融合rt…

BUCK的工作模式:CCM BCM DCM

连续导通模式CCM CCM工作状态 一个开关周期内&#xff0c;电感内的电流始终大于0&#xff0c;电感在DCDC整个工作周期中一直处于充电放电状态&#xff1b;即使DCDC的功率开关管断开时&#xff08;Toff&#xff09;&#xff0c;电感中一直有电流流过&#xff1b; 功率开关管闭合…

分布式学习02-CAP理论

文章目录 CAP三指标一致性可用性分区容错性 CAP不可能三角P存在的必要性CP理论AP理论 CAP理论对分布式系统的特性做了高度抽象&#xff0c;将其抽象为一致性、可用性、分区容错性。 并对特征间的冲突做了总结&#xff1a;CAP不可能三角。 CAP三指标 一致性&#xff08;Consis…

PostgreSQL Docker Error – 5432: 地址已被占用

PostgreSQL Docker Error – 5432: 地址已被占用 今天在学习【Spring Boot React】价值79.9美元&#xff0c;全栈开发&#xff0c;搭建个人网站、做毕业设计、试试这套课程第17~21节视频的时候&#xff0c;发现运行docker run --name demo-postgres -e POSTGRES_PASSWORDpass…

循环生成对抗网络——CycleGAN

系列文章目录 GAN生成对抗网络介绍 目录 系列文章目录 前言 二、应用 三、解决的问题 1、图像转译任务 2、原理 四、调试好的源码 前言 CycleGAN&#xff08;循环生成对抗网络&#xff09;是一种用于图像到图像的转换的深度学习模型&#xff0c;由Jun-Yan Zhu等人在20…

Redis数据库与GO(一):安装,string,hash

安装包地址&#xff1a;https://github.com/tporadowski/redis/releases 建议下载zip版本&#xff0c;解压即可使用。解压后&#xff0c;依次打开目录下的redis-server.exe和redis-cli.exe&#xff0c;redis-cli.exe用于输入指令。 一、基本结构 如图&#xff0c;redis对外有个…

【ubuntu】ubuntu20.04安装chrome浏览器

1.下载 https://download.csdn.net/download/qq_35975447/89842972 https://www.google.cn/chrome/ 2.安装 sudo dpkg -i google-chrome-stable_current_amd64.deb 3.使用

【AI学习】Mamba学习(一):总体架构

论文&#xff1a;《Mamba: Linear-Time Sequence Modeling with Selective State Spaces》 作者1&#xff1a;Albert Gu&#xff0c;现在是CMU(卡内基梅隆大学)助理教授&#xff0c;曾在DeepMind 工作。多年来一直推动SSM架构发展。 作者2&#xff1a;Tri Dao&#xff0c;现为…

文件上传之%00截断(00截断)以及pikachu靶场

pikachu的文件上传和upload-lab的文件上传 目录 mime type类型 getimagesize 第12关%00截断&#xff0c; 第13关0x00截断 差不多了&#xff0c;今天先学文件上传白名单&#xff0c;在网上看了资料&#xff0c;差不多看懂了&#xff0c;但是还有几个地方需要实验一下&#…

老年人意外跌倒感知技术

意外跌倒是导致老年人仙游的6大原因之一&#xff0c;尤其多余80岁以上的老年人。跌倒已成为我国 65 岁以上老年人因伤致死的首位原因&#xff08;来源&#xff1a;IT之家&#xff09;。 跌倒最容易发生在两个地方&#xff0c;卫生间和过道。主要可能是卫生间没有安装扶手&…

【案例】平面云

教程案例视频&#xff1a;Unity Shader Graph - 云教程 开发平台&#xff1a;Unity 2022 开发工具&#xff1a;Unity ShaderGraph   一、效果展示 二、ShaderGraph 路线图 三、案例分析 核心思路&#xff1a;使用 Noise&#xff08;噪声&#xff09;模拟云层状态   3.1 说明…

C++异步操作实现线程池

文章目录 std::future用法async函数promise::get_futurepackaged_task::get_future 线程池实现 std::future std::future是C11标准库中的一个模板类,表示异步操作的结果 当我们在进行多线程中使用异步任务时,std::future是用来帮我们在需要的时候获取任务执行的结果 他的一个…

基于spring boot的篮球论坛系统

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

快停止这种使用U盘的行为!

前言 现在各行各业的小伙伴基本上都需要用电脑来办公了&#xff0c;你敢说你不需要用电脑办公&#xff1f; 啊哈哈哈&#xff0c;用iPad或者手机办公的也算。 有些小伙伴可能经常996&#xff0c;甚至有时候都是007。有时候到了下班时间&#xff0c;工作还没做完&#xff0c;…

图文深入理解Oracle DB企业级集中管理神器-GC的安装和部署

值此国庆佳节&#xff0c;深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。今天继续宅继续写。 本文承接上篇&#xff0c;介绍GC的安装和部署。咱们不急&#xff0c;慢慢来&#xff0c;饭要一口一口地吃才能吃得踏实自然。 限于篇幅&#xff0c;本节将重点介绍关键步…

VRRP协议个人理解+报文示例+典型配置-RFC2338/RFC3768/RFC5798/RFC9568

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 因此本文将在VRRP协议报文的基础上进行介绍。 VRRP协议发展 关于VRRPv2基本原理&#xff0c;可重点参考2004年发布的RFC3768-Virtual Ro…

深入理解NumPy库:常用函数详解与数组操作指南

在数据科学和数值计算领域&#xff0c;NumPy无疑是一个强大的工具&#xff0c;它为Python提供了高效的多维数 组处理能力。无论是进行数据分析、构建机器学习模型&#xff0c;还是进行复杂的科学计算&#xff0c;NumPy都是 不可或缺的核心库之一。 numpy.array 是 NumPy 库中…

UART通信—基于江科大源码基础进行的改进和解析

我就不讲理论了&#xff0c;CSDN上大佬属实多&#xff0c;我就只讲代码了&#xff0c;串口的基本理论&#xff0c;大家去看其他大佬写的吧 一、源文件的组成 1、包含的头文件 stm32f10x.h 是STM32F10x系列微控制器的标准外设库&#xff08;Standard Peripheral Library&…

【算法业务】数据驱动的用户增长实践、收益及思考

这篇内容是多年之前&#xff08;2020年&#xff09;的用户增长项目时自己写的总结&#xff0c;这里做一下对于实践和思考的回顾&#xff0c;便于知识的记录和经验分享&#xff0c;内容涉及用户增长理解、个性化推送系统框架、个性化推送问题建模、推送内容池构建、智能文案生成…

zotero使用koofr+google drive/onedrive同步

最早了解到这个思路是来自 知乎-【从零开始使用Zotero】(3) Zotero文献同步方式 和 How to Sync Zotero Files Using WebDAV and Google Drive with Koofr: A Step-by-Step Guide 虽然周围很多人都在用Readpaper这种web端的了&#xff0c;但是经常逛Arxiv而且zotero的web插…