通过学习和使用STC比较器,我深刻体会到其在嵌入式系统设计中的重要性。比较器不仅具有简单直观的工作原理,而且通过灵活的配置选项和强大的功能扩展能力,可以适应各种复杂的应用场景。同时,我也认识到在使用比较器时需要注意的一些细节问题,如版本差异、外部元件选型和中断处理等。这些经验和教训将对我未来的学习和工作产生积极的影响。 FLASH模拟EEPROM
Flash通常以块(Block)或页(Page)为单位进行擦除和编程,而EEPROM可以单字节或较小的单元进行编程和擦除。
EEPROM在编程和擦除速度上通常比Flash快,特别是在小量数据更新的情况下。
Flash的擦写次数有限(通常为数千至数十万次),而EEPROM的耐用性通常更高。
由于Flash的高密度,它在成本上通常更具优势。
Flash模拟EEPROM的技术实现
通过软件算法和硬件支持,将Flash的大块擦除和编程操作转换为看似单字节或小块的操作。这通常涉及到一个或多个模拟EEPROM的“扇区”在Flash中的实现,每个扇区管理一定数量的数据,并通过软件跟踪每个数据位的状态。
为了延长Flash的寿命,需要实现磨损均衡算法,确保Flash的各个部分被均匀使用,避免某些区域过早达到擦写次数限制。
为了提高模拟EEPROM的性能,可以优化数据访问模式,减少不必要的擦除和编程操作,以及使用缓存技术来减少对Flash的直接访问。
学习Flash模拟EEPROM的过程中,深入理解Flash和EEPROM的技术原理是关键。这有助于我们更好地掌握模拟技术的实现方法和优化策略。
软件模拟SPI
1. SPI的四个主要信号线(SCK时钟线、MOSI主出从入数据线、MISO主入从出数据线、CS片选线)的作用及其时序关系。
2. SPI的几种常见工作模式(如CPOL和CPHA的不同组合)以及数据传输方式(如MSB先传或LSB先传)。
编写软件模拟SPI的代码时,要关注以下几个状况:
时钟信号生成:根据SPI的时钟频率和相位/极性要求,通过软件控制GPIO引脚来模拟时钟信号的上升沿和下降沿。
数据发送与接收:在时钟信号的驱动下,通过GPIO引脚发送数据到MOSI线,并从MISO线读取数据。注意数据位的同步和时序对齐。
片选控制:在数据传输前通过CS引脚选择相应的从设备,并在数据传输完成后释放片选。
中断与轮询:根据应用场景选择合适的通信方式(中断或轮询),以提高系统效率或简化代码结构。
1
本帖最后由 xnh 于 2024-8-8 16:47 编辑1
2
本帖最后由 xnh 于 2024-8-8 16:47 编辑2 LED 点亮 按钮的使用 LED闪烁 延迟方法的应用具体代码如下:
#include "stc32g.h"
#include "stc32_stc8_usb.h"
#include "string.h"
#include "stdio.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
#define MAIN_Fosc 24000000L //定义主时钟
#define KEY_P32 P32
#define KEY_P33 P33
#define KEY_P34 P34
#define KEY_P35 P35
// 初始化
void sys_init();
void p20_auto_lighten_extinguish();
void p2_lighten_10m(char p);
char putchar(char c)
{
char temp = {0};
temp = c;
USB_SendData(temp, 1); //发送数据缓冲区,长度
usb_OUT_done();
return c;
}
// 延时
//========================================================================
// 函数: void delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2022-6-3
// 备注:
//========================================================================
void delay_ms(u8 ms)
{
u16 i;
do{
i = MAIN_Fosc / 6000;
while(--i); //6T per loop
}while(--ms);
}
void main()
{
int i = 0;
P_SW2 |= 0x80;
sys_init();
usb_init(); //USB CDC 接口配置
EUSB = 1; //IE2相关的中断位操作使能后,需要重新设置EUSB
EA = 1; //打开总中断
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while (1)
{
if (bUsbOutReady)
{
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
usb_OUT_done();
}
if (KEY_P33 == 0)
{
delay_ms(10);
if (KEY_P33 == 0)
{
P21 = 0;
}
} else {
P21 = 1;
}
if (KEY_P34 == 0)
{
delay_ms(10);
if (KEY_P34 == 0)
{
p20_auto_lighten_extinguish();
}
}
}
}
void sys_init()
{
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
}
void p20_auto_lighten_extinguish()
{
P20 = 0;
delay_ms(500);
P20 = 1;
delay_ms(500);
}
void p2_lighten(char p)
{
P2 = ~(1 << p);
}
打卡 硬件SPI读写FLASH芯片
1. 理解SPI的基础知识
SPI通信总线,广泛用于MCU、FLASH、传感器等之间的通信。它包含四个主要的信号线:SCK、MOSI、MISO和CS。
工作模式 时钟极性和相位 (CPOL和CPHA)
2.熟悉FLASH芯片的特性
不同的FLASH芯片有不同的存储结构和容量,包括页大小、扇区大小
指令集不同 读取、写入、擦除等
3.SPI通信
需要根据SPI 芯片要求正确配置
如屠龙刀 我在代码中 一般配置波特率2400
4.FLASH芯片操作 需要注意优化读写策略减少不必要的擦除操作。
打卡 软件模拟IIC 硬件IIC
IIC总线是一种串行、半双工通信协议,主要用于近距离、低速的芯片通信
IIC有两根主要线路 串行数据线和串行时钟线(SDA、SCL) 用于数据传输和通信 的时间同步
IIC的特点 结构简单、成本低
软件模拟
通过通用输入输出(GPIO)口来模拟器SCL和SDAd时序。实现IIC通信
软件模拟的特点 灵活性高可以在不支持硬件IIC的单片机上模拟实现 同时也存在时间延迟和精度的问题 影响通信的速度和稳定
硬件
硬件实现则是通过单片机内部集成的IIC控制器 直接通过物理线路通信
特点通常稳定性和速度优于软件模拟 但受限于单片机硬件资源
打卡 EEPROM芯片数据读写
51单片机的EEPROM并非传统的EEPROM存储器,是通过DATAFLASH模拟实现的 这种设计使得51单片机不需要外部 EEPROM芯片的情况下能具备数据读写的功能
51单片机 利用IAP技术实现EEPROM读写操作 IAP允许单片机运行时对自身的FLASH存储器进行编程 也就是读写功能
51单片机提供了特殊功能寄存器来管理EEPROM读写操作
读写的流程
读取
1.设置地址寄存器(ISP_ADDRH、ISP_ADDRL)
2.发送读取命令(ISP_CMD=0x01)
3.触发寄存器(ISP_TRIG)进行读取操作 读取的数据存储到数据寄存器(ISP_DATA)中
写入
1.擦除目标扇区数据(注意:51单片机只能将1变为0 不能将0变为1)
2.设置寄存器地址 发送写入命令(ISP_CMD=0x02) 写入数据到寄存器
3.触发寄存器 进行写入操作
擦除
1.设置地址寄存器(注意:通常只设置扇区起始地址的高位部分)
2.发送擦除命令(ISP_CMD=0x03)
3.触发寄存器 执行擦除操作
触发机制
触发存储器(ISP_TRIG)的写入需要连续两次操作 先写入0x46 在写入0xB9 以确保安全性
注意事项
扇区擦除
51单片机只能将1变为0 不能将0变为1 因此写入数据之前如果目标地址不是全为1(0xFF) 则需要先执行扇区擦除
中断管理
执行EEPROM读写操作时 需要关闭总中断(EA=0) 确保操作连续不被打断
打卡 PWM1
[*]PWM是一种通过改变信号周期内“高电平”的持续时间与总周期的比例来调节模拟量输出的技术。这种技术广泛应用于电机控制、LED亮度调节等领域。
[*]虽然8051 内核不支持直接输出PWM(脉冲宽度调制)功能,但是可以通过软件或者硬件扩展。使得8051 单片机能产生PWM信号。控制电机、LED亮度调节等。