官方 cc13x0 提供的驅動為了相容多種器件和作業系統比較抽象,例如串列埠傳送函式是這樣的:
int_fast32_t uart_write(uart_handle handle, const void *buffer, size_t size)
輕易看不出來是如何操作暫存器的,這種方式的驅動檔案放在.../source/ti/driver 目錄下面
下面通過乙個串列埠收發函式的開發歷程來說明下如何通過直接操作暫存器這種最底層的方式進行程式開發
1. 暫存器定義標頭檔案
#define uart0_base 0x40001000 // uart
各個外設對應的標頭檔案裡面定義了每個暫存器的偏移位址,例如hw_uart.h裡面定義了
#define uart_o_ctl 0x00000030
2.暫存器讀寫
hw_types.h裡面定義了暫存器的讀寫函式
// word (32 bit) access to address x
// read example : my32bitvar = hwreg(base_addr + offset) ;
// write example : hwreg(base_addr + offset) = my32bitvar ;
#define hwreg(x) \
(*((volatile unsigned long *)(x)))
3. 乙個串列埠自收自發完整示例**如下:
hwregb(prcm_base+prcm_o_uartclkgr)=1; //uartclkgr 使能
hwregb(prcm_base+prcm_o_uartclkgs)=1; //uartclkgs 使能
hwregb(prcm_base+prcm_o_uartclkgds)=1; //uartclkgds 使能
while(!(hwregbitw(prcm_base+prcm_o_pdstat0,prcm_pdstat0_serial_on_bitn)))
hwregbitw(prcm_base+prcm_o_clkloadctl,prcm_clkloadctl_load_bitn) =1;//load enable
//ioc暫存器使能
hwreg(ioc_base+ioc_o_iocfg2) =0x2000600f;
hwreg(ioc_base+ioc_o_iocfg3) =0x00006010;
//uart 波特率設定
//hwregbitw(uart0_base+uart_o_ctl,uart_ctl_uarten_bitn) =0;
hwregb(uart0_base+uart_o_ctl) =0;
hwregh(uart0_base+uart_o_ibrd) =0x1a;
hwregb(uart0_base+uart_o_fbrd) =0x3;
hwregb(uart0_base+uart_o_lcrh) =0x70;
hwregh(uart0_base+uart_o_ctl) =0x0301;
/* loop forever echoing */
while (1)
暫存器直接操作
include include include include include include static unsigned int major static struct device led dev static struct class led class static volatile u...
暫存器對映與直接操作暫存器
一 儲存器對映 與重對映 儲存器本身不具有位址資訊,它的位址是由晶元廠商或使用者分配,給 物理儲存器分配 邏輯位址的過程就稱為儲存器對映 通過這些邏輯位址就可以訪問到相應的儲存器的物理儲存單元。如果給儲存器再分配乙個位址就叫儲存器重對映。如stm32,對於 片上外設,它們以四個位元組為乙個單元,共3...
位操作(暫存器)
stm32中cpu是32位的。最方便快捷的方法是直接操作32位的位址,對某個位址直接賦值是最快的操作,只需要乙個指令。附錄1 在32位的系統中 1字 word 4位元組 byte 1位元組 byte 8位 bit 1b 8bit 1kb 1024b 2 10b 1mb 1024kb 1gb 1024...