- 博客(30)
- 收藏
- 关注
原创 I2C驱动AT24C02
写操作需要在设备地址字和确认之后有一个8位的数据字地址。该微控制器可以传输多达7 (1K/2K)或15 (4K, 8K, 16K)更多的数据字。如果有超过8个(1K/2K)或16个(4K, 8K, 16K)数据字传输到EEPROM,数据字地址将“翻转”,先前的数据将被覆盖。接下来的3位是1K/2K EEPROM的A2、A1和AO设备地址位。设备地址字由一个强制的1,0序列的前四个最有效的位,如所示。1K/2K EEPROM能够进行8字节的页写入,4K、8K和16K设备能够进行16字节的页写入。
2024-03-12 22:28:10
439
原创 PWM驱动智能小车舵机运动
舵机90°时 PWM周期为20ms 占空时间为1.5ms。舵机0°时 PWM周期为20ms 占空时间为0.5ms。舵机180°时 PWM周期为20ms 占空时间为2ms。舵机45°时 PWM周期为20ms 占空时间为1ms。初始化让舵机位于最左边,也就是0°。
2024-03-11 22:24:21
400
原创 NWatch-Alarm闹钟功能实现
alarm模块是STR菜单界面,更改界面的值通过状态机的方式逐个改变每个数据的值然后通过确认赋值,改变完所有数据值后保存到外部Flash中。每次时间或者闹钟响后,更新最近一个闹钟。通过计算本周开始到当前闹钟时间总共过去多少分钟,最少的就是最近一个闹钟。如果当前时间是闹钟设置的时间,则进行相应。改变当前页面绘制函数称为闹钟响后的绘制函数。使用SPI读取W25Q的ID验证通信的正确性。使用CubeMx自动配置。
2024-02-28 21:36:10
478
原创 NWatch手表-Setting界面-Sound功能实现
APPConfig关于声音的定义是通过位域来实现的,UI声音,闹钟声音和时钟声音这三个声音都占两位。最大是11最小是00.Sound部分是IMAGE界面主要由三个部分组成,UI声音,闹钟声音和时钟声音。在main函数中调用,轮询查询当前播放的音律是否时间结束,如果结束播放下一个。当按下确认键后,设置APPConfig中不同部分声音的值。程序中使用的蜂鸣器由TIM3的CH4的PWM来驱动。
2024-02-26 09:18:18
1043
原创 NWatchSetting界面
本文主要仿照NWatch完成了NWatch中Setting界面的功能的实现。NWatch的Setting界面。
2024-02-19 23:20:59
394
1
原创 NWatch多级菜单技术分析
首先NWatch会通过一个菜单结构体menu_s来设置当前菜单的内容,例如设置当前的菜单的被选的应用、应用个数、菜单名字、菜单类型、菜单的函数和上一级菜单的加载函数等相关信息。初始化主菜单通过菜单的设置函数来设置当前菜单的的内容。例如下面是设置手表菜单的内容,用来显示系统的时间和日期。当按下确认键以后进行NWatch主界面,重新设置菜单的内容和功能。
2024-02-15 10:20:40
632
1
原创 OLED使用printf格式化打印和显示汉字
汉字结构体 由索引和数据量部分组成 ,索引的长度和编码格式有关。UTF-8编码下一个汉字占三个字节,GBK编码下占两个。底层使用 显示字符串函数。
2024-01-18 16:42:16
828
1
原创 0.96寸OLED屏幕驱动
本程序通过I2C1来控制OLED的显示,所以先使能硬件I2C1。图像显示函数 : 将图像数据更新到显示器的显存缓冲区中。
2024-01-17 20:28:57
498
1
原创 STM32F103编译过程链接出现内存不足问题的解决方法
使用FreeRTOS提供的内存分配和释放函数即可解决问题。在创建环形缓冲区的过程中使用了,C语言库函数malloc。在代码编译和链接过程中出现了内存不足的问题。注意:尽量使用单片机操作系统提供的库函数。
2024-01-05 16:17:44
932
1
原创 打砖块游戏-挡球板移动控制
本文使用FreeRTOS中的队列以及队列集来实现挡球板的控制,将不同外设的队列添加入队列集当中,队列集一直处于阻塞读当中,当不同的控制外设产生数据后将写入对应的队列中,然后队列集会被唤醒读取对应的数据。
2023-12-19 12:06:36
131
1
原创 打砖块游戏-六轴传感器姿态控制
每隔50ms读取x、y、z轴对应的加速度值和角速度值。然后通过y轴的加速度值计算出来y轴倾斜的角度来对挡球板的位置进行控制。本文使用的六轴传感器时MPU6050,相关的原理大家可以去搜索资料,本文只讲打砖块游戏对于六轴传感器的应用。MPU6050通过I2C来进行通信,因此本文将初始化STM32F103的I2C2来驱动MPU6050。
2023-12-19 11:49:04
68
1
原创 打砖块游戏-旋转编码器控制
设置PA6引脚为上升沿中断触发模式,每当触发中断时,判断B的值如果B为低电平,则说明A比B快90°说明为顺时针转动,反之慢90°逆时针转动。旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可的值旋转轴的速度与方向。即当旋转编码器顺时针转时,A比B提前90°(一个周期的方波信号为360°);反之A比B延迟90°。下图中的A、B连接的引脚以具体初始化的引脚为准,本文中A连接的是PA6,B连接的是PA8.
2023-12-19 11:30:50
67
1
原创 挡球板控制之红外遥控-红外解码
设置PB1引脚为双边沿中断触发引脚,每次发生中断记录当前TIM的计数值count保存入循环缓冲区当中。然后译码的时候相邻两个count相减就是半个周期的数据。NEC红外编码的关于引导码和数据码的约定。NEC红外编码的一帧数据的组成。NEC红外编码的重复码。
2023-12-19 10:53:50
41
1
原创 NWATCH打砖块小游戏移植
打砖块游戏主要由两个子任务组成,分别是挡球板任务以及小球任务。1. 硬件模块屏幕显示 : 0.96 寸OLED I2C通信传感器模块:红外遥控、旋转编码器和六轴姿态传感器挡球板任务程序流程图挡球板任务,不断从消息队列中获取控制信息。//循环读取按键值 如果是左右 则改变木板移动方向 否则 进入下一次循环while (1)}else//隐藏滑动板}else//滑动板越界判断//显示滑动板移动小球的程序流程图。
2023-12-16 21:15:08
374
4
原创 C语言循环缓冲区设计
在C语言中,我们经常需要处理数据的缓冲区。循环缓冲区是一种特殊类型的缓冲区,它允许我们在固定大小的缓冲区中持续地读取和写入数据,就像在一个环形轨道上一样。当数据到达缓冲区的末尾时,它会从缓冲区的开始处继续写入。这种设计非常高效地使用了内存空间。在本文中,我们将讨论如何设计一个C语言的循环缓冲区。我们将创建一个数据结构来保存缓冲区的状态,并定义几个函数来读取、写入和清除缓冲区。。首先,我们需要定义一个结构体来保存缓冲区的信息。head:指向缓冲区中第一个有效数据的指针。
2023-11-29 16:01:17
441
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人