一个底层驱动函数的解读

<p>/**************************************************************************<br>
* Description<br>
* Write a byte into some one byte register.<br>
*<br>
* Parameters<br>
* addr : The register's address.<br>
* data : The data.<br>
* Returns<br>
* None.<br>
*<br>
* Return Value List<br>
* void : None.<br>
* Remarks<br>
* None.<br>
**************************************************************************/<br><span style="color: #ff0000;">inline void HAL_PUT_UINT8(volatile UINT8 *addr, UINT8 data)<br>
{<br>
int shft;<br><br>
shft = ((UINT32)addr & 0x03) << 3;<br>
*(UINT32 *)((UINT32)addr & ~3UL) = (<span style="color: #808000;"><span style="color: #3366ff;">*(UINT32 *)((UINT32)addr & ~0x03)</span>
</span>
& ~(0xFF << shft)) | (data << shft);<br>
}</span>
</p>
<p></p>
<p>左移3相当于x8;</p>
<p>addr&0x03相当于对addr除以4取余数(得到一个相当段内偏移的一个值),为什么要对4取余数呢?因为数据在内存中的存放实际上是以4个字节为单位的(有问题),这样可以避免大小端的问题;</p>
<p>addr&~0x03相当于对addr减去了余数,得到一个能被4整除的最大的数,这个数作为地址(相当于段基址),如下图所示:</p>
<p></p>
<p><img alt=""></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>代码中蓝色的部分是原来的数据,与~(0xFF<<shft)会把原来位置上的一个字节的数清空,然后再跟data<<shft相或,即可将data写入指定的位置。</p>
<p></p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值