蓝桥杯——嵌入式学习日记

因为lED和LCD共用PC8~PC15引脚,要通过锁存(LE)和(GPIOC->ODR)来避免LED和LCD引脚冲突

修改点:

  • main.c中,GPIO初始化引脚后,LE(PD2引脚低电平锁存,退出透明模式,LCD的输出就无法影响LED引脚的状态)
    在这里插入图片描述
  • LCD_DisplayStringLine();
    在这里插入图片描述
    在这里插入图片描述
  • LCD_Clear()
    在这里插入图片描述

定时器中断

定时器功能

在这里插入图片描述

在这里插入图片描述

定时器频率和周期公式

  • PSC(预分频系数): 1 / f == T, 乘上(PSC+1) 得到执行一次累加操作的实际周期,再乘上(ARR+1)等于中断周期
  • 预分频理解: 假设原本1ms执行一次累加, PSC == 2, 则当前变成2ms才执行一次累加(另外的1ms分给了别的任务)
    在这里插入图片描述
  • 时钟配置
    在这里插入图片描述- 通过STM32CubeMX,配置TIM2(通用定时器)的参数(Fsystem = 80MHz = 80 000 000)
    假设定时中断周期要求 1s , 则 ARR+1=8000 , PSC+1 = 10000
    在这里插入图片描述

使能定时中断

//定时中断需要使能HAL_TIM_Base_Start_IT(&htim2);  //HAL_TIM_Base_Start_IT函数用于以中断模式启动定时器

长按键、短按键(使用TIM3)

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

在这里插入图片描述
利用cnt计时
在这里插入图片描述
本质就是将计算 T 公式里的: ARR 代替为 CNT(计数值)—— T = 1 / f = CNT * (PSC + 1) / f

LCD高亮显示

//按键4通过循环取余数,控制lcd某行高亮显示
static uint16_t temp_line = 0;
void Hight_light_lcd_line(){key_s4 = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);if(key_s4==RESET && k4_last_state==SET){  //按下B4temp_line++;temp_line%=3;HAL_Delay(200);}//控制功能栏轮流高亮显示if(temp_line==0){//sprintf();   用于写入字符串到字符数组LCD_SetBackColor(Red);  //该行以下的背景颜色是红色sprintf(text, "    Hello, Vodka!     ");LCD_DisplayStringLine(Line3, (uint8_t*) text );LCD_SetBackColor(Black);		//该行以下的背景颜色是黑色sprintf(text, "      Count: %d        ", Count);LCD_DisplayStringLine(Line4, (uint8_t*) text);sprintf(text, "   LightMode: %d        ", lightMode);LCD_DisplayStringLine(Line5, (uint8_t*) text);}else if(temp_line==1){//sprintf();   用于写入字符串到字符数组sprintf(text, "    Hello, Vodka!     ");LCD_DisplayStringLine(Line3, (uint8_t*) text );LCD_SetBackColor(Red);	sprintf(text, "      Count: %d        ", Count);LCD_DisplayStringLine(Line4, (uint8_t*) text);LCD_SetBackColor(Black);	sprintf(text, "   LightMode: %d        ", lightMode);LCD_DisplayStringLine(Line5, (uint8_t*) text);	}else if(temp_line==2){//sprintf();   用于写入字符串到字符数组sprintf(text, "    Hello, Vodka!     ");LCD_DisplayStringLine(Line3, (uint8_t*) text );sprintf(text, "      Count: %d        ", Count);LCD_DisplayStringLine(Line4, (uint8_t*) text);LCD_SetBackColor(Red);	sprintf(text, "   LightMode: %d        ", lightMode);LCD_DisplayStringLine(Line5, (uint8_t*) text);LCD_SetBackColor(Black);	}//LED闪烁,间隔两秒闪烁一次light_led(3,lightMode%2);}

PWM波形

原理

占空比:高电平持续时间占整个周期时长的比值
PWM频率和占空比的概念:占空比由捕获比较寄存器(CCR)决定,而频率由ARR和PSC共同决定。不同的PSC和ARR组合可以得到相同的频率,只要它们的乘积相同。例如,PSC=1和ARR=1000,与PSC=2和ARR=500,得到的频率是一样的,但占空比的调节范围可能不同,因为ARR的值不同。
在这里插入图片描述

CubeMX配置

在这里插入图片描述

初始化

在这里插入图片描述

CCR(输出比较寄存器)

在这里插入图片描述

输入捕获测量引脚输出PWM波形

通过计算两个中断之间CNT差值(capture_value),得出中断周期(捕获周期)
在这里插入图片描述

捕获周期计算公式

在这里插入图片描述

信号发生器

PWM输出引脚和输入捕获引脚,板子上的引脚R37~R40分别是:电压采集1、电压采集2、频率输出1(PB4)、频率输出2(PA15)

例题

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

在这里插入图片描述

TIM17配置(记得配置NVIC)

在这里插入图片描述

pwm输入捕获代码

PA1、PA7需要杜邦线连接; PA1配置TIM2的通道2、PA7配置TIM17的通道1
在这里插入图片描述

输入捕获555定时器的频率

时钟通道配置

引脚PA15和引脚PB4测量频率输入1和频率输入2
在这里插入图片描述
在这里插入图片描述

代码

TIM2、TIM16输入捕获中断开启
在这里插入图片描述
TIM2、TIM16输入捕获展示
在这里插入图片描述

ADC测量

配置ADC1和ADC2

在这里插入图片描述

代码实现

在这里插入图片描述

在这里插入图片描述

USART通信(异步、全双工、字节传输)

配置

在这里插入图片描述

类型转换问题

字符类型(char)在算术运算中会被转换为整数类型(int)。
short型会被转换为int型。
float型会被转换为double型以提高精度。
当有符号数与无符号数进行运算时,所有操作数自动转换为无符号类型

字符与字节

存储字符串 "bens in 2023/23/23" 的 char 数组需占用 19 字节,空格也算字符,包含'\0'作为终止符(转义字符\n,\t也算字符)

代码实现(向上位机发送数据)

void UART_Tx_Test(void){sprintf((char*)uart_tx_text,"Hey~ Vodka~\r\n");	HAL_UART_Transmit(&huart1, (uint8_t *)uart_tx_text, strlen(uart_tx_text), 50);  //超时时间限制为50msHAL_Delay(2000); //发送数据间隔时间: 0.1s	}

代码实现(按字节循环接收uart串口数据)

主函数
在这里插入图片描述

//util.h
#ifndef __util_h
#define __util_h
//串口接收变量
extern char uart_rx_text[22];
extern uint8_t Rx_Byte;
extern uint8_t Rx_Index;
extern uint8_t Rx_DoneFlag;//车辆信息(串口接收)
extern char car_type[5];
extern char car_data[5];
extern char car_time[13];//测试函数                                      
void lcd_test(void);                            //ADC测量                                       
void ADC_show(void);                            //ADC测量电压
void ADC_Caculate_Volt(void);//串口发送测试
void UART_Tx_Test(void);//串口接收测试(只能通过中断接收)
void UART_Rx_Test(void);//UART中断数据后续处理(放在主程序里循环)
void uart_data_process(void);#endif//util.c
//UART中断回调接收数据(第一次中断在主函数)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart){if(huart->Instance == USART1){uart_rx_text[Rx_Index++] = Rx_Byte;//判断接收的字节是否完成if(Rx_Index==22||Rx_Byte=='\n'){Rx_DoneFlag = 1;}//继续开启下一次中断HAL_UART_Receive_IT(&huart1,&Rx_Byte,sizeof(Rx_Byte));}
}//UART中断数据后续处理(放在主程序里循环)
void uart_data_process(void){//判断中断接收完毕标志if(Rx_DoneFlag==1){if(Rx_Index <= 22){   //接收数组长度22字节,除去\0,实际只能存储21个字节sscanf(uart_rx_text, "%4s %4s %10s", car_type, car_data, car_time);//展示数据LCD_SetBackColor(Yellow);LCD_SetTextColor(Black);		sprintf(rx_display_text,"        UART_Rx           ");LCD_DisplayStringLine(Line0,rx_display_text);		  sprintf(rx_display_text,"    car_type:%s       ",car_type);LCD_DisplayStringLine(Line1,rx_display_text);sprintf(rx_display_text,"    car_data:%s         ",car_data);LCD_DisplayStringLine(Line2,rx_display_text);sprintf(rx_display_text," car_time:%s        ",car_time);LCD_DisplayStringLine(Line3,rx_display_text);		  }else{sprintf(rx_display_text,"        Rx_Error\r\n          ");HAL_UART_Transmit(&huart1, (uint8_t*)rx_display_text, strlen(rx_display_text), 50); }//重置相应标志Rx_DoneFlag = 0;Rx_Index = 0;memset(uart_rx_text,0,strlen(uart_rx_text));}
}

通过定时器,UART串口接收不定长的数据

原理

传送一个字节花费的时间,转化为CNT的值来判断
在这里插入图片描述
间隔指定时间读取一个数据
在这里插入图片描述
判断结束的标志:最后一个位的时间大于1.5ms
在这里插入图片描述

配置

TIM4:内部时钟、波特率:9600、 开启中断、 PSC: 8000-1
在这里插入图片描述

串口中断开启、时钟使能

在这里插入图片描述

中断处理、中断回调

在这里插入图片描述

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

自行编写

在这里插入图片描述

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

IIC

IIC原理图

在这里插入图片描述

非易失性存储器

在这里插入图片描述

从机地址

读写位:1是读、2是写
在这里插入图片描述

代码实现

在这里插入图片描述

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

RTC实时时钟

设置(读取)时间、日期,设置闹钟

RTC配置

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

在这里插入图片描述

代码实现

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

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

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

相关文章

Liunx系统Microsoft SQL Server数据库还原

1.确认Linux系统已安装SQLServer服务并启动 2.在Windows中使用SSMS连接原数据库与Linux远程数据库服务 3.备份 成功备份如下 4.上传bak文件到远程Linux服务器 登陆Linux服务并创建数据库文件夹 退出Linux服务

【学习资源】多元时序分析问题和时序图模型

工业数据分析领域中&#xff0c;多元时序数据分析是一个广泛的问题。今天和大家简单介绍多元时序预测、聚类、分类、时序图模型和相应的深度学习库。 图片来源&#xff1a;https://www.researchgate.net/publication/349207209_Multivariate_Time-Series_Anomaly_Detection_via…

QT二 QT使用generate form 生成常用UI,各种UI控件

一 。没有使用general form 和 使用 general form 后&#xff0c;file层面和代码层面的不同比较 file层面的不同 代码层面的不同&#xff0c; 在 使用了general form之后&#xff0c;在主界面的构造方法中&#xff0c;使用ui->setupUi(this),就完成了所有UI的处理。 而之…

Haption力反馈遥操作机器人:6自由度高精度技术,定义远程操作新标准

Haption在力反馈遥操作机器人技术领域展现了强大的创新能力。其核心技术——力反馈技术&#xff0c;通过提供高度逼真的触觉反馈&#xff0c;显著提升了远程操作的精确性与用户体验。这种技术在工业、医疗等高要求场景中表现出色&#xff0c;同时也为科研和教育领域提供了有力支…

魔塔社区的torch_empty错误问题的解决办法

前言 我在运行魔塔社区&#xff08;modelscope&#xff09;的ZhipuAI/chatglm3-6b模型&#xff08;智谱&#xff09;的实例程序的时候&#xff0c;碰到了一个奇怪的错误&#xff08;torch.empty&#xff09;&#xff0c;我尝试解决了一下。 &#xff08;当前采用的Python版本…

全面了解 Cookies、Session 和 Token

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

51c自动驾驶~合集26

我自己的原文哦~ https://blog.51cto.com/whaosoft/11968755 #大模型/Sora/世界模型之间是什么关系 1 什么是大模型 人工智能大模型&#xff08;Artificial Intelligence Large Model&#xff0c;简称AI大模型&#xff09;是指具有庞大的参数规模和复杂程度的机器学习模…

分布式环境下的重复请求防护:非Redis锁替代方案全解析

目录 引言 方案一&#xff1a;前端防护策略 方案二&#xff1a;后端协同控制 方案三&#xff1a;流量控制与过滤 滑动窗口限流 布隆过滤器 方案四&#xff1a;基于框架的实践方案 多层防护策略与最佳实践 总结 引言 在Web应用开发中&#xff0c;防止用户重复点…

4.1 C#获取目录的3个方法的区别

C#中常用有如下3个获取目录的方式如下 1.Directory.GetCurrentDirectory():获取当前工作目录&#xff0c;工作目录可能被用户或其他代码修改。尽量少用。&#xff08;似乎只要在运行中使用另存为或者打开某个文件夹&#xff0c;当前工作目录就修改&#xff09; 2.Application…

【漏洞复现】Next.js中间件权限绕过漏洞 CVE-2025-29927

什么是Next.js&#xff1f; Next.js 是由 Vercel 开发的基于 React 的现代 Web 应用框架&#xff0c;具备前后端一体的开发能力&#xff0c;广泛用于开发 Server-side Rendering (SSR) 和静态站点生成&#xff08;SSG&#xff09;项目。Next.js 支持传统的 Node.js 模式和基于边…

MCU-芯片时钟与总线和定时器关系,举例QSPI

时钟源&#xff1a; 时钟源为系统时钟提供原始频率信号&#xff0c;系统时钟则通过&#xff08;分频、倍频、选择器&#xff09;成为整个芯片的“主时钟”&#xff0c;驱动 CPU 内核、总线&#xff08;AHB、APB&#xff09;及外设的运行。 内部时钟源&#xff1a; HSI&#x…

使用 ByteDance 的 UI-TARS Desktop 探索 AI 驱动的 GUI 自动化新前沿

文章目录 UI-TARS Desktop 是什么&#xff1f;技术亮点应用场景如何快速上手&#xff1f;与其他技术的对比未来展望结语 随着人工智能技术的快速发展&#xff0c;AI 正在从单纯的文本生成和图像识别迈向更复杂的交互场景。ByteDance 近期推出的 UI-TARS Desktop&#xff08;基于…

DockerFile制作镜像(Dockerfile Creates an Image)

DockerFile制作镜像 hub.docker.com 搜索到的 Redis官方镜像&#xff0c;提示我们可以创建自己的 DockerFile 来添加 redis.conf 文件&#xff1a; 于是&#xff0c;我准备进行首次 DockerFile 的制作尝试。 一、准备工作 1.1 下载 redis.conf 我的方案是从 GitHub 上下载 …

C++List模拟实现|细节|难点|易错点|全面解析|类型转换|

目录 1.模拟代码全部 2.四大块代码理解 1.最底层&#xff1a;ListNode部分 2.第二层&#xff1a;ListIterator部分 3.第三层&#xff1a;ReserveListIterator部分 4最终层&#xff1a;List 1.模拟代码全部 using namespace std; template<class T> struct ListNode …

如何让自动驾驶汽车“看清”世界?坐标映射与数据融合概述

在自动驾驶领域,多传感器融合技术是实现车辆环境感知和决策控制的关键。其中,坐标系映射和对应是多传感器融合的重要环节,它涉及到不同传感器数据在统一坐标系下的转换和匹配,以实现对车辆周围环境的准确感知。本文将介绍多传感器融合中坐标系映射和对应的数学基础和实际应…

鸿蒙开发之背景图片的使用

在鸿蒙开发中&#xff0c;设置背景图片是提升应用界面视觉效果的重要一环。以下是关于鸿蒙开发中背景图片使用的详细方法&#xff1a; 一、通过XML布局文件设置背景图片 1.使用Image组件设置背景图片 在XML布局文件中&#xff0c;可以使用Image组件来设置背景图片。通过ohos…

如何在 HTML 中创建一个有序列表和无序列表,它们的语义有何不同?

大白话如何在 HTML 中创建一个有序列表和无序列表&#xff0c;它们的语义有何不同&#xff1f; 1. HTML 中有序列表和无序列表的基本概念 在 HTML 里&#xff0c;列表是一种用来组织信息的方式。有序列表就是带有编号的列表&#xff0c;它可以让内容按照一定的顺序呈现&#…

c++malloc出来的对象调用构造-------定位new

前言:之前在搓高并发内存池的时候就在想,类对象不能调用自身的构造函数,那直接申请内存出来的类对象岂不是很难受,然后我这两天仔细研究了一下,发现其实构造函数也可以显示去调用,而且含不限量,故做此文 在c中一个类对象不能直接调用自身的构造 class A { public:A() {cout &l…

ElementUI时间选择、日期选择

如大家所发现的&#xff0c;由于ElementUI 时间选择器&#xff0c;日期选择器&#xff0c;时间日期选择器点击清除按钮时&#xff0c;v-model 所绑定的属性值会变成 null&#xff0c;所以当使用 ElementUI 时间选择器&#xff0c;日期选择器&#xff0c;时间日期选择器 时&…

一篇文章入门Python Flask框架前后端数据库开发实践(pycharm在anaconda环境下)

Python Flask 是一个轻量级的 Web 应用框架&#xff0c;也被称为微框架。它以简洁、灵活和易于上手的特点而受到开发者的喜爱。 核心特点 轻量级&#xff1a;Flask 核心代码简洁&#xff0c;仅包含 Web 开发的基本功能&#xff0c;不强制使用特定的数据库、模板引擎等&#xf…