一个底层驱动函数的解读

<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 &amp; 0x03) &lt;&lt; 3;<br>
*(UINT32 *)((UINT32)addr &amp; ~3UL) = (<span style="color: #808000;"><span style="color: #3366ff;">*(UINT32 *)((UINT32)addr &amp; ~0x03)</span>
</span>
&amp; ~(0xFF &lt;&lt; shft)) | (data &lt;&lt; shft);<br>
}</span>
</p>
<p></p>
<p>左移3相当于x8;</p>
<p>addr&amp;0x03相当于对addr除以4取余数(得到一个相当段内偏移的一个值),为什么要对4取余数呢?因为数据在内存中的存放实际上是以4个字节为单位的(有问题),这样可以避免大小端的问题;</p>
<p>addr&amp;~0x03相当于对addr减去了余数,得到一个能被4整除的最大的数,这个数作为地址(相当于段基址),如下图所示:</p>
<p></p>
<p><img alt=""></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>代码中蓝色的部分是原来的数据,与~(0xFF&lt;&lt;shft)会把原来位置上的一个字节的数清空,然后再跟data&lt;&lt;shft相或,即可将data写入指定的位置。</p>
<p></p>

你可能感兴趣的:(函数)