蓝桥杯嵌入式模板(cubemxkeil5)
LED

引脚PC8~PC15,默认高电平(灭)。
此外还要配置PD2为输出引脚(控制LED锁存) ,默认低电平(锁住)!!!
#include "led.h"void led_disp(unsigned char disp_led)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_ALL,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,disp_led<<8,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}/*使用方法*/
unsigned char ledon=0x00;
led_disp(ledon|=0x01);//第一个led亮
led_disp(ledon|=0x04);//第三个led亮led_disp(ledon&=~(0x01))//第一个led灭
led_disp(ledon&=~(0x08))//第四个led灭
KEY

选择PB0~PB2,PA0为输入模式,配置成上拉输入。 我们按键用的是定时器轮询检测按键状态(还能实现长按短按的功能)。

时钟源选择内部时钟,设置成100Hz,也就是10ms进一次中断,别忘了在NVIC Settings打勾 !
#include "intterrupt.h"struct keys
{unsigned char sta;//引脚电平unsigned char flag;//是否按下unsigned char longflag;//是否长按unsigned char judge;//进度标志位unsigned int time;//长按时要用到
};
struct keys key[4]={0,0,0};void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIMX){key[0].sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(int i=0;i<4;i++){switch(key[i].judge){case 0:{if(key[i].sta==0){key[i].judge=1;key[i].time=0;}}break;case 1:{if(key[i].sta==0){key[i].judge=2;}else{key[i].judge=0;}}break;case 2:{if(key[i].sta==1)//松手的时候根据time来判断长短按{key[i].judge=0;if(key[i].time<200)//小于2s{key[i].flag=1;}}else//没松手{key[i].time++;if(key[i].time>200)//大于2s{key[i].longflag=1;}}}break;}}}
}/*使用方法*/void key_proc(void)
{if(key[0].flag==1)//按键1短按{//处理数据key[0].flag=0;}if(key[3].longflag==1)//按键4长按{//处理数据key[3].longflag=0;}
}
key_proc()丢while里。
ADC

板子从左往右数第一个是PB15引脚(对应ADC2的通道15),第二个是PB12引脚(对应ADC1的通道11),采样周期选到最大,一定程度上能防止adc一直抖动。
#include "myadc.h"double adc_get(ADC_HandleTypeDef *pin)
{unsigned int adc;HAL_ADC_Start(pin);adc=HAL_ADC_GetValue(pin);//HAL_Delay(1);可不加return adc*3.3/4096;
}/*使用方法*/
adc_get(&hadc2);//获取第一个电压
adc_get(&hadc1);//获取第二个电压
PWM
假设题目要求我们在PA7引脚输出频率为1000Hz,占空比为50%的PWM波

注意所选定时器最好不要和按键中断的定时器共用 !
frq=80000000/800/100;duty=50/100;
//在while之前启动PWM
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);/*设置占空比和频率*/
__HAL_TIM_SET_PRESCALER(&htim17,80000000/100/PWM_frq);//设置频率__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,duty);//设置占空比
IC


PB4和PA15引脚用于输入捕获,测量频率。最好用TIM2和TIM3! 按键定时器等所有外设都设置好了再设置。
#include "intterrupt.h"unsigned int ccrl_val=0;
unsigned int frq=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM2){ccrl_val=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);__HAL_TIM_SetCounter(htim,0);frq=(80000000/80)/ccrl_val;HAL_TIM_IC_Start_IT(htim,TIM_CHANNEL_1);}//if(htim->Instance==TIM3)//{// //}//同上 再定义一个变量即可 注意在main里extern frq
}/*使用方法*/
//在while之前启动IC 就可以在while里读frq
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//启动第一个IC
HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);//启动第二个IC
IC(测量占空比)
假设题目要求我们检测PA7引脚输入的信号的占空比

cubemx如上配置,PA7对应TIM3的通道二,那么把通道二设置成直接模式,另外选一个通道设置成间接模式,让直接模式测量上升沿,间接模式测量下降沿。
#include "intterrupt.h"unsigned int ccrl_vala=0,ccrl_valb=0;
unsigned int frq=0;
double duty=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3){ccrl_vala=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);//直接ccrl_valb=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);//间接__HAL_TIM_SetCounter(htim,0);frq=(80000000/80)/ccrl_vala;duty=(double)(ccrl_valb/ccrl_vala)*100;HAL_TIM_IC_Start_IT(htim,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(htim,TIM_CHANNEL_2);}
}
这个看看就好 考的几率不大。
UART

记得手动选择PA9和PA10,波特率按题目要求,一般是9600。记得开中断!!!
#include "interrupt.h"
#include "usart.h"char rxdata[22];
unsigned char rxbit;
unsigned char rx_p;void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{rxdata[rx_p++]=rxbit;HAL_UART_Receive_IT(&huart1,&rxbit,1);
}/*使用方法*/
include "string.h"//使用memset函数
//在while之前初始化 调用HAL_UART_Receive_IT(&huart1,&rxbit,1);void uart_proc(void)
{if(rx_p>0){if(rx_p==x)//实际要接收的位数{//处理}else{//报错}rx_p=0;memset(rxdata,0,22);//22要和你设置的rxdata长度一样}
}/*注意事项*/
//在while循环里这样写 防止接收不完整
while(1)
{if(rx_p!=0){uint8_t temp=rx_p;HAL_Delay(1);if(rx_p==temp){uart_proc();}}
}
I2C

直接在官方给的i2c_hal.c里写,cubemxPB6和PB7直接选择输出模式。
#include "i2c_hal.h"//官方的.c函数void eeprom_write(unsigned char addr,unsigned char dat)
{I2CStart();I2CSendByte(0xa0);//0表示写I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CSendByte(dat);I2CWaitAck();I2CStop();
}unsigned char eeprom_read(unsigned char addr)
{unsigned char dat;I2CStart();I2CSendByte(0xa0);//0表示写I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CStop();I2CStart();I2CSendByte(0xa1);//1是读I2CWaitAck();dat=I2CReceiveByte();I2CSendNotAck();//读出来之后发送非应答I2CStop();return dat;
}/*使用方法*/
eeprom_write(0,data);//地址从0开始,存八位的数据。data=eeprom(0);//读地址
八位无符号整型数据可以直接写和读,double类型的参考下图;


注意:每次写入都要延时5ms!!!
RTC

近几年基本不考,但要会最基本的rtc时钟。参数填125和6000。
#include "stdio.h"RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;while(1)
{HAL_RTC_GetTime(&hrtc,&sTime,RTC_FORMAT_BIN);//一定要先获取时间再获取日期!!!HAL_RTC_GetDate(&hrtc,&sDate,RTC_FORMAT_BIN);char text[50];sprintf(text,"%02d:%02d:%02d--%02d:%02d:%02d",sDate.Year,sDate.Month,sDate.Date,sTime.Hours,sTime.Minutes,sTime.Seconds);//再用官方提供的lcd显示函数显示年月日时分秒即可
}
RTC暂停:__HAL_RCC_RTC_DISABLE();
RTC恢复:__HAL_RCC_RTC_ENABLE();
RTC闹钟

记得开中断,闹钟先设置成3s后
RTC_AlarmTypeDef sAlarm;void GET_Time(void)
{HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
}void SET_alarm(void)
{sAlarm.AlarmTime.Hours = 0x00;sAlarm.AlarmTime.Minutes = 0x0;
/**/sAlarm.AlarmTime.Seconds = sTime.Seconds+1;sAlarm.AlarmTime.SubSeconds = 0x0;sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS|RTC_ALARMMASK_MINUTES;sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;sAlarm.AlarmDateWeekDay = 0x1;sAlarm.Alarm = RTC_ALARM_A;
/**/if(sAlarm.AlarmTime.Seconds==60)sAlarm.AlarmTime.Seconds=0;
/**/HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);//这里要注意,我们选择的是十进制
}//中断服务函数
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{GET_Time();SET_Alarm();//操作
}
SET_alarm里加了多行注释的是自己添加的东西,其余从rtc.c复制

每一秒进一次rtc闹钟的回调函数,在回调函数里进行对应的操作即可。
(可能不考,了解即可)
相关文章:
蓝桥杯嵌入式模板(cubemxkeil5)
LED 引脚PC8~PC15,默认高电平(灭)。 此外还要配置PD2为输出引脚(控制LED锁存) ,默认低电平(锁住)!!! #include "led.h"void led_disp…...
ELFK (Filebeat+ELK)日志分析系统
一. 相关介绍 Filebeat:轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装 Filebeat,并指定目录与日志格式,Filebeat 就能快速收集数据,并发送给 logstash 进或是直接发给 Elasticsearch 存储,性能上相…...
HttpClient、OKhttp、RestTemplate接口调用对比( Java HTTP 客户端)
文章目录 HttpClient、OKhttp、RestTemplate接口调用对比HttpClientOkHttprestTemplate HttpClient、OKhttp、RestTemplate接口调用对比 HttpClient、OkHttp 和 RestTemplate 是三种常用的 Java HTTP 客户端库,它们都可以用于发送 HTTP 请求和接收 HTTP 响应&#…...
[旅游] 景区排队上厕所
人有三急,急中最急是上个厕所要排队,而且人还不少!这样就需要做一个提前量的预测,万一提前量的预测,搞得不当,非得憋出膀光炎,或者尿裤子。尤其是女厕所太少!另外一点是儿童根本就没…...
三 maven的依赖管理
一 maven依赖管理 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等…...
iperf3 网络性能测试
iperf3测试 1、iperf3简介 iperf3是一个主动测试网络带宽的工具,可以测试iTCP、UDP、SCTP等网络带宽;可以通过参数修改网络协议、缓冲区、测试时间、数据大小等,每个测试结果会得出吞吐量、带宽、重传数、丢包数等测试结果 2、参数详解 通…...
08 Php学习:if语句、Switch语句
PHP 条件语句 当您编写代码时,您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。 在 PHP 中,提供了下列条件语句: if 语句 - 在条件成立时执行代码 if…else 语句 - 在条件成立时执行一块代码,…...
二分查找的边界问题是怎么产生的?
总结:二分查找的目标有两个,一个是左区件的右边界,一个是右区间的左边界 如何去理解二分的过程? 如果要查找的是左区间的右边界: 可以将[l, r]理解一个集合,这个集合范围内的数都有可能是最后需要得到的…...
华为 2024 届校园招聘-硬件通⽤/单板开发——第十套
华为 2024 届校园招聘-硬件通⽤/单板开发——第十套 部分题目分享,完整版带答案(有答案和解析,答案非官方,未仔细校正,仅供参考)(共十套)获取(WX:didadidadidida313,加我…...
五子棋:不会下五子棋也没关系,会用Java写五子棋就行
关注公号“微澜网络”获取完整源代码! 效果展示: 目录 效果展示: 导语: 游戏介绍: 程序设计: 1.游戏规则和功能: 2.用户界面设计: 3.程序架构设计: 4.可扩展性和灵…...
【VUE】使用Vue和CSS动画创建滚动列表
使用Vue和CSS动画创建滚动列表 在这篇文章中,我们将探讨如何使用Vue.js和CSS动画创建一个动态且视觉上吸引人的滚动列表。这个列表将自动滚动显示项目,类似于轮播图的方式,非常适合用于仪表盘、排行榜或任何需要在有限空间内展示项目列表的应…...
分布式结构化数据表Bigtable
文章目录 设计动机与目标数据模型行列时间戳 系统架构主服务器Chubby作用子表服务器SSTable结构子表实际组成子表地址组成子表数据存储及读/写操作数据压缩 性能优化局部性群组(Locality groups)压缩布隆过滤器 Bigtable是Google开发的基于GFS和Chubby的…...
langchain 加载 csv,json
csv from langchain_community.document_loaders.csv_loader import CSVLoaderloader CSVLoader(file_pathdata/专业描述.csv, csv_args{delimiter: ,,quotechar: ",fieldnames: [专业, 描述] }, encodingutf8, source_column专业)data loader.load() print(data)quote…...
Java-常见面试题收集(十三)
二十二 Redis 1 Redis 作用 Redis,全称Remote Dictionary Server,即远程字典服务,是一个开源的使用ANSI C语言编写的、支持网络的、基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它主要用于缓存数据的计算…...
第二证券策略:股指预计维持震荡格局 关注汽车、工程机械等板块
第二证券指出,指数自今年2月份阶段低点反弹以来,3月份持续高位整理。进入4月份之后面对年报和一季报的双重财报发表期,预计指数短期保持高位整理概率比较大。前期缺乏成绩支撑的概念股或有回落的危险,主张重视成绩稳定、估值低、分…...
hcia datacom课程学习(6):路由与路由表基础
1.路由的作用 不同网段的设备互相通信需要具有路由功能的设备进行转发 具有路由功能的设备不一定是路由器,交换机可以有路由功能,同样的,路由器也可以有交换功能,像家里常用的路由器就是集路由功能和交换功能于一体的 2.路由相…...
AI PC元年,华为的一张航海图、一艘渡轮和一张船票
今天,从学术研究者到产业投资者,无不认为大模型掀起了一场人工智能的完美风暴。 所谓“完美风暴”,指的是一项新技术的各个要素,以新的方式互相影响、彼此加强,组合在一起形成了摧枯拉朽般的力量。 而我们每个人&#…...
NAT技术
网络技术深似海呀,一段时间不用又忘。 是什么 NAT技术是网络防火墙技术的一部分,可以作用在linux防火墙或者设备防火墙,NAT技术可以实现地址和端口的转换,主要还是为了网络连通性。 作用 存在以下三个IP,A(10.234.…...
新能源汽车“价格战”之后,充电桩主板市场将会怎样?
2024年2月底,国内新能源汽车市场开启了一场前所未有的“价格战”↓ 比亚迪率先抛出“王炸”车型——秦PLUS荣耀版和驱逐舰05荣耀版,起售价低至7.98万元,打响了价格战的“第一枪”,引爆了平静的汽车市场。 “电比油低”就此拉开序…...
appium driver install uiautomator2 安装失败
报错 Installing ‘uiautomator2’ using NPM install spec ‘appium-uiautomator2-driver’ Error: Encountered an error when installing package: npm command ‘install --save-dev --no-progress --no-audit --omitpeer --save-exact --global-style --no-package-lock…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
