一个底层驱动函数的解读

/**************************************************************************
  * Description
  *   Write a byte into some one byte register.
  *
  * Parameters
  *   addr :  The register's address.
  *   data :  The data.
  * Returns
  *   None.
  *
  * Return Value List
  *   void :         None.
  * Remarks
  *   None.
  **************************************************************************/
inline void HAL_PUT_UINT8(volatile UINT8 *addr, UINT8 data)
{
    int shft;

    shft = ((UINT32)addr & 0x03) << 3;
    *(UINT32 *)((UINT32)addr & ~3UL) = (*(UINT32 *)((UINT32)addr & ~0x03) & ~(0xFF << shft)) | (data << shft);
}

 

 左移3相当于x8;

addr&0x03相当于对addr除以4取余数(得到一个相当段内偏移的一个值),为什么要对4取余数呢?因为数据在内存中的存放实际上是以4个字节为单位的(有问题),这样可以避免大小端的问题;

addr&~0x03相当于对addr减去了余数,得到一个能被4整除的最大的数,这个数作为地址(相当于段基址),如下图所示:

 

 

 

 

 

 

代码中蓝色的部分是原来的数据,与~(0xFF<<shft)会把原来位置上的一个字节的数清空,然后再跟data<<shft相或,即可将data写入指定的位置。

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值