爱普生EPSON实时时钟芯片-RX8900SA

2023-11-07

一、引脚连接

近期由于项目需求,被指定使用一款实时时钟芯片RX8900SA,经查询后发现网络资源很少,便在此记录一下使用笔记,方便查询使用,附代码。后期发现爱普生的RX8025t芯片手册内容相近,资源多且有中文手册,可对比查看。
在这里插入图片描述
在这里插入图片描述
芯片采用I2C通讯方式,具体时序查看芯片应用手册,常用的引脚如下:
SDA/SCL:用于I2C通讯;
/INT:用于闹钟报警,正常状态时是高电平,中断发生后,引脚电平由 高3V->低;
Vbat:连接电池;

二、使用方法

寄存器配置

在这里插入图片描述
1.芯片寄存器一共有15个,00~06用来设置和读取实时时间,数据格式为BCD码,需要注意的是03WEEK寄存器数据格式是不一样的,每个位对应周几(不许进行BCD码转换);
2.08~0A是用来对定时闹钟的时间配置,闹钟配置有两种方式具体操作在下面;
3.0D~0F是控制寄存器,用来设定中断方式、定时方式、中断标志位等;

1.实时时间读取/设置

在这里插入图片描述
1.设备地址为64,想要写入相应的寄存器,需要先发设备地址,然后寄存器地址,然后数值,比如WriteByteAdd(Rx8900sa_ADD,15,0x08); //使能alarm中断信号AIE;
2.读取相应的寄存器,需要先发设备地址,然后相应的寄存器,比如typGetAlarmTime.AF=ReadByteAdd(Rx8900sa_ADD,14);//读取中断标志寄存器,AF在第3位,0开始计数。

2.闹钟时间读取/设置

在这里插入图片描述
在这里插入图片描述
开启闹钟定时报警功能(即到点儿/INT引脚就由高变低),主要分两步:
1.设置定时时间,闹钟最小定时时间为分钟,设置不到秒,最大设置时间为日,若想要更长时间的定时,添加应用代码即可,分钟/小时时间设置向08/09寄存器写入数值即可,数值80h~FFh中及代表忽略(即每一分钟或者每小时);这里比较特殊的是day和week的定时,时间设置在0A寄存器,但需要使用0D寄存器的WADA位来控制,0代表周时间报警,1代表日时间报警,0A寄存器数据格式最高位为1的话表示每一天。
2.设置2个寄存器(0D,0F),清除1个中断标志位;0D Extension Register寄存器中第6位WADA用来控制按照day设定的时间报警,还是用week设定的时间报警,0F Control Register寄存器的第3位AIE是用来使能闹钟定时中断,因此在初始化的时候需要对该为写1;1个中断标志位是0E Flag Register寄存器的第3位AF,在初始化的时候需要进行清0,当定时时间到,中断发生,该标志位置1,/INT引脚电平由3V->0V,清零该标志位后便可进行下一次定时报警,不清除不再会触发定时报警。

三、代码

“Rx8900sa.c文件”

其中包括一些延时函数,用于自己的开发环境中重新定义一下即可,这里的OS.h主要用来设定延时函数
代码片.

/*************************************************
File name:    //Rx8900sa.c/h
Author:      //Davidysw
Version:      //V1.0
Description:  //用于驱动Rx8900sa实时时钟芯片 
              // 读取秒、分、时、周、日、月、年
              // 设定闹钟分、时、日
Others:       // 具体操作查看应用手册
Log:          // 
*************************************************/
#include <msp430.h>
#include "OS.h"         
#include "Rx8900sa.h"

TIME  typNowTime,typSetTime;
ALARM typSetAlarmTime,typGetAlarmTime;

/*
*@ Description: 转换为BCD码
*@ param 1    :例如传进来的是51,转换成0x51,实时时钟存储的是BCD码
*@ param 2
*@ return
*/
uint8_t hex_2bcd(uint8_t s) 
{
  uint8_t temp;
  uint8_t t;
  s %= 100;
  temp = s / 10;
  if(!temp)             //如果为0
  {
   t = s ;
  }
  else
  {
    t = temp * 6 + s;   //10进制转16进制,超过10的数*6
  }
  return t;
}

/*
*@ Description: 读取实时时间->typNowTime
*@ param 1    
*@ param 2
*@ return
*/
void Rx8900sa_ReadNowTime(void)
{  		
    uint8_t buff_rd[7];
    uint8_t i;

    for(i = 0; i < 7;i ++)
    {
      buff_rd[i] = ReadByteAdd(Rx8900sa_ADD,i);
    }
    typNowTime.second = ((buff_rd[0] >> 4) & 0x07) * 10 + (buff_rd[0] & 0x0f);
    typNowTime.minute = ((buff_rd[1] >> 4) & 0x07) * 10 + (buff_rd[1] & 0x0f);
    typNowTime.hour   = ((buff_rd[2] >> 4) & 0x03) * 10 + (buff_rd[2] & 0x0f);
    //typNowTime.week   = ((buff_rd[3] >> 4) & 0x07) * 10 + (buff_rd[3] & 0x0f);
    typNowTime.day    = ((buff_rd[4] >> 4) & 0x03) * 10 + (buff_rd[4] & 0x0f);
    typNowTime.month  = ((buff_rd[5] >> 4) & 0x01) * 10 + (buff_rd[5] & 0x0f);
    typNowTime.year   = ((buff_rd[6] >> 4) & 0x0f) * 10 + (buff_rd[6] & 0x0f);
    
    switch(buff_rd[3])
    {
      case 0x02:
        {
          typNowTime.week=1;
        }break;
      case 0x04:
        {
          typNowTime.week=2;
        }break;
      case 0x08:
        {
          typNowTime.week=3;
        }break;
      case 0x10:
        {
          typNowTime.week=4;
        }break;
      case 0x20:
        {
          typNowTime.week=5;
        }break;
      case 0x40:
        {
          typNowTime.week=6;
        }break;
      case 0x01:
        {
          typNowTime.week=7;
        }break;
      default:
        {
          typNowTime.week=0;
        }break;
        
    }
}

/*
*@ Description: 设置实时时间->typSetTime
*@ param 1    Rx8900sa_SetNowTime(31,0,6,1,18,11,19);
*@ param 2
*@ return
*/
uint16_t Rx8900sa_SetNowTime(uint8_t second,uint8_t minute,uint8_t hour,uint8_t week,uint8_t day,uint8_t month,uint8_t year)
{	
    uint8_t i;
    uint8_t buff_wr[7];
    static TIME set_time_old;
    
    typSetTime.second = second;
    typSetTime.minute = minute;
    typSetTime.hour   = hour;
    //typSetTime.week   = week;
    typSetTime.day    = day;
    typSetTime.month  = month;
    typSetTime.year   = year;
    
    switch(week)
    {
      case 1:
        {
          typSetTime.week=0x02;
        }break;
      case 2:
        {
          typSetTime.week=0x04;
        }break;
      case 3:
        {
          typSetTime.week=0x08;
        }break;
      case 4:
        {
          typSetTime.week=0x10;
        }break;
      case 5:
        {
          typSetTime.week=0x20;
        }break;
      case 6:
        {
          typSetTime.week=0x40;
        }break;
      case 7:
        {
          typSetTime.week=0x01;
        }break;
      default:
        {
          typSetTime.week=0;
        }break;       
    }
    
    if(typSetTime.second!=set_time_old.second||typSetTime.minute!=set_time_old.minute||typSetTime.hour!=set_time_old.hour||typSetTime.week!=set_time_old.week||
       typSetTime.day!=set_time_old.day||typSetTime.month!=set_time_old.month||typSetTime.year!=set_time_old.year)
      {
        buff_wr[0] = hex_2bcd(typSetTime.second);
        buff_wr[1] = hex_2bcd(typSetTime.minute);
        buff_wr[2] = hex_2bcd(typSetTime.hour);
        buff_wr[3] = typSetTime.week;
        buff_wr[4] = hex_2bcd(typSetTime.day);	
        buff_wr[5] = hex_2bcd(typSetTime.month);
        buff_wr[6] = hex_2bcd(typSetTime.year);
        for(i = 0;i < 7; i++)
        {
          WriteByteAdd(Rx8900sa_ADD,i,buff_wr[i]);
          delay_ms(5);
        }
        set_time_old.second = typSetTime.second;
        set_time_old.minute = typSetTime.minute;
        set_time_old.hour   = typSetTime.hour;
        set_time_old.week   = typSetTime.week;
        set_time_old.day    = typSetTime.day;
        set_time_old.month  = typSetTime.month;
        set_time_old.year   = typSetTime.year;		
      }
    return 1;	
}

/*
*@ Description: 设置闹钟--天设置方式
*@ param 1    :例如:设置18号6点1分出发闹钟报警,则设置Rx8900sa_SetAlarmDay(1,6,18);
*@ param 2
*@ return
*/
uint16_t Rx8900sa_SetAlarmDay(uint8_t minute,uint8_t hour,uint8_t day)
{
    uint8_t i;
    uint8_t buff_wr[4];
    
    typSetAlarmTime.minute = minute;
    typSetAlarmTime.hour   = hour;
    typSetAlarmTime.day    = day;
    
    buff_wr[0] = hex_2bcd(typSetAlarmTime.minute);
    buff_wr[1] = hex_2bcd(typSetAlarmTime.hour);
    buff_wr[2] = hex_2bcd(typSetAlarmTime.day);	

   for(i = 8;i < 11; i++)
   {
       WriteByteAdd(Rx8900sa_ADD,i,buff_wr[i-8]);
       delay_ms(5);
   }
   
   WriteByteAdd(Rx8900sa_ADD,15,0x08);//使能alarm中断信号AIE
   delay_ms(5);
   WriteByteAdd(Rx8900sa_ADD,13,0x40);//寄存器WADA:1设定day  0:设定week报警
   delay_ms(5);
   rx8900sa_ClearAlarmFlag();         //清除报警标志位
   delay_ms(5);
   return 1;	
}


/*
*@ Description: 设置闹钟--周设置方式,WADA=0
*@ param 1    :例如:设置星期一到星期五6点1分出发闹钟报警,则设置Rx8900sa_SetAlarmWeek(1,6,0x3E);
*@ param 2    :week  AE Sat Fri Th Wes Tue Mon Sun
*@ param 3            0   0   1   1  1   1   1   0     = 0x3E
*/
uint16_t Rx8900sa_SetAlarmWeek(uint8_t minute,uint8_t hour,uint8_t week)
{
    uint8_t i;
    uint8_t buff_wr[4];
    
    typSetAlarmTime.minute = minute;
    typSetAlarmTime.hour   = hour;
    typSetAlarmTime.week   = week;
    
    buff_wr[0] = hex_2bcd(typSetAlarmTime.minute);
    buff_wr[1] = hex_2bcd(typSetAlarmTime.hour);
    buff_wr[2] = typSetAlarmTime.week;

   for(i = 8;i < 10; i++)
   {
       WriteByteAdd(Rx8900sa_ADD,i,buff_wr[i-8]);
       delay_ms(5);
   }
   WriteByteAdd(Rx8900sa_ADD,10,buff_wr[2]);
   delay_ms(5);
   WriteByteAdd(Rx8900sa_ADD,15,0x08);//使能alarm中断信号AIE
   delay_ms(5);
   WriteByteAdd(Rx8900sa_ADD,13,0x00);//寄存器WADA:1设定day  0:设定week报警
   delay_ms(5);
   rx8900sa_ClearAlarmFlag();         //清除报警标志位
   delay_ms(5);
   return 1;	
}


/*
*@ Description: 清除中断标志位AF
*@ param 1    :时间到设定闹钟时间后触发报警引脚INT,电平会从高->低,清除标志位AF后,才会进行下次报警
*@ param 2
*@ return
*/
void rx8900sa_ClearAlarmFlag(void)
{
  WriteByteAdd(Rx8900sa_ADD,14,0x40);//清除中断标志位AF,第3位AF清除,第6位保持
}
/*
*@ Description: 读取芯片闹钟寄存器,用于放在循环中做仿真测试使用
*@ param 1    
*@ param 2
*@ return
*/
void Rx8900sa_ReadAlarm(void)
{  		
    uint8_t buff_rd[3];
    uint8_t i;
    for(i = 8; i < 11;i ++)
    {
      buff_rd[i-8] = ReadByteAdd(Rx8900sa_ADD,i);
    }
    typGetAlarmTime.minute = ((buff_rd[0] >> 4) & 0x07) * 10 + (buff_rd[0] & 0x0f);
    typGetAlarmTime.hour   = ((buff_rd[1] >> 4) & 0x03) * 10 + (buff_rd[1] & 0x0f);
    typGetAlarmTime.day    = ((buff_rd[2] >> 4) & 0x03) * 10 + (buff_rd[2] & 0x0f);
    typGetAlarmTime.week   = buff_rd[2];
    
    typGetAlarmTime.AF=ReadByteAdd(Rx8900sa_ADD,14);//读取中断标志寄存器,AF在第3位,0开始计数
    typGetAlarmTime.AIE=ReadByteAdd(Rx8900sa_ADD,15);//读取AIE中断使能寄存器,AIE在第3位
    typGetAlarmTime.WADA=ReadByteAdd(Rx8900sa_ADD,13);//读取WADA中断使能寄存器,WADA在第6位
    if((typGetAlarmTime.AF&0x08)!=0)               //产生闹钟中断,AF=1
    {
        rx8900sa_ClearAlarmFlag();
    }
}

uint8_t GetNowtimeSecond(void)
{
    return typNowTime.second;
}
uint8_t GetNowtimeMinute(void)
{
    return typNowTime.minute;
}
uint8_t GetNowtimeHour(void)
{
    return typNowTime.hour;
}
uint8_t GetNowtimeDay(void)
{
    return typNowTime.day;
}
uint8_t GetNowtimeMonth(void)
{
    return typNowTime.month;
}
uint8_t GetNowtimeYear(void)
{
    return typNowTime.year;
}

/****************************
*       以下为I2C相关函数
*****************************/

/*时钟线状态设置*/
void Set_SCL(uint8_t x)
{
    if(x)
    {
      SCL_H;
    }
    else
    {
      SCL_L;
    }
    delay_us(20);   
}

/*数据线状态设置*/
void Set_SDA(uint8_t x)
{
    if(x)
    {
      SDA_H;
    }
    else
    {
      SDA_L;
    }
    delay_us(20);    
}

/*总线状态初始化*/
void I2Cstart(void)//开始信号
{
    SDA_OUTPUT;
    Set_SCL(1);
    Set_SDA(1);
    Set_SDA(0);
    delay_us(20);
}


/*总线结束*/
void I2Cstop(void)
{
    SDA_OUTPUT;
    Set_SCL(0);
    Set_SDA(0);
    Set_SCL(1);
    Set_SDA(1);
}

/*等待从机应答*/
void I2CResponseAck(void)
{
    uint16_t i = 0;
	
    Set_SCL(1);	 
    SDA_INPUT;
    while((SDA_X)&&(i<2500))
    {
      i++;//如果一段时间内没有收到应答信号,则认为已正确接收到数据?
    }
    Set_SCL(0);
}

void write_byte(uint8_t data)	
{
    uint8_t i;
    SDA_OUTPUT;
    for(i=0;i<8;i++)
    {
      Set_SCL(0);
      if((data&0x80)!=0)	
      { 
        Set_SDA(1);
      }
      else
      {
        Set_SDA(0) ; 
      }				  
      Set_SCL(1);		   
      data=data<<1;
    }
    Set_SCL(0);
}
uint8_t read_byte(void)
{
    uint8_t i,k;
    Set_SCL(0);
    SDA_INPUT; 
    for(i=0;i<8;i++)
    {	
      k=k<<1;
      Set_SCL(1);
      if(SDA_X)
      {	 
        k=k|1;
      }
      Set_SCL(0);
    }  
    return k;
}

/*主机应答回应*/
void I2CSendAck(uint8_t n)
{
    Set_SCL(0);
    SDA_OUTPUT;
    if(n)
    {
      Set_SDA(1);
    }
    else
    {
       Set_SDA(0);
    }
    Set_SCL(1);
}

/*给IIC设备写入一个字节*/
void WriteByteAdd(uint8_t iic_add, uint8_t byte_add, uint8_t data)
{
    I2Cstart();
    write_byte(iic_add);
    I2CResponseAck();
    write_byte(byte_add);
    I2CResponseAck();
    write_byte(data);
    I2CResponseAck();
    I2Cstop();
}

/*读IIC设备一个字节*/
uint8_t ReadByteAdd(uint8_t iic_add, uint8_t byte_add)
{
    uint8_t temp;
    
    I2Cstart();
    write_byte(iic_add);
    I2CResponseAck();
    write_byte(byte_add);
    I2CResponseAck();
    I2Cstart();
    write_byte(iic_add|1);
    I2CResponseAck();
    temp = read_byte();
    I2CSendAck(1);
    I2Cstop();
  
    return temp;
}

“Rx8900sa.h文件”

代码片.

#ifndef   _RX8900SA_H
#define   _RX8900SA_H

#define uint8_t  unsigned char
#define uint16_t unsigned int
#define uint32_t unsigned long

#define Rx8900sa_ADD	 0X64

typedef	struct	TIME_type
{
	unsigned char 	second;		//秒
	unsigned char 	minute;		//分
	unsigned char 	hour;		//小时
    unsigned char 	week;		//周
	unsigned char 	day;		//日
	unsigned char 	month;		//月
	unsigned char 	year;		//年
}TIME;
extern TIME typNowTime,typSetTime;

typedef	struct	ALARM_type
{
	unsigned char 	minute;		//分
	unsigned char 	hour;		//小时
    unsigned char 	week;		//周
	unsigned char 	day;		//日
	unsigned char 	AF;		//中断标志
    unsigned char 	AIE;		//中断使能
    unsigned char 	WADA;		//WADA:1设定day  0:设定week报警
}ALARM;
extern ALARM typSetAlarmTime,typGetAlarmTime;

// The two-wire I2C bus port
#define SCL                BIT5
#define SCL_OUTPUT        (P3DIR |= SCL)
#define SCL_L             (P3OUT &=~SCL)
#define SCL_H             (P3OUT |= SCL)

#define SDA                BIT7
#define SDA_OUTPUT        (P3DIR |= SDA)
#define SDA_INPUT         (P3DIR &=~SDA)
#define SDA_L             (P3OUT &=~SDA)
#define SDA_H             (P3OUT |= SDA)
#define SDA_X             (P3IN&SDA)

extern uint16_t Rx8900sa_SetNowTime(uint8_t second,uint8_t minute,uint8_t hour,uint8_t week,uint8_t day,uint8_t month,uint8_t year);
extern uint16_t Rx8900sa_SetAlarmDay(uint8_t minute,uint8_t hour,uint8_t day);
extern uint16_t Rx8900sa_SetAlarmWeek(uint8_t minute,uint8_t hour,uint8_t week);
extern uint8_t ReadByteAdd(uint8_t iic_add, uint8_t byte_add);
extern void WriteByteAdd(uint8_t iic_add, uint8_t byte_add, uint8_t data);
extern void Rx8900sa_ReadNowTime(void);
extern void Rx8900sa_ReadAlarm(void);
extern void rx8900sa_ClearAlarmFlag(void);
#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爱普生EPSON实时时钟芯片-RX8900SA 的相关文章

  • Unlock PeopleSoft Objects All at Once

    Change control is used in Application Designer to lock definitions and track history changes for each object Change cont
  • 图解NCHW与NHWC数据格式

    图解NCHW与NHWC数据格式 田海立 CSDN CSDN博客 nchw 流行的深度学习框架中有不同的数据格式 典型的有NCHW和NHWC格式 本文从逻辑表达和物理存储角度用图的方式来理解这两种数据格式 最后以RGB图像为例来加深NHWC和
  • Adam优化算法详细解析

    本文转载于以下博客地址 http www atyun com 2257 html 如有冒犯 还望谅解 Adam优化算法是一种对随机梯度下降法的扩展 最近在计算机视觉和自然语言处理中广泛应用于深度学习应用 在引入该算法时 OpenAI的Die
  • 使用nginx实现负载均衡

    一 什么是负载均衡 随着互联网的发展 业务流量越来越大并且业务逻辑也越来越复杂 使用单台机器可能会造成性能问题和单点故障 因此需要多台机器来进行性能的水平扩展以及避免单点故障 为了将不同的用户的流量分发到不同的服务器上面 保持每台机器处理请
  • J-Link RTT调试的初始介绍

    1 RTT简介 RTT全称是Real Time Transmit 实时传输 是Segger公司推出的调试手段之一 它是一种用于嵌入式中与用户进行交互的技术 使用RTT可以从MCU快速输出调试信息和数据 且不影响MCU的实时性 只要支持J L
  • 渲染页到详情页到加入购物车

    1 渲染 拿到数据放在自己的data渲染 data headerList class tabid index active tabid点击时的下标 index是数组下标 active是选中时状态 分类功能 click handfenl it
  • 数据挖掘主要解决的四类问题

    数据挖掘主要解决的四类问题 数据挖掘非常清晰的界定了它所能解决的几类问题 这是一个高度的归纳 数据挖掘的应用就是把这几类问题演绎的一个过程 下面让我们来看看它所解决的四类问题是如何界定的 1 分类问题 分类问题属于预测性的问题 但是它跟普通
  • yolo目标检测图片时,png出问题(花掉),bmp、jpg等其他格式没问题

    yolo做目标检测的时候 当输入图片是png的时候 整个图片会花掉 如图所示 研究了好久 是因为png是8位 bmp jpg是24位 所以要将8位转换成24位 这里参考了 https blog csdn net qq 17130909 ar
  • ORA-01578(数据块损坏) 转

    当Oracle数据库出现坏块时 Oracle会在警告日志文件 alert SID log 中记录坏块的信息 ORA 01578 ORACLE data block corrupted file 7 block
  • wxWidgets简单的多线程

    include
  • vue el-tree:默认展开第几级节点

    需求描述 Tree 树形结构 默认展开第二级菜单 查 element 文档 解决方法 设置 default expanded keys 的值为 idArr 数组
  • JVM——查看full gc频率(jstat -gc)

    问题 如何查看系统的full gc频率 思路 使用JVM工具jstat查看 步骤 1 运行jps获取进程号 jps 2 目标进程9 监控JVM 每5秒打印一次 jstat gc 9 5000 说明 S0C 幸存区1的大小 S1C 幸存区2的
  • 多线程(四)线程的状态及生命周期

    目录 一 线程的状态 新建 初始 就绪 可运行 运行 阻塞 死亡 二 线程的状态转移 NEW RUNNABLE TERMINATED 状态的转移 yield 方法 让出 CPU执行权 三 线程的生命周期 一 线程的状态 NEW 安排了工作
  • Redis数据类型-hash

    一 概述 Redis中hash类型可以具有String key和String value的map容器 所以该类型非常适合存储值对象的信息 如username password和age等 如果hash中包含很少的字段 那么该类型的数据也将仅占
  • 华为无盘服务器,无盘服务器操作系统

    无盘服务器操作系统 内容精选 换一换 本节操作介绍购买云耀云服务器的操作步骤 购买时 为减少您配置参数的时间 部分参数由系统自动分配 以下参数配置供你了解系统的默认配置 购买云耀云服务器仅支持 包年 包月 的计费方式 请您在购买前确保已完成

随机推荐

  • Web实现前后端分离,前后端解耦

    点击上方 Java之间 选择 置顶或者星标 你关注的就是我关心的 作者 山河远阔 来源 https blog csdn net weixin 37539378 article details 79956760 上一篇 面试官 数据量很大 分
  • 蜗牛君漫聊动态布局框架(二):核心功能的思路与实现

    Hello 大家好 我是蜗牛君 我们又见面了 本篇文章是蜗牛君漫聊动态布局框架的第二篇 上一篇中我们讲解了框架的大致思路 以及复习了一下RecyclerView的基础使用方式 那么本篇文章我们就正式开始框架的搭建了 首先我们要做一件事情 就
  • Python出现Could not find a version that satisfies the requirement openpyxl (from versions: )

    一 环境使用python3 7时 用pip安装openpyxl出现如下错误 系统环境 windows10家庭版Python版本 python3 7 1IDE sublime text 3二 解决方案按照提示所示是其中一个原因是pip版本过低
  • GPU对应的cuda以及cuDNN驱动安装

    cudnn 临时个性化版本切换 https blog csdn net sslfk article details 123053540 1 查看自己的cuda 最高支持的版本 查看方法 sudo cat usr local cuda ver
  • Spring到底是一个什么东西呢?

    转自 Spring到底是一个什么东西呢 Spring 自面世以来 一直深受大家的喜爱 它延申出很多优秀的框架 如 Spring framework SpringMVC SpringBoot Spring Cloud Spring Data
  • 那些会阻碍程序员成长的细节[5]

    全文共 1304字 预计阅读时间 4分钟 断断续续的写成一个系列 也出乎我的意料 越展开内容越多 有点收不住 Let s 继续吧 进入主题 不依规范行事 这个很常见 嘴上一套 行动时另一套 也就是知行不一 实际是知易行难 不自我监督 不自我
  • (四)RTL级低功耗设计

    前面介绍了系统级的低功耗设计 换句话说就是在系统级降低功耗可以考虑的方面 系统级的低功耗设计 主要是由系统级设计 具有丰富经验的人员实现 虽然还轮不到我们设计 我们了解一下还是比较好的 我们前端设计人员的重点不在系统级设计上面 而是在RTL
  • webapi添加html页面,webApi添加视图出现/Index.cshtml”处的视图必须派生自 WebViewPage 或 WebViewPage。...

    是因为webApi Views文件夹下缺乏web config文件 从mvc项目相同目录拷贝一个web Config文件放入 删除多余的namespaces 即可 web config配置如下 Index period cshtml 处的视
  • 零基础玩转树莓派(四)—GPIO端口控制(LED灯)

    一 GPIO介绍 树莓派3B 和普通电脑不一样的地方在于它还带了40个可编程的GPIO General Purpose Input Output 可以用来驱动各种外设 如传感器 步进电机等 GPIO General Purpose I O
  • Markdown学习

    标题 Hello world hello world 引用 选择java走向人生巅峰 格式 gt 回车 分割线 回车 图片 图片名字 超链接 格式 链接名字 点击跳转4399游戏 列表 有序列表 格式 数字 空格 无序列表 格式 空格 表格
  • 移植OpenHarmony 3.0到ARM单片机

    9月30日 OpenHarmony 3 0 LTS版本发布 本文将介绍如何移植OpenHarmony 3 0到星空派开发板上 1 星空派开发板介绍 星空派 GD 开发板是由旗点科技推出的一款GD32开发板 板载GD32F303ZET6芯片
  • Linux终端打印

    student myhost echo h h h h h h student myhost echo h h h h h h student myhost echo h h h h h h 我们可以看到echo命令执行完后自带一个换行符并
  • 相关滤波跟踪(MOSSE)

    相关滤波跟踪 MOSSE 在信号处理中 有这么一个概念 相关性 correlation 用来描述两个因素之间的联系 而相关性又分为cross correlation 互相关 两个信号之间的联系 和auto correlation 自相关 本
  • 拍档的快速排序怎么写?

    我可以提供一个快速排序的算法 1 选择一个基准元素 2 遍历数组 将小于基准元素的放入一个新的数组中 将大于基准元素的放入另一个新的数组中 3 递归地 recursively 对小于基准元素的数组和大于基准元素的数组进行排序 4 将排序后的
  • 用jquery插件实现自动添加用户

  • Android-CheckBox和RadioButton调整间距(有坑,注意)

    经常遇到设计师要求button部分和文字的添加间距 总结以下几种方式吧 修改button素材 将button素材周围添加透明区域 缺点 增大图片素材 间距不好控制 文字部分增加空格 缺点 虽然控制相对方便 但是还是受限于字体的样式和大小对于
  • Unity shader 初学 玻璃透明效果

    Properties BumpMap BumpMap 2D Bump CubeMap CubeMap Cube Dist Dist range 0 100 0 Amount Amount range 0 1 0 SubShader Tags
  • typeScript基础类型

    ts基础类型包括 布尔值 数字 字符串 数组 元组 枚举 Any Void Null Undefined Never Object等 1 布尔值 boolean let isDone boolean false 2 数字 number le
  • [深度学习入门]Numpy基础(上)

    目录 一 前言 二 Numpy概述 三 生成Numpy数组 3 1 从已有数据中创建数组 3 2 利用random模块生成数组 3 3 创建特定形状的多维数组 3 4 利用arange和linspace函数生成数组 四 获取元素 五 Num
  • 爱普生EPSON实时时钟芯片-RX8900SA

    爱普生EPSON实时时钟芯片 RX8900SA 一 引脚连接 二 使用方法 寄存器配置 1 实时时间读取 设置 2 闹钟时间读取 设置 三 代码 Rx8900sa c文件 Rx8900sa h文件 一 引脚连接 近期由于项目需求 被指定使用