王者农药更新版
一、启动文件配置
二、GPIO使用
2.1基本步骤
1.配置GPIO,所以RCC开启APB2时钟
2.GPIO初始化(结构体)
3.给GPIO引脚设置高/低电平(WriteBit)
2.2Led循环点亮(GPIO输出)
1.RCC开启APB2时钟。
RCC_APB2PeriphClockCmd
2.GPIO_init初始化GPIO。参数是结构体,GPIO_PIN1 | GPIO_PIN2可以同时初始化。
3.GPIO输出
GPIO_ResetBits给gpio端口设为低电平(led点亮)
GPIO_SetBits给gpio端口设为高电平(熄灭)
GPIO_WriteBit,第三个参数决定
5、添加延时函数
6、循环点亮
2.3按键控制两个led(GPIO输入)
Led:
1.RCC开启GPIO所在的APB2时钟
2.GPIO初始化,默认设置为高电平
3.写函数分别控制GPIO对应引脚的高/低电平,为之后按键控制做准备
按键:
1.RCC开启APB2时钟
2.GPIO初始化
3.GPIO读取输入信息,按键按下时读取为0
GPIO_ReadInputDataBit,代表输入寄存器的某个端口的值
0代表按下,防抖,如果不松开按键一直循环,松开按键后,跳出循环,再防抖,修改变量KeyNum的值代表按下pin_1对应的按键了。
GPIO_ReadInputData,代表整个输入寄存器。
4.反转
GPIO_ReadOutputDataBit,输入的是什么,输出什么,输出0时,设为高电平灯灭。
三、显示屏(OLED)
3.1调试方法
1.串口调试
2.显示屏调试
3.keil调试
3.2显示屏调试(OLED)
参数:行,列,值,(长度)
采用IIC或SPI协议。这里采用IIC,IIC有两个引脚SCL,SDA
1.RCC打开APB2时钟
2.GPIO初始化,要注意SCL和SDA对应GPIO引脚都要初始化,这里是pin8和pin9,且因为IIC协议有上拉电阻,所以是开漏输出
3.引脚配置,默认SCL和SDA两个引脚都配置为高电平
4.最后通过导入OLED.h显示
四、EXTI中断
4.1stm32中断
中断方法有很多,EXTI,TIM,ADC,USART,IIC
NVIC用来决定优先级。
4.2中断基本步骤
1.RCC开启GPIO和AFIO对应的APB2的时钟,EXTI和NVIC默认是开着的
2.GPIO初始化(结构体)
3.AFIO配置,用来选择哪个GPIO,GPIO的哪个引脚发生中断,用GPIO_EXTILineConfig(GPIO中断线引脚)
4.EXTI中断配置,EXTI初始化——EXTI_Init函数(结构体)
5.NVIC优先级组配置和初始化,通过对优先级分组来决定优先级,使用NVIC_PriorityGroupConfig,之后进行NVIC初始化——NVIC_Init
4.3具体步骤
1.RCC时钟配置,主要GPIO和AFIO。EXIT和NVIC是一直打开时钟的,不需要配置
2.GPIO配置初始化,上拉输入
3.AFIO配置
第二个是选择中断引脚
第一个是重映射,先不用
4.EXTI配置
Mode选中断模式,还有个事件模式
Triggle分为上升沿触发(从低电平到高电平),下降沿触发(从高电平到低电平触发,选这个)和上升下降沿触发
5.NVIC配置
先分组,这里分到组2,也可以选其他组,然后NVIC初始化。
6.中断配置好了,接下来让cpu从主程序跳到中断程序,中断函数的名字固定的
先判断中断标志位是不是pin14,如果是,执行中断程序,最后中断标志位清空,否则一直循环中断程序。
挡光片遮挡后,led灯会触发中断,灯灭
五、TIM定时中断
5.1基本步骤
1.TIM1和TIM8是高级定时器,TIM2-5是通用定时器,TIM6和TIM7是基本定时器。这个芯片只有TIM1-4,这里用的是TIM2通用定时器。所以RCC打开TIM2对应的APB1(低速外设)时钟。
2.TIM配置内部时钟/ETR外部时钟/ITRX其他定时器/TIx捕获通道,这里使用内部时钟,内部时钟使用TIM_InternalClockConfig。
(RCC掌管外设时钟,TIM定时器是外设)
3.时基单元初始化(结构体),TIM_TimeBaseInit
4.中断输出控制,定时器很多地方都需要申请中断,使用TIM_ITConfig
5.配置NVIC,有中断就有优先级,优先级+初始化
6.运行控制,放最后定时器运行,TIM_Cmd
5.2具体步骤
1.配置GPIO时钟
2.配置RCC内部时钟/ETR外部时钟/ITRX其他定时器/TIx捕获通道
3.配置内部时钟模式/外部时钟模式2/外部时钟模式1/编码器模式
4.配置时基单元和运行控制(放最后)
5.配置中断输出控制
6.配置NVIC
7.计数
六、TIM输出比较
6.1TIM输出比较与PWM
PWM(Pulse Width Modulation),即脉冲宽度调制,是一种模拟电路数字控制技术。它通过改变脉冲信号的占空比(即脉冲宽度与周期的比值)来等效地获得所需的模拟量(电压或电流)输出。
6.2呼吸灯实现的基本步骤
1.因为要用到GPIO和TIM,所以RCC需要打开APB2和APB1的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2.GPIO初始化(led灯)
3.开启TIM2内部时钟
4.时基单元初始化
5.输出比较(oc)单元初始化TIM_OC1Init
6.运行控制
7.修改占空比,TIM_SetCompare1函数可以设置CCR的值(1是因为OC1通道1)
6.3具体步骤
1.RCC开启GPIO和TIM时钟
2.配置时基单元
3.配置输出比较单元
IIM_OCInitTypedef结构体有很多属性,有一些高级定时器用的,我们不用配置,所以需要给这些初始化,用TIM_OCStructInit,然后把需要的配置。
注:这里初始化是TIM_OC1Init,用于初始化定时器的输出比较通道1。每个定时器的输出比较总共有4个通道
4.配置GPIO,复用推挽输出
我们在GPIO,PA0引脚,所以输出比较单元用的TIM_OC1Init。这里配置PA0。
5.运行控制(TIM_Cmd)
6.参数计算
7.呼吸灯
当CCR大的时候亮,小的时候暗,所以要实现呼吸灯,需要不断改变CCR的值,用TIM_SetComparel函数可以设置CCR的值,主循环中让它逐渐增大,然后逐渐减少。
8.拓展——重映射
6.4舵机控制
和呼吸灯步骤一样,只需要修改通道和占空比即可,分别是OC2Init()和TIM_SetCompare2(TIM2, Compare)。呼吸灯是TIM_SetCompare1。
七、输入捕获
7.1测频率基本步骤
1.RCC开启GPIO和TIM的时钟
2.GPIO初始化,配置成输入模式
3.时基单元初始化
4.输入捕获单元初始化
5.配置触发源,这里使用FI1PF1触发源
6.配置从模式Reset
7.运行控制
7.2具体步骤
1.RCC开启GPIO和TIM的时钟
2.GPIO初始化,配置成输入模式
3.时基单元初始化
4.输入捕获单元初始化
这是只测频率,所以使用ICInit即可,ICSelection选择直联通道。
5.配置触发源,这里使用FI1PF1触发源
6.配置从模式Reset
7.运行控制
7.3测频率和占空比
把TIM_ICInit函数换成TIM_PWMIConfig函数,这个函数能同时初始化两个通道。这里通道1是直联和上升沿,默认配置通道2是交叉和下降沿,与通道1正好相反。
八、USART串口通信协议
8.1常见通信协议
半双工:A能给B发数据,B也能给A发数据,但是不能同时发。
全双工:A能给B发数据,B也能给A发数据,而且能同时发。
同步:通信双方有一个共同的时钟信号,通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。
异步:数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同步。
8.2串口通信方式
两个设备之间发送端和接收端交叉连接。
因为两个设备可能要不同的电平,中间可以加电平转化芯片,本芯片采用TTL电平——3.3V
设备1给设备2发送数据:假设设备1每一秒发送一次高电平(3.3V)或低电平(0V),设备2就必须每一秒接受一次,如果时间不一样,可能重复或错过。
这个每秒发送一次数据就叫波特率。如果发送的高电平,则接受到1,如果是低电平,则接受到0。
8.3串口发送+接收数据基本步骤
1.RCC开启USART1和GPIO时钟
2.GPIO初始化,TX配置成复用输出,RX配置成输入
3.USART初始化
4.如果只发送,直接开启USART即可。如果还要接收数据,则需要配置中断。
5.中断输出控制(发送+接收)
6.NVIC(发送+接收)
8.4具体步骤
1.RCC开启USART1和GPIO时钟
2.GPIO初始化,TX配置成复用输出,RX配置成输入
3.USART初始化
4.运行控制USART
5.上面已经可以发送了,现在发送数据
发送之后到TDR,需要等待一段时间,等TDR的数据传到移位寄存器后,再发送下一次数据,如果不等待,可能造成数据覆盖。标志状态为reset时一直循环等待
6.如果还要接收数据,需要中断,并且串口初始化时,需要把接收数据的模式加上
九、I2C
9.1串口通信缺点
如果只有两个设备通信,设置一组串口
设备1 —— 设备2
如果有三个设备需要通信,则每个设备都需要设置两组串口
设备1——设备2
设备1——设备3
设备2——设备3
如果更多设备需要通信,则需要设置更多串口,线路连接更加复杂。为此,设计了一种总线通信方式,包含多种协议,如I2C,SPI,CAN等
9.2 I2C通信方式
I2C(又叫IIC),意思是芯片与芯片之间的通信。采用一主多从的方式,例如把单片机作为主机,其他设备做为从机。
串口通信使用发送线TX和接收线RX进行通信,而IIC使用时钟线SCL和数据线SDA通信。
SCL:————————————
SDA:————————————
设备:主 从 从 从 ....
9.3 I2C发送数据
起始位为0时,代表单片机给从设备写数据
起始位为1时,代表单片机从从设备读数据
空闲状态:SCL和SDA都保持高电平
起始状态:SDA先切换为低电平,SCL后切换为低电平。(起始位为0时,代表单片机给从设备写数据,所以SDA变成低电平)
发送数据:SDL先切换为高电平或低电平,之后SCL切换为高电平,实现发送1或0。发送一个1或0后,SCL再切换为低电平。
通过发送数据,就可以发送设备地址了。
设备地址有7位,每个从设备都有自己的设备地址,假设一个从设备的设备地址为1010000
两个线的高低电平如下
发送完设备地址后,需要发送读/写位,写置0,读置1。
之后,从设备发送应答信号,若从机接收到之前的命令,则回复0。
之后发送寄存器地址,寄存器地址有8位,假设主设备要和从设备MPU6080通信,需要在从设备中找一片区域从放之后发送的数据,这片区域的地址就是寄存器地址。如果从设备收到,则再次应答。
找到从设备,找到寄存器地址后,就可以发送数据(8位),从设备接收到应答。
终止状态:先SDA切换为高电平,后把SCL也切换为高电平。
9.4 软件IIC发送数据的代码
1.把IIC的两根线分别接到GPIOB下pin10和pin11引脚,用软件实现,所以使用GPIO即可
RCC开启APB2下的GPIOB时钟,且初始化,注意需要把输出模式配置成开漏输出。
如果是推挽输出,当一个从设备发送0,一个从设备发送1时,有可能短路。所以需要换成开漏输出,这样只能输出0,要想输出1,只能在IIC总线上接一个电源和上拉电阻(防止短路)。
2.为了方便控制后续的SDA和SCL的高低电平,可以封装几个函数,然后配置初始状态,终止状态和发送数据,发送数据以高位优先。
3.主机接收数据
4.发送和接收应答
5.主函数调试
相关文章:

王者农药更新版
一、启动文件配置 二、GPIO使用 2.1基本步骤 1.配置GPIO,所以RCC开启APB2时钟 2.GPIO初始化(结构体) 3.给GPIO引脚设置高/低电平(WriteBit) 2.2Led循环点亮(GPIO输出) 1.RCC开启APB2时钟。…...

各省份消费差距(城乡差距)数据(2005-2022年)
消费差距,特别是城乡消费差距,是衡量一个国家或地区经济发展均衡性的重要指标。 2005年-2022年各省份消费差距(城乡差距)数据(大数据).zip资源-CSDN文库https://download.csdn.net/download/2401_84585615/…...

[Linux] 进程创建、退出和等待
标题:[Linux] 进程创建、退出和等待 个人主页水墨不写bug (图片来源于AI) 目录 一、进程创建fork() 1) fork的返回值: 2)写时拷贝 编辑3)fork常规用法 4ÿ…...

微软推出针对个人的 “AI伴侣” Copilot 会根据用户的行为模式、习惯自动进化
微软推出了为每个人提供的“AI伴侣”Copilot,它不仅能够理解用户的需求,还能根据用户的日常习惯和偏好进行适应和进化。帮助处理各种任务和复杂的日常生活场景。 它能够根据用户的生活背景提供帮助和建议,保护用户的隐私和数据安全。Copilot…...

【QT】QT入门
个人主页~ QT入门 一、简述QT1、什么是QT2、QT的优势3、应用场景 二、QT的基本使用1、新建项目(1)选择项目模版(2)选择项目路径(3)选择构建系统(4)填写类信息设置界面(5&…...

Linux 6.11版本发布
Linux 6.11版本的发布是Linux社区的一个重要里程碑,它不仅在实时计算、性能优化方面取得了显著进展,还在安全性上迈出了关键一步。 一、实时计算与性能优化 1.io_uring子系统支持 Linux 6.11引入了io_uring子系统的增强功能,特别是支持了b…...

CSS 参考手册
CSS 参考手册 概述 CSS(层叠样式表)是一种用于描述HTML或XML文档样式的样式表语言。它用于控制网页的布局和外观,使网页设计更加美观和响应式。CSS可以定义文本颜色、字体、布局、响应式设计等,是网页设计和开发中不可或缺的一部分。 基础语法 CSS的基本语法由选择器和…...

数据采集工具sqoop介绍
文章目录 什么是sqoop?一、Sqoop的起源与发展二、Sqoop的主要功能三、Sqoop的工作原理四、Sqoop的使用场景五、Sqoop的优势六、Sqoop的安装与配置 sqoop命令行一、Sqoop简介与架构二、Sqoop特点三、Sqoop常用命令及参数四、使用示例五、注意事项 什么是sqoop? Sqoop是一款开…...

扫盲:写给UI设计师的SCADA系统知识点
一、SCADA是什么,及其组成。 SCADA(Supervisory Control And Data Acquisition,监控与数据采集系统)是一种用于实时监控、控制和数据采集的自动化系统。 SCADA的组成部分: - 人机界面(HMI*:提…...

类的特殊成员函数——三之法则、五之法则、零之法则
系统中的动态资源、文件句柄(socket描述符、文件描述符)是有限的,在类中若涉及对此类资源的操作,但是未做到妥善的管理,常会造成资源泄露问题,严重的可能造成资源不可用。或引发未定义行为,进而…...

计算机毕业设计 智慧物业服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

Python软体中使用SpaCy进行命名实体识别
Python软体中使用SpaCy进行命名实体识别 命名实体识别(Named Entity Recognition,NER)是自然语言处理(NLP)中的一个重要任务,它涉及识别文本中的命名实体,例如人名、地名、组织名等。SpaCy是一种流行的NLP库,提供了高效的NER功能。在本文中,我们将介绍如何使用SpaCy进…...

华为云技术深度解析:以系统性创新加速智能化升级
华为云技术深度解析:以系统性创新加速智能化升级 在当今数字化转型的浪潮中,云计算作为关键的基础设施,正以前所未有的速度推动着各行各业的智能化升级。作为全球领先的云服务提供商,华为云凭借其深厚的技术积累和创新实力&#…...

推理攻击-Python案例
1、本文通过推理攻击的方式来估计训练集中每个类别的样本数量、某样本是否在训练集中。 2、一种简单的实现方法:用模型对训练数据标签进行拟合,拟合结果即推理为训练集中的情况。 3、了解这些案例可以帮助我们更好的保护数据隐私。 推理攻击(…...

find_box_3d
参数 (ObjectModel3DScene, SideLen1, SideLen2, SideLen3, MinScore, GenParam : GrippingPose, Score, ObjectModel3DBox, BoxInformation) 入参介绍 1,ObjectModel3DScene, 输入的3d模型,这个模型最好是由xyx三通道点…...

Visual Studio2017编译GDAL3.0.2源码过程
一、编译环境 操作系统:Windows 10企业版 编译工具:Visual Studio 2017旗舰版 源码版本:gdal3.0.2 二、生成解决方案 打开Visual Studio 2017的x64本机生成工具,切换到gdal3.0.2源码根目录;执行generate_vcxproj.b…...

计算机网络——email
pop3拉出来 超出ASCII码范围就不让传了 这样就可以传更大的文件...

【Linux】信号知识三把斧——信号的产生、保存和处理
目录 1、关于信号的前置知识 1.1.什么是信号? 1.2.为什么要学习信号? 1.3.如何学习信号? 1.4.一些常见的信号 1.5.信号的处理方式 1.6.为什么每一个进程都可以系统调用? 2.信号的产生 2.1.kill命令产生信号…...

【国庆要来了】基于Leaflet的旅游路线WebGIS可视化实践
前言 转眼2024年的国庆节马上就要来临了,估计很多小伙伴都计划好了旅游路线。金秋十月,不管是选择出门去看看风景,还是选择在家里看人。从自己生活惯了的城市去别人生活惯了的城市,去感受城市烟火、去感受人文风景,为2…...

Element-UI Plus 暗黑主题切换及自定义主题色
1. 暗黑主题切换 在main.js中引入下面文件 import element-plus/theme-chalk/dark/css-vars.css安装 vueuse/core pnpm add vueuse/coreApp.vue 添加下面代码 使用了 useDark() 的页面才会从 localStorage中读取当前主题状态,否则,刷新页面就会恢复默…...

人工智能与机器学习原理精解【31】
文章目录 卷积神经网络CNN定义数学原理与公式计算与定理架构例子例题 全连接层的前馈计算定义数学原理与公式计算过程示例 参考文献 卷积神经网络 CNN 即卷积神经网络(Convolutional Neural Networks),是一类包含卷积计算且具有深度结构的前…...

如何安全地大规模部署 GenAI 应用程序
大型语言模型和其他形式的生成式人工智能(GenAI) 的广泛使用带来了许多组织可能没有意识到的安全风险。幸运的是,网络和安全提供商正在寻找方法来应对这些前所未有的威胁。 随着人工智能越来越深入地融入日常业务流程,它面临着泄露专有信息、提供错误答…...

verilog实现FIR滤波系数生成(阶数,FIR滤波器类型及窗函数可调)
在以往采用 FPGA 实现的 FIR 滤波功能,滤波器系数是通过 matlab 计算生成,然后作为固定参数导入到 verilog 程序中,这尽管简单,但灵活性不足。在某些需求下(例如捕获任意给定台站信号)需要随时修改滤波器的…...

OSPF的不规则区域
1.远离骨干非骨干区域 2.不连续骨干 解决方案 tunnel ---点到点GRE 在合法与非ABR间建立隧道,然后将其宣告于OSPF协议中; 缺点:1、周期和触发信息对中间穿越区域造成资源占用(当同一条路由来自不同区域,路由器会先…...

大数据新视界 --大数据大厂之 Ibis:独特架构赋能大数据分析高级抽象层
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

总结TypeScript相关知识
目录 引入认识特点安装使用变量声明类型推导 JS 和 TS 共有类型number类型boolean类型string类型Array类型null和undefined类型object类型symbol类型对象类型函数类型 可选和只读type 和 interface索引签名类型断言非空类型断言类型缩小严格赋值检测现象TS 新增类型字面量类型a…...

pdf怎么编辑修改内容?详细介绍6款pdf编辑器功能
■ pdf怎么编辑修改内容? PDF(Portable Document Format)作为一种广泛使用的文件格式,具有特点包括兼容性强、易于传输、文件安全性高、跨平台性、可读性强、完整性、可搜索性、安全性、可压缩性。 PDF文件本身是不可以直接进行编…...

【Blender Python】4.获取场景对象的几种方式
概述 有时候我们需要获取场景中已经添加或存在的对象。本节就总结在Blender Python中获取场景中对象的一些方法。 通过名称获取 py.data的objects()方法返回一个对象集合,可以使用键名或者下标形式获取具体的对象。 在默认新建的场景中,存在三个对象…...

鸿蒙harmonyos next flutter通信之EventChannel获取ohos系统时间
建立通道 flutter代码: EventChannel eventChannel EventChannel("com.xmg.eventChannel"); ohos代码: //定义eventChannelprivate eventChannel: EventChannel | null null//定义eventSinkprivate eventSink: EventSink | null null//建…...

Python 代码编写规范
本规范旨在为 Python 项目的代码编写提供一致性指南。它遵循 Python 社区的 PEP 8 标准,并结合了通用的编程最佳实践。 1. 编码风格 1.1 缩进 使用 4 个空格 作为缩进,不要使用制表符(Tab)。 def example():if True:print(&quo…...