STM32HAL库【G431】--【蓝桥杯嵌入式第九届省赛题】

2024-02-15 18:40

本文主要是介绍STM32HAL库【G431】--【蓝桥杯嵌入式第九届省赛题】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

完整工程(百度网盘免费下载,提取码:0403)和演示视频在文章末尾,需要请移步至文章末尾。

目录

  • 第九届嵌入式省赛题目
  • 涉及模块主要代码
    • 主要变量与结构体
    • 按键模块
    • 倒计时模块
    • EEPROM模块
      • EEPROM读取
      • EEPROM写入
    • LCD移植
  • 完整功能演示视频
  • 完整工程文件(HAL库)
  • 嵌入式赛点资源包(2023)
  • 总结

第九届嵌入式省赛题目

在这里插入图片描述

涉及模块主要代码

主要变量与结构体

struct keys//按键结构体
{uchar key_judge;//按键判断状态bool key_sta;//按键实时状态uint key_time;//按键持续时间bool key_single;//短按按键标志bool key_long;//长按按键标志
};
struct times //时间结构体
{uchar time_hour;uchar time_min;uchar time_sec;uchar time_hms_mode;};
struct keys key[4]={0,0,0,0,0,0};//初始化按键
uchar ctimer=0;//消抖时间
uint led_ntimer=0;//led闪烁时间变量
bool led_flag=0;//led闪烁标志位
uchar time_No=0;//第几个时间struct times time[5] = {0,1,55,0};//初始化时间变量
char lcd_buffer[20];//lcd显示缓存
uchar key_long_time=0;//长按按键,数值增加的时间
uint count_douwn=0;//倒计时变量bool run_flag=0; 
uint secs=0;//总秒数bool cf_1=0,cf_2=0;// 00:standby 01:setting 10:running 11:pause

按键模块

在按键部分,从题目得知,有短按长按,并且有长按连续增加。因此在捣鼓按键中,我利用了状态机的思想,对按键B1,B2,B3,B4按键进行判断,由于题目中,只需要B3按键连续增加,所以我没有让其他按键拥有此功能。
主要代码如下:

#include "stdbool.h"
#define uchar unsigned char
#define uint unsigned int
struct keys
{uchar key_judge;//按键判断状态bool key_sta;//按键实时状态uint key_time;//按键持续时间bool key_single;//短按按键标志bool key_long;//长按按键标志
};
void Key_Scan(void)//按键判断
{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(uchar i=0; i<4; i++)//本段逻辑类似于FPGA中的状态机{switch(key[i].key_judge){case 0://状态0{if(key[i].key_sta==0){key[i].key_judge=1;key[i].key_time=0;}}break;case 1://状态1,按键消抖{if(ctimer++>=10)//10ms{ctimer=0;if(key[i].key_sta==0)key[i].key_judge=2;else key[i].key_judge =0;}	}break;case 2://状态2,判断成功按下,处理按键{if(ctimer++>=10)//10ms{ctimer=0;if(key[i].key_sta==0)key[i].key_time++;//一直按下,时间增加if(key[i].key_time<80 && key[i].key_sta==1)//短按{key[i].key_single=1;key[i].key_judge=0;}else if(key[i].key_time>=80)//长按超过0.8s{if(key[i].key_sta==0){if(i==2)//按键b3,长按一直增加的特殊功能{key_long_time++;if(key_long_time>=10)key[i].key_long=1;//长按时,每隔0.1s把标志位,置1key_long_time%=10;}}else//松开按键后,除开B3的特殊功能,把标志位,置1 {key[i].key_judge=0;if(i!=2)key[i].key_long=1;}}}}break;}}

倒计时模块

处理倒计时时,我们可以利用中断进行。其中一个重要的思想就是,将倒计时的时间转化成秒,LCD显示时,再把秒转换成具体时间就可以。根据时间的进制关系,我们可以写出如下代码。

void Time_to_secs(void)//将时间转化成秒,方便倒计时,定义的uint可能不够,可继续扩大
{secs = time[time_No].time_hour *3600 + time[time_No].time_min *60 + time[time_No].time_sec;
}
void Secs_to_time(void)//将秒转化成时间
{time[time_No].time_hour =secs /3600;time[time_No].time_min = secs %3600 /60;time[time_No].time_sec = secs %3600 %60;
}
void B4_process(void)//按键b4处理,倒计时处理
{if(key[3].key_single==1){run_flag=!run_flag;if(run_flag){cf_1=1;cf_2=0;}//倒计时启动else {cf_1=1;cf_2=1;}//倒计时暂停key[3].key_single=0;LCD_ClearLine(Line4);LCD_ClearLine(Line6);	}if(count_douwn>=1000){Time_to_secs();if(secs !=0)secs--;else cf_1=cf_2=0;		Secs_to_time();count_douwn=0;}
}

EEPROM模块

我们将比赛给的资源库中,HAL库的IIC底层代码加入到我们自己的工程中,然后增加如下代码

EEPROM读取

EERPOM地址:图中MSB是最高有效位,LSB是最低有效位,LSB为1时是读取,为0时是写入。
在这里插入图片描述
因为E1,E2,E3全部接地,所以A0,A1,A2全部为0
在这里插入图片描述

读取时序图:
在这里插入图片描述
根据时序写出EEPROM读取代码:

uchar EEPROM_Read(uchar add)//EEPROM读取
{uchar temp;I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CStart();I2CSendByte(0xa1);I2CWaitAck();temp = I2CReceiveByte();I2CStop();return temp;
}

EEPROM写入

写入时序图:
在这里插入图片描述根据时序写出EEPROM写入代码:

void EEPROM_Wite(uchar add, uchar dat)//EEPROM写入
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CSendByte(dat);I2CWaitAck();I2CStop();
}

LCD移植

LCD原理图
在STM32CudeMx中将图中所有引脚设置为输出模式(除LCD_RST外,不用管LCD_RST,因为它在硬件上连接到了复位引脚),再将赛点资源包中的lcd.c,lcd.h,font.h复制到自己的工程文件下即可。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在main.c中加入如下代码,点h文件是头文件,其他代码加入main函数即可使用

#include "lcd.h”
LCD_Init();//初始化lcd
LCD_Clear(Black);//设置lcd背景
LCD_SetBackColor(Black);//设置每行背景
LCD_SetTextColor(White);//设置字体颜色
LCD_DisplayStringLine(Line0,"Hello World!");

完整功能演示视频

完整工程文件(HAL库)

嵌入式赛点资源包(2023)

总结

自己写的代码,不喜勿喷,欢迎参考
以上就是本次的全部内容了,第一次写博客,记录一下。
想联系笔者请私信就好。

这篇关于STM32HAL库【G431】--【蓝桥杯嵌入式第九届省赛题】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712218

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

深入探索嵌入式 Linux

摘要:本文深入探究嵌入式 Linux。首先回顾其发展历程,从早期尝试到克服诸多困难逐渐成熟。接着阐述其体系结构,涵盖硬件、内核、文件系统和应用层。开发环境方面包括交叉编译工具链、调试工具和集成开发环境。在应用领域,广泛应用于消费电子、工业控制、汽车电子和智能家居等领域。关键技术有内核裁剪与优化、设备驱动程序开发、实时性增强和电源管理等。最后展望其未来发展趋势,如与物联网融合、人工智能应用、安全性与

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

嵌入式技术的核心技术有哪些?请详细列举并解释每项技术的主要功能和应用场景。

嵌入式技术的核心技术包括处理器技术、IC技术和设计/验证技术。 1. 处理器技术    通用处理器:这类处理器适用于不同类型的应用,其主要特征是存储程序和通用的数据路径,使其能够处理各种计算任务。例如,在智能家居中,通用处理器可以用于控制和管理家庭设备,如灯光、空调和安全系统。    单用途处理器:这些处理器执行特定程序,如JPEG编解码器,专门用于视频信息的压缩或解压。在数字相机中,单用途

基于微信小程序与嵌入式系统的智能小车开发(详细流程)

一、项目概述 本项目旨在开发一款智能小车,结合微信小程序与嵌入式系统,提供实时图像处理与控制功能。用户可以通过微信小程序远程操控小车,并实时接收摄像头采集的图像。该项目解决了传统遥控小车在图像反馈和控制延迟方面的问题,提升了小车的智能化水平,适用于教育、科研和娱乐等多个领域。 二、系统架构 1. 系统架构设计 本项目的系统架构主要分为以下几个部分: 微信小程序:负责用户界面、控制指令的

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本

嵌入式Linux C基本知识点总结

学习这块知识点有好久了,最近借一本书的框架来对基本的知识点进行总结,参考《嵌入式Linux上的C语言编程实践》进行总结记录之。 一、 基本开发环境 Linux下C语言开发环境 使用工具:程序生成工具GCC、程序调试工具GDB、工程管理工具为make和Makefile。 开发流程:使用编辑工具编写C语言源文件,然后编译生成机器代码为主的二进制可执行程序。 编译流程:C语言经过编译-汇