CC1310有关GPIO外设的配置过程
目錄
- GPIO外設的配置流程
- 引腳初始化
- 引腳的聲明
- 添加引腳聲明
- 引腳初始化
- GPIO初始化
- GPIO外設的實現
- 在gpioPinConfig數組中添加要使用的引腳
- 在gpioCallbackFunctions數組中添加要使用的回調函數
- 添加對應引腳的索引號
- 初始化GPIO外設
- GPIO使用注意事項
GPIO外設的配置流程
我們想要將CC1310芯片的某個引腳配置給GPIO外設使用,那么就必須確保芯片引腳與GPIO外設索引的引腳有正確的對應關系。
GPIO引腳配置的流程大致如下:
它主要分為對應引腳的初始化和對應GPIO外設的初始化。
引腳初始化
首先我們想要將CC1310的某個引腳作為GPIO引腳使用,我們必須要初始化該引腳
引腳的初始化主要可分為上圖中的三個步驟。
引腳的聲明
我這里說的聲明并非像C語言的變量聲明那樣,而是CC1310的例程中,對每個引腳的物理地址都做了預定義,這個預定義我們可以再CC1310_LAUNCHPAD.h文件中看到。
注意這一步并非必須的,這樣做只是方便了我們在編寫程序時可以更加方便的理解程序,并且增強了代碼整體的可移植性。但是如果我們使用這種引腳預定義的聲明方式,那么我們必須要保證我們預定義的名稱指向了我們想用的IO引腳的物理地址。
如下圖所示:
這里再廢話兩句,為什么要添加引腳的預定義:
如果我想使用一個紅色led燈作為CC1310工作狀態的指示燈,并選擇使用IO_0作為一個led燈的輸出引腳,那么我將IO_0的物理地址預定義為CC1310_LAUNCHPAD_PIN_RLED,這樣我們在編寫應用程序時想要改變紅色LED燈引腳電平時,就可以直接調用預定義的名稱,這樣會更加方便我們理解該引腳的作用。如果我們之后想用IO_6作為紅色led燈的輸出引腳,那么只用在這里把IO_0改為IO_6便可以了,而不需要修改我們編寫的應用程序,這便增加了應用程序代碼整體的可移植性。
并且如果之后想要之后再添加一個綠色led燈,來指示CC1310的另外一些工作的狀態,我這里也可以提前預定義出來,并不設定實際的引腳物理地址,這樣方便我們后續繼續擴充程序功能。
添加引腳聲明
我們在預定義了我們想要使用的引腳后,便可以在引腳初始化時使用它了。
但在引腳初始化之前,我們必須配置其相應的屬性,這是在為引腳初始化時,將引腳和對應屬性一起寫入對應寄存器做準備。
我們可以在CC1310_LAUNCHPAD.c文件中找到下面這段代碼:
這段代碼中的PIN_Config表單便是對程序中所有用到的所有引腳進行了屬性配置。
如果我們想要新添加了某些引腳的預定義,便需要在改屬性配置表中添加要使用的引腳名稱,并為其加上我們想要其實現的引腳屬性。
此外,該部分代碼還規定了這些引腳產生的硬件和軟件中斷都是優先級最低的中斷。
引腳初始化
在將要使用的引腳名稱添加到引腳配置表后,便可以使用此表進行引腳的初始化過程了。
引腳的初始化時調用了PIN_init()函數完成的,在TI的例程中,該函數是在main函數中,調用Board_init函數時實現的。
我們點進去Board_init()函數,便可以發現該函數。
/** ======== CC1310_LAUNCHXL_initGeneral ========*/ void CC1310_LAUNCHXL_initGeneral(void) {Power_init();if (PIN_init(BoardGpioInitTable) != PIN_SUCCESS) {/* Error with PIN_init */while (1);}/* Perform board-specific initialization */ // Board_initHook(); }/** ======== Board_init ========*/ void Board_init(void) {CC1310_LAUNCHXL_initGeneral(); }向PIN_init()函數中傳入的PIN_Config表中的引腳都會被配置為GPIO引腳,并具有添加的引腳屬性。
沒有在PIN_Config表中的引腳都會被配置為輸入輸出都失能的狀態。
注意:在同一個應用程序中,PIN_init()不可以被多次調用。
這里我想深究一下,PIN_init函數到底做了什么,表面上來看他是將BoardGpioInitTable數組中的對具體引腳的配置全部初始化到對應GPIO端口上,但是如果我們愿意嘗試一下就會發現,有幾個問題存在
沒有在BoardGpioInitTable數組中配置引腳,但是在gpioPinConfigs數組(這個數組在后面介紹GPIO的部分可以看到)中存在的引腳就可以在GPIO_init后使用GPIO功能
如果我們只使用引腳,不使用GPIO模式,那我們是不是可以不進行不用進行PIN_init,這是不行的,不然PIN_open函數在調用時會卡死
我們在整個程序中用到的引腳不用全部在BoardGpioInitTable中列出,只要在PIN_open函數的數組中或BoardGpioInitTable數組中列出即可。
那么這個PIN_init函數到底對引腳的配置起著怎樣的作用呢,為什么所使用的引腳不用在其輸入數組中提及,但卻又必須盡早調用,且全局僅能調用一次呢?
那我們跳進PIN_init函數中看一看,首先解答問題2,在PIN_init函數釋放了阻塞PIN_open函數的信號量
他之所以重要是因為在其中創建了所有引腳的軟硬件中斷,這寫引腳的信息是從PINCC26XX文件中映射過來的,所以不需要我們在調用PIN_init函數時輸入。同時它也實現了GPIO的上電操作,并可以對寫入BoardGpioInitTable中的引腳完成配置操作,這樣也省去了我們之后再調用GPIO_setConfig函數對使用GPIO的引腳進行單獨配置。(在gpioPinConfigs數組中完成對GPIO引腳的配置也可以起到相同的效果)
GPIO初始化
介紹完PIN初始化后,我們已經可以使用driver/PIN.h文件中提供的API使用這些引腳了,如果我們想要直接使用某些引腳實現IO功能的話可以直接調用PIN_open()函數,但是在有操作系統的應用程序中并不推薦這樣做,因為這并非線程安全的。
上面PIN_init函數會將我們需要的引腳配置為GPIO可用的狀態,但是在想使用這些引腳作為GPIO之前,還需要完成GPIO外設的初始化。
下面有關GPIO配置的操作都是在CC1310_LAUNCHPAD.c文件中完成的。
GPIO外設的實現
有關GPIO的配置信息,都是通過GPIO_Config結構體來保存的,其實例化代碼如下:
const GPIOCC26XX_Config GPIOCC26XX_config = {.pinConfigs = (GPIO_PinConfig *)gpioPinConfigs,.callbacks = (GPIO_CallbackFxn *)gpioCallbackFunctions,.numberOfPinConfigs = CC1310_LAUNCHXL_GPIOCOUNT,.numberOfCallbacks = sizeof(gpioCallbackFunctions)/sizeof(GPIO_CallbackFxn),.intPriority = (~0) };在該結構體的原型在GPIOCC26XX中定義,其中保存了GPIO可以控制的引腳、回調、中斷等信息。
我們要做的便是在對GPIO_Config結構體實話化時,配置我們所用的實際引腳、中斷與結構體的成員完成鏈接(對成員進行實例化賦值)。
在gpioPinConfig數組中添加要使用的引腳
我們想要使用GPIO控制紅色LED燈的電平變化,則將其添加到gpioPinConfig數組中,并加上配置信息,其他預留引腳定義配置也可以添加到數組中,配置信息為NOT_CONFIG。
GPIO_PinConfig gpioPinConfigs[] = {/* Input pins */GPIOCC26XX_DIO_13 | GPIO_DO_NOT_CONFIG, /* Button 0 */GPIOCC26XX_DIO_14 | GPIO_DO_NOT_CONFIG, /* Button 1 */GPIOCC26XX_DIO_15 | GPIO_DO_NOT_CONFIG, /* CC1310_LAUNCHXL_SPI_MASTER_READY */GPIOCC26XX_DIO_21 | GPIO_DO_NOT_CONFIG, /* CC1310_LAUNCHXL_SPI_SLAVE_READY *//* Output pins */GPIOCC26XX_DIO_07 | GPIO_DO_NOT_CONFIG, /* Green LED */GPIOCC26XX_DIO_00 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH , /* Red LED */GPIOCC26XX_DIO_30 | GPIO_DO_NOT_CONFIG, /* TMP116_EN *//* SPI Flash CSN */GPIOCC26XX_DIO_20 | GPIO_DO_NOT_CONFIG,/* SD CS */GPIOCC26XX_DIO_21 | GPIO_DO_NOT_CONFIG,/* Sharp Display - GPIO configurations will be done in the Display files */GPIOCC26XX_DIO_24 | GPIO_DO_NOT_CONFIG, /* SPI chip select */GPIOCC26XX_DIO_22 | GPIO_DO_NOT_CONFIG, /* LCD power control */GPIOCC26XX_DIO_23 | GPIO_DO_NOT_CONFIG, /*LCD enable */};在gpioCallbackFunctions數組中添加要使用的回調函數
我們可以自定義某個引腳的回調函數,但該回調函數的指針需要傳入GPIO_Config結構體中,在GPIO外設中注冊回調函數的對應中斷。
GPIO_CallbackFxn gpioCallbackFunctions[] = {NULL, /* Button 0 */NULL, /* Button 1 */NULL, /* CC1310_LAUNCHXL_SPI_MASTER_READY */NULL, /* CC1310_LAUNCHXL_SPI_SLAVE_READY */ };添加對應引腳的索引號
我們在上面在gpioPinConfig數組中添加的均是使用到的引腳的物理地址和配置信息,但我們想要調用某個引腳,被非要找到這個引腳的物理地址,而只需要將其從儲存它的數組中提取出來即可,也就是我們只需對該數組中的某個元素進行索引,因此我們必須定義與該數組中每個引腳成員對應的索引序號。
關于引腳索引信息的定義,我們是在CC1310_LAUNCHPAD.h文件中實現的,利用共用體完成定義。
其代碼如下:
需要注意的是,我們調用的引腳的索引號必須與該引腳存在于gpioPinConfig數組中的位置保持一致。
初始化GPIO外設
在配置完gpioPIN_Table后,便可以調用GPIO_init()函數來進行GPIO外設的初始化了。
GPIO_init()函數會將我們配置的gpioPIN_Table和中斷表中的引腳名稱,按照其對應的索引號一一存入到GPIO外設的相應寄存器中。
在調用了GPIO_init()函數后,便完成了GPIO的初始化工作,之后便可以調用GPIO.h文件中的API來通過GPIO配置或控制相應的引腳了。
GPIO使用注意事項
(未完待續)~
總結
以上是生活随笔為你收集整理的CC1310有关GPIO外设的配置过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧姆龙NJ系列入门
- 下一篇: 学习笔记(01):SAS数据分析:从入门