一个底层驱动函数的解读

/**************************************************************************

* 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<

你可能感兴趣的:(一个底层驱动函数的解读)