自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 STM32基础综合案例:花式流水灯(寄存器实现)

一、需求描述引言前面陆陆续续学习了STM32的相关知识,截至目前,其基础知识就算学完了。接下来,我们将借助一个综合的案例——花式流水灯,以巩固前面学习的STM32相关知识,包括GPIO的使用、按键控制、中断控制、串口使用以及I2C的使用。案例描述本案例“花式流水灯”旨在通过实现一个,综合应用包括技术。系统设计用于,用户可以,并使用特定符号进行分隔。此外,通过的显示。系统启动时会尝试从M24C02 EEPROM中读取预存的方案数据,若无数据则等待串口指令并更新存储。

2025-02-16 14:18:32 935

原创 硬件实现I2C案例(HAL库实现)

二、硬件电路设计引言前面陆陆续续利用寄存器方式实现了软件模拟I2C、硬件实现I2C的案例。接下来,我们使用HAL库的方式实现以下硬件I2C案例。当然了,本次案例可能复用前面寄存器实现的硬件I2C案例中实现的某些代码块,所以建议看这之前可以先看看前面寄存器实现的案例介绍。一、需求描述二、硬件电路设计本次案例属于是前面寄存器实现的硬件I2C案例的另一种实现方式,故需求和硬件设计不变,不清楚的可参考下面文章:硬件实现I2C案例(寄存器实现)_iic硬件电路-优快云博客三、软件设计。

2025-02-14 13:31:05 1449

原创 硬件实现I2C案例(寄存器实现)

首先,读取SR1已经在等待过程的条件中进行,然后由于我们BTF是在传输数据过程中被置位的,而之后的传输无非两种情况:一是继续传输数据,则在下一次用到BTF之前就会进行数据的读写操作,此时BTF会被自动清除;这就意味着,从机发送数据到总线上后发出的应答以及之后主机发出的停止信号应该在当前发送数据前设置好才对,换句话说,如果从机发送数据了之后才设置ACK以及STOP的话,会导致这俩信号将在这之后传输的字节接收后才产生,这样的话就对应的就是下一次传输的字节数据的应答与停止了。而且寄存器对这俩标志位的描述是。

2025-02-07 21:18:22 1034

原创 硬件实现I2C常用寄存器简单介绍

而从模式下需要判断停止信号是否发出(STOPF),是因为从设备需要保证确实识别到通信结束了再去开始一段新的通信,否则从设备贸然停止本次通信将有失配合,而停止信号表示主设备结束了当前传输,从设备可以准备下一次通信,所以为了保证在主设备确实发出停止信号后再去进行新的通信,这里从设备需要一个标志STOPF来判断主机已经发出停止信号。可与串口介绍寄存器时的RXNE类比,通常用于接收或者读取数据前的判断数据寄存器是否填满,填满了意味着可以开始接收数据了,此时自动置1,软件对数据寄存器进行读写时会自动清除。

2025-02-07 00:08:04 713

原创 I2C外设基本介绍

同时,无论在模拟的周期频率上,还是在时序的模拟上,利用软件模拟的I2C也显得没那么精准,而且大量的延时和电平的控制全部都需要CPU进行控制,大大加重了CPU的负担......考虑到这些问题,本次我们就来介绍32中的。首先,深入SDA数据总线,箭头走向一个数据控制模块,顾名思义控制来往数据的,因为I2C协议规定位传输高位先行,所以箭头继续直接走向【数据移位寄存器】的最右方,表示外部接收的数据从低位进入移位寄存器,然后不断左移依次填满,最后将移位寄存器中满满的数据并行交给DR数据寄存器处理。

2025-02-06 20:28:32 719

原创 软件模拟I2C案例(寄存器实现)

宏定义起到一个全局替换的效果,经过宏定义,我们可以将某些复杂代码利用简洁移动的语句进行代替,增强代码可读性和编写效率。(1)由于I2C协议涉及到。

2025-02-06 12:29:47 1518

原创 模拟I2C通讯之时序图整理

引言前面介绍了I2C通讯的概念、原理以及协议,然后在介绍了支持I2C协议的一款EEPROM芯片M24C02的相关知识后,接下来我们再来整理一下STM32使用I2C通讯与M24C02芯片进行数据传递所需要理解的一些。一、I2C通讯协议相关时序1、起始和停止信号I2C通讯时进行数据传递前我们先会有一个起始信号,同时数据传递结束后会有一个停止信号。由上述时序图可知,一开始设备不会占用总线即总线空闲,默认高阻态,同时总线外边连上拉电阻接到电源,所以总线呈现高电平。

2025-02-03 13:36:01 1113

原创 软件模拟I2C案例前提须知——EEPROM芯片之M24C02

值得注意的是,本次案例使用的软件模拟I2C,所以我们并不会使用STM32芯片内部的I2C模块,只是借助软件去模拟I2C协议的时序状态。接着还有两个引脚分别是SCL和SDA,显然就是连接两根总线的引脚。由于该芯片手册不光是关于M24C02芯片的介绍,还有M24C01等的介绍,所以这里关于存储上有两种,分别是1kbit和2kbit,当然,我们的芯片内存时2kbit。这里的设备地址是进行数据传递之前就要先知道的设备码,之后才会根据需要去传输对应的EEPROM存储器中对于的内存单元,也就是那个8位的数据地址。

2025-02-01 12:24:15 913

原创 I2C基础知识

引言引言这里祝大家新年快乐!前面我们介绍了串口通讯协议,现在我们继续来介绍另一种常见的简单的串行通讯方式——。一、什么是I2C是由Phiilps公司在上个世纪80年代开发的,其英文翻译过来实际上是【内部集成电路】,所以他就是为。关于,简单说明一下:根据英文缩写,应该是写成IIC,不过通常我们读的时候会把两个I读成I2(I的平方的意思,标准写法的2应该是在I的右上角)。之所以平时描述时直接写I2C,主要是因为打角标相对麻烦,所以就出现这样的写法。

2025-01-31 20:55:00 913

原创 STM32调试手段:重定向printf串口

其实也非常简单,其在STM32CubeMX中需要进行的配置和前面串口通讯轮询案例的HAL库实现需要的配置是一样的,因为本次作重定向主要就只是多重写一个fputc函数,即。很简单,只需要将 fputc 里面的输出指向 STM32 串口即可,fputc 函数有固定的格式,我们只需要在函数内操作STM32串口即可。我们知道 C 语言中printf 函数默认输出设备是控制台,如果要实现在串口或者 LCD 上显示,必须重定义C语言标准库函数里调用的与输出设备相关的函数。然后,根据上面所述原理,这里直接给上。

2025-01-22 16:53:08 3419

原创 USART_串口通讯中断案例(HAL库实现)

我们现在是想找一下串口中断相关的回调函数,所以先得知道怎么样用该文件中定义的内容,如上图有描述“如何使用这个driver”,大概就是会涉及到咱要找的回调函数了。当然本次我们主要是借助中断实现数据的接收,所以看看关于数据接收的中断回调函数即可,其他的我们有时间自己去同理试一试也可以的。,这就说明我们此时不是自己给长度了,其会自动检测数据长度,因此我们可以直接从中断回调函数中拿到我们接受到的数据的长度,然后在发送接收数据时传进去即可。前面,我们使用HAL库实现了串口通讯的轮询案例,接下来,我们。

2025-01-21 18:21:00 1083

原创 USART_串口通讯轮询案例(HAL库实现)

多了一个判断,因为这里HAL库中的发送是无脑直接拿到数据就发的,我们现在在循环中,没有发之前给的buffer,虽然我们没写入数据,但是其初始化是0,所以此时接收到的就是0,即发送就会直接把“\0”全部发出来。而为了避免这种情况,我们对接收函数做一个判断,因为其是有返回值的,就是为了避免接收有问题,当它确实正确接收到数据后,就会返回HAL_OK,所以我们这里判断它是否等于这个,等于即说明接收到我们发的了,这样我们再把数据发出来就好了。显然,这里就看见GPIO口的配置了,同时我们会发现,上面它定义了一个。

2025-01-20 17:53:09 1682

原创 USART_串口通讯中断案例(一)(寄存器实现)

根据前面轮询案例的分析,我们发现在进行字符串收发的时候形成的循环阻塞相对会多一些,一方面有单字符内部接收时的轮询、另一方面还有我们循环每一次的单字符接收,这样的轮询接收字符的方式就会大大降低CPU的执行效率。由于我们案例使用的串口是USART1,所以我们首先得去知道USART1的中断处理函数叫啥,前面讲述中断的时候说过:可以直接。前面轮询案例已经介绍了串口主要使用的一些寄存器,这里我们将使用中断来进行串口通讯,所以避免不了的是开启串口相关中断使能,按照前面介绍的寄存器,如果看得仔细的朋友应该能发现,在。

2025-01-19 15:07:03 1045

原创 USART_案例(一)接收字符串代码改进

注意:这里最后我们让接收到的字符长度-1,是因为接收字符串时最后产生空闲帧结束字符接收会再多返回一个0,在字符串中就是“\0”,但是这不是我们希望收到的字符,所以我们干脆长度-1,这样就不会显示出来,在逻辑上我们就相当于没有接收到额外的字符了,这样也更符合我们接收的内容。根据上面的理解,TXE为1是指此时发送的数据为空,可以开始下一轮数据的发送。根据上图说明我们容易知道TXE表示的是发送数据寄存器为空的标志,当数据寄存器中的数据被转移到移位寄存器时就会被置1,当我们再次写入数据的时候,该位又会清零。

2025-01-18 20:59:47 721

原创 USART_串口通讯轮询案例(一)(寄存器实现)

3.1.1波特率寄存器当前我们的串口通讯不使用同步功能,所以。

2025-01-18 16:29:56 879

原创 STM32之USART_串口通讯

目录引言一、通讯相关基础1.1 并行通讯与串行通讯1.2 单工、半双工、全双工通讯1.3 同步与异步通讯1.4 串口介绍1.5 串口通讯协议二、USART外设三、USART_功能框图原理介绍四、波特率的设置五、总结引言 本次介绍STM32中片上外设中的模块之一——串口通讯模块,也是最为简单基础的一种串口通讯,其名称也叫USART。当然,串口、USART这俩概念到底是什么、他们俩之间的关系是什么、哪些模块叫串口、我们可能见过的RS232等就叫

2025-01-16 15:12:06 1238 2

原创 STM32按键中断案例(HAL库实现)

现在,我们再来基于HAL库对该案例进行二次实现,关于HAL库的基本操作流程,如果有朋友还不熟悉的话,可以参考我前面最初关于HAL库的基本介绍以及基于HAL库实现流水灯的详细讲解,这里我们就直接开始实现了。会发现,调用的函数中也主要是俩条语句,实际上551行这个语句时清除中断标志位的意思,参数就是我们传进来的按键对应端口,其底层就是我们寄存器实现时配置的挂起寄存器,不信我们可以看看。然后如下图看看生成的代码,发现我们寄存器方式编写的大部分代码,如按键和LED的初始化都已经自动生成好了,也就是说。

2025-01-10 22:47:53 1245

原创 STM32按键中断案例(基于寄存器)

三、软件设计由于本次案例将基于寄存器实现,同时本次案例中涉及到中断处理,通过我们前面对中断的学习容易发现,处理中断过程中会。

2025-01-10 18:18:19 1092

原创 stm32的中断系统

引言 在计算机系统中,我们的程序在执行时常常不只是一味地从上到下的执行,还可能出现一些突发事件,此时需要我们先去执行后再返回原来的位置继续执行;同时,我们写代码中在最后都是放入一个死循环中,意味着程序总是只能把主程序运行完以后才能执行其他事件,而这显然容易耽误其他事件的执行。为此,在计算机系统中引入了一种机制,能够在一定时间打断主程序的运行,优先去执行某个特定程序,这种机制就是今天我们要详细叙述的中断机制。 鉴于本次文章将比较详细的介绍中断相关知识,所以篇幅比较长,大概万字以

2025-01-09 15:09:04 1009

原创 依次开关灯案例(HAL库练习)

然后,将之前我们写好的LED驱动代码直接加到该工程中。因为前面流水灯案例关于工程的配置与这里一模一样,只是代码核心逻辑不同。所以对于LED的驱动我们直接拿来用,写起来也简单。

2024-12-05 09:03:59 708

原创 流水灯案例工程实现(基于HAL库)

这时候我们就知道了,这里APB1报错是因为给的时钟频率太高了,因此我们需要对这里进行分频,72MHz只需进行二分频(/2)即可。

2024-11-30 13:22:26 1078

原创 HAL库的简单介绍以及环境搭建

为什么要学习HAL库?寄存器开发效率比较低,在工作中如果想快速开发,还是要会用到HAL库开发。HAL库是目前ST主力推广的开发方式,所以你如果还要用ST的芯片,会使用HAL库开发是势在必行的。而且最最关键的是,使用HAL开发有诸多的好处。目前,HAL库已经支持STM32全线产品。什么是HAL库?HAL库的全称是Hardware Abstraction Layer,翻译成硬件抽象层。

2024-11-23 21:28:17 1443

原创 STM32时钟系统的简单介绍

HSE时钟高速外部时钟是由外部时钟源提供,目前几乎所有的STM32单片机的设计都是在外部接一个8MHz的晶振,经过PLL倍频(9倍频)后得到一个72MHz的系统时钟。我们系统默认就是这个时钟。这个在启动文件可以看到。

2024-11-22 12:35:36 1131

原创 STM32总体架构简单介绍

因此,在了解了STM32的基本用法以后,我们有必要去宏观的了解一下它的总体架构,因此,我们代码中用到的一些变量都是被存放在SRAM里面,而下载的代码程序以及程序中用到的常量都是统一存储在flash里面,因为我们程序本身也会被转成二进制文件,所以都放在flash里面了,那么很明显,我们。其中,这里重要的是去与其他设备进行数据的通信,谁给谁发不重要。理解了主动单元,被动单元就好理解了,简单理解就是没办法自己控制去进行发送的设备,只能去听别人的,相当于是一个从属的设备,即被动单元是一个处于从属状态的一种设备。

2024-11-21 21:17:26 2908 1

原创 GPIO流水灯改进实现(结构化)(寄存器版)

本次叙述了在编写代码时涉及到的一种非常重要的思想 ------ 模块化思想,同时也学到了如何去通过分文件处理来改善代码结构,使代码层次更加清晰,更易快速了解代码整体结构。t=O83At=O83AGPIO_流水灯案例(寄存器)-优快云博客https://blog.youkuaiyun.com/2301_79475128/article/details/143834694?

2024-11-19 15:28:14 927

原创 GPIO_流水灯案例(寄存器)

最后关闭keil。至此,关于流水灯的项目工程就创建并配置好了,后面就开始正式编写相关代码了。

2024-11-18 00:34:17 1214 2

原创 Keil+VSCode优化开发体验

本期我们讲解了关于VSCode在单片机开发编码带来的优化体验以及实现keil和VSCode的联合开发的详细步骤以及相关注意事项。

2024-11-17 15:15:07 5357 6

原创 GPIO相关的寄存器(重要)

我们进入技术手册,进入GPIO的寄存器地址映像,就能看见GPIO相关的7个寄存器的排列的信息了。从图中可以看见,每一个寄存器的数据都是32位存储,只不过有些只使用了低16位,其余位保留位。从图中我们可以看出每个寄存器的大致信息,如偏移地址、寄存器名称、复位值以及位。前两个配置寄存器前面我们主要用于配置GPIO的工作模式,这是32位都用上了;接着的两个输入输出数据寄存器只使用低16位的部分,高16位保留,这是由于每一组GPIO端口恰好有16个引脚,对应寄存器16位,所以就这样设定了;紧接着就是。

2024-11-16 23:18:57 2570 2

原创 AURIX Development Studio的使用入门

此外,大家可以多去Windows->Preferences中探索,让自己的编译器更加好用!点击主界面上方一栏中的Window,继续选择Preferences。尽量选择磁盘空间大一些的路径创建一个工作空间WorkSpance。右键点击左上角空白矩形区域,弹出如下图方框,点击Import。进入Preferences后,如下图依次操作即可。至此,工作空间的基本构建就完成了!外观黑暗,不好看,可以自己修改。

2024-10-30 00:32:34 1764

原创 GPIO概述及工作模式详解

通用型输入输出。简单理解就是我们可以控制输入输出的单片机引脚,统称为GPIO。GPIO存在的意义就是用程序控制或读取它们的输出或输入。本次咱学习了GPIO的一些相关介绍以及GPIO主要的8种工作模式,主要就是输入和输出模式,再加上一些特定情况下的输入输出,整体来说还好。这部分涉及到了一些后面才会详细学习的知识点,所以没有详细说明,比如时钟、外部中断等。因此,不要慌张,这里咱先有个印象,后期一学到了,就自然明了了。加油!

2024-08-23 11:18:52 4563 1

原创 点灯案例优化(三)宏定义特定位名称

你可能一下都反应不过来这些的啥意思了,表达式右边上来就是一顿运算,可能刚开始大多数人都看不懂这写的什么,因此在这块我们还可以再次优化一下。由此就可以看见, CNFx和MODEx构成的(x=0,1,...,),其中x就表示了端口位PA0,1...,且一个包括两个特定位,我们修改的就是这两部分。在这里,我们看见显示出了很多端口对应的特定位的宏定义,最后的数字0,1...就是代表PA0等,所以我们直接选择PA0,即ODR0。根据这个原理,我们也可以顺势将其他灯也点亮,代码也简洁了不少,可读性也提高了。

2024-08-21 12:53:14 462

原创 点灯案例优化(二) 利用位运算修改特定位

通过本次优化代码,我们再次加深了对位运算的理解,也了解到了其一个应用场景这里实际上还有一个小地方可以简化代码,就是设置GPIOA工作模式地方,我们发现四段代码两两类似,其实咱可以两两合并,只需要用一个或就可以,即// 设置GPIOA的工作模式这样其实也是同样的意思,实际上就是利用或运算同时对两位进行修改,我们可自行尝试运行一下,效果是一样的OK,这就是第二次的代码优化了,继续加油,拜拜。

2024-08-21 11:41:06 958

原创 点灯案例优化(一): 使用宏定义寄存器名称

前面我们加过一些启动文件和相关的核心文件,其中有一个文件中充满了宏定义,即stm32f10x.h现在,我们进去看看我们顺势找一下,看看有没有我们开启时钟用的寄存器RCC这里,我们找到了一个RCC定义宏,但似乎不是我们想要的。那我们继续往下翻看看,这里,我们找到了RCC基地址的宏定义,发现这里还包含一个基地址以及一个地址值的和,即0x1000+AHBPERIPH_BASE一探究竟,那么我们继续找这个宏定义看看找到以后,我们发现,这又是一个宏加上地址值,即0x2000+PERIPH_BASE。

2024-08-20 13:28:09 658

原创 点灯案例练习(基于寄存器)

前面,我们耗费大量时间,终于点亮了STM32板子上的第一个LED-1的黄灯,实验现象如下那么,根据前面的思路,我们按理说也可以点亮其他两个LED灯(这里有三个LED灯,分别叫LED-1 LED-2 LED-3,对应黄蓝绿),接下来我们就开始练习点亮另外两盏灯。

2024-08-20 12:03:12 1236

原创 点亮LED灯案例(基于寄存器)

i首先,我们使用寄存器开发的方式点亮一个LED灯,期间会涉及到一些寄存器知识,目前不用深究,后续会详细介绍。目前咱就是快速体验STM32开发,点亮一个LED灯就行了。

2024-08-19 19:37:29 1622

原创 Keil MDK下载安装以及芯片支持包的下载

途径一:进入官网下载选择途中红色框选中的MDK-ARM,下载安装即可。途径二:这里提供一个安装和激活教程,点击进入途径三:直接自行网上查找相关下载和安装教程。

2024-08-19 14:04:01 2107

原创 STM32的相关简单介绍

STM32是设计的以为核心的微控制器ST公司,即意法半导体集团(STMicrolectronics,简称ST),1987年成立·。由意大利的SGS微电子公司和法国Thomson半导体公司合并而成。在当下的32位微控制器中,STM32在工程师和市场中崭露头角,深受喜爱。

2024-08-19 13:35:27 1114

原创 STM32是基于ARM架构的,那么ARM究竟是什么呢?

首先,ARM是一家,全称,高级精简指令集机器,RISC意味着是精简指令集的芯片。同时也有复杂指令集CSIC的芯片,如X86,常以Intel和AMD为主。其次,之后这家公司被收购,产品以ARM架构处理器及相关外围组件方案为主,,通过知识产权的方式去卖钱。最后,ARM是几乎所有移动端的处理器,如。

2024-08-19 11:46:34 1578 2

原创 基于多态的职工信息管理系统(C++实现)

事先声明本文章中编写的代码仅用于学习算法思想和编写基础形式使用,并未进行太多的代码优化。本次主要利用C++来实现一个基于多态的职工信息管理系统职工管理系统,可以用来管理公司内所有员工的信息。其中,公司中职工分为三类:普通员工、经理、老板。显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责。其中三种岗位职责内容如下:1、普通员工职责:完成经理交给的任务2、经理职责:完成老板交给的任务,并下发任务给员工3、老板职责:管理公司所有事务二、功能描述在职工信息管理系统中,需要实现的功能如下:1、

2024-05-31 11:38:55 822 5

原创 简单实现---基于STL的演讲比赛流程管理系统(C++实现)

1、课题总结该程序是基于C++的STL的演讲比赛流程管理系统的简易实现。现在总结一下它的关键特点和功能:1. STL的使用:使用STL中的vector\deque\map等容器对选手编号等信息进行记录或存放。2. 随机数生成:使用rand()函数和time(NULL)来生成随机数种子,确保每次运行程序时都能获得不同的随机数序列。3. 面向对象编程:使用类SpeechManage来管理整个演讲比赛流程,包括开始比赛、显示菜单、查看往届信息、清空比赛信息等功能。

2024-05-13 21:12:22 1547 2

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除