自用---

零、环境配置

keil代码补全

keil pack包

cubemx配置安装包

一、LED

cubemx配置PD2引脚为输出模式

uint16_t led_value = 0x00;
void led_set(uint8_t led_dis)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,led_dis<<8,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);    
}
void led_single_on(uint8_t turn)
{led_value = led_value | (0x01<<(turn - 1));led_set(led_value);
}
void led_single_off(uint8_t turn)
{led_value = led_value & (~(0x01<<(turn - 1)));led_set(led_value);
}

void led_single_on(uint8_t turn);
void led_single_off(uint8_t turn);

通过位运算实现单独的led操作而不影响其他led灯的正常显示,便于实现led的同时闪烁和分别控制,成功解决和led灯冲突的问题

二、EPPEROM(I2C)

初始化

初始化函数【无需在cubemx配置引脚】,在while(1)前面初始化配置一下🆗,下面这个函数在提供的I2C函数里有

void I2CInit(void)
{GPIO_InitTypeDef GPIO_InitStructure = {0};GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_6;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Pull = GPIO_PULLUP;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}

 EEPROM--AT24C02只有对写操作有时间间隔要求,对读操作没有间隔要求

由上图可以得知,AT24C02读时间间隔为5ms

HAL_Delay(5);    //延时5ms--AT24C02写时序要求

 根据芯片手册时序图编写读写函数

//字节写函数
void at24c02_Byte_Write(unsigned char addr,unsigned char cSendByte)
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CSendByte(cSendByte);I2CWaitAck();I2CStop();
}

//随机读
unsigned char at24c02_Byte_read(unsigned char addr)
{unsigned char dat;I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CStart();I2CSendByte(0xa1);I2CWaitAck();dat = I2CReceiveByte();I2CSendNotAck();I2CStop();return dat;
}

三、LCD

1.LCD基本显示问题

#include "stdio.h"  //进入sprintf函数的头文件

sprintf () 可以将格式化输出发送到一个字符串中

使用示例:

        sprintf(text,"    Liquid Level     ");LCD_DisplayStringLine(Line1,(u8*)text);

2.高亮某一行 

        if(set_sel == Sel_3){LCD_SetBackColor(Yellow);}sprintf(text," Threshold_3:  %2dcm     ",Threshold_3);LCD_DisplayStringLine(Line7,(u8*)text);      LCD_SetBackColor(Black);    

 设置set_sel用于选择高亮的某一行

在显示前设置高亮背景颜色

在显示后设置回默认的背景颜色

3.高亮某个字符

void highlight(uint8_t *str,uint8_t pos)
{int i = 0;for(i = 0; i <= 20; i++){if(i != pos && i!= (pos+1))LCD_DisplayChar(Line3,(320 - (16 * i)),str[i]);}LCD_SetBackColor(Yellow);LCD_DisplayChar(Line3,(320 - (16 * pos)),str[pos]);LCD_SetBackColor(Yellow);LCD_DisplayChar(Line3,(320 - (16 * (pos+1))),str[pos+1]);LCD_SetBackColor(Black);	
}

使用示例:

四、串口

1.串口重定向

#include "stdio.h"
int fputc(int ch,FILE *f)
{HAL_UART_Transmit(&huart1,(unsigned char*)&ch,1,50);return ch;
}

 

2.串口中断

3.串口DMA

4.不定长数据接收

5.指令解析

6.sscanf的使用

五、TIM

1.PWM输出(多通道脉冲输出/信号发生器)

  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);  //PA6--PWM输出HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1); //PA7--PWM输出

2.PWM占空比

①初始化配置

②修改比较值

__HAL_TIM_SetCompare(    );

3.PWM频率设置

__HAL_TIM_SET_PRESCALER(&htim2,80-1);

4.输入捕获,双通道测量频率和占空比

    HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
uint16_t cnt_rising=0, cnt_falling=0;
uint16_t freq=0;
float IC_duty;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim -> Instance == TIM3){if(htim -> Channel == HAL_TIM_ACTIVE_CHANNEL_2){cnt_rising = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2)+1;freq = (80000000/80) / cnt_rising;IC_duty = ((float)cnt_falling/cnt_rising)*100;}if(htim -> Channel == HAL_TIM_ACTIVE_CHANNEL_1){cnt_falling = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1)+1;}}
}

5.RTC时钟

6.定时器实现闪烁/步进

六、按键

短按

长按+短按

按键处理函数

七、ADC(电位器)

ADC校准

HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);        //ADC校准

ADC读取值

勾选ADC2  IN15 Single-ended,其他选项默认

HAL_ADC_Start(&hadc2);
HAL_ADC_GetValue(&hadc2);
double getADCvalue(void)
{HAL_ADC_Start(&hadc2);HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);        //ADC校准uint32_t value = HAL_ADC_GetValue(&hadc2);ADC_get_flag = 0;return (value*3.3)/4095.0;
}

4095——>分辨率12bit   

过采样(G4系列)

Oversampling Right Shift和Oversampling Ratio设置为对应的。

double getADCvalue(void)
{HAL_ADC_Start(&hadc2);HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);        //ADC校准uint32_t value = HAL_ADC_GetValue(&hadc2);ADC_get_flag = 0;return (value*3.3)/4095.0;
}

 

硬件滤波

软件滤波(一阶互补滤波)

double first_filter(double new_val,double old_val,float rate)
{return  (new_val*rate + old_val*(1-rate)); 
}

八、考试调试

①printf

②LCD

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

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

相关文章

vue3新手笔记

setup&#xff08;&#xff09;{}函数&#xff0c;是启动页面后&#xff0c;自动执行的一个函数。所有数据&#xff08;常量、变量&#xff09;、函数等等&#xff0c;都要return 出去。 ref函数&#xff1a;让页面上的数据响应式更新&#xff0c;不需要刷新页面&#xff1f; 对…

Docker篇(二)— Docker架构介绍

目录 一、Docker和虚拟机的区别二、Docker架构镜像和容器DockerHubDocker架构 小结 一、Docker和虚拟机的区别 Docker可以让一个应用在任何操作系统中非常方便的运行。而以前我们接触的虚拟机&#xff0c;也能在一个操作系统中&#xff0c;运行另外一个操作系统&#xff0c;保…

【GN】《Group Normalization》

ECCV-2018 Facebook AI Research 更多论文解读&#xff0c;可参考【Paper Reading】 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Image Classification in ImageNet5.3 Object Detecti…

基于李雅普诺夫稳定性分析的一阶、二阶系统MATLAB仿真模型

李雅普诺夫稳定性定理 假设系统状态方程&#xff1a; 零状态为其平衡状态&#xff0c;即f(0,t)0 t&#xff1e;t0。如果存在一个具有连续的一阶偏导数的标量函数V (x,t)&#xff0c;并且满足下述条件&#xff1a; 1、V (x,t)是正定的&#xff1b; 2、沿状态方程轨线的V (x…

使用 nginx 服务器部署Vue项目

安装nginx 文本代理服务器 centos下载 注意需要root权限 在CentOS服务器上下载Nginx可以通过以下步骤完成&#xff1a; 更新系统软件包列表&#xff1a; yum update 安装EPEL存储库&#xff08;Extra Packages for Enterprise Linux&#xff09;&#xff1a; yum install…

利用Flexbox和Margin实现智能布局:如何巧妙分配剩余空间,让你的网页设计更上一层楼?

1、演示 2、flex布局 Flex布局是一种用于Web开发的弹性盒子布局模型&#xff0c;它可以让容器内的子元素在空间分配、对齐和排列方面具有更大的灵活性。以下是Flex布局的基本用法&#xff1a; 容器属性&#xff1a; display: flex;&#xff1a;将容器指定为Flex布局。flex-dire…

POP3的要点:查看电子邮件需要知道什么

在您点击阅读时&#xff0c;是否曾想过您是如何如此轻松地查看电子邮件的&#xff1f;对我们来说&#xff0c;这听起来可能只是几秒钟的加载时间&#xff0c;但实际上幕后发生了许多事情。邮局协议&#xff08;POP3&#xff09;是一种应用层协议&#xff0c;电子邮件客户端使用…

恒创科技:香港服务器CPU核心数如何选?越多越好吗?

​  谈到 CPU“核心”是完成所有处理的组件&#xff0c;程序能否顺利运行的第一因素是你有多少个核心。但由于不同的计算任务占用不同的资源&#xff0c;所以如果您打算简单地创建小型网站或者其他请求处理数据也不高的业务&#xff0c;那么您的基本型号应该包含 1、2 核已经…

STL库 —— list 的编写

目录 一、成员变量 ​编辑 二、push_back 函数 三、迭代器 iterator 3.1 iterator 结构体 3.2 begin() 与 end() 函数 3.3 iterator 运算符重载 3.4 -> 的重载 3.5 const_iterator 四、测试代码 五、修饰符成员 5.1 insert 函数 5.2 erase 函数 5.3 push 函数…

WordPress关注公众号可见内容插件源码

简介&#xff1a; WordPress公众号引流工具——关注公众号可见内容插件推荐 通过关注微信公众号&#xff0c;获取随机验证码从而获得隐藏文本的访问权限。 插件特点 隐藏内容扫码关注获取验证码 可以作为引流公众号 支持无必须API接口&#xff0c;无备案域名也可以 自定义…

先进电机技术 —— 步进电机控制综述

一、背景 随着自动化技术的发展和精密控制需求的增长&#xff0c;步进电机作为一种重要的执行元件在众多领域展现出了卓越的性能优势。步进电机&#xff0c;又称为步进驱动器或步进马达&#xff0c;是一种能够将电脉冲信号精确转换为角位移或直线位移的特殊电动机。其工作原理…

信息系统项目管理师0044:IT治理方法与标准(3信息系统治理—3.1 IT治理—3.1.4 IT治理方法与标准)

点击查看专栏目录 文章目录 3.1.4 IT治理方法与标准1. ITSS中1T服务治理 3.1.4 IT治理方法与标准 考虑到IT治理对组织战略目标达成的重要性&#xff0c;国内外各类机构持续研究并沉淀IT治理相关的最佳实践方法、定义相关标准&#xff0c;这里面比较典型的是我国信息技术服务标准…

Leetcode算法训练日记 | day18

一、找树左下角的值 1.题目 Leetcode&#xff1a;第 513 题 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出:…

Python:六大数据类型理论与示例

在这篇文章中&#xff0c;我们深入探讨了Python中的六大基本数据类型&#xff1a;数字&#xff08;Number&#xff09;、字符串&#xff08;String&#xff09;、列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xff09;、字典…

Hive的分区与排序

一、Hive分区 1.引入&#xff1a; 在大数据中&#xff0c;最常见的一种思想就是分治&#xff0c;我们可以把大的文件切割划分成一个个的小的文件&#xff0c;这样每次操作一个个小的文件就会很容易了&#xff0c;同样的道理&#xff0c;在hive当中也是支持这种思想的&#xff…

UE4 避免布料模拟重置后抖动

问题&#xff1a;每次设置带布料模拟的布料新位置&#xff0c;就会发生突然的抖动 解决办法&#xff1a;给“布料混合权重”或“布料最大距离缩放”K帧&#xff0c;参考数值为0.2—1&#xff08;红框内的值都试过无法解决&#xff09;

JVM性能调优——运行时参数

文章目录 1、JVM参数选项类型1.1、标准参数选项1.2、非标准参数选项1.3、非稳定参数选项 2、添加JVM参数的方式3、常用JVM参数选项4、通过Java代码获取JVM参数5、小结 熟悉JVM参数对于系统调优是非常重要的。比如一个高流量的延迟的电子交易平台&#xff0c;它要求的响应时间都…

头歌机器学习实验 第7次实验 局部加权线性回归

任务描述 本关任务&#xff1a;编写一个利用局部加权计算回归系数的小程序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.局部加权算法的思想&#xff1b;2.局部加权的核心算法。 局部加权算法的思想 在局部加权算法中 &#xff0c;我们给待预测点附近…

【mT5多语言翻译】之六——推理:多语言翻译与第三方接口设计

请参考本系列目录&#xff1a;【mT5多语言翻译】之一——实战项目总览 [1] 模型翻译推理 在分别使用全量参数微调和PEFT微调训练完模型之后&#xff0c;我们来测试模型的翻译效果。推理代码如下&#xff1a; # 导入模型 if conf.is_peft:model AutoModelForSeq2SeqLM.from_pr…

为什么需要SOCKS代理?

在数字化时代&#x1f310;&#xff0c;随着网络安全威胁的不断演进和增加&#xff0c;保护个人隐私和数据安全成为了互联网用户的一大挑战&#x1f6e1;️。在寻求增强在线安全和隐私的解决方案时&#xff0c;SOCKS代理成为了一个关键的技术工具&#x1f511;。本文旨在详细探…