ML302-OpenCpu开发-功能开发(四)

本文档详细介绍了ML302开放CPU的开发过程,包括用户入口程序、线程创建、串口初始化、GPIO操作、中断处理、日志等级配置以及ADCPWM等功能的实现。通过示例代码展示了如何使用这些功能,并提到了配置文件的注意事项。此外,还提及了示例程序的改造和联网功能的后续开发。
摘要由CSDN通过智能技术生成

添加源文件

个人喜欢在custom_main目录下 添加用户应用程序,故custom_main.mk 添加编译的源文件。然后将相关源文件拷贝custom_main目录下的src下
添加源文件

中移模组用户入口程序

相当于c语言的main函数入口
在这里插入图片描述

#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

线程建立

创建线程
线程
不能用这个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
串口初始化
个人串口引脚配置

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目录下提供的示例进行改造,示例程序都是基于命令交互方式实现的。只有找到其主要接口函数便可以使用
ADC
PWM

配置文件

配置文件烧写固件时候不会清空所有flash。 原因:flash是芯片自带的,研发有个工具可以擦,但校准数据也会全部被擦了,就无法驻网了,所以擦不了

上一篇:ML302-OpenCpu开发-功能验证

下一篇:ML302-OpenCpu开发-联网功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡諦

你的鼓励是我最大创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值