嵌入式基础

要求

嵌入式基础

代码思路

  • 用uint16_t型(16位)指针time指向该16位寄存器,作为读取和修改寄存器值的通道;
  • 定义一个名为timeOp的位域,结构如下,存储从寄存器中读取的值,修改操作在该位域上进行,修改后的值返回至寄存器中。

int getHours()

  • 首先提取时间地址:时间存放在(基址+2)的16位寄存器中,定义一个时间宏存放地址;
    嵌入式基础

  • 根据结构图,Hours占5位,其地址与时间地址的偏移量为11,因此提取数值的时候将原数值右移11位;

  • 右移后将数值与0x1F(00011111),将数值的低五位提取出来,也就是Hours。

void SetHours (int hours)

  • 将原Hours置0;
  • 将Hours左移11位,其他位为0,这样将左移后的Hours或上一步的时间后,就将Hours设置到新的时间中.

代码

typedef uint16_t u16;  //16位

u16 *time;      
time = OXFFFFC0000 + 2;   //time指针指向该寄存器

struct{                  //定义一个timeOp位域
  unsigned seconds:5,  
  minutes: 6,
  hours: 5;
}timeOp;

timeOp.hours = *time>>11;            //利用time指针将寄存器中的值放至timeOp中
timeOp.minutes = (*time & 0X07E0)>>5;
timeOp.seconds = *time & 0X001F;

/*
* 函数功能:修改寄存器中的Hours部分的值
* 实现方法:修改timeOp位域中hours的值,将位域的值利用time指针,传至寄存器中
*/
void SetHours(int hours)
{
  timeOp.hours = hours;
  *time = (u16)timeOp;  //通过强制转换的方式将值传给time指针,指针将值给寄存器
}

/*
* 函数功能:返回寄存器中hours部分的值
* 实现方法:将timeOp位域中hours的值直接返回即可
*/
int getHours()
{
  return timeOp.hours;
}

上一篇:js 时间格式化


下一篇:为什么中位数sql提取可以考核多种知识点用法,row_number() over(),sum(case when ...end)