蓝桥杯嵌入式的学习总结

一. 前言

        嵌入式竞赛实训平台(CT117E-M4) 是北京国信长天科技有限公司设计,生产的一款 “ 蓝桥杯全国软件与信息技术专业人才大赛-嵌入式设计与开发科目 “ 专用竞赛平台,平台以STM32G431RBT6为主控芯片,预留扩展板接口,可为用户提供丰富的实验场景。

以下内容都是小编自己在学习中所总结摘抄下来内容以及对嵌入式竞赛实训平台的相关理解,如有不到位之处,可尽情指出。如果全部完全理解掌握,拿个省二完全绰绰有余。

二. 学习CT117E-M4开发板

        1. 首先需要了解开发板资源,可以通过查看CT117E-M4的产品手册获取相对应的知识。另外在开始学习前,需要准备好相对应的软件环境,包括嵌入式集成开发环境(Keil Realview MDK) 以及STM32CubeMx的相关环境配置。值得注意的是如果使用keil 5 集成开发环境,就得使用集成开发环境自带的Pack installer安装STM32G4系列器件包。这些资源我都会放在我主页的资源当中,如果有需要可以取走。

        2. 在蓝桥云课上的右上角的搜索处输入蓝桥杯大赛历届真题即可查找到历届真题。

        3. LED是由PC8~PC15这8个GPIO口控制,在低电平时候点亮,所以我们在初始化时就可以在CubeMX中让它们都置高。如下所示:

如上图所示,就实现了将PC8~PC15所有的GPIO口都置为高,因此刚开始所以LED灯都会灭。

        4.  GPIO端口总共有八种模式,输入模式有四种:上拉输入模式,下拉输入模式,浮空输入,模拟输入。输出模式有:推挽输出,开漏输出,复用推挽,复用开漏。

        5. 这里简单介绍下这八种模式的概念:

1)上拉输入模式:上拉开关闭合,下拉开关断开,肖特基触发器打开。当IO引脚没有外部输入时,GPIO引脚会默认输入一个高电平,可以通过读取输入数据寄存器来读取到此时的IO电平。

2)下拉输入模式则跟上拉输入模式相反。

3)浮空输入模式:上拉开关和下拉开关均断开,肖特基触发器打开。此时,如果外部的IO引脚什么都不接(即悬空状态),此时GPIO引脚的电平将是一个不确定的状态。它将完全由外部的输入电平来确定。

4)模拟输入模式:肖特基触发器关闭,数据不再经过触发器模块。并且内部上下拉全部断开。该模式一般是给芯片内部的ADC外设来使用的。在该模式下,可以知道MCU将无法通过读取输入数据寄存器获得IO引脚的电平变化状态。

5)推挽输出模式:可输出高低电平,驱动能力强。

6)开漏输出模式:只能输出低电平,需要外部上拉电阻才能输出高电平。

7)复用推挽输出模式:用于特殊功能如UART、SPI等,由其他外设控制输出。

8)复用开漏输出模式:同样用于特殊功能,由其他外设控制输出。

        6. 代码书写的位置:

1)private includes:用户头文件的引用。

2)private typedef:用户自定义数据类型。

3)private macro:用户宏函数定义。

4)private variables:用户常量和变量定义。

5)private function prototypes:用户函数说明。

6)private usercode:功能实现位置。

7)Initialize all configured peripherals:各种初始化位置。

        7. 大家在安装完Keil集成开发环境后,需要选择CMSIS-DAP Debugger调试器,然后点击setting就能进入下面这个界面,然后再在Flash选项卡下,勾选Reset and Run。

 

三. 开发板各个外设的配置及使用

        1. 首先从LED灯开始,由于上面已经讲过LED的CubeMx配置,所以我们直接来看下由CubeMx生成的keil 5工程代码中LED相关代码。

#include"led.h"void LED_Disp(uchar dsLED)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);	//hign pinHAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);	//some lowHAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);	//open LatchHAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);	//close Latch
}

 

其中,HAL_GPIO_WritePin这个就是HAL库中的一个内置函数,用来设置引脚电平。

下面我们再来看下led.h的代码,我们在每创建一个.c和.h文件后都要保存到相应工程目录的一个文件夹中,这里可以统一命名为bsp。

#ifndef _LED_H_
#define _LED_H_#include "main.h"void LED_Disp(uchar dsLED);#endif

 

其中bsp文件夹就是存放的我们各种.c和.h文件,MDK-ARM中就有我们的keil5工程,下面那个test.ioc就是我们相应的CubeMx配置。在有了文件夹后,别忘了在keil5工程左侧目录中添加这个文件夹哦。最后一步就是让这个包含所有内容的总文件夹成为我们keil5工程的环境变量,点击keil5工程上方一个类似魔法棒的东西,然后选择其中的Include Paths如下所示:

  

        2.  关于LCD的相关代码在官方给出的资料当中就有,我们可以直接拿过来使用。这里小编后面也会整理在我主页的资料当中。

        3. 按键控制,通过查询产品手册,可以知道按键主要由PB1,PB2,PB0,PA0控制。

相关按键代码示例如下:

#include "interrupt.h"
#include "main.h"struct keys key[4]={0,0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM1){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].key_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].key_time<70){key[i].single_flag=1;}}else{key[i].key_time++;if(key[i].key_time>70){key[i].long_flag=1;}}}break;}}}
}

 

这里包含了按键的点击,长按的判断,并且使用到了定时器作为中断,用来间隔很短的时间来查询按键是否被按下。

下面我们来看下相关的CubeMx配置。

 

这里我们使用的是定时器TIM1,需要设置Clock Source为Internal Clock内部时钟源。并且在下面设置好分频系数(Prescaler)以及重装载值(Counter Period)。这里为什么设置成80-1,主要是根据频率和时间的关系来确定的。我们知道频率的倒数就是所间隔的时间,例如50Hz就是0.02s。因为在我们的产品手册中说明了频率为80MHz,也就是80000000,我们用这个数除以分频系数,再除以重装载值就是我们最后的定时器间隔时间。这里80000000除以80得1000000,再除以10000,得100,也就是100Hz,0.01s,10ms。之所以减一是因为这里从0开始。

为了方便,这里我把我们今天所讲到的内容所涉及到的GPIO配置直接给出来。

3. PWM输入捕获

        与PA6和PA7有关,选择TIM16_CH1和TIM17_CH1。

 

 

 

double ccrl_val1a=0,ccrl_val2a=0;
uint ccrl_val1b=0,ccrl_val2b=0;
uint frq1=0,frq2=0;
float duty1=0,duty2=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM2){if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1){ccrl_val1a=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);ccrl_val1b=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);__HAL_TIM_SetCounter(htim,0);frq1=(80000000/80)/ccrl_val1a;duty1=(ccrl_val1b/ccrl_val1a)*100;HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);}}if(htim->Instance==TIM3){if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1){ccrl_val2a=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);ccrl_val2b=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);__HAL_TIM_SetCounter(htim,0);frq2=(80000000/80)/ccrl_val2a;duty2=(ccrl_val2b/ccrl_val2a)*100;HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);}}
}

4. ADC数模转化

        

 

#include "badc.h"double getADC(ADC_HandleTypeDef *pin)
{double abc;HAL_ADC_Start(pin);abc = HAL_ADC_GetValue(pin);return (abc*3.3)/4096.0;
}

 

5. IIC通信

相关硬件配置如下: 

        

由此可以得出我们的IIC通信跟PB6和PB7有关。

关于IIC通信的相关代码,我们也可以直接使用官方所给的资料当中的代码,我们只需要在此基础上再添加两个代码即可,也就是IIC通信的读取和写入。如下所示:

unsigned char eeprom_read(unsigned char addr)
{unsigned char dat;I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CStop();I2CStart();I2CSendByte(0xa1);I2CWaitAck();dat=I2CReceiveByte();I2CSendAck();I2CStop();return dat;
}void eeprom_write(unsigned addr,unsigned char dat)
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CSendByte(dat);I2CWaitAck();I2CStop();
}

以上便是我们今天的全部内容,如还有些许疑问,可以直接私信我或者在评论区底下留言。另外所需的资源数据包以及相关的完整源代码文件可在我主页中进行查找,或者找我拿取。

 

         

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

conda环境下module ‘numba.types‘ has no attribute ‘Macro‘问题解决

1 问题描述 conda环境下运行数据处理&#xff0c;报出如下错误&#xff1a; Traceback (most recent call last):File "train_preprocess.py", line 13, in <module>import audioFile "/opt/service/lipsync/audio.py", line 1, in <module>…

橙子质量检测系统源码分享

橙子质量检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

基于yolov5滑块识别破解(一)

由于内容较长&#xff0c;将分为两个部分来说明&#xff0c;本文讲解yolov5的部署与训练。 1.YOLOv5部署 云端部署&#xff08;训练&#xff09; 服务器创建 如果自己的显卡算力不是很好的&#xff0c;或者是核显电脑&#xff0c;可以租用算力&#xff0c;价格还行一块钱左右就…

知乎:从零开始做自动驾驶定位; 注释详解(二)

这个个系统整体分为: 数据预处理 前端里程计 后端优化 回环检测 显示模块。首先来看一下数据预处理节点做的所有事情&#xff1a; 数据预处理节点 根据知乎文章以及代码我们知道: 节点功能输入输出数据预处理1.接收各传感器信息2.传感器数据时间同步 3.点云运动畸变补偿 4.传…

20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示&#xff0c;设置电流阈值为80&#xff0c;电流小阈值为50&#xff0c;电压阈值为60&#xff0c;温度阈值…

【Qt网络编程】Tcp多线程并发服务器和客户端通信

目录 一、编写思路 1、服务器 &#xff08;1&#xff09;总体思路widget.c&#xff08;主线程&#xff09; &#xff08;2&#xff09;详细流程widget.c&#xff08;主线程&#xff09; &#xff08;1&#xff09;总体思路chat_thread.c&#xff08;处理聊天逻辑线程&…

SQL 多表联查

目录 1. 内联接&#xff08;INNER JOIN&#xff09; 2. 左外联接&#xff08;LEFT JOIN&#xff09; 3. 右外联接&#xff08;RIGHT JOIN&#xff09; 4. 全外联接&#xff08;FULL JOIN&#xff09; 5. 交叉联接&#xff08;CROSS JOIN&#xff09; 6. 自联接&#xff0…

MySQL篇(存储引擎)(持续更新迭代)

目录 一、简介 二、使用存储引擎 1. 建表时指定存储引擎 2. 查询当前数据库支持的存储引擎 三、三种常见存储引擎 1. InnoDB存储引擎 1.1. 简介 1.2. 特点 1.3. 文件格式 1.4. 逻辑存储结构 表空间 段 区 页 行 2. MyISAM存储引擎 2.1. 简介 2.2. 特点 2.3. …

【Linux】入门【更详细,带实操】

Linux全套讲解系列&#xff0c;参考视频-B站韩顺平&#xff0c;本文的讲解更为详细 目录 1、课程内容 2、应用领域 3、概述 4、 Linux和Unix 5、VMware15.5和CentOS7.6安装 6、网络连接三种方式 7、虚拟机克隆 8、虚拟机快照 9、虚拟机迁移删除 10、vmtools 11、目录…

Gartner:中国企业利用GenAI提高生产力的三大策略

作者&#xff1a;Gartner高级首席分析师 雷丝、Gartner 研究总监 闫斌、Gartner高级研究总监 张桐 随着生成式人工智能&#xff08;GenAI&#xff09;风靡全球&#xff0c;大多数企业都希望利用人工智能&#xff08;AI&#xff09;技术进行创新&#xff0c;以收获更多的业务成果…

python是什么语言写的

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言。现今Python语言很火&#xff0c;可有人提问&#xff0c;这么火的语言它的底层又是什么语言编写的呢&#xff1f; python是C语言编写的&#xff0c;它有很多包也是用C语言写的。 所以说&#xff0c;C语言还是很…

SSM+vue音乐播放器管理系统

音乐播放器管理系统 随着社会的发展&#xff0c;计算机的优势和普及使得音乐播放器管理系统的开发成为必需。音乐播放器管理系统主要是借助计算机&#xff0c;通过对首页、音乐推荐、付费音乐、论坛信息、个人中心、后台管理等信息进行管理。减少管理员的工作&#xff0c;同时…

2024年华为杯数学建模E题-高速公路应急车道启用建模-基于YOLO8的数据处理代码参考(无偿分享)

利用YOLO模型进行高速公路交通流量分析 识别效果&#xff1a; 免责声明 本文所提供的信息和内容仅供参考。尽管我尽力确保所提供信息的准确性和可靠性&#xff0c;但我们不对其完整性、准确性或及时性作出任何保证。使用本文信息所造成的任何直接或间接损失&#xff0c;本人…

《深度学习》—— 卷积神经网络(CNN)的简单介绍和工作原理

文章目录 一、卷积神经网络的简单介绍二、工作原理(还未写完)1.输入层2.卷积层3.池化层4.全连接层5.输出层 一、卷积神经网络的简单介绍 基本概念 定义&#xff1a;卷积神经网络是一种深度学习模型&#xff0c;通常用于图像、视频、语音等信号数据的分类和识别任务。其核心思想…

Java笔试面试题AI答之设计模式(5)

文章目录 21. 简述Java什么是适配器模式 ?适配器模式的主要组成部分包括&#xff1a;适配器模式的实现方式主要有两种&#xff1a;适配器模式的优点&#xff1a;适配器模式的缺点&#xff1a;示例说明&#xff1a; 22. 请用Java代码实现适配器模式的案例 &#xff1f; 21. 简述…

【Transformers基础入门篇1】基础知识与环境安装

文章目录 一、自然语言处理基础知识1.1 常见自然语言处理任务1.2 自然语言处理的几个阶段 二、Transformers简单介绍2.1 Transformers相关库介绍2.2 Transformers 相关库安装 三、简单代码&#xff0c;启动NLP应用 一、自然语言处理基础知识 1.1 常见自然语言处理任务 情感分…

2024风湿免疫科常用评估量表汇总,附操作步骤与评定标准!

常笑医学整理了5个风湿免疫科常用的评估量表&#xff0c;包括类风湿关节炎患者病情评价&#xff08;DAS28&#xff09;、系统性狼疮活动性测定&#xff08;SLAM&#xff09;等。这些量表在常笑医学网均支持在线评估、下载和创建项目使用。 01 类风湿关节炎患者病情评价 &#x…

【MYSQL】聚合查询、分组查询、联合查询

目录 聚合查询聚合函数count()sum()avg()max()和min()总结 分组查询group by 子句having 子句 联合查询笛卡尔积内连接外连接自连接子查询单行子查询多行子查询from子句使用子查询 合并查询 聚合查询 聚合查询就是针对表中行与行之间的查询。 聚合函数 count() count(列名)&a…

828华为云征文 | 使用Flexus X实例搭建Dubbo-Admin服务

一、Flexus X实例简介 华为云推出的Flexus云服务&#xff0c;作为专为中小企业及开发者设计的新一代云服务产品&#xff0c;以其开箱即用、体验卓越及高性价比而著称。其中的Flexus云服务器X实例&#xff0c;更是针对柔性算力需求量身打造&#xff0c;能够智能适应业务负载变化…

工业交换机故障快速排查的方法有哪些

在现代工业自动化的环境中&#xff0c;工业交换机作为网络连接的重要设备&#xff0c;其稳定性和可靠性至关重要。然而&#xff0c;实际使用过程中难免会遇到各种故障&#xff0c;这对生产线和系统的正常运作造成了影响。为了有效应对这些问题&#xff0c;下面将介绍一些工业交…