2024蓝桥杯嵌入式模板代码详解

本文详细介绍了如何使用STM32CubeMx配置STM32芯片,包括设置时钟和GPIO,以及LED和LCD模板代码的编写和集成,强调了代码组织和头文件管理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、STM32CubeMx配置

打开STM32CubeMx,选择【File】->【New Project】,进入芯片选择界面,搜索到蓝桥杯官方的芯片型号,并点击收藏,下次直接点击收藏就可以找到对应的芯片,
请添加图片描述
打开工程后,首先点击【System Core】,准备配置RCC和SYS。点击【RCC】->【High Speed Clock(HSE)】->【Crystall/Ceramic Resonator】;【SYS】->【Debug】->【Serial Wire】。
请添加图片描述
请添加图片描述
配置时钟树,点击第二项【Clock Configuration】
在这里插入图片描述
结果图如下
在这里插入图片描述
点击第三项【Project Manager】
在这里插入图片描述在这里插入图片描述
打开Keil点击编译,看是否配置成功,点击魔法棒

在这里插入图片描述在这里插入图片描述
到此,编写代码的配置已经完成

二、LED模板代码

通过CT117E-M4产品手册查看。易知LED引脚为PC8~PC15,锁存器使能引脚PD2,CubeMX进行引脚的配置。将其配置为GPIO_Output。PC8-PC15配置为High,点击生成代码。
在这里插入图片描述此时Keil软件在运行就会弹出,点击确认重新编译就行。
:以后自己编译的代码只能写在Begin和End之间,不然下次配置完CubeMX后自己写的代码会消失。
在这里插入图片描述
打开项目文件夹,创建名为bsp的文件夹,以后自己编写的代码都存放于此。
在这里插入图片描述
keil文件里,点击项目名Demo_dzj,添加一个新的组,并改名为bsp

在这里插入图片描述
Ctrl+n创建两个文件,Ctrl+s保存到bsp文件里,并改名为lcd.c、lcd.h
在这里插入图片描述
首先在main.h中定义两个数据类型,这样以后就直接写uint、uchar,这样比较方便。最后Ctrl+s(编写代码时不时都要按这个快捷键,保存代码)。
在这里插入图片描述

typedef unsigned int uint;
typedef unsigned char uchar;

点击bsp文件,添加已存在的文件lcd.c
再点击魔术棒,选择【c/c++】,点击Include path右边的三个…的图标,添加头文件路径(路径不变,就只需要配置一次)。
在这里插入图片描述
在这里插入图片描述
led.h代码如下

#ifndef ___HAL_LED_
#define ___HAL_LED_

#include "main.h"
void Disp_LED(uchar led);
#endif

led.c编写LED显示函数

#include "led.h"

void Disp_LED(uchar led)			//led参数:选择那几个LED点亮
{
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, GPIO_PIN_SET);    	//所有IO口置1
	HAL_GPIO_WritePin(GPIOC, led << 8, GPIO_PIN_RESET);				//高8位 为1的IO口点亮
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);				//开锁存器
	HAL_GPIO_WritePin(GPIOD,  GPIO_PIN_2, GPIO_PIN_RESET);		//关锁存器
}

main.c文件中直接添加对应头文件,main函数里初始化LED,while(1)里闪烁LD1。再次提醒代码只能写在Begin和End之间。
在这里插入图片描述
在这里插入图片描述
请添加图片描述

三、LCD模板代码

LCD不需要配置引脚,直接导入官方的文件即可
第十五届蓝桥杯大赛省赛选手资源数据包(电子赛)\DP2024_ES(嵌式)\BSP\LCD_Driver\MDK5_LCD_HAL
请添加图片描述
分别将Src文件里的lcd.c和Inc文件里的fonts.hlcd.h添加到第一节我们创建的bsp文件夹里
请添加图片描述
打开Keil,添加已存在的文件到bsp中,在main.c函数led.h下面添加lcd.h头文件,点击编译。
打开Src文件中的main.c,并复制主要代码到keil中。
请添加图片描述
显示结果如下
请添加图片描述

### 蓝桥杯下降沿捕获算法实现 在嵌入式开发领域,尤其是针对蓝桥杯比赛中的硬件设计部分,下降沿捕获通常用于检测信号的变化并触发相应的操作。通过定时器中断或其他外设功能模块来捕捉输入信号的下降沿事件是一种常见方法[^2]。 以下是基于STM32平台的一个典型下降沿捕获模板: #### 定时器配置 为了实现下降沿捕获的功能,可以通过TIMx通道设置成IC模式(Input Capture Mode),并通过滤波机制减少噪声干扰。具体步骤如下所示: ```c // 配置GPIO引脚为复用功能 void TIM_GPIO_Config(void){ GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA时钟 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } // 初始化定时器参数 void TIM_InputCaptureConfig(void){ TIM_HandleTypeDef htim2; TIM_IC_InitTypeDef sConfigIC; __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler = 8399; // 设置预分频系数 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 65535; // 自动重装载值 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim2); sConfigIC.ICPolarity = TIM_INPUTCAPTUREPOLARITY_FALLING; // 下降沿触发 sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 15; // 数字滤波器配置 HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1); HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); // 中断优先级设定 HAL_NVIC_EnableIRQ(TIM2_IRQn); // 启用中断向量表 } ``` 上述代码片段展示了如何初始化一个外部输入捕获单元,并将其配置为仅响应输入信号的下降沿变化。 #### 中断服务程序 当发生指定条件下的边沿跳变时,会进入对应的中断处理函数,在这里读取当前计数值并与前一次记录做对比分析从而计算时间间隔或者脉宽等物理量。 ```c uint32_t IC_Val1=0, IC_Val2=0, Frequency=0; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){ if(htim->Instance==TIM2){ if (IC_Val1 !=0 ){ IC_Val2 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); uint32_t diff = abs((int32_t)(IC_Val2 - IC_Val1)); /* 计算频率 */ Frequency = SystemCoreClock /diff ; IC_Val1 = IC_Val2 ; }else{ IC_Val1 = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); } } } ``` 此段伪码解释了怎样在一个典型的ARM Cortex-M系列微控制器上完成基本的时间戳采集以及简单的周期测定逻辑。 ### 总结说明 以上提供了一个关于如何利用STM32标准库创建一个能够有效监测特定IO口状态转换(即下降沿) 的框架结构实例。它不仅适用于竞赛环境下的快速原型搭建需求,同时也具备一定的实际应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值