一般地,晶元公司都會提供晶元驅動的一些驅動**,以lps25hb 為例,該mems工作時,與主mcu通訊通過iic或者spi的方式進行,從而實現mems的暫存器的讀寫。
為了相容iic和spi的通訊,我們這裡設計兩個基於stm32 hal 庫的的讀寫函式platform_write()、platform_read():
static
int32_t
platform_write
(void
*handle,
uint8_t reg,
uint8_t
*bufp,
uint16_t len)
#ifdef mki109v2
else
if(handle ==
&hspi2)
else
if(handle ==
&hspi1)
#endif
return0;
}static
int32_t
platform_read
(void
*handle,
uint8_t reg,
uint8_t
*bufp,
uint16_t len)
#ifdef mki109v2
else
if(handle ==
&hspi2)
else
#endif
return0;
}
typedef
int32_t
(*lps25hb_write_ptr)
(void*,
uint8_t
,uint8_t*,
uint16_t);
typedef
int32_t
(*lps25hb_read_ptr)
(void*,
uint8_t
,uint8_t*,
uint16_t);
typedef
struct
lps25hb_ctx_t;
這樣我們定義了乙個結構體lps25hb_ctx_t,該結構體中設計了三個指標。通過宣告乙個該結構體的變數,將變數的成員指向統一的讀寫結構函式。
/* initialize mems driver inte***ce */
lps25hb_ctx_t dev_ctx;
dev_ctx.write_reg = platform_write;
dev_ctx.read_reg = platform_read;
dev_ctx.handle =
&hi2c1;
這樣mems 的驅動介面就實現了。但是為了程式更好的可讀性,我們需要將mems 暫存器讀寫的具體功能函式進一步實現。
這裡我們設計與上層介面函式無關的暫存器讀寫函式,利用還函式實現mems內部所有暫存器的讀寫。
/**
* @brief read generic device register
* * @param ctx read / write inte***ce definitions(ptr)
* @param reg register to read
* @param data pointer to buffer that store the data read(ptr)
* @param len number of consecutive register to read
* @retval inte***ce status (mandatory: return 0 -> no error)
* */
int32_t
lps25hb_read_reg
(lps25hb_ctx_t* ctx,
uint8_t reg,
uint8_t
* data,
uint16_t len)
/** * @brief write generic device register
* * @param ctx read / write inte***ce definitions(ptr)
* @param reg register to write
* @param data pointer to data to write in register reg(ptr)
* @param len number of consecutive register to write
* @retval inte***ce status (mandatory: return 0 -> no error)
* */
int32_t
lps25hb_write_reg
(lps25hb_ctx_t* ctx,
uint8_t reg,
uint8_t
* data,
uint16_t len)
這樣,我們就實現了介面函式的對應關係
於是,我們可以根據mems的暫存器表進行相關的暫存器讀寫設計了。
如:
/**
* @brief the reference pressure value is a 24-bit data expressed as 2』s
* complement. the value is used when autozero or autorifp function
* is enabled.[set]
* * @param ctx read / write inte***ce definitions.(ptr)
* @param buff buffer that contains data to write
* @retval inte***ce status (mandatory: return 0 -> no error).
* */
int32_t
lps25hb_pressure_ref_set
(lps25hb_ctx_t *ctx,
uint8_t
*buff)
/** * @brief the reference pressure value is a 24-bit data expressed as 2』s
* complement. the value is used when autozero or autorifp function
* is enabled.[get]
* * @param ctx read / write inte***ce definitions.(ptr)
* @param buff buffer that stores data read.(ptr)
* @retval inte***ce status (mandatory: return 0 -> no error).
* */
int32_t
lps25hb_pressure_ref_get
(lps25hb_ctx_t *ctx,
uint8_t
*buff)
4、暫存器的資料描述:
暫存器表的資料描述包括 define 定義、結構體資料型別定義、列舉變數的定義
例如:
#define lps25hb_ctrl_reg1 0x20u
typedef
struct
lps25hb_ctrl_reg1_t;
#define lps25hb_ctrl_reg2 0x21u
typedef
struct
lps25hb_ctrl_reg2_t;
#define lps25hb_ctrl_reg3 0x22u
typedef
struct
lps25hb_ctrl_reg3_t;
#define lps25hb_ctrl_reg4 0x23u
typedef
struct
lps25hb_ctrl_reg4_t;
typedef
enum
lps25hb_f_mode_t;
這樣,依賴這些個暫存器變數的描述,設計相關的具體的某乙個暫存器讀寫函式,mems 的驅動程式**就可以輕鬆實現了。 通用暫存器 記憶體讀寫
暫存器的結構 eax 的一半為 ax ax 的一半為 al ax就是eax的一部分 al就是ax的一部分 低位 ah就是ax的一部分 高位 8位暫存器只能放2個十六進製制的數 乙個位元組 彙編指令 mov,add,sub,and,or,xor,not 計算機記憶體的每乙個位元組會有乙個編號 即記憶體...
Linux下讀寫暫存器
arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...
Linux下讀寫暫存器
arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...