中移ML307R(4G Cat1,C-SDK,OpenCPU)模组学习开发-添加源文件和头文件,工程结构说明(用户必看)
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ML307R_OPEN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
通过上节的 编译下载和运行第一个程序 咱知道咱是在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 里面添加包含
# -*- 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, 然后我就可以使用里的函数了
#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" 头文件)
#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=%d\n", 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=0x%08x\n", 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文件
#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=%d\n", 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=0x%08x\n", ret); } cm_log_printf(0, "adc CM_ADC_0 read:%ld(mv)!!\n",voltage); cm_log_printf(0, "adc test end!!\n"); }
#ifndef test_h_ #define test_h_ void test(void); #endif
2,然后就可以调用了
#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,测试
使用串口模块连接上
复位一下开发板可以看到打印的日志
.