天天看點

ML302-OpenCpu開發-功能開發(四)添加源檔案中移模組使用者入口程式線程建立序列槽列印初始化GPIO輸出使用GPIO中斷的使用log等級ADC PWM 等其它功能配置檔案

功能開發

  • 添加源檔案
  • 中移模組使用者入口程式
  • 線程建立
  • 序列槽列印初始化
  • GPIO輸出使用
  • GPIO中斷的使用
  • log等級
  • ADC PWM 等其它功能
  • 配置檔案

添加源檔案

個人喜歡在custom_main目錄下 添加使用者應用程式,故custom_main.mk 添加編譯的源檔案。然後将相關源檔案拷貝custom_main目錄下的src下

ML302-OpenCpu開發-功能開發(四)添加源檔案中移模組使用者入口程式線程建立序列槽列印初始化GPIO輸出使用GPIO中斷的使用log等級ADC PWM 等其它功能配置檔案

中移模組使用者入口程式

相當于c語言的main函數入口

ML302-OpenCpu開發-功能開發(四)添加源檔案中移模組使用者入口程式線程建立序列槽列印初始化GPIO輸出使用GPIO中斷的使用log等級ADC PWM 等其它功能配置檔案
#ifdef CM_OPENCPU_MODEL_POC 
	cm_pocAppTaskEntry();
#else
    cm_test_keypad_init();
	cm_test_alarm_init();
    /* 調用cm_test_pwrkey_register()接口後,pwrkey邏輯由使用者實作。預設不調用此接口,pwrkey邏輯由底層實作。*/
    cm_test_pwrkey_register();
#endif
           

線程建立

ML302-OpenCpu開發-功能開發(四)添加源檔案中移模組使用者入口程式線程建立序列槽列印初始化GPIO輸出使用GPIO中斷的使用log等級ADC PWM 等其它功能配置檔案
ML302-OpenCpu開發-功能開發(四)添加源檔案中移模組使用者入口程式線程建立序列槽列印初始化GPIO輸出使用GPIO中斷的使用log等級ADC PWM 等其它功能配置檔案

不能用這個us級延時,這個同級任務不會切換,要用osdelay那個

/*
 * @description:  延時ms // ! 此函數無法延時20ms以下!!! 最好以20的整數倍
 * @param {int} ms_delay
 * @return {*}
 */
void usr_non_block_delay_ms(int ms_delay)
{
    if(ms_delay>20)
    {
        osDelay(ms_delay/20);
    }
    else
    {
        osDelay(1);
    }
}

/*
 * @description: 延時ms // ! 同級線程不能使用ms切換!!!
 * @param {int} us_delay
 * @return {*}
 */
void usr_delay_ms(int ms_delay)
{
    uint32_t sdelay = ms_delay*100*1000;
    do
    {
        __NOP();
    }
    while(sdelay--);
}

/*
 * @description: 延時us // ! 同級線程不能使用us切換!!!
 * @param {int} us_delay
 * @return {*}
 */
void usr_delay_us(int us_delay)
{
    uint32_t sdelay = us_delay*100;
    do
    {
        __NOP();
    }
    while(sdelay--);
}
           

序列槽列印初始化

直接調用demo程式 cm_demo_uart() 函數。 個人喜好:115200 TX:97 RX:98

ML302-OpenCpu開發-功能開發(四)添加源檔案中移模組使用者入口程式線程建立序列槽列印初始化GPIO輸出使用GPIO中斷的使用log等級ADC PWM 等其它功能配置檔案
ML302-OpenCpu開發-功能開發(四)添加源檔案中移模組使用者入口程式線程建立序列槽列印初始化GPIO輸出使用GPIO中斷的使用log等級ADC PWM 等其它功能配置檔案

GPIO輸出使用

#define DEVICE_NET_STA_GPIO18_PIN2              CM_IOMUX_PIN_2_FUNC_GPIO_18         // 網絡狀态燈
#define DEVICE_NET_STA_GPIO18                   18                                  // 網絡狀态燈

#define DEVICE_MOD_STA_GPIO21_PIN79             CM_IOMUX_PIN_79_FUNC_GPIO_21        // 模式訓示燈
#define DEVICE_MOD_STA_GPIO21                   21                                  // 模式訓示燈
           
/*
 * @description: 初始化 網絡訓示燈 模式訓示燈
 * @return {*}
 */
void led_tips_init(void)
{
    cm_gpio_cfg_t cfg = {0};
    cm_gpio_level_e level;
    
    cm_iomux_set_pin_func(DEVICE_NET_STA_GPIO18_PIN2);//初始化之前一定要先設定引腳複用
    cm_iomux_set_pin_func(DEVICE_MOD_STA_GPIO21_PIN79);//初始化之前一定要先設定引腳複

    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;
    cfg.pull = CM_GPIO_PULL_DOWN;
    cm_gpio_init(DEVICE_NET_STA_GPIO18, &cfg);
    cm_gpio_init(DEVICE_MOD_STA_GPIO21, &cfg);
    
    level = CM_GPIO_LEVEL_LOW;
    cm_gpio_set_level(DEVICE_NET_STA_GPIO18, level);
    cm_gpio_set_level(DEVICE_MOD_STA_GPIO21, level);
}
           

GPIO中斷的使用

#define DEVICE_KNOB_GPIO28_PIN100               CM_IOMUX_PIN_100_FUNC_GPIO_28       // 旋鈕
#define DEVICE_KNOB_GPIO28                      28                                  // 旋鈕
           
/*
 * @description: 中斷觸發
 * @return {*}
 */
void gpio_irq_knob_callback(void)
{
    logger_normal("gpio_irq_knob_callback \r\n");
}
           
/*
 * @description: GPIO初始化
 * @return {*}
 */
void gpio_irq_knob_init(void)
{
    cm_gpio_cfg_t cfg = {0};
    cm_gpio_level_e level;

    cfg.direction = CM_GPIO_DIRECTION_INPUT;
    cfg.pull = CM_GPIO_PULL_DOWN;
    
    cm_iomux_set_pin_func(DEVICE_KNOB_GPIO28_PIN100);//初始化之前一定要先設定引腳複用
    
    cm_gpio_init(DEVICE_KNOB_GPIO28, &cfg);
    cm_gpio_interrupt_register(DEVICE_KNOB_GPIO28, gpio_irq_knob_callback);
    cm_gpio_interrupt_enable(DEVICE_KNOB_GPIO28, CM_GPIO_IT_EDGE_FALLING);
}
           

log等級

#define LOG_LEVEL            (1) 	// 1 debug  2 info 3 warn 4 error 5 fatal 6 close log
char g_log_level = LOG_LEVEL;                                       // done 預設log等級
           
#define logger_normal(fmt, arg...) cm_demo_printf(fmt, ##arg)
#define logger_debug(fmt, arg...)  do{if(g_log_level <= 1){cm_demo_printf("[DEBUG]:"fmt,##arg);}}while(0)
#define logger_info(fmt, arg...)   do{if(g_log_level <= 2){cm_demo_printf("[INFO]:"fmt,##arg);}}while(0)
#define logger_warn(fmt, arg...)   do{if(g_log_level <= 3){cm_demo_printf("[WARN]line %d in %s:"fmt,__LINE__,__FILE__,##arg);}}while(0)
#define logger_error(fmt, arg...)  do{if(g_log_level <= 4){cm_demo_printf("[ERROR]line %d in %s:"fmt,__LINE__,__FILE__,##arg);}}while(0)
#define logger_fatal(fmt, arg...)  do{if(g_log_level <= 5){cm_demo_printf("[FATAL]line %d in %s:"fmt,__LINE__,__FILE__,##arg);}}while(0)
           

ADC PWM 等其它功能

examples目錄下提供的示例進行改造,示例程式都是基于指令互動方式實作的。隻有找到其主要接口函數便可以使用

ML302-OpenCpu開發-功能開發(四)添加源檔案中移模組使用者入口程式線程建立序列槽列印初始化GPIO輸出使用GPIO中斷的使用log等級ADC PWM 等其它功能配置檔案
ML302-OpenCpu開發-功能開發(四)添加源檔案中移模組使用者入口程式線程建立序列槽列印初始化GPIO輸出使用GPIO中斷的使用log等級ADC PWM 等其它功能配置檔案

配置檔案

ML302-OpenCpu開發-功能開發(四)添加源檔案中移模組使用者入口程式線程建立序列槽列印初始化GPIO輸出使用GPIO中斷的使用log等級ADC PWM 等其它功能配置檔案

燒寫固件時候不會清空所有flash。 原因:flash是晶片自帶的,研發有個工具可以擦,但校準資料也會全部被擦了,就無法駐網了,是以擦不了

上一篇:ML302-OpenCpu開發-功能驗證

下一篇:ML302-OpenCpu開發-聯網功能

繼續閱讀