轉:http://blog.csdn.net/lorain_lynies/article/details/52038640
CSR1010 I/O開發須知:
關於I/O操作的函數庫被定義在頭文件<pio.h>中,查閱函數庫我們需要用到一下幾個函數:
1、設置引腳模式,我們需要將其設為user模式。
- void PioSetModes (uint32 mask, pio_mode mode)
2、設置方向,分為輸入和輸出,這里我們需要將button引腳設置為輸入,led引腳設置為輸出。
- void PioSetDir (uint16 pio, bool output)
3、設置電流相關,對於led引腳需要設置為允許大電流模式,button引腳設置為弱電流模式。
- void PioSetPullModes (uint32 mask, pio_pull_mode mode)
4、設置I/O產生相關事件,此處使用sys_event_pio_changed事件。
- void PioSetEventMask (uint32 mask, pio_event_mode mode)
每次產生事件都會調用下面的系統函數來對事件進行響應,其具體操作由開發者編寫。
- void AppProcessSystemEvent(sys_event_id id, void *data)
5、使用CSR uEnergy SDK進行開發時,沒有main()函數,代碼先執行void AppPowerOnReset(void),然后執行void AppInit(sleep_state last_sleep_state)進行初始化工作,之后由系統事件觸發執行void AppProcessSystemEvent(sys_event_id id, void *data)和bool AppProcessLmEvent(lm_event_code event_code, LM_EVENT_T *event_data)。
示例代碼如下:
- #include <main.h>
- #include <pio.h>
- #include <ls_app_if.h>
- #define PIO_BUTTON 11
- #define PIO_LED0 10
- #define PIO_LED1 4
- #define PIO_DIR_OUTPUT TRUE
- #define PIO_DIR_INPUT FALSE
- void AppPowerOnReset(void)
- {
- }
- void AppInit(sleep_state last_sleep_state)
- {
- PioSetModes((1UL << PIO_LED0) | (1UL << PIO_LED1), pio_mode_user);
- PioSetDir(PIO_LED0, PIO_DIR_OUTPUT);
- PioSetDir(PIO_LED1, PIO_DIR_OUTPUT);
- PioSetPullModes((1UL << PIO_LED0) | (1UL << PIO_LED1), pio_mode_strong_pull_up);
- PioSetMode(PIO_BUTTON, pio_mode_user);
- PioSetDir(PIO_BUTTON, PIO_DIR_INPUT);
- PioSetPullModes((1UL << PIO_BUTTON), pio_mode_weak_pull_up);
- PioSetEventMask((1UL << PIO_BUTTON), pio_event_mode_both);
- }
- void AppProcessSystemEvent(sys_event_id id, void *data)
- {
- if (id == sys_event_pio_changed)
- {
- const pio_changed_data *pPioData = (const pio_changed_data *)data;
- if (pPioData->pio_cause & (1UL << PIO_BUTTON) )
- {
- if (pPioData->pio_state & (1UL << PIO_BUTTON))
- {
- PioSets((1UL << PIO_LED0) | (1UL << PIO_LED1), 0xffffUL);
- }
- else
- {
- PioSets((1UL << PIO_LED0) | (1UL << PIO_LED1), 0UL);
- }
- }
- }
- }
- bool AppProcessLmEvent(lm_event_code event_code, LM_EVENT_T *event_data)
- {
- return TRUE;
- }