天天看点

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开发-联网功能

继续阅读