- 博客(27)
- 收藏
- 关注
原创 基于HALL库STM32F4利用SPI驱动MPU6500
从时序图可以看见,SCLK空闲时为高电平,其低电平时数据改变,高电平时读取数据(下降沿移出,上升沿移入),故SPI的模式为模式三:CPOL=1、CPHA=1。其中(a)图为IIC时序,(b)图为SPI时序。这部分可以先略过,先看下边的代码编写再看此寄存器去理解代码。
2025-01-08 08:53:21
1303
原创 1.8寸TFT屏幕的使用(二)——显示字符、字符串、数字、汉字等
建立一个字符显示函数,形参为显示起点x、y,要显示的字符chr,字体颜色clor、背景颜色bc、字号大小size以及叠加模式的选择mode。首先定义一个空指针用于指向字号数组,此时指向的为这个数组的第一个元素。关于csize公式的讲解:我们获取一个字符所占字节大小,定义一个变量csize,由于字号的宽度为其一半,假如为16号,则一个字符宽度为8;所以我们将字号除二就能得到其宽度,即:(size/2)得出字符在x所占位数。
2025-01-06 11:36:43
943
原创 结构体的使用
int main()当然创建变量部分可以放在函数体也可以放在函数外,无非是局部变量与全局变量。}Today;int main()这里我们声明了一个结构体,其名字为Data,成员有年、月、日,变量名为今天。(当然你还可以加上明天,在变量名后加逗号分隔,写上Tomorrow)。int main()这里我省了明天的年月赋值,直接用的是Today的。
2025-01-06 11:35:45
734
原创 零基础入门指针的应用
有关指针的运算符号有:&a就表示取变量a的地址。*p表示取p所指向的变量的内容。在64位系统中,指针占8字节(不管是int *、char *等),那么既然都是8字节,那是不是定义指针可以随便定义呢?就会产生警告,第一是因为我们要保存的是字符型的地址,不能用int *,编译也会有类型不兼容警告。第二便是步长(单位)不一样,对于这点下面我做出详细介绍:虽然指针变量的大小都一样,但是不同类型的指针变量,取指针指向的内容宽度是与类型有关系的。
2024-12-31 19:33:13
1098
原创 STM32驱动NRF24L01
NRF24L01的工作模式,由CE和CONFIG寄存器(0X00)的PWR_UP(第1位)和PRIM_RX(第0位)位共同控制。NRF24L01所处模式PWR_UP位状态PRIM_RX位状态CEFIFO寄存器状态关断模式 Shutdown0待机模式 Standby10无数据传输发射空闲模式 Idle-TX101TX FIFO为空发射模式 TX101数据在TX FIFO寄存器中停留在发送模式,直至发送完成接收模式 RX111。
2024-12-31 19:32:36
1757
2
原创 1.8寸TFT屏幕的使用(一)——初始化、画点、颜色填充
由于没有MISO引脚,也就是我们根本用不到读,所以就没有读时序。上图便是其写时序了,SDA在SCL的上升沿采样(高位先行),在SCL低电平数据变化;初始时SCL为低电平,第一个边沿采样,也就是(CPOL = 0、CPHA = 0)不就是相当于舍弃了读数据的SPI的模式0么?(DC是控制写的是数据还是命令的,正常的SPI是先发寄存器在发要写的数据,这里直接用这个线代替)x))x))x))x))这里先介绍一个很重要的寄存器——存储器数据访问控制寄存器:0X36MY:行地址顺序,用于设置行地址方向。
2024-12-26 20:37:31
2838
原创 协议篇之SPI通信(软件篇)
SPI有四种工作模式,看起来是很复杂繁琐的,其实不然,SPI的工作模式主要是由时钟信号的相位和极性决定的,即由CPOL时钟极性和CPHA时钟相位决定。CPOL:时钟极性,决定空闲时SCK的状态,当CPOL=1时,SCK时钟线空闲状态下为高电平,反之CPOL=0时SCK空闲状态下为低电平。CPHA:时钟相位,决定第几个下降沿采样,当CPHA=1时,在SCK时钟线第二个跳变沿采样,反之CPHA=0时在SCK时钟线第一个跳变沿采样。
2024-12-26 20:35:29
1069
原创 STM32基于HALL库的串口以及DMA(串口总篇)
为串口的总结篇,有出发送一个字符,发送与接收字符串、串口重定向、DMA发送与接收、接收不定长字符串等
2024-11-23 16:12:51
1590
原创 STM32定时器篇——通用定时器的使用(定时中断,PWM输出)
从上图可以看见,总线APB1(最大只能到36MHz)给通用定时器提供时钟,但不代表通用定时器的时钟频率为36MHz,因为通用定时器不直接由APB1提供,而是会先经过一个倍频器。见上图APB1预分频系数为1则倍频系数为1,则频率不变,否则频率乘二。而对APB1的预分频在启动文件就已经配置好了(system_stm32f10x.c中的SystemInit()函数),分频系数为2,故定时器时钟为72MHz。PWM应用于在具有惯性的系统中,可以通过一系列脉冲的宽度进行调制来等效地获得所需要的模拟参量。
2024-06-26 10:07:41
2311
原创 STM32定时器入门篇——(基本定时器的使用)
时钟源来源于APB1总线(不懂的可以看看时钟树,这里先不做过多详细介绍,一般都为72MHZ)当然,通用定时器和基本定时器都来自这个总线。计数器时钟CK_CNT:每来一个时钟,先经过控制器,通过预分频器的分频,0为1分频,也就是不分频,1为2分频,如果时钟为72MHZ的话到达计数器则为36MHZ(预分频器为16位,最大可以写65535,也就是65536分频),即经过预分频器后的时钟为计数器时钟CK_CNT。公式CK_CNT = TIMxCLK/(PSC + 1)
2024-06-25 22:26:29
905
原创 STM32定时器篇——Systick定时器的使用(实现delay延时函数)
Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器对于CM3,CM4内核芯片,都有Systick定时器。当Systick计到0时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。l常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。
2024-06-15 18:27:21
1263
原创 Keil软件仿真的使用
复位按钮点击这个按钮会使目标硬件复位,功能等同于硬件上的复位按钮。开始或继续执行程序,用来快速执行到断点处。如果程序已经停在一个断点上,点击这个按钮将继续执行程序直到遇到下一个断点或程序结束。也就是说如果没有断点,程序会一直运行。停止程序执行。这个按钮将中止当前正在运行的程序。执行程序中的下一行代码。如果当前行调用了函数,将进入该函数内部。执行下一行代码,但是不进入函数内部。如果当前行调用了函数,将执行整个函数,然后停在下一行。
2024-06-10 12:53:42
5172
4
原创 MPU6050篇——姿态解算,卡尔曼滤波
首先我们打开inv_mpu.c文件夹,如下图所示便是第一个要修改的地方:我们将其修改为:define定义可以改为自己使用的型号的单片机。修改后在上面定义这个宏,并加上一个MPU6050的宏,用于源文件区别芯片:然后我们打开inv_mpu_dmp_motion_driver.c,找到如下地方,和上面一样:修改为:(记得在上面加入#define STM32F10x_MPU6050)此时还有一些地方需要完善,但大致已经改完了,修缮一下:编译,报3处错,如下:这里报错:(inv_mpu.h文件中)
2024-06-07 23:12:39
7434
8
原创 MPU6050篇——温度与角度的读取
1. 首先是2. 然后接下来便是:其中MPU6050的地址为7位,而八位为一个数据帧,所以在最后一位再加一位是指定对寄存器是读还是写操作。而器件地址上篇也介绍了,当AD0为0则地址为0X68,否则为0X69,这里我接的0,即地址为0x68;左移一位,低位自动补0,我们为写操作,所以无需操作。4. 写需要操作的寄存器地址:这里以reg代替。6. 发送需要对寄存器操作的数据:以data代替7. 最后等待Ack响应,结束IIC;这样,一个写时序就写好了;
2024-06-06 18:30:18
3324
原创 MPU6050篇——(MPU6050的介绍及IIC时序)
MPU6050是全球首例 9 轴运动处理传感器。它集成了 3 轴 MEMS 陀螺仪,3 轴 MEMS 加速度计,以及一个可扩展的数字运动处理器 DMP(Digital Motion Processor),可用 I2C 接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其 I2C 或 SPI 接口 输出一个 9 轴的信号(SPI 接口仅在 MPU-6000 可用)。MPU-60X0 也可以通过其 I2C 接口 连接非惯性的数字传感器,比如压力传感器。
2024-06-05 22:14:47
5993
原创 STM32——DMA的使用(定时器触发ADC多通道扫描模式)
DMA的英文直译的意思是直接内存访问,主要作用就是转移数据 ,用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输(通俗的讲就是讲数据从一个地址空间复制到另一个地址空间)。无须内核参与,数据可以通过DMA快速地移动,可以节省CPU的资源来做其他操作(比如使内核腾出手专心操作IO口或响应中断等)。在此举个例子让你们更好理解DMA带来的作用:比如下面的这个程序是先发送10000个串口数据,然才才能让LED闪烁。即发送数据和LED闪烁无法同时进行。for(i = 0;i
2024-06-04 16:56:08
3508
原创 STM32——ADC篇(ADC的使用)
STM32F1的ADC为12位ADC,是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。STM32的ADC其转换时间为1us。
2024-06-03 19:27:35
13117
原创 STM中断篇——外部中断的使用
所谓 NVIC ,即嵌套向量中断控制器,全称 Nested vectored interrupt controller。属于是内核的器件,其作用是对STM32中的中断进行管理,因为M3内核中的中断数量很多,当同时出现多个中断时,优先处理哪个中断?以及那些中断不处理等,都要靠NVIC 进行控制。NVIC可以统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先等级经行分组,进一步设置抢占优先级和响应优先级。
2024-06-03 11:48:38
1106
原创 单片机基础:关键字的使用以及结构体指针
当变量被volatile修饰时,编译器不会再用刀变量时直接从寄存器里面拿,而是直接去取内存地址里的值,通过这种方法取到的值一定是最新的,实际的值。
2024-05-24 21:18:57
1360
1
原创 单片机数据类型长度以及优先级
如果为不同类型数据时,编译器会先将低级的数据类型转换为较高级的数据类型且运算后结果为高级数据类型。其长度是不确定的,主要和CPU的位数有关,即指针大小实际上是由寻址宽度决定的。8位的和16位的指针长度分别为1字节和2字节,32位处理器则是4字节,而64位处理器则是8字节了。1.在日常编程过程中,有符号型(signed)和无符号型(unsigned)两种如果不是必须的,尽可能选无符号型,能有效省去符号位检测,减去CPU负担。优先级顺序大概可以记为:算术运算>关系运算>逻辑运算>赋值运算。
2024-05-24 15:14:33
524
原创 从0开始点亮OLED屏幕(五)OLED显示汉字,图片
size1/8+size1%8的作用是取出汉字所占页数,乘上字宽也就得出需要写的次数。(一次写8个竖着的像素点,原理前文有介绍过)利用画点函数吧八个竖着的像素数据画出来,x就往下自增1,当x的增量为字宽时,就移到下一页继续写,这个就是现实汉字的原理了。如果是从我第一篇文章看起,这个还是很容易理解的。
2024-04-28 12:39:30
1635
3
原创 从0开始点亮OLED屏幕(三)OLED画点,显示字符、字符串
而一个数据有8个点,我们可以利用画点函数去显示出来,即画一个点,y坐标加1,画完一个数据后便让x加1画后续一列的8个像素点,此时应该将y的值从新回到一开始的y值,也就是把y0赋过来。size1/8得此字符所占页数,(size1/2)得字符在x的位数,页数乘x方向位数即得出需要写的次数size2。可以发现第三个形参定义的是一个指针,指向要显示的字符串地址,到时显示完一个字符,地址自增,显示下一个字符,在此之前先判断一下是不是合法的字符(是不是可打印显示字符),最小为空格32、最大为'~':126。
2024-04-27 07:22:07
2497
1
原创 从0开始点亮OLED屏幕(二)OLED的初始化
从0开始点亮OLED屏幕(二)OLED的初始化此文章将会进一步教会你初始化OLED和在OLED上点亮任意一个像素点
2024-04-26 07:45:22
6131
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人