蓝桥杯嵌入式国三备赛经验分享

news2024/12/25 22:34:06

1 学习STM32入门视频

向大家推荐一套宝藏级别的视频:
【STM32入门教程-2023版 细致讲解 中文字幕】

如果已经比过蓝桥杯单片机学习过单片机相关课程的同学,你们可以尝试不需要STM32套件进行学习。如果没有学过单片机相关课程的同学,可以买套件边用边学

尽量把这套视频看完,无论是对参加蓝桥杯嵌入式设计与开发竞赛(蓝桥杯)、嵌入式芯片与系统设计大赛STM32赛道(嵌入式大赛)或全国大学生物联网设计竞赛(华为杯)都有好处!

2 学习嵌入式开发板备赛视频

我主要看的是这套嵌入式视频:

【【备战2024蓝桥杯 嵌入式组】CT117E-M4 新款开发板 3小时省赛模块  速成总结】

从视频中可以学习到一些好的代码编写方式,从而避免各个外设的冲突、提高硬件运行效率

3 备赛笔记

GPIO_Mode_AIN = 0x0,  //模拟输入

GPIO_Mode_IN_FLOATING = 0x04, //浮空输入

GPIO_Mode_IPD = 0x28, //下拉输入

GPIO_Mode_IPU = 0x48, //上拉输入

GPIO_Mode_Out_OD = 0x14, //开漏输出

GPIO_Mode_Out_PP = 0x10, //推挽输出

GPIO_Mode_AF_OD = 0x1C,  //复用开漏

GPIO_Mode_AF_PP = 0x18   //复用推挽

GPIO_SetBits //设置成高电平

GPIO_ResetBits //设置成低电平  

HAL_GPIO_Write();//写GPIO电平状态函数

Key_State 里面的Key一定要初始化Key = 0;

长按键需要给25延时(Key_Time1)+长按键启用标志位

双击按键需要给40延时(Key_Time2)+双击按键启用标志位+暂时双击按键号

通用定时器可以产生4路频率相同,占空比不同的PWM输出

高级定时器可以产生7路频率相同,占空比不同的PWM输出

%d数据后面加空格 防止数据末位不清除

__HAL_TIM__SETCOMPARE(定时器,通道x, 占空比);

AT24C02 写一条语句延时5ms

MCP4017的从机地址(写操作):0X5E

随着我们向MCP中输入的数越大,他对应的电阻也就越大,当我们传入0x7f时,对应的电阻就是100K。这里要注意的一点是,我们写进去的一个数字(0-127),读出来也是一个数字,转化为电阻阻值:R = 787.4 * read_resistor 欧,电压:3.3*(R/(R+10)) (假设外接的电压为3.3)

新建工程

开启时钟(选择外部时钟) -> 配置时钟树 -> 配置DAP下载模式 -> 工程名 -> 配置MDK文件 -> 勾上生成code选项 -> 生成文件 -> 打开Keil -> 配置DAP下载 -> 勾上清除并更新 -> 建立bsp文件夹

LED

在CubeMX选择PC8-PC15、PD2为推挽输出模式 -> 配置PC8-PC15为高电平,PD2为低电平 -> 更新文件

->

void LED_Display(uchar data)
{
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC, (~data)<<8, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

(在main.c文件写代码时,写在Bagin和End注释之间)

LCD

复制资源包里LCD例程中2.h文件、1.c文件 -> 打开main.c,复制以下代码

LCD_Init();

LCD_Clear(Black);

LCD_SetBackColor(Black);

LCD_SetTextColor(White);

LCD_DisplayStringLine(Line9, (unsigned char *)str);

-> 创建char str[30];、引用”stdio.h”使用sprintf函数

Key(短按键)

在CubeMX打开TI63时钟配置外部时钟源 -> 配置PSC、ARR -> 使能中断 -> 更新文件

->

uint8_t Key_State(void)

{

    uchar Key = 0;

    if(!HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0))

    Key = 1;
  
    if(!HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1))

    Key = 2;

    if(!HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2))

    Key = 3;

    if(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0))
    
    Key = 4;



    return Key;

}

void Key_Loop(void)

{

    static uint8_t LastState, NowState;

    uint8_t i;

    LastState = NowState;
    
    NowState = Key_State();

    for(i = 1;i <= 4;i ++)

    {

    if(LastState == 0 && NowState == i)

    KeyNum = i;

    }

}

->

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//中断回调函数(中断服务函数)

{

    static uint8_t Count0;

    if(htim -> Instance == TIM6)

    {

        if(++Count0 >= 20)
    
        {

            Count0 = 0;

            KeyStart = 1;

        }

    }

}

->

HAL_TIM_Base_Start_IT(&htim6);//使能定时器中断

Key(长按键)

uint8_t Key_Short, Key_Long, Key_Time, Long_State = 1;

void Key_Loop(void)
{
	static uint8_t LastState, NowState;
	uint8_t i;
	LastState = NowState;
	NowState = Key_State();
	for(i = 1;i <= 4;i ++)
	{
		if(LastState == 0 && NowState == i)
		Key_Time = 0;
		if(LastState == i && NowState == i)
		{
			if(++Key_Time >= 25 && Long_State)
			{
				Key_Long = i;
				Long_State = 0;
			}
		}
		if(LastState == i && NowState == 0)
		{
			if(Key_Time < 25)
			Key_Short = i;
			Long_State = 1;
		}
	}
}

PWM

在CubeMX打开相应定时器选择PWM生成选项 -> 配置时钟PSC:待定频率,ARR:100-1、CCR:占空比初值 -> 更新文件

->

HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);//使能PWM某通道输出

->

__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, PA6_PWM);//改变占空比

IC(测频率+占空比):

在CubeMX打开相应定时器 - > 配置Clock Source -> 选择CH1为直接通道、CH2为间接通道 -> 配置时钟PSC:80-1、ARR满重装值 -> CH1为上升沿触发、CH2为下降沿触发 -> 配置从模式(Combined Reset Trigger Mode) -> 选择触发源(TI1FP1)-> 更新文件 -> 创建IC.c、IC.h文件 -> 引入tim.h头文件 ->

uint32_t Read_Fre(uint8_t Command)
{

	if(Command == 15) return 1000000 / (HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1) + 1);
	else if(Command == 4) return 1000000 / (HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1) + 1);
	else return 0;
}

double Read_Buty(uint8_t Command)
{
    if(Command == 15) return (HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2) + 1) * 100.0 / (HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1) + 1);
	else if(Command == 4) return (HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_2) + 1) * 100.0 / (HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1) + 1);
	else return 0;
}

->

HAL_TIM_IC_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim3, TIM_CHANNEL_1);//使能通道1
HAL_TIM_IC_Start(&htim2, TIM_CHANNEL_2);
HAL_TIM_IC_Start(&htim3, TIM_CHANNEL_2);//使能通道2

IC(中断测频率)

在CubeMX打开相应定时器TIMx的时钟 -> 选择相应通道CHx -> 配置时钟PSC:80-1、ARR满重装值-> 使能中断 -> 更新文件 -> 创建IC.c、IC.h文件 ->

uint32_t TIM2_IC_CRR1;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim -> Instance == TIM2)
	{
		TIM2_IC_CRR1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
		__HAL_TIM_SetCounter(htim, 0);
	}
}

uint32_t Read_Fre(void)
{
	return 1000000 / (TIM2_IC_CRR1 + 1);
}

->

HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);//使能输入捕获中断

ADC + DMA

在CubeMX打开相应引脚ADC通道 -> 配置ADC1、ADC2中相应通道使能(Single-ended) -> 使能连续转换 -> 添加DAM -> 配置循环模式Circular -> 使能DMA请求为连续模式 -> 失能DMA中断 -> 更新文件 ->

HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc1,1); 
HAL_ADC_Start_DMA(&hadc2,(uint32_t *)adc2,1); //使能DAM转运

IIC

在CubeMX设置PB6、PB7引脚为输出模式 ->

void Write_AT24C02(uint8_t Command, uint8_t Data)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(Command);
	I2CWaitAck();
	I2CSendByte(Data);
	I2CWaitAck();
	I2CStop();
}

uint8_t Read_AT24C02(uint8_t Command)
{
	uint8_t Data;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(Command);
	I2CWaitAck();
	I2CStart();
	I2CSendByte(0xa0 | 0x01);
	I2CWaitAck();
	Data = I2CReceiveByte();
	I2CSendNotAck();//不需要继续读就给非应答
	I2CStop();
	
	return Data;
}

uint8_t Read_AT24C02(uint8_t Command)
{
	uint8_t Data;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(Command);
	I2CWaitAck();
	I2CStart();
	I2CSendByte(0xa0 | 0x01);
	I2CWaitAck();
	Data = I2CReceiveByte();
	I2CSendNotAck();//不需要继续读就给非应答
	I2CStop();
	
	return Data;
}

USART1

在CubeMX配置USART1模式为Asynchronous -> 配置波特率 -> 使能中断 -> 配置PA9、PA10为USART1 -> 更新文件 -> 创建MyUSART.c、.h文件 -> 引用usart.h->

uint8_t Rxdata,Receive_Over, pRxPacket;
char RxPacket[30];

void Send_USART(char *data)
{
	HAL_UART_Transmit(&huart1, (uint8_t  *)data, strlen(data), 50);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart -> Instance == USART1)
	{
		HAL_UART_Receive_IT(huart, &Rxdata, 1);
		RxPacket[pRxPacket ++] = RXdata;
	}
}

void Receive_USART(void)
{
	static uint8_t p;
	if(pRxPacket != 0)
	{
		p = pRxPacket;
		HAL_Delay(1);
		if(p == pRxPacket)
		{
			Receive_Over =1;
Send_USART(RxPacket);
			pRxPacket = 0;
memset(RxPacket, 0, 30);
		}
	}
}

->

HAL_UART_Receive_IT(&huart1, &Rxdata, 1);//使能接收中断
4 备赛过程

嵌入式省赛备赛过程与单片机备赛过程类似,这里不再赘述,详情可以查看博主的另一篇博客:

【蓝桥杯单片机大一零基础到国二经验分享】

奇数届嵌入式国赛备赛时,可以多学习一些串口方面的c语言函数,比如第十五届嵌入式串口相关的收发数据及提取数据就比较多。

偶数届嵌入式国赛备赛时,需要学习扩展板相关外设的使用。

5 资料

 如需十五届嵌入式资料可以私信我,本人很乐意开源,欢迎大家在评论区交流学习,预祝大家在蓝桥杯嵌入式设计与开发竞赛中取得优异成绩!!!

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

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

相关文章

直击智博会,supOS加快发展新质生产力,赋能全球工厂数字化转型

9月6日&#xff0c;第十四届智慧城市与智能经济博览会&#xff08;以下简称智博会&#xff09;开幕主题活动在宁波举办。本届智博会着重围绕“数字赋能新型工业化”主题&#xff0c;设置开幕活动、展览展示和前瞻研讨、产数合作、赛事赋能、开放活动等4大板块活动&#xff0c;旨…

全球AI产品Top100排行榜

Web Top50的榜单里&#xff0c;AIGC类型的应用占比52%&#xff0c;遥遥领先。AIGC类型包括图像、视频、音乐、语音等的内容生成和编辑。音乐生成应用Suno在过去六个月中的排名跃升最为显著&#xff0c;从第36位上升至第5位。排名第二大类是通用对话/AI聊天/角色扮演类型的应用&…

银河麒麟系统开机自动进入指定账户(如:root)桌面

目录 1. 需求的提出 2. 机器环境说明 3. 解决方法 4. 附加说明 1. 需求的提出 编写好的软件在客户的装有银河麒麟操作系统的机器上运行&#xff0c;但有些操作必须用root权限才能操作&#xff0c;如&#xff1a;打开串口。Linux下的普通账户打开串口时提示权限不足。在普通…

【HarmonyOS NEXT】实现截图功能

【HarmonyOS NEXT】实现截图功能 【需求】 实现&#xff1a;实现点击截图按钮&#xff0c;实现对页面/组件的截图 【步骤】 编写页面UI Entry Component struct Screenshot {BuildergetSnapContent() {Column() {Image().width(100%).objectFit(ImageFit.Auto).borderRadi…

C++入门(06)安装QT并快速测试体验一个简单的C++GUI项目

文章目录 1. 清华镜像源下载2. 安装3. 开始菜单上的 QT 工具4. 打开 Qt Creator5. 简单的 GUI C 项目5.1 打开 Qt Creator 并创建新项目5.2 设计界面5.3 添加按钮的点击事件5.4 编译并运行项目 6. 信号和槽&#xff08;Signals and Slots&#xff09; 这里用到了C类与对象的很多…

网络协议详解

目录 1.认识网络协议 2网络协议的设计 2.1网络通信的问题 2.2网络协议的分层设计 软件分层与网络分层 3.OSI七层网络模型 各层次的介绍如下 4.TCP/IP 五层协议 各层次说明 各层次所解决的问题 5.网络和操作系统之间的关系 单主机下 多主机下 6.重新理解网络协议 …

【鸿蒙HarmonyOS NEXT】页面之间相互传递参数

【鸿蒙HarmonyOS NEXT】页面之间相互传递参数 一、环境说明二、页面之间相互传参 一、环境说明 DevEco Studio 版本&#xff1a; API版本&#xff1a;以12为主 二、页面之间相互传参 说明&#xff1a; 页面间的导航可以通过页面路由router模块来实现。页面路由模块根据页…

kubernetes微服务基础及类型

目录 1 什么是微服务 2 微服务的类型 3 ipvs模式 ipvs模式配置方式 4 微服务类型详解 4.1 ClusterIP 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 metalLB配合loadbalance实现发布IP 1 什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&…

JavaWeb——JavaScript(3/4)-JS对象:BOM、DOM(Window、Location,概念、标准模型、获取元素对象)

目录 BOM 介绍 Window 案例(1) Location DOM 概念 标准模型 获取元素对象 案例(2) 原始代码 完整代码 JS对象 BOM 介绍 概念&#xff1a;Browser Object Model 浏览器对象模型&#xff0c;允许JavaScript与浏览器对话&#xff0c;JavaScript 将浏览器的各个组成部…

git 提交自动带上storyid

公司里的运维团队的产品经理&#xff0c;那老六提出说要在每个提交带上的jira storyid或者bugid&#xff0c;不用他自己弄不顾他人麻烦&#xff0c;真想问候他的xx。不过既然已经成为定局&#xff0c;还是想想有没有其他办法。经一番调研&#xff0c;网上有比较零碎的信息&…

攻防世界--->地穴

前言&#xff1a;学习笔记。 下载 解压 查壳。 64位ida打开。 进入主函数。 很容易得知&#xff0c;这是一个RC4加密。 【 &#xff08;题外话&#xff09; 在reverse中&#xff0c;RC4考点&#xff0c;不会很难。 reverse中RC4关键点就是&#xff0c;抓住异或。 一般解这种…

Open a folder or workspace... (File -> Open Folder)

问题&#xff1a;vscode Open with Live Server 时 显示Open a folder or workspace... (File -> Open Folder)报错 解决&#xff1a;不可以单独打开文件1.html ; 需要在文件夹里打开 像这样

【哈希表】深入理解哈希表

目录 1、哈希表简介2、哈希函数2.1、概念2.2、常用的哈希函数2.2.1、直接定址法2.2.2、除留余数法2.2.3、平方取中法2.2.4、基数转换法 3、哈希冲突3.1、概念3.2、开放地址法【闭散列&#xff1a;key存放到冲突位置的“下一个”空位置】3.3、链地址法【开散列&#xff1a;冲突位…

SAM 2:分割图像和视频中的任何内容

文章目录 摘要1 引言2 相关工作3 任务&#xff1a;可提示视觉分割4 模型5 数据5.1 数据引擎5.2 SA-V数据集 6 零样本实验6.1 视频任务6.1.1 提示视频分割6.1.2 半监督视频对象分割6.1.3 公平性评估 6.2 图像任务 7 与半监督VOS的最新技术的比较8 数据和模型消融8.1 数据消融8.2…

dr 航迹推算 知识介绍

DR&#xff08;Dead Reckoning&#xff09;航迹推算是一种在航海、航空、车辆导航等领域中广泛使用的技术&#xff0c;用于估算物体的位置。DR航迹推算主要通过已知的初始位置和运动参数&#xff08;如速度、方向&#xff09;来预测物体的当前位置。以下是 DR 航迹推算的详细知…

跨平台电商数据整合:item_get API在电商大数据平台中的角色

在电商行业蓬勃发展的今天&#xff0c;跨平台运营已成为众多商家的必然选择。然而&#xff0c;随之而来的数据孤岛问题却成为了制约电商企业进一步发展的瓶颈。为了解决这一问题&#xff0c;电商大数据平台应运而生&#xff0c;而item_get API作为获取商品详情的关键接口&#…

统计学第6天

1、变量间关系的度量 函数关系 &#xff08;1&#xff09;是一一对应的确定关系&#xff1b; &#xff08;2&#xff09;设有两个变量x和y&#xff0c;变量y随x一起变化&#xff0c;并完全依赖于x,当x取某个数值时&#xff0c;y根据确定的关系取相应的值&#xff0c;称y是x的…

建设网盘聚合中心—Win10+Alist+RaiDrive

经常需要在网上找各种资源&#xff0c;但遇到 2 个问题&#xff1a; 1. 大部分网盘都需要先将文件保存在自己网盘后才能下载&#xff0c;也就是必须创建对应网盘账号。 2. 有些网盘还必须要下载客户端才能下载文件。 创建账号无法避免&#xff0c;但可以不用下载那么多的客户端…

写在 Pencils Protocol TGE 前:加密市场共识才是王道,拥抱社区

“Pencils Protocol 正在成为本轮市场周期中&#xff0c;加密项目建立共识最有力的工具&#xff01;” 对于加密项目而言&#xff0c;代币 TGE 是一个非常重要的事情&#xff0c;它不仅仅意味着生态内经济系统的全面启动&#xff0c;同时也意味着项目生态市场的全面开启。当然…

《Rust避坑式入门》第1章:挖数据竞争大坑的滥用可变性

赵可菲是一名Java程序员&#xff0c;一直在维护一个有十多年历史的老旧系统。这个系统即将被淘汰&#xff0c;代码质量也很差&#xff0c;每次上线都会出现很多bug&#xff0c;她不得不加班修复。公司给了她3个月的内部转岗期&#xff0c;如果转不出去就会被裁员。她得知公司可…