蓝桥杯嵌入式速成

蓝桥杯嵌入式速成

  • cubmx创建工程
  • 利用官方提供的LCD代码创建工程(15届不能用)
  • 利用官方提供的LCD代码创建工程(15届能用)
  • Keil配置
    • 头文件注意
    • 其他注意
  • LED
    • 闪烁
  • 按键
    • 短按
    • 长按
    • 双击
  • LCD
    • 高亮行
    • 高亮字符
  • RTC
  • ADC
  • I2C
  • uart
    • 接收
    • 发送
  • PWM
  • DAC
  • 定时器
  • 捕获PWM频率+占空比
  • 占空比

cubmx创建工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

利用官方提供的LCD代码创建工程(15届不能用)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

利用官方提供的LCD代码创建工程(15届能用)

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Keil配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

头文件注意

在这里插入图片描述

使用sprintf需要加头文件stdio.h
使用memset需要加头文件string.h

其他注意

如果要在main使用需要extern
uwTick 1ms加一次

Led 需要用LedDisp(0)初始化
串口接收初始化HAL_UART_Receive_IT(&huart1,&rx_data,1);
串口不工作看中断是不是打开,引脚是不是PA9,PA10
PWM初始化HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);
输入捕获初始化HAL_TIM_IC_Start_IT(&htim16, TIM_CHANNEL_1);;
I2C 需要用I2CInit()初始化
EEP开始需要第一次先写入题目要求的合法数据 之后再读
EEP 写0xa0 读(先写要读的地址) 0xa1
mcp 写0x5e0x5f

在这里插入图片描述

LED

在这里插入图片描述
Led初始化LedDisp(0)


void LED_disp(u8 led)
{HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); //打开锁存器HAL_GPIO_WritePin(GPIOC,0xFF00,GPIO_PIN_SET);	// set熄灭HAL_GPIO_WritePin(GPIOC,led<<8,GPIO_PIN_RESET);	// reset点亮HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //关闭锁存器
}vu32 ledTick = 0;
u8 led = 0;
void LED_proc()
{if(uwTick - ledTick  < 100) return;	ledTick = uwTick;LED_disp(led);
}

闪烁

在这里插入图片描述

按键

在这里插入图片描述
在这里插入图片描述

u8 ko,kv,ku,kd = 0;void KeyRead()
{//5行四个按键if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == 0) kv = 1;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == 0) kv = 2;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) == 0) kv = 3;else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == 0) kv = 4;else kv = 0;// 默认给值为0,这里别忘记了kd = kv &(ko ^ kv);ku = ~kv &(ko ^ kv);ko = kv;  
}

短按

vu32 keyTick = 0;
void KeyProc()
{if(uwTick - keyTick < 20) return;keyTick =uwTick;KeyRead();if(kd == 1){}else if(kd == 2){}else if(kd == 3){}else if(kd == 4){}

长按

vu32 keyTick = 0;
vu32 keyLongTick = 0;
void KeyProc()
{if(uwTick - keyTick < 20) return;keyTick = uwTick;KeyRead();if(ku == 1) //注意用ku{//短按}else if(ku == 2 && (uwTick - keyLongTick < 800)) {//短按//注意要防止长按抬手触发短按多加了一个判断条件}else if(ku == 3 && (uwTick - keyLongTick < 800)){} else if(ku == 4 && (uwTick - keyLongTick < 800)){}else if(kd == 2 || kd == 3 || kd == 4){//开始长按计时keyLongTick = uwTick;}if(kv == 2 && (uwTick - keyLongTick > 800)){//长按操作}if(kv == 3 && (uwTick - keyLongTick > 800)){//长按操作}if(kv == 4 && (uwTick - keyLongTick > 800)){//长按操作}}

双击


u8 keyStatus;
u32 keyTick;
u32 keyIdle = 0;
u32 doubleTick = 0;
void Key_proc()
{if(uwTick - key_tick < 20) return;key_tick = uwTick;KEY_read();keyIdle = uwTick - doubleTick ;//2次按键间隔的时间,单位ms//之前没有按下if(kd ==  1 && keyStatus == 0){keyStatus = 1;doubleTick = uwTick;		//按下变为状态1,开始计时}else if(keyStatus  == 1){//如果400ms内再按触发双击,如果第一次按后400ms没按则才触发单击,这里改为300ms也可以,我感觉有点快if(keyIdle < 400 && kd == 1)	{//双击操作keyStatus = 0;}else if(key_idle > 400){//单击keyStatus= 0;}}
}

LCD

LCD最多21位

高亮行

if(pwm_line == 0)LCD_SetBackColor(Green);
sprintf((char *)lcd_buf,"   PA3_F:%-5dHz     ",pa3_frq);	
LCD_DisplayStringLine(Line2,lcd_buf);
LCD_SetBackColor(Black);if(pwm_line == 1)LCD_SetBackColor(Green);
sprintf((char *)lcd_buf,"   PA3_D:%d %%        ",pa3_duty);	
LCD_DisplayStringLine(Line3,lcd_buf);
LCD_SetBackColor(Black);

高亮字符

if(b2wz == 1 ) LCD_SetBackColor(Red);
LCD_DisplayChar(Line4,320-(4 * 16),times[ccwz].h/10+'0');
LCD_DisplayChar(Line4,320-(5 * 16),times[ccwz].h%10+'0');
LCD_SetBackColor(Blue);LCD_DisplayChar(Line4,320-(6 * 16),':');if(b2wz == 2) LCD_SetBackColor(Red);LCD_DisplayChar(Line4,320-(8 * 16),times[ccwz].m/10+'0');LCD_DisplayChar(Line4,320-(9 * 16),times[ccwz].m%10+'0');LCD_SetBackColor(Blue);LCD_DisplayChar(Line4,320-(10 * 16),':');if(b2wz == 3) LCD_SetBackColor(Red);
LCD_DisplayChar(Line4,320-(12 * 16),times[ccwz].s/10+'0');
LCD_DisplayChar(Line4,320-(13 * 16),times[ccwz].s%10+'0');
LCD_SetBackColor(Blue);

RTC

可以找例程在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

RTC_DateTypeDef D;
RTC_TimeTypeDef T;
u32 rtc_tick = 0;
void RTC_proc()
{if(uwTick - rtc_tick < 100)rtc_tick = uwTick;/* Get the RTC current Time */HAL_RTC_GetTime(&hrtc, &T, RTC_FORMAT_BIN);/* Get the RTC current Date */HAL_RTC_GetDate(&hrtc, &D, RTC_FORMAT_BIN);
}

ADC

在这里插入图片描述
在这里插入图片描述

如果双通道需要配置
在这里插入图片描述
采样时间选最大
在这里插入图片描述

u32 r37_value = 0;
u32 r38_value = 0;
u32 mcp_value = 0;
float r37_volt = 0;
float r38_volt = 0;
float mcp_volt = 0;
u32 adc_tick = 0;
void ADC_proc()
{if(uwTick - adc_tick < 100)return;adc_tick = uwTick;//就这两个函数HAL_ADC_Start(&hadc1);mcp_value = HAL_ADC_GetValue(&hadc1);HAL_ADC_Start(&hadc1);r38_value = HAL_ADC_GetValue(&hadc1);HAL_ADC_Start(&hadc2);r37_value = HAL_ADC_GetValue(&hadc2);r37_volt = r37_value * 3.3 / 4096.0;r38_volt = r38_value * 3.3 / 4096.0;mcp_volt = mcp_value * 3.3 / 4096.0;	}

I2C

I2C 需要用I2CInit初始化

//写9行
void EEpWrite(uint8_t addr,uint8_t data)
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CSendByte(data);I2CWaitAck();I2CStop();HAL_Delay(5);
}
//读13行
uint8_t EEpRead(uint8_t add)
{uint8_t data;I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CStart();I2CSendByte(0xa1);I2CWaitAck();data = I2CReceiveByte();I2CSendNotAck(); //注意是noackI2CStop();return data;
}void MCP_write(uint8_t mcp)
{I2CStart();I2CSendByte(0x5E);I2CWaitAck();I2CSendByte(mcp);I2CWaitAck();I2CStop();
}

uart

在这里插入图片描述

接收

串口接收初始化HAL_UART_Receive_IT(&huart1,&rx_data,1);
接收中断3行

u8 rx_pointer , rx_data;
u8 rx_buff[30];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{rx_tick = uwTick;HAL_UART_Receive_IT(&huart1,&rx_data,1);rx_buff[rx_pointer++] = rx_data;
}

接收处理

u32 rx_tick = 0;
void RX_proc()
{if(uwTick - rx_tick < 50) return;rx_tick = uwTick;if(rx_pointer == 1 && rx_buff[0] == '#'){//接收输出正确}else if(rx_pointer > 0){//接收输出错误}rx_pointer = 0;memset(rx_buff,0,sizeof(rx_buff));
}

发送

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
struct __FILE
{int handle;/* Whatever you require here. If the only file you are using is *//* standard output using printf() for debugging, no file handling *//* is required. */
};
/* FILE is typedef’d in stdio.h. */
FILE __stdout;
int fputc(int ch, FILE *f) 
{HAL_UART_Transmit(&huart1,(u8 *)&ch,1,50);/* Your implementation of fputc(). */return ch;
}

然后就可以通过printf发送串口数据

PWM

不要用同一个定时器设置不同引脚的PWM
PWM初始化HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);在这里插入图片描述 在这里插入图片描述

u16 pa3_frq = 1000;
u16 pa4_frq = 2000;
u8 pa3_duty = 50;
u8 pa4_duty = 50;
u32 pwm_tick = 0;
void PWM_proc()
{if(uwTick - pwm_tick < 100)return;pwm_tick = uwTick; __HAL_TIM_SetAutoreload(&htim2,1e6 / pa3_frq - 1);__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_4,(1e6 / pa3_frq) * pa3_duty / 100);__HAL_TIM_SetAutoreload(&htim3,1e6 / pa4_frq - 1);__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,1e6 / pa4_frq * pa4_duty / 100);
}

DAC

在这里插入图片描述

u16 dac_value = 0;
u32 dac_tick = 0;
void DAC_proc()
{if(uwTick - dac_tick < 100) return;dac_tick = uwTick;HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_2,DAC_ALIGN_12B_R,dac_value);HAL_DAC_Start(&hdac1,DAC_CHANNEL_2);
}

定时器

定时器先配置定时时间 然后打开中断 然后打开定时器 即可
在这里插入图片描述

捕获PWM频率+占空比

PA15 -> R39
PA4 -> R40
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打开列程
在这里插入图片描述
打开输出捕获中断
在这里插入图片描述
我们改成我们需要的
在这里插入图片描述
回调函数也复制过去
在这里插入图片描述
变量也复制过去
在这里插入图片描述
我们有俩个定时器所以要先判断一下
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

占空比

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Vue.js------vue基础

1. 能够了解更新监测, key作用, 虚拟DOM, diff算法2. 能够掌握设置动态样式3. 能够掌握过滤器, 计算属性, 侦听器4. 能够完成品牌管理案例 一.Vue基础_更新监测和key 1.v-for更新监测 目标&#xff1a;目标结构变化, 触发v-for的更新 情况1: 数组翻转情况2: 数组截取情况3…

VIT论文阅读

论文地址&#xff1a;https://arxiv.org/pdf/2010.11929.pdf VIT论文阅读 摘要INTRODUCTION结论RELATEDWORKMETHOD1.VISIONTRANSFORMER(VIT)整体流程消融实验HEAD TYPE AND CLASSTOKENpoisitional embedding 整体过程公式Inductive biasHybrid Architecture 2.FINE-TUNINGANDH…

Substance 3D2024版 下载地址及安装教程

Substance 3D是Adobe公司推出的一套全面的3D设计和创作工具集合&#xff0c;用于创建高质量的3D资产、纹理和材质。 Substance 3D包括多个功能强大的软件和服务&#xff0c;如Substance 3D Painter、Substance 3D Designer和Substance 3D Sampler等。这些工具提供了广泛的功能…

TQ15EG开发板教程:在MPSOC上运行ADRV9009

首先需要在github上下载两个文件&#xff0c;本例程用到的文件以及最终文件我都会放在网盘里面&#xff0c; 地址放在最后面。在github搜索hdl选择第一个&#xff0c;如下图所示 GitHub网址&#xff1a;https://github.com/analogdevicesinc/hdl/releases 点击releases选择版…

vue实现海康h5player问题汇总

1. 引入问题 最开始写的时候&#xff0c;把h5player封装成了一个组件&#xff0c;把资源文件随便放在了一个目录下&#xff0c; 直接在子组件中引入&#xff0c;报错window.JSPlugin is not a constructor 或者JSPlugin is not defined 初步分析应该是引入资源文件失败&#x…

Java异常处理机制详解:多层方法调用与异常传播(day23)

1.数组下标越界 2.多个处理异常 上面这两个代码的区别就是有无 System.out.println("抛出了NumberFormatException"); System.out.println("抛出了ArrayIndexOutOfBoundsException"); 第一种是不论捕获到哪种异常&#xff0c;都只会调用e.printStack…

Asterisk 21.2.0编译安装经常遇到的问题和解决办法之pjproject

目录 Asterisk社区官方的说法然而买家秀是这样的pjproject-2.14下载不了的问题如何解决 Asterisk社区官方的说法 编译安装Asterisk 21.2.0版本 按照官网文档&#xff0c;原则上只需要如下几步&#xff1a; ./contrib/scripts/install_prereq install ./configure make make i…

Golang | Leetcode Golang题解之第20题有效的括号

题目&#xff1a; 题解&#xff1a; func isValid(s string) bool {n : len(s)if n % 2 1 {return false}pairs : map[byte]byte{): (,]: [,}: {,}stack : []byte{}for i : 0; i < n; i {if pairs[s[i]] > 0 {if len(stack) 0 || stack[len(stack)-1] ! pairs[s[i]] {…

【leetcode面试经典150题】36. 旋转图像(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

第04章 计算机常用通信指标和术语视频课程

4.1 本章目标 掌握bit、Byte、KB、MB、GB、TB概念和换算关系掌握波特率、比特率、误码率的概念掌握信道、基带信号、频带信号概念了解多路复用、频分多路复用、时分多路复用了解同步传输、异步传输概念 4.2 bit、Byte、KB、MB、GB、TB概念和换算关系 4.2.1 概念与换算 4.2.2…

docker-compose 之 OpenGauss

使用 docker 启动高斯数据库的示范脚本如下&#xff1a; docker-compose.yml version: 3.7 services:opengauss:image: enmotech/opengauss:5.1.0container_name: opengaussnetwork_mode: "host"privileged: truevolumes:- ./opengauss:/var/lib/opengaussenvironm…

使用自己的数据基于SWIFT微调Qwen-Audio-Chat模型

目录 使用自己的数据训练参数设置自己的数据准备语音转写任务语音分类任务 开始训练不同训练方法mpddpmp ddpdeepspeed 训练实例训练详情Qwen-Audio-Chat模型 模型数据实例官方可用的数据由内部函数处理为指定格式 训练好的模型测试 使用自己的数据 官方参考文档&#xff1a;…

CSPNet: A New Backbone that can Enhance Learning Capability of CNN

CSPNet 摘要1.引言3.方法3.1Cross Stage Partial NetworkDenseNetCross Stage Partial DenseNetPartial Dense BlockPartial Transition LayerApply CSPNet to Other Architectures 3.2 Exact Fusion ModelLooking Exactly to predict perfectlyAggregate Feature PyramidBalan…

【Android】【root remount】【3】remount 文件详细信息获取

前言 我们在root & remount 设备后&#xff0c;push相关文件到systm 、vendor、product 等目录进行调试&#xff0c;那么我们push的文件被保存在什么地方呢&#xff1f; 以及我们FWS、app侧如何过去push 的文件信息呢&#xff1f; remount push 文件保存 push 文件保存的…

java数据结构与算法刷题-----LeetCode684. 冗余连接

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 并查集 并查集 解题思路&#xff1a;时间复杂度O( n ∗ l o g 2…

高质量数据赋能大模型应用落地,景联文科技提供海量AI大模型数据

随着人工智能技术的迅猛进步&#xff0c;AI算法持续创新突破&#xff0c;模型的复杂度不断攀升&#xff0c;呈现出爆炸性的增长态势。数据的重要性愈发凸显&#xff0c;已然成为AI大模型竞争的核心要素。 Dimensional Research的全球调研报告显示&#xff0c;72%的受访者认为&a…

01、ArcGIS For JavaScript 4.29对3DTiles数据的支持

综述 Cesium从1.99版本开始支持I3S服务的加载&#xff0c;到目前位置&#xff0c;已经支持I3S的倾斜模型、3D Object模型以及属性查询的支持。Cesium1.115又对I3S标准的Building数据实现了加载支持。而ArcGIS之前一直没有跨越对3DTiles数据的支持&#xff0c;所以在一些开发过…

【Qt】:对话框(一)

对话框 一.基本的对话框二.自定义对话框三.通过图形化界面自定义对话框四.关于对话框mode 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者…

读所罗门的密码笔记16_直通心智

1. 直通心智 1.1. 如今&#xff0c;科学家已经可以诱发触觉、压觉、痛觉和大约250种其他感觉 1.1.1. DARPA支持的触觉技术第一次让一位受伤的人能够用假肢和手指感知到被触碰的物体 1.1.2. 可以建立人工系统&#xff0c;来替换和弥补受损大脑的部分区域 1.1.3. 神经科学家能…

如何合理利用Vue 3中的ref和reactive

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…