ARM裸机开发-I2C-E2PROM

Adafruit MS8607库深度解析:嵌入式高精度环境传感器驱动开发 环境传感器是物联网终端实现温湿度与气压感知的核心组件,其驱动开发需兼顾I²C通信协议、多源校准算法与低功耗时序控制。MS8607作为集成MS5637(压力/温度)与HTU21D(湿度)的三合一MEMS传感器,典型应用于工业监测、气象站及医疗设备等对精度(±0.1℃、±2%RH、±0.025%FS)和稳定性要求严苛的场景。其驱动本质是异构传感器协同管理问题,涉及PROM校准系数解析、温度补偿压力计算、共享I²C地址资源调度及RTOS任务安全访问等关键技术。本文围绕Adafruit MS8607 Arduino 阅读详情

目录

一.背景

二.时序

1.基本时序

2.I2c读写时序

三.AT24C02

四.I2c寄存器

IADR

IFDR

I2CR

I2SR

I2DR

五.实现

1.复用功能

2.电气属性

3.读写时序实现


一.背景

IIC(Inter-Integrated Circuit)又称I2C,是是IICBus简称,所以中文应该叫集成电路总线。是飞
利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备(芯片与芯片之间)而发展而来的一种同步串行半双工通信总线方式。该总线允许同时连接多个设备(芯片)。每块芯片在总线上拥有特定的地址。自2006年10月1日起,使用I²C协议已经不需要支付专利费(低速免费,高速付费),但制造商仍然需要付费以获取IIC从属设备地址。
上图所示是IIC的总线的使用场景,所有挂载在IIC总线上的设备都有两根信号线,一根是数据线SDA,另一根是时钟线SCL。这两个信号线都是双向的。
作为一种通信方式,IIC总线在某一时刻,总线只允许有一个设备处于发送状态,所发生的数总
线上所有的设备所接收。IIC通信协议包含有设备地址,只有发送方携带的地址与某个接收方址
相同时,接收方才真正执行相关的指令。
显然,用一根SDA传输数据,为串行(一个bit的发),半双工(不能同时发),SCL时钟线,同步时钟速率,所以为同步。
此外,类似Modbus协议,整个网络只有一个主机,多个从机,默认所有从机保持静默,主机发数据,从机应答,主机根据从机地址传输数据。该I2C则有两个主机,但一般为单主机模式。
     
IIC总线规定,设备在空闲时,两根总线都处于高电平状态。为保证这种状态,数据线SDA和时钟线SCL都要外接上拉电阻(4.7-10k,从机释放总线时,由于上拉电阻,所以总线保持为高电平)。对于I.MX来说,这个上拉电阻也可以在引脚电器配置中设置。

二.时序

1.基本时序

高位先行,数据线默认高电平。

起始信号:SCL时钟信号线为高电平时,SDA数据信号线由高变低出现下降沿

数据传输:

SCL时钟信号线为高电平时,SDA数据信号线电平保持稳定,此时接收方采样数据

SCL时钟信号线为低电平时,SDA数据信号线电平可以改变,此时发送方发送数据

应答信号:

第9个时钟周期,接收方需要向发送方回复应答信号(ACK低电平NACK高电平),每发一个字节,接收方回复应答信号。接收方不一定一直是主机,发送方也不一定一直是从机。发送方发送一个字节结束后,把电平拉高(线与特性),释放总线,交给接收方,若接收方拉低电平,则表示回复ACK,若接收方拉高电平,则表示回复NACK

发送一个字节后可接着发,不用再发起始信号

结束信号:

SCL时钟信号线为高电平时,SDA数据信号线由低变高出现上升沿。

由于结束信号是上升沿触发,所以当接收方拉高电平(NACK)之后要发送结束信号,则应该先拉低,再拉高电平。(若是低电平,即回复ACK,则直接拉高)

最后,注意所有起始和结束信号都是由主机发起,包括时钟信号

起始信号后第一个字节:设备地址(高7位)+数据流向位(低1位)
0x10
0001 0001 理论128个从机,实际会空出一个,只有127个从机
0:主机发送数据给从机(写)
1:从机发送数据给主机(读) 

2.I2c读写时序

I2c写时序:

1.主机发送起始信号+设备地址+写位,等待从机ACK应答
2.主机发送寄存器地址,等待从机ACK应答

3.主机向从机发送数据,等待从机ACK应答
4.主机发送停止信号


I2c读时序:
1.主机发送起始信号+设备地址+写位,等待从机ACK应答

2.主机发送寄存器地址,等待从机ACK应答

3.主机重发起始信号+设备地址+读位,等待从机ACK应答

4.主机接收从机数据,主机回复ACK应答

5.当主机接收完最后一个字节数据,向从机回复NACK应答 
6.主机发送停止信号

读写位和设备地址连着,所以要改变读写位就要重发设备地址,而设备地址通常为起始信号后的第一个字节,所以重发起始信号

三.AT24C02

AT24C02 是一款 2Kbit(256 字节)的串行 EEPROM(电可擦除可编程只读存储器)芯片。它通过 I2C 总线接口与主控芯片(如单片机)通信,常用于存储需要掉电保存的小量数据,例如配置参数或用户设置。

📊 核心参数速览

· 存储容量:2Kbit,即 256 字节(256 x 8bit)。
· 接口类型:I2C 两线串行接口(SCL, SDA)。
· 工作电压:1.8V ~ 5.5V,宽电压范围,兼容 3.3V (使用的imx6ull)和 5V 系统。
· 通信速率:100KHZ(1.8V,2.5V,2.7V);400kHz(5V)。

· 支持页写:一页8B。
· 擦写寿命:100 万次。
· 数据保存:100 年。

黑色芯片如下结构

A0,A1,A2默认接GND,即默认低电平。设备地址0101 0000,即0x50

四.I2c寄存器

IADR

当imx6ull芯片作为从机时,应在该寄存器传输地址,本篇作为主机使用。

IFDR

配置分频,由于采用ipg时钟,在上篇中有所提及,应为66MHZ,而本次应设置为100KHZ,计算没有具体值,采用相近的分频因子640

I2CR

TXAK:

当主机为发送模式,此位置0,表示检测从机发送的ACK,置1表示检测从机发送的NACK

当主机为接收模式,此位置0,表示主机回复给从机的ACK,置1表示主机回复给从机的NACK

I2SR

ICF:只判断确认位之前的数据是否传输

IBB:判断总线是否占用,0空闲,1占用,发送停止位之后清零

IAL:总线仲裁,置0表示不丢失总线仲裁,用于多主机情况下,置1表示仲裁丢失,没有抢到总线控制权,本次不需要,配0即可。

IIF:中断标记位,判断包括确认位之前的数据是否接收,即使GIC失能,但外设中断位也会产生,只是到不了内核。接收或发送数据之前清零,接收ACK或NACK之后置1,然后要再发送数据的话再清零。主机作为接收方时标记接收应答,置1,作为发送方时标记发送应答,置1

I2DR

五.实现

1.复用功能

引脚43的UART4 TXD被复用为I2C1的时钟线,引脚42的UART4 RXD 被复用为I2C1的数据线

    // 配置引脚复用功能
    IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL, 1);
    IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA, 1);

2.电气属性

由于I2c配置了上拉电阻,所以此处应修改PUS位为11,选择22k的上拉电阻与芯片电阻并联,同时PUE为选择拉,(保持是电压输入几伏就保持,不改变)PKE位选择失能,所以12-15位为1111,配置电气属性为0xF0B0

    // 配置引脚电气属性
    IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0xF0B0);
    IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0xF0B0);

3.读写时序实现

    //与上面的复用功能和电气属性皆为初始化部分
    I2C1->I2CR &= ~(1 << 7);    // I2C1失能
    I2C1->IFDR = 0x15;          // 640分频
    I2C1->I2CR |= (1 << 7);     // I2C1使能

void i2c_write(I2C_Type *base, unsigned char dev_address, unsigned char reg_address, const unsigned char *data, int len)
{
    // 通信前 仲裁丢失标志位清零 + 中断标记位清零
    base->I2SR &= ~((1 << IIF) | (1 << IAL));
    // 通信前,等待数据传输完毕
    while ((base->I2SR & (1 << ICF)) == 0);
    // 发送起始信号
    base->I2CR |= (1 << MSTA);
    // 主机模式:发送模式
    base->I2CR |= (1 << MTX);
    // 后续检测从机ACK信号
    base->I2CR &= ~(1 << TXAK);
    // 中断标记位清零
    base->I2SR &= ~(1 << IIF);
    // 发送设备地址 + 写位
    base->I2DR = dev_address << 1;   // 101 0000 0
    // 等待从机ACK
    while ((base->I2SR & (1 << IIF)) == 0);
    // 中断标记位清零
    base->I2SR &= ~(1 << IIF);
    // 发送寄存器地址
    base->I2DR = reg_address;
    // 等待从机ACK
    while ((base->I2SR & (1 << IIF)) == 0);

    while (len--)
    {
        // 中断标记位清零
        base->I2SR &= ~(1 << IIF);
        // 发送数据
        base->I2DR = *data++;
        // 等待从机ACK
        while ((base->I2SR & (1 << IIF)) == 0);
    }

    // 发送停止信号
    base->I2CR &= ~(1 << MSTA);

    // 等待总线空闲
    while ((base->I2SR & (1 << IBB)) != 0)
    {
        delay_us(100);
    }
}

void i2c_read(I2C_Type *base, unsigned char dev_address, unsigned char reg_address, unsigned char *data, int len)
{
   // 通信前 仲裁丢失标志位清零 + 中断标记位清零
    base->I2SR &= ~((1 << IIF) | (1 << IAL));
    // 通信前,等待数据传输完毕
    while ((base->I2SR & (1 << ICF)) == 0);
    // 发送起始信号
    base->I2CR |= (1 << MSTA);
    // 主机模式:发送模式
    base->I2CR |= (1 << MTX);
    // 后续检测从机ACK信号
    base->I2CR &= ~(1 << TXAK);
    // 中断标记位清零
    base->I2SR &= ~(1 << IIF);
    // 发送设备地址 + 写位
    base->I2DR = dev_address << 1;
    // 等待从机ACK
    while ((base->I2SR & (1 << IIF)) == 0);
    // 中断标记位清零
    base->I2SR &= ~(1 << IIF);
    // 发送寄存器地址
    base->I2DR = reg_address;
    // 等待从机ACK
    while ((base->I2SR & (1 << IIF)) == 0);

    // 重发起始信号
    base->I2CR |= (1 << RSTA);
    // 中断标记位清零
    base->I2SR &= ~(1 << IIF);
    // 重发设备地址 + 读位
    base->I2DR = dev_address << 1 | 1;
    // 等待从机回复ACK信号
    while ((base->I2SR & (1 << IIF)) == 0);
    // 主机模式:接收模式
    base->I2CR &= ~(1 << MTX);
    // 中断标记位清零
    base->I2SR &= ~(1 << IIF);

    // 代表只需要读取一个字节
    if (len == 1)
    {
        // 代表收到一个字节后,后续回复NACK
        base->I2CR |= (1 << TXAK);
    }

    // 假读,在半双工模式下,发送和接收都用I2DR寄存器,读一次才能启动读数据,data不++,下次读取要覆盖此次读取发送时残留的数据 
    *data = base->I2DR;

    // 读取len个字节数据
    while (len-- != 0)
    {   
        // 代表收到一个字节数据,并且主机回复了ACK
        while ((base->I2SR & (1 << IIF)) == 0);
        // 中断标记位清零
        base->I2SR &= ~(1 << IIF);

        // 代表数据全部接收完
        if (len == 0)
        {
            // 发送停止信号
            base->I2CR &= ~(1 << MSTA);
            // ACK,以便下次通信发送数据时发送方检测ACK
            base->I2CR &= ~(1 << TXAK);
            // 等待总线空闲
            while ((base->I2SR & (1 << IBB)) != 0)
            {
                delay_us(100);
             }       
        }
        else if (len == 1)
        {
            // NACK
            base->I2CR |= (1 << TXAK);
        }

        *data++ = base->I2DR;
    }
}
i2c_read(I2C1, 0x50, 0, buffer, 5);

设备地址0x0101 0000,即0x50

寄存器地址 0 是 AT24C02 内部的存储单元地址,也叫字地址(Word Address)。

AT24C02 的存储空间是 256 字节(2K bit),地址范围是 0x00 ~ 0xFF。

  • 你传 0,表示要从第 0 个字节开始读写。

  • 你传 0x10,表示从第 16 个字节开始。

  • 容易混淆的两个“地址”

    名称含义例子谁决定的
    设备地址I2C 总线上识别哪个芯片0x50芯片型号 + A0/A1/A2 引脚
    字地址EEPROM 内部存储单元的偏移量0x00 ~ 0xFF你在代码里自己分配
ARM / RISC-V 芯片设计生成全流程深度报告(2026):工具链、技术栈与制造工艺 从产品定义一路走到量产爬坡:13 个阶段、4 大工程域、全阶段 EDA 工具矩阵、先进制程与封装工艺、成本与周期模型、签核清单与风险登记册,并标注 ARM 与 RISC-V 两条路线的真实差异。 阅读详情

相关推荐

船载 OpenHarmony AIS 航海工作台:桌面启动器与导航框架

本文介绍船载OpenHarmony AIS航海工作台的自研Launcher与导航框架。其桌面即工作台,集成多页应用网格、Dock栏、拖拽排序及U盘安装入口,统一管理系统与第三方应用。通过视图模型持久化布局,实现开机直入工作台。导航采用router与Navigation双范式并存,支持状态联动(如告警悬浮球、船舶弹窗),提升操作效率。设计注重性能优化与权限合规,为后续硬件数据接入奠定基础。

专注于计算机研发知识和资讯分享 13

I2C 通信协议详解:时序、EEPROM 读写流程与实战总结

I²C是一种由飞利浦开发的串行同步半双工通信总线,仅需SCL(时钟线)和SDA(数据线)即可实现主机与多从机间的低速通信。其工作时序以起始信号(SCL高时SDA下降沿)开始,数据在SCL高电平期间稳定传输,每8位后接收方发送ACK应答,最后以停止信号(SCL高时SDA上升沿)结束。典型应用包括EEPROM存储、传感器采集、显示屏驱动及实时时钟通信。设备地址唯一,支持一主多从或多个主机架构,具有引脚少、连接简单的优势,广泛用于嵌入式系统中。

weixin_62427201的博客 315

船载 OpenHarmony AIS 航海工作台:串口数据采集与 AIS / NMEA 解析

本文介绍船载OpenHarmony AIS航海工作台的串口数据采集与解析架构:通过后台线程实现GNSS/NMEA与AIS报文的稳定读取,利用原生库高效解码,数据经解析后存入本地关系库,再由轮询线程回传至主线程刷新船舶列表。设计强调解析下沉、原生加速与可靠性机制,确保UI不卡顿,为后续融合气象、潮汐等外部信息奠定基础。

专注于计算机研发知识和资讯分享 109

基于OMAP-L138的便携式设备状态监测与诊断仪设计

摘要:提出基于OMAP-L138的便携式设备状态监测与诊断仪的设计方案。介绍了其软硬件结构设计,重点对数据采集部分的硬件及数据采集模块的软件设计做了详细的介绍。利用了ARM核控制处理优势与DSP核数字处理能力,实现低功耗高性能的优点。 关键词:OMAP;故障诊断仪; 数据采集 工业设备的状态监测和故障诊断,有效地保证了设备的平稳运行,并在设备预知维修中发挥越来越重要的作用。为了满足石化企业对于状态监测和故障诊断的需求,设计了一款便携式综合性设备状态监测与诊断仪器。设计中参考了信迈的OM...

YEYUANGEN的专栏 796

船载 OpenHarmony AIS 航海工作台:告警与防碰撞预警系统

船载OpenHarmony AIS航海工作台的告警与防碰撞系统,集成十余类告警(超速、偏航、会遇、SOS等),通过网格空间索引实现高效邻近判定,保障实时性。告警管理器统一调度规则、去重、通知与日志,支持悬浮球、语音、跑马灯、弹窗多渠道触达,确保航行安全。SOS紧急通道独立运行,避免干扰。系统设计强调性能优化与多场景适配,为航海安全提供核心支撑。

专注于计算机研发知识和资讯分享 117

PMOS缓启动电路设计实战:用LTspice优化上电时序,把60A冲击降到15A

本文通过一个实战案例,深入解析了PMOS缓启动电路如何有效抑制上电冲击电流。文章指出,低ESR电容是导致冲击电流飙升的元凶,并详细阐述了利用LTspice仿真工具,通过优化栅极电阻和栅源电容等参数,将高达60A的冲击电流成功降至15A的设计与优化过程,为电源开关电路设计提供了可复用的方法论。

onion的博客 899

MCU本质与演进:从8051到AIoT边缘智能

微控制器(MCU)是嵌入式系统的核心,区别于通用CPU,其本质是集成ROM、RAM、定时器、ADC等模块的片上系统(SoC),专为确定性实时控制而生。它依托裸机编程或轻量级RTOS实现低延迟响应,在工业控制、消费电子等领域具备不可替代性。随着ARM Cortex-M架构普及,MCU在性能、外设集成与开发效率上实现跃迁;Arduino与ESP32进一步推动开发范式平民化,降低硬件门槛。当前,TinyML与AI加速器正拓展MCU边界,使其从传统控制单元升级为边缘智能中枢——这一演进始终围绕‘场景适配’展开,强调

weixin_34374684的博客 351

聚类分析之——Kmeans算法(一)

原创地址:http://www.toutiao.com/i6399454239554273794/ 聚类分析是一种静态数据分析方法,常被用于数据挖掘、机器学习、模式识别等领域,聚类是一种无监督式的学习方法。它是在未知样本类别的情况下,通过计算样本彼此间的距离(欧式距离,马式距离,汉明距离,余弦距离等)来估计样本所属类别。从结构性来划分,聚类方法分为自上而下和自下而上两种方法。聚类的算法有很多

june2017的博客 3531

嵌入式系统介绍

嵌入式系统基本知识及开发逻辑

qq_33559839的博客 3914

RAW、RGB、YUV图像格式的采样与存储原理详解

本文详细解析了RAW、RGB和YUV三种核心图像格式的采样与存储原理。RAW是传感器原始数据,信息完整但需后期处理;RGB直接对应显示,直观但数据量大;YUV通过亮色分离与色度下采样,在保证观感的前提下大幅提升传输与存储效率,是视频编码与流媒体的主流格式。理解其差异是图像处理与视频开发的基础。

e4f5g6h7的博客 516

解锁PyCharm+Deepseek:本地部署AI编程超能力

在本次探索中,我们成功地在 PyCharm 中实现了 DeepSeek 的本地化部署,这一过程虽然涉及多个步骤,但每一步都为我们开启 AI 编程大门奠定了基础。从安装最新版 PyCharm,确保我们拥有一个功能强大且兼容性良好的开发环境,到注册 DeepSeek 账号并获取 API Key,这是连接我们与强大 AI 能力的关键纽带。接着,在 PyCharm 中安装 Continue 插件并进行精细配置,让 DeepSeek 能够深度融入我们的编程流程。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 5548

STM32开发之嵌入式基础:计算机组成与Cortex-M4体系结构详解

本文系统阐述了嵌入式系统的基本概念、组成及特点,重点解析了ARM Cortex-M4微控制器的体系结构。从冯诺依曼与哈佛架构对比,到存储器分类(ROM/RAM)、总线机制与CPU工作流程,深入讲解了机器字长、数据单位(bit/byte/int)及寄存器体系。以STM32为例,详述Cortex-M4的三总线架构、地址映射、位带操作、工作模式(线程/处理模式)与特权级别,并结合RTOS应用,阐明MSP/PSP堆栈管理、中断屏蔽与上下文切换机制,构建了从计算机基础到嵌入式开发的完整知识框架。

AwesoneZh的博客 281

YOLOv11 损失函数进阶:SlideLoss 让小目标检测精度飙升

创建self.loss_fun = loss_fun # 基础损失函数(如BCEWithLogitsLoss)self.loss_coef = loss_coef # 损失系数# 计算滑动权重:根据预测与真实值的差异判断样本难度# 难度越高,权重越大该类在原有损失函数的基础上,通过diff计算样本预测与真实值的差异(差异越大,样本越难),进而生成动态权重,实现对难样本的重点学习。

m0_64661770的博客 217

为什么学习率预热(warmup)能显著改善Transformer等大模型的训练稳定性?

t$ 的分母 $(1-\beta_2^t)$ 极小,导致方差估计值波动剧烈。若此时 $\eta$ 较大,更新步长 $\Delta \theta$ 将不可控。Adam 优化器的参数更新公式为 $\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}{warmup}$ 时人为压低 $\eta_t$,从而保证 $\Delta \theta$ 的数值稳定性。在训练初期($t$ 很小),$\hat{v}{warmup}}$,在 $t < T。

2402_84593233的博客 182

DDR5中的On-Die Termination(ODT)详解:电阻值支持及其背后的秘密

DDR5支持多档ODT电阻值,范围从40Ω到480Ω,均基于240Ω标准参考电阻RZQR_{ZQ}RZQ​。不同电阻档位对应不同的信号负载和功耗需求。校准电压点关键,常用0.8×VDD进行精准调校。CA信号间ODT匹配必须严格控制,保证命令总线稳定。选择合适的ODT值是高速内存设计中不可忽视的细节。

weixin_43199439的博客 2099

大数据架构中的数据治理:元数据管理与数据血缘追踪实践

本文将聚焦大数据架构中数据治理的两大核心支柱——元数据管理与数据血缘追踪元数据管理的目标、类型与实施步骤(从需求分析到工具落地);数据血缘追踪的技术实现(静态解析、动态捕获、混合方案)与应用场景;如何将两者结合,构建完整的数据治理体系,并通过真实案例展示落地效果。元数据管理:定义了业务/技术/操作元数据,讲解了工具选型(如Apache Atlas)、采集(Hook/API)、存储(关系库+图数据库)、应用(数据发现、质量监控);数据血缘追踪。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 868

ARM 内存管理

最早期的计算机,程序是打在卡片上的,CPU 读一张卡片执行一条指令,效率极低。后来有了内存,程序要先加载到内存再执行,也就是 “存储程序” 概念,这才开启了操作系统的发展。1. 单道编程的内存管理2. 多道编程的内存管理:解决 “同时跑多个程序” 的问题为了提升资源利用率,出现了。

qq_52240295的博客 334

【30】软考软件设计师——UML类图与用例图满分精讲|下午第3题常考核心

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第30篇,聚焦**模块四:应用技术(下午题)第3道高频大题**,UML建模是历年下午必考核心,单题分值稳定10~12分。全文深度拆解两大核心UML图表:**类图**与**用例图**,超详细讲解类图三层结构、可见性修饰符、五大核心关系(泛化/关联/依赖/聚合/组合)的判定标准与绘图规范;吃透用例图参与者、系统边界、三大关系(包含/扩展/泛化)的底层逻辑,搭配独家**关系秒杀口诀、标准绘图模板、真题改错技巧**;全文适配补图、判断关系、分析场景、纠错优化

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 573

OpenHarmony 应用无感读写公共目录方案:不改设备形态,跳过权限弹窗

方案用户感知是否改设备形态适用场景运行时权限弹窗有感(需点允许)否标准形态设备,用户可接受交互改 devicetype=tablet无感是(全 ROM 迁移,风险大)需整机形态迁移的产品系统预授权(推荐)完全无感否需公共目录读写且用户不可感知的场景应用沙箱完全无感否仅供本应用使用的私有文件最终建议:在不修改设备形态标识的前提下,通过系统配置文件按“包名 + 签名指纹”做安装时预授权,是实现 OpenHarmony 应用无感读写公共目录的最务实路径。

qq_44160056的博客 259

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

React Native for OpenHarmony 实战:react-native-file-logger 日志库鸿蒙化适配

本文记录了将 react-native-file-logger 适配至 OpenHarmony 的实战过程。基于鸿蒙 7.0 模拟器,通过 5 个 TurboModule 方法实现日志落盘、轮转、列举与删除,采用 fileIo 实现核心功能,支持按大小和跨天轮转,归档文件命名精确至毫秒。邮件发送功能因平台限制按能力边界处理,明确拒绝并提示用户手动导出。验证通过,日志文件结构清晰,内容完整,产出 HAP 示例与独立 HAR 库,中英双语文档齐全,为鸿蒙应用日志管理提供可靠方案。

m0_62930060的博客 271

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Docker 部署 devkitARM:轻松搭建掌机自制程序编译环境

devkitARM 是一款面向掌机自制程序的开源交叉编译工具链,旨在为 Game Boy Advance、Nintendo DS、Nintendo 3DS、GP32 和 GP2X 提供编译器与开发库,并把源码编译成对应平台的程序文件。本文将介绍如何通过 Docker Compose 部署 devkitARM,搭建掌机自制程序编译环境,帮助开发者在容器里编译这些程序,适合不想在本机安装整套工具链,以及要在持续集成里固定工具链的场景。

java_logo的专栏 370

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

云手机私有化部署完整方案:基于ARM服务器搭建私有安卓云集群

ARM 服务器是私有化安卓云集群最优硬件底座,原生架构匹配 Android,高密度、低损耗,非常适合企业内网场景。整套私有化方案的核心,从来不是 “跑起来安卓”,而是隔离可控、可审计、可运维、可扩容。两条路线各有取舍:开源自建灵活、门槛高;商用私有化交付开箱即用、安全能力完备,是当前企业生产环境主流方案。六边云手机私有化方案,补齐了自建方案在驱动适配、管控平台、审计合规、信创适配上的短板,适合对数据主权、内网隔离有强需求的政企、自研 App、垂直行业客户。

a598652的博客 334

ARM 汇编入门(六):栈、子程序与 AAPCS64 调用约定

AArch64汇编中,函数调用依赖AAPCS64 ABI协议,确保跨语言、跨编译器的二进制兼容。核心规则包括:寄存器分工明确(caller-saved可覆盖,callee-saved需保存)、栈指针SP必须16字节对齐、栈帧大小为16字节倍数;参数通过X0~X7(整数)和V0~V7(浮点/SIMD)传递,超出则压栈;大结构体传指针,小结构体拆入寄存器;非叶子函数须保存LR(X30),否则返回错误;标准prologue/epilogue维护调用链与栈安全。掌握这些规则,方能实现手写汇编与高级语言的无缝协作,避

m0_58087444的博客 179

openharmony 设备录像「无声音」全流程排查与修复

录制视频没有声音」从最初的恐慌排查,最终落在了一个系统级代码分支的选择问题上。最终解法:把走禁用分支的条件去掉,让系统走自己的正常音频准备流程。技术要点写在代码注释里了:一句 ARM64 分支指令,让整个媒体引擎重新学会「听」。

qq_44160056的博客 203

2026.11.9录屏笔记

e.g:服务器划分出一个目录作为可访问的目录,客户端通过网络发起标准的fs请求来读取,主机上所有的数据存放在磁盘,磁盘的格式是xfs,访问时所用到的也是xfs格式,这是一个标准的网络协议而不是本地文件类型格式,后期客户端将这个文件理解为基础的网络文件,用mount连接。每一个层级的域对应一个服务器(根域---根域服务器,顶级域---顶级域服务器,目的是为了在全球获取到唯一性备案)根域名服务器记录六个顶级域名服务器的域名和ip,顶级域名服务器记录二级以此类推。重置时间(发起再次请求的时间间隔<同步时间)

ever_you_love的博客 95

#OpenHarmony 权限体系拆解:user_grant、system_grant 与权限定义表

文件分区内容system(只读)权限定义表读的就是它system(只读)预授权清单:按应用包名 + 签名证书哈希匹配,安装时自动授予 user_grant 权限access_token 数据库data每个应用 token 的实际授权状态(持久化的 grantStatus)

qq_44160056的博客 131
上一篇: ARM裸机开发-UART
下一篇: ARM裸机开发-I2C-LM75
剑指offer.
博客等级 码龄3年 15粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值