王者农药更新版
一、启动文件配置
二、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中读取当前主题状态,否则,刷新页面就会恢复默…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
