中移ML307R(4G Cat1,C-SDK,OpenCPU)模组学习开发-添加源文件和头文件,工程结构说明(用户必看)

2024-08-15 15:18:43 浏览数 (1)

说明

通过上节的 编译下载和运行第一个程序 咱知道咱是在custom里面写自己的程序;

咱后面写自己的程序的时候可以把.c文件放到src文件夹里面;   .h文件可以放到inc里面

不过可以随意,我一般喜欢把.c和.h放到一块,这样子方便些,后面我都会把文件放到src文件夹里面

custom_main.c 里面的   int cm_opencpu_entry(void * param)      函数是程序的main函数, 程序从这个函数里面开始执行

现在新建.c和.h文件

因为我不喜欢把.c文件和.h文件分开, 所以我直接把.c和.h文件放到src里面

1,在src文件夹右键选择 新建文件

test.c

2,同样在src文件夹新建个test.h文件

3,然后如果要使用test.c 需要在 SConscript 里面添加包含

代码语言:javascript复制
# -*- coding: utf-8 -*-
#====================================================================
#
# Copyright © 2023 China Mobile IOT. All rights reserved.
#
#
#====================================================================


Import('env')
from ModuleBuild import *

module = 'custom_main'  # 模块名,同簇模块不得重名
current_dir = os.path.join(Dir('.').abspath)
target = None


#========================================================
# ram_source_files:运行在ram中
# flash_source_files:运行在flash中
#========================================================
ram_source_files = [#添加.c文件路径(让程序运行在ram中)
    'custom_main/src/custom_main.c',
    'custom_main/src/test.c',
]

flash_source_files = [#添加.c文件路径(让程序运行在flash中,节省内存)
    
]


#========================================================
# public_incs: 在这个里面添加其它模块里面的.h文件的路径
# private_incs:在这个里面添加本模块(custom_main文件夹)里面的 .h文件的路径
#========================================================
public_incs = [
    current_dir   '/../examples/mcu_sys/inc',#这边使用mcu_sys.h是其它模块里面的,所以在这里添加路径
]

private_incs = [
    current_dir   '/custom_main/inc',
    current_dir   '/custom_main/src',#test.h是本模块里面的,所以在这里添加路径
]


#========================================================
# cpp_define:仅适用于本模块,对其他模块不可见
#========================================================
cpp_defines = [
]


#========================================================
# 模块编译
#========================================================
mod = ModuleBuild(env,
        name = module,
        ram_srcs = ram_source_files,
        flash_srcs = flash_source_files,
        pub_incs = public_incs,
        pri_incs = private_incs,
        cpp_define = cpp_defines
)

target = mod.build_object()

Return('target')

现在说一下咱都可以直接写哪些 #include xxxx.h

1,首先这就是个单片机使用的C编译器,所以C库都是可以的

#include <stdint.h>

#include <stdbool.h>

#include <string.h> 

.

.

.

2,然后呢就是厂家内部封装好的库(这些底层都设置好了引用)

咱可以直接在文件里面  #include xxxx.h

3,假设我需要在test里面使用模组的ADC功能, 只需要  #include "cm_adc.h"

4, 然后我就可以使用里的函数了

代码语言:javascript复制
#include "cm_adc.h"


void test(void)
{
    int32_t adc_value=0;

    cm_adc_read(CM_ADC_0, &adc_value);//读取电压
}

5, 除了上面的include里面的,其它地方也有几个直接可以引用的

我只是全方面阐述,知不知道这个无所谓!

标准的思路

1,其实咱们都是在  examples 例子里面找需要的功能,找到自己需要的功能以后看看里面都调用了哪些.h文件咱就调用哪些就可以

2,假设我需要ADC的功能

3,我就可以去掉不必要的之后把需要的拷贝过来

同时我把串口打印改为了使用日志打印(使用日志口打印函数添加 #include "cm_sys.h" 头文件)

代码语言:javascript复制
#include "cm_adc.h"

#include <stdint.h>
#include "cm_adc.h"
#include "cm_os.h"
#include "cm_sys.h"

void test(void)
{
    int32_t voltage=0;
    uint32_t voltage_vbat=0;
    int32_t ret;
    
    ret = cm_adc_vbat_read(&voltage_vbat);
    if(ret != 0)
    {
        cm_log_printf(0, "adc vbate read err,ret=%dn", ret);//串口打印改为了使用日志打印
    }
    cm_log_printf(0, "adc vbate read:%ld(mv)!!n",voltage_vbat);

    //测试ADC0
    ret = cm_adc_read(CM_ADC_0,&voltage);
    if(ret != 0)
    {
        cm_log_printf(0, "adcCM_ADC_0 read err,ret=0xxn", ret);
    }
    cm_log_printf(0, "adc CM_ADC_0 read:%ld(mv)!!n",voltage);
    cm_log_printf(0, "adc test end!!n");
}

现在我需要在 custom_main.c 里面调用test.c里面的 test函数

1,先按照正常写单片机C语言的规定补全 test.h文件

代码语言:javascript复制
#include "test.h"
#include "cm_adc.h"

#include <stdint.h>
#include "cm_adc.h"
#include "cm_os.h"
#include "cm_sys.h"

void test(void)
{
    int32_t voltage=0;
    uint32_t voltage_vbat=0;
    int32_t ret;
    
    ret = cm_adc_vbat_read(&voltage_vbat);
    if(ret != 0)
    {
        cm_log_printf(0, "adc vbate read err,ret=%dn", ret);//串口打印改为了使用日志打印
    }
    cm_log_printf(0, "adc vbate read:%ld(mv)!!n",voltage_vbat);

    //测试ADC0
    ret = cm_adc_read(CM_ADC_0,&voltage);
    if(ret != 0)
    {
        cm_log_printf(0, "adcCM_ADC_0 read err,ret=0xxn", ret);
    }
    cm_log_printf(0, "adc CM_ADC_0 read:%ld(mv)!!n",voltage);
    cm_log_printf(0, "adc test end!!n");
}
代码语言:javascript复制
#ifndef test_h_
#define test_h_

void test(void);

#endif

2,然后就可以调用了

代码语言:javascript复制
#include "custom_main.h"

#include "test.h"

int cm_opencpu_entry(void *param)
{
    (void)param;

    test();

    return 0;
}

编译下载测试

下载的详细步骤用户去看    "编译下载和运行第一个程序"  那节,这里不再详细赘述;

1,编译

双击打开

先清理工程    scons -c

然后按一下键盘的 回车 运行下指令

编译 custom_main 工程

输入命令 scons custom=y   ,然后按回车键执行

2,下载

选择生成的zip文件,然后点击start

先一直按着BOOT按键,然后按一下RST按键, 然后松开RST按键, 最后松开BOOT,此时模组进入了烧录程序模式

烧录成功以后点击 Back返回

3,测试

使用串口模块连接上

复位一下开发板可以看到打印的日志

0 人点赞