CC1310直接操作寄存器編程

官方 CC13x0 提供的驅動爲了兼容多種器件和操作系統比較抽象,例如串口發送函數是這樣的:

int_fast32_t UART_write(UART_Handle handle, const void *buffer, size_t size)
{
    return (handle->fxnTablePtr->writeFxn(handle, buffer, size));
}

輕易看不出來是如何操作寄存器的,這種方式的驅動文件放在.../source/ti/driver 目錄下面

 

下面通過一個串口收發函數的開發歷程來說明下如何通過直接操作寄存器這種最底層的方式進行程序開發

1. 寄存器定義頭文件

SDK提供的寄存器定義放在 .../source/ti/devices/cc13x0/inc目錄下的一堆頭文件裏,hw_memmap.h文件裏面定義了各個外設的基地址,例如:

#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_PDCTL0,PRCM_PDCTL0_SERIAL_ON_BITN) =1;//SERIAL ON
    }
    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) {
                if(HWREGBITB(UART0_BASE+UART_O_FR,4) == 0) {
              input[0] = HWREGB(UART0_BASE);
              HWREGB(UART0_BASE) = input[0];
           }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章