一、GPIO使用流程圖
二、函數介紹
三、GPIO 點亮LED
四、代碼下載地址
一、GPIO使用流程圖
這個圖是官網找到的,ML307R GPIO引腳電平默認為1.8V,需注意和外部電路的電平匹配,具體可參考《ML307R_硬件設計手冊_OpenCPU版本適用.pdf》中的描述。
二、函數介紹
SDK中有一個GPIO常規使用方法的demo程序,GPIO demo提供了GPIO參數設置、輸入輸出設置、電平設置和中斷設置等功能示例程序,可在cm_demo_gpio.c文件中查看
2.1 cm_gpio_cfg_t結構體說明
typedef struct{cm_gpio_mode_e mode;/*!< 不支持*/cm_gpio_direction_e direction;cm_gpio_pull_e pull;
} cm_gpio_cfg_t;
這個主要是看 cm_gpio_direction_e direction;和cm_gpio_pull_e pull
cm_gpio_direction_e direction 是設置GPIO是輸入還是輸出
/** I/O方向 */
typedef enum{CM_GPIO_DIRECTION_INPUT = 0,CM_GPIO_DIRECTION_OUTPUT,
}cm_gpio_direction_e;
cm_gpio_pull_e pull 是設置上下拉
/** 上/下拉 */
typedef enum{CM_GPIO_PULL_NONE,CM_GPIO_PULL_DOWN,CM_GPIO_PULL_UP,
}cm_gpio_pull_e;
比如我是要控制lED 閃爍,那么可以配置如下
cm_gpio_cfg_t cfg = {0};cfg.direction = CM_GPIO_DIRECTION_OUTPUT; //配置成輸出cfg.pull = CM_GPIO_PULL_UP; //上拉
2.2 cm_iomux_set_pin_func 函數介紹
* @brief IOMUX 設置引腳復用功能** @param [in] pin PIN 定義號* @param [in] fun FUN 定義號** @return * = 0 - 成功 \n* = -1 - 失敗*/
int32_t cm_iomux_set_pin_func(cm_iomux_pin_e pin, cm_iomux_func_e fun);
此函數第一個參數 cm_iomux_pin_e 是一個枚舉,代表的是那個管腳,這個要和GPIO功能的管腳區分,比如我這里使用GPIO4 控制LED燈,可以查看 “ML307R_OpenCPU資源綜述”手冊 ,LED對應的引腳號是16,所以我們選擇CM_IOMUX_PIN_16,而不是對應的GPIO4,這里需要注意。
第二個參數是復用功能 ,從下圖可以看到GPIO4 是OpenCPU復用功能1,既選擇CM_IOMUX_FUNC_FUNCTION1
2.3? cm_gpio_init介紹
/*** @brief 初始化GPIO* * @param [in] gpio_num GPIO號* @param [in] cfg 配置* * @return * = 0 - 成功 \n* < 0 - 失敗, 返回值為錯誤碼* * @details 初始化之前一定要先設置引腳復用*/
int32_t cm_gpio_init(cm_gpio_num_e gpio_num, cm_gpio_cfg_t *cfg);
第一個參數是cm_gpio_num_e 是指對應的GPIO,LED控制是使用了 GPIO4,既選擇CM_GPIO_NUM_4
第二個參數 cm_gpio_cfg_t,就是上面配置的方向和上下拉
2.4 cm_gpio_set_level函數介紹
/*** @brief 設置輸出電平* * @param [in] gpio_num GPIO號* @param [in] level 輸出電平* * @return * = 0 - 成功 \n* < 0 - 失敗, 返回值為錯誤碼* * @details More details*/
int32_t cm_gpio_set_level(cm_gpio_num_e gpio_num, cm_gpio_level_e level);
這個函數設置對應GPIO 輸出高低電平
第一個參數 cm_gpio_num_e? 對應的GPIO
第二個參數cm_gpio_level_e 對應的是設置的電平
/** 高低電平 */
typedef enum{CM_GPIO_LEVEL_LOW,CM_GPIO_LEVEL_HIGH,
}cm_gpio_level_e;
2.5 cm_gpio_get_level函數介紹
/*** @brief 讀取輸入電平* * @param [in] gpio_num GPIO號* @param [out] level 輸入電平* * @return * = 0 - 成功 \n* < 0 - 失敗, 返回值為錯誤碼* * @details More details*/
int32_t cm_gpio_get_level(cm_gpio_num_e gpio_num, cm_gpio_level_e *level);
這個函數是讀對應的GPIO 電平
第一個參數 cm_gpio_num_e? 對應的GPIO
第二個參數cm_gpio_level_e 對應的是讀的電平
三、GPIO 點亮LED
osTimerId_t gpio_timer_id = NULL;// LED定時器回調函數
void gpio_TimerCallback(void *argument) {static unsigned char i = 0;if(i == 0){cm_gpio_set_level(CM_GPIO_NUM_4, CM_GPIO_LEVEL_LOW);i = 1;}else{cm_gpio_set_level(CM_GPIO_NUM_4, CM_GPIO_LEVEL_HIGH);i = 0;}
}
void gpio_create_timer(void)
{osTimerAttr_t timer_attr = {.name = "Gpio_Timer",
};gpio_timer_id = osTimerNew(gpio_TimerCallback, osTimerPeriodic, NULL, &timer_attr);osTimerStart(gpio_timer_id, 200);
}void gpio_set_output(void)
{cm_gpio_cfg_t cfg = {0};cfg.direction = CM_GPIO_DIRECTION_OUTPUT;cfg.pull = CM_GPIO_PULL_UP;cm_iomux_set_pin_func(CM_IOMUX_PIN_16, CM_IOMUX_FUNC_FUNCTION1);//初始化之前一定要先設置引腳復用cm_gpio_init(CM_GPIO_NUM_4, &cfg);gpio_create_timer();
}void bsp_gpio_init(void)
{gpio_set_output();}
以上就是控制LED燈閃爍,在定時器里面實現 ,實際上是1S閃爍一次
四、代碼下載地址
ML307R OpenCPU GPIO使用 代碼