当前位置: 首页 > news >正文

猿创征文|中国移动 OneOS 万耦启物开发板支持包(BSP)

猿创征文|中国移动 OneOS 万耦启物开发板支持包

  • 1. 序言
  • 2. BSP目录结构说明
  • 3.例程简介
  • 4. 实验验证
    • 4.1 用户工程
    • 4.2 用户按键部分-标准IO按键例程
    • 4.3 外设部分-蜂鸣器例程
    • 4.4 外设部分-PWM驱动RGB例程
    • 4.5 外设部分-AHT20例程
    • 4.6 外设部分-ESP8266例程
  • bug收集

项目源码地址:【例程】OneOS启物开发板板级支持包(BSP)

1. 序言

本板级支持包(BSP)是基于OneOS官方源码进行二次开发,对本开发板进行适配,方便使用与学习开发的一个源码项目。主要针对中国移动OneOS 启物开发板<以下简称启物开发板>进行更新优化。
在这里插入图片描述

本文档将从BSP目录结构开始,为您讲解整个BSP的结构,与简要的使用示范。
在这里插入图片描述

2. BSP目录结构说明

启物开发板的BPS工程目录基本结构与OneOS基础目录一致,所有的开发板Demo存放于projects目录下,该目录下一同存放例程功能说明。Demo会在未来进行新增、维护。
在这里插入图片描述
关于OneOS 的层级目录关系与主要介绍,可以移步OneOS官网开发文档页面进行详细阅读参考,地址连接为:https://os.iot.10086.cn/doc/。
Demo 的工程目录内容与OneOS官方一致,应用于源码文件存放于 application文件夹下,开发板相关源码存放于board 文件夹下,通过OneOS-Cube进行工程设置,关于如何使用OneOs-Cube也可以在OneOS官网开发文档页面找到对应描述。

3.例程简介

这里我们简要说明相关的例程结构与大致作用:

Demo名称简要说明
oo_Customer_Sample_Project用户工程
01_UserButton_Key_Demo用户按键部分-标准IO按键例程
02_Peripheral_BUZZER_Demo外设部分-蜂鸣器例程
03_Peripheral_RGB_PWM_Demo外设部分-PWM驱动RGB例程
04_Peripheral_AHT20_Demo外设部分-AHT20例程
05_Peripheral_ESP8266_Demo外设部分-ESP8266例程

每个Demo都有详尽的例程说明注释,在使用Demo进行调试前,请务必进行阅读:

// *************************** 例程说明 ***************************
// 
// 测试需要准备 <OneOS 启物开发板> 一块
// 推荐 MDK 版本为 MDK5.28a
// 
// 调试下载需要准备 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器> 一个
// 或者使用 <标准 Jlink> 进行下载调试连接亦可
// 
// 确认连接无误 上电 可使用调试下载器供电 但推荐使用 USB供电 可通过CH340的Type-C进行供电isp下载hex
// 烧录本例程后 如果使用的是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 可以直接在串口助手中打开对应串口
// 如果使用的并不是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>下载bin
// 请接上 CH340 标识的Type-C接口到电脑USB 再打开串口调试助手打开对应串口
// 
// 本工程为用户示例工程 仅开启基础功能
// 
// 打开新的工程或者工程移动了位置务必执行以下操作
// 第一步 关闭上面所有打开的文件
// 第二步 project->clean  等待下方进度条走完
// 
// 2021-08-12	SEEKFREE
// 
// *************************** 例程说明 ***************************

根据不同的Demo,说明内容会有所不一样,相关的提示信息不在这里进行赘述。源码
中有详尽的对应注释,供参考学习使用。

4. 实验验证

本实验一共有六个实验,

4.1 用户工程

  • 核心代码
/**
 ***********************************************************************************************************************
 * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 *
 * @file        main.c
 *
 * @brief       User application entry
 *
 * @revision
 * Date         Author          Notes
 * 2020-02-20   OneOS Team      First Version
 ***********************************************************************************************************************
 */

#include <board.h>
#include <timer/clocksource.h>

// *************************** 例程说明 ***************************
// 
// 测试需要准备 <OneOS 启物开发板> 一块
// 推荐 MDK 版本为 MDK5.28a
// 
// 调试下载需要准备 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器> 一个
// 或者使用 <标准 Jlink> 进行下载调试连接亦可
// 
// 确认连接无误 上电 可使用调试下载器供电 但推荐使用 USB供电 可通过CH340的Type-C进行供电
// 烧录本例程后 如果使用的是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 可以直接在串口助手中打开对应串口
// 如果使用的并不是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 请接上 CH340 标识的Type-C接口到电脑USB 再打开串口调试助手打开对应串口
// 
// 本工程为用户示例工程 仅开启基础功能
// 
// 打开新的工程或者工程移动了位置务必执行以下操作
// 第一步 关闭上面所有打开的文件
// 第二步 project->clean  等待下方进度条走完
// 
// 2021-08-12	SEEKFREE
// 
// *************************** 例程说明 ***************************

static void user_task(void *parameter)
{
	os_int32_t time_count = 1;

	os_task_msleep(1000);
	os_kprintf("\r\nWhat's up?\r\n");
    while (1)
    {
		os_kprintf("%dh %dm %ds was wasted.\r\n", time_count/3600, time_count/60%60, time_count%60);
		time_count++;
		os_task_msleep(1000);
    }
}

int main(void)
{
    os_task_t *task;

    task = os_task_create("user", user_task, NULL, 1024, 3);
    OS_ASSERT(task);
    os_task_startup(task);

    return 0;
}

  • 代码分析
    创建一个task线程,调用user_task函数,然后开始计时打印显示
  • 调试效果
21:01:23.796 -> [0] W/STARTUP: OneOS kernel start, version: Kernel-V2.0.1-20210118 [_k_startup][251]
21:01:23.802 -> 
21:01:23.802 -> 
21:01:23.804 -> sh>
21:01:24.795 -> What's up?
21:01:24.795 -> 0h 0m 1s was wasted.
21:01:25.796 -> 0h 0m 2s was wasted.
21:01:26.796 -> 0h 0m 3s was wasted.
21:01:27.797 -> 0h 0m 4s was wasted.
21:01:28.796 -> 0h 0m 5s was wasted.
21:01:29.795 -> 0h 0m 6s was wasted.
21:01:30.797 -> 0h 0m 7s was wasted.
21:01:31.797 -> 0h 0m 8s was wasted.
21:01:32.796 -> 0h 0m 9s was wasted.
21:01:33.796 -> 0h 0m 10s was wasted.
21:01:35.019 -> 0h 0m 11s was wasted.
21:01:35.797 -> 0h 0m 12s was wasted.
21:01:37.702 -> 0h 0m 13s was wasted.
21:01:37.796 -> 0h 0m 14s was wasted.
21:01:38.796 -> 0h 0m 15s was wasted.
21:01:39.796 -> 0h 0m 16s was wasted.
21:01:40.796 -> 0h 0m 17s was wasted.
21:01:41.796 -> 0h 0m 18s was wasted.
21:01:42.796 -> 0h 0m 19s was wasted.
21:01:43.796 -> 0h 0m 20s was wasted.

4.2 用户按键部分-标准IO按键例程

  • 核心代码
/**
 ***********************************************************************************************************************
 * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 *
 * @file        main.c
 *
 * @brief       User application entry
 *
 * @revision
 * Date         Author          Notes
 * 2020-02-20   OneOS Team      First Version
 ***********************************************************************************************************************
 */

#include <board.h>
#include <timer/clocksource.h>

// *************************** 例程说明 ***************************
// 
// 测试需要准备 <OneOS 启物开发板> 一块
// 推荐 MDK 版本为 MDK5.28a
// 
// 调试下载需要准备 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器> 一个
// 或者使用 <标准 Jlink> 进行下载调试连接亦可
// 
// 确认连接无误 上电 可使用调试下载器供电 但推荐使用 USB供电 可通过CH340的Type-C进行供电
// 烧录本例程后 如果使用的是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 可以直接在串口助手中打开对应串口
// 如果使用的并不是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 请接上 CH340 标识的Type-C接口到电脑USB 再打开串口调试助手打开对应串口
// 
// 按下主板上对应按键后 程序会通过 shell 输出信息
// 
// 本例程示范将 S1初始化为普通IO按键 S2/S3初始化为中断输入按键
// 按下S1会输出按键计数复位信息
// 按下S2会输出按键计数增加信息
// 按下S3会输出按键计数减少信息
// 
// 打开新的工程或者工程移动了位置务必执行以下操作
// 第一步 关闭上面所有打开的文件
// 第二步 project->clean  等待下方进度条走完
// 
// 2021-08-12	SEEKFREE
// 
// *************************** 例程说明 ***************************

void key2_handler (void *args)																// 按键 S2 的回调处理函数
{
	*((os_uint32_t *)args) += 1;															// 按键 S3 触发中断回调 将传参的指针指向的 key_count 加一
}

void key3_handler (void *args)																// 按键 S3 的回调处理函数
{
	*((os_uint32_t *)args) -= 1;															// 按键 S3 触发中断回调 将传参的指针指向的 key_count 减一
}

static void user_task(void *parameter)
{
    os_uint32_t key_count = 0;
    os_uint32_t key_count_last = 0;
	os_uint8_t key_state = 0;

	os_pin_mode(key_table[0].pin, key_table[0].mode);										// 将按键初始化为 普通IO 输入模式 参数详见 bsp/board.c
	os_pin_attach_irq(key_table[1].pin, key_table[1].irq_mode, key2_handler, &key_count);	// 将按键初始化为 中断输入IO 下降沿触发 参数详见 bsp/board.c 关联回调函数 key2_handler 传参 key_count 的地址
	os_pin_attach_irq(key_table[2].pin, key_table[2].irq_mode, key3_handler, &key_count);	// 将按键初始化为 中断输入IO 下降沿触发 参数详见 bsp/board.c 关联回调函数 key3_handler 传参 key_count 的地址
	os_pin_irq_enable(key_table[1].pin, ENABLE);											// 使能按键的中断
	os_pin_irq_enable(key_table[2].pin, ENABLE);											// 使能按键的中断
	key_state = os_pin_read(key_table[0].pin);												// 获取默认的 S1 按键状态

	os_task_msleep(1000);
	os_kprintf("\r\nkey test is running.\r\n");
    while (1)
    {
		if(os_pin_read(key_table[0].pin) != key_state)										// 按键 S1 状态发生变化
		{
			key_count = 0;																	// 清空 key_count 计数
			os_kprintf("key_count was reset.\r\n");											// 通过 shell 输出计数复位提示信息
			os_task_msleep(500);															// 延时 主要是防止反复触发消抖
		}
		key_state = os_pin_read(key_table[0].pin);											// 更新按键 S1 状态

		if(key_count_last != key_count)														// 计数状态变更
		{
			key_count_last = key_count;														// 更新计数状态
			os_kprintf("key_count is %d.\r\n", key_count);									// 输出当前按键计数状态
		}
		os_task_msleep(10);
    }
}

int main(void)
{
    os_task_t *task;

    task = os_task_create("user", user_task, NULL, 1024, 3);
    OS_ASSERT(task);
    os_task_startup(task);

    return 0;
}

  • 代码分析
    本例程示范将 S1初始化为普通IO按键 S2/S3初始化为中断输入按键,按下S1会输出按键计数复位信息, 按下S2会输出按键计数增加信息,按下S3会输出按键计数减少信息
  • 调试效果
21:03:53.587 -> [0] W/STARTUP: OneOS kernel start, version: Kernel-V2.0.1-20210118 [_k_startup][251]
21:03:53.593 -> 
21:03:53.593 -> 
21:03:53.595 -> sh>
21:03:54.588 -> key test is running.
21:03:56.947 -> key_count was reset.
21:03:58.057 -> key_count is 1.
21:04:00.517 -> key_count is 2.
21:04:00.657 -> key_count is 5.
21:04:00.827 -> key_count is 6.
21:04:00.947 -> key_count is 7.
21:04:01.128 -> key_count is 8.
21:04:01.798 -> key_count is 7.
21:04:02.138 -> key_count is 6.
21:04:02.437 -> key_count is 5.
21:04:02.738 -> key_count is 4.
21:04:02.927 -> key_count is 2.
21:04:03.318 -> key_count is 1.
21:04:03.857 -> key_count is -3.

4.3 外设部分-蜂鸣器例程

  • 核心代码
/**
 ***********************************************************************************************************************
 * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 *
 * @file        main.c
 *
 * @brief       User application entry
 *
 * @revision
 * Date         Author          Notes
 * 2020-02-20   OneOS Team      First Version
 ***********************************************************************************************************************
 */

#include <board.h>
#include <timer/clocksource.h>

// *************************** 例程说明 ***************************
// 
// 测试需要准备 <OneOS 启物开发板> 一块
// 推荐 MDK 版本为 MDK5.28a
// 
// 调试下载需要准备 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器> 一个
// 或者使用 <标准 Jlink> 进行下载调试连接亦可
// 
// 确认连接无误 上电 可使用调试下载器供电 但推荐使用 USB供电 可通过CH340的Type-C进行供电
// 烧录本例程后 如果使用的是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 可以直接在串口助手中打开对应串口
// 如果使用的并不是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 请接上 CH340 标识的Type-C接口到电脑USB 再打开串口调试助手打开对应串口
// 
// 本例程示范将 B1初始化为IO控制蜂鸣器
// 跟随时间蜂鸣器间隔会变短
// 最终长鸣后重新开始循环
// 会有信息通过 shell 输出
// 
// 打开新的工程或者工程移动了位置务必执行以下操作
// 第一步 关闭上面所有打开的文件
// 第二步 project->clean  等待下方进度条走完
// 
// 2021-08-12	SEEKFREE
// 
// *************************** 例程说明 ***************************

static void user_task(void *parameter)
{
	os_uint16_t count = 950;

	os_task_msleep(1000);
    os_pin_mode(beep_table[0].pin, PIN_MODE_OUTPUT);

    while (1)
    {
		os_pin_write(beep_table[0].pin, beep_table[0].active_level);
		os_task_msleep(50);
		os_pin_write(beep_table[0].pin, !beep_table[0].active_level);
		os_task_msleep(count);
		os_kprintf("count: %d\r\n",count);

		count -= 10;
		if(count == 0)
		{
			os_kprintf("\r\nBOOM!");
			os_pin_write(beep_table[0].pin, beep_table[0].active_level);
			os_task_msleep(1000);
			os_pin_write(beep_table[0].pin, !beep_table[0].active_level);
			os_task_msleep(1000);
			count = 950;
		}
    }
}

int main(void)
{
    os_task_t *task;

    task = os_task_create("user", user_task, NULL, 1024, 3);
    OS_ASSERT(task);
    os_task_startup(task);

    return 0;
}


  • 代码分析
    本例程示范将 B1初始化为IO控制蜂鸣器, 跟随时间蜂鸣器间隔会变短,最终长鸣后重新开始循环,打印延时时间间隔。
  • 调试效果
21:11:35.211 -> [0] W/STARTUP: OneOS kernel start, version: Kernel-V2.0.1-20210118 [_k_startup][251]
21:11:35.216 -> 
21:11:35.216 -> 
21:11:35.219 -> sh>count: 950
21:11:38.201 -> count: 940
21:11:39.179 -> count: 930
21:11:40.150 -> count: 920
21:11:41.110 -> count: 910
21:11:42.061 -> count: 900
21:11:42.999 -> count: 890
21:11:43.930 -> count: 880
21:11:44.850 -> count: 870
21:11:45.760 -> count: 860
21:11:46.659 -> count: 850
21:11:47.550 -> count: 840
21:11:48.430 -> count: 830
21:11:49.300 -> count: 820
21:11:50.160 -> count: 810
21:11:51.010 -> count: 800
21:11:51.850 -> count: 790
21:11:52.680 -> count: 780
21:11:53.500 -> count: 770

4.4 外设部分-PWM驱动RGB例程

  • 核心代码
/**
 ***********************************************************************************************************************
 * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 *
 * @file        main.c
 *
 * @brief       User application entry
 *
 * @revision
 * Date         Author          Notes
 * 2020-02-20   OneOS Team      First Version
 ***********************************************************************************************************************
 */

#include <board.h>
#include <timer/clocksource.h>

// *************************** 例程说明 ***************************
// 
// 测试需要准备 <OneOS 启物开发板> 一块
// 推荐 MDK 版本为 MDK5.28a
// 
// 调试下载需要准备 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器> 一个
// 或者使用 <标准 Jlink> 进行下载调试连接亦可
// 
// 确认连接无误 上电 可使用调试下载器供电 但推荐使用 USB供电 可通过CH340的Type-C进行供电
// 烧录本例程后 如果使用的是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 可以直接在串口助手中打开对应串口
// 如果使用的并不是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 请接上 CH340 标识的Type-C接口到电脑USB 再打开串口调试助手打开对应串口
// 
// 本例程示范将 A1-A3初始化为IO控制RGB灯珠
// 跟随时间RGB灯珠换色间隔会变短
// 最终常亮白光后重新开始循环
// 会有信息通过 shell 输出
// 
// 打开新的工程或者工程移动了位置务必执行以下操作
// 第一步 关闭上面所有打开的文件
// 第二步 project->clean  等待下方进度条走完
// 
// 2021-08-12	SEEKFREE
// 
// *************************** 例程说明 ***************************

static void user_task(void *parameter)
{
    int i = 0;
	os_uint16_t count = 1000;

    for (i = 0; i < led_table_size; i++)
    {
        os_pin_mode(led_table[i].pin, PIN_MODE_OUTPUT);
        os_pin_write(led_table[i].pin, led_table[i].active_level);
    }
	os_task_msleep(1000);

    while (1)
    {
        for (i = 0; i < led_table_size; i++)
        {
            os_pin_write(led_table[i].pin, !led_table[i].active_level);
            os_task_msleep(count);
            os_pin_write(led_table[i].pin, led_table[i].active_level);
        }
		os_kprintf("count: %d\r\n",count);
		count -= 50;
		if(count == 0)
		{
			os_kprintf("\r\nFlash!");
			for (i = 0; i < led_table_size; i++)
			{
				os_pin_write(led_table[i].pin, !led_table[i].active_level);
			}
			os_task_msleep(1000);
			for (i = 0; i < led_table_size; i++)
			{
				os_pin_write(led_table[i].pin, led_table[i].active_level);
			}
			os_task_msleep(1000);
			count = 1000;
		}
    }
}

int main(void)
{
    os_task_t *task;

    task = os_task_create("user", user_task, NULL, 1024, 3);
    OS_ASSERT(task);
    os_task_startup(task);

    return 0;
}


  • 代码分析
    本例程示范将 A1-A3初始化为IO控制RGB灯珠, 打印打开LED时间,跟随时间RGB灯珠换色间隔会变短,最终常亮白光后重新开始循环。
  • 调试效果
21:21:39.775 -> [0] W/STARTUP: OneOS kernel start, version: Kernel-V2.0.1-20210118 [_k_startup][251]
21:21:39.780 -> 
21:21:39.780 -> 
21:21:39.783 -> sh>count: 1000
21:21:46.623 -> count: 950
21:21:49.324 -> count: 900
21:21:51.874 -> count: 850
21:21:54.274 -> count: 800
21:21:56.524 -> count: 750
21:21:58.624 -> count: 700
21:22:00.574 -> count: 650

4.5 外设部分-AHT20例程

  • 核心代码
/**
 ***********************************************************************************************************************
 * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 *
 * @file        main.c
 *
 * @brief       User application entry
 *
 * @revision
 * Date         Author          Notes
 * 2020-02-20   OneOS Team      First Version
 ***********************************************************************************************************************
 */

#include <board.h>
#include <timer/clocksource.h>
#include <sensors/sensor.h>

// *************************** 例程说明 ***************************
// 
// 测试需要准备 <OneOS 启物开发板> 一块
// 推荐 MDK 版本为 MDK5.28a
// 
// 调试下载需要准备 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器> 一个
// 或者使用 <标准 Jlink> 进行下载调试连接亦可
// 
// 确认连接无误 上电 可使用调试下载器供电 但推荐使用 USB供电 可通过CH340的Type-C进行供电
// 烧录本例程后 如果使用的是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 可以直接在串口助手中打开对应串口
// 如果使用的并不是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 请接上 CH340 标识的Type-C接口到电脑USB 再打开串口调试助手打开对应串口
// 
// 本例程示范将 开发板上AHT20传感器通过软件IIC1总线初始化
// 每间隔一秒输出一次当前温湿度信息
// 相关信息通过 shell 输出
// 
// 打开新的工程或者工程移动了位置务必执行以下操作
// 第一步 关闭上面所有打开的文件
// 第二步 project->clean  等待下方进度条走完
// 
// 2021-08-12	SEEKFREE
// 
// *************************** 例程说明 ***************************

static void user_task(void *parameter)
{
    struct os_sensor_data sensor_data;																				// 新建一个数据存放结构体

	os_task_msleep(1000);
	os_kprintf("\r\nAHT20 test running.\r\n");

	// 为什么 AHT20 需要两个设备 这是因为驱动文件中将其拆分成了两个部分 分别是湿度与温度 注册成了两个设备
    os_device_t *sensor_humi = os_device_find("humi_aht20");														// 通过设备名找到 humi_aht20
    OS_ASSERT(sensor_humi != NULL);																					// 如果没有该设备则报错
    os_device_open(sensor_humi);																					// 找到设备就打开设备
	
    os_device_t *sensor_temp = os_device_find("temp_aht20");														// 通过设备名找到 temp_aht20
    OS_ASSERT(sensor_temp != NULL);																					// 如果没有该设备则报错
    os_device_open(sensor_temp);																					// 找到设备就打开设备

	while(1)
	{
        os_device_read_nonblock(sensor_humi, 0, &sensor_data, sizeof(struct os_sensor_data));						// 通过设备读取数据
        os_kprintf("sensor humi (%d.%03d)%\r\n", sensor_data.data.humi / 1000, sensor_data.data.humi % 1000);		// 将数据通过 shell 输出

        os_device_read_nonblock(sensor_temp, 0, &sensor_data, sizeof(struct os_sensor_data));						// 通过设备读取数据
        os_kprintf("sensor temp (%d.%03d)℃\r\n", sensor_data.data.temp / 1000, sensor_data.data.temp % 1000);		// 将数据通过 shell 输出

		os_task_msleep(1000);
	}
}

int main(void)
{
    os_task_t *task;

    task = os_task_create("user", user_task, NULL, 1024, 3);
    OS_ASSERT(task);
    os_task_startup(task);

    return 0;
}

  • 代码分析
    本例程示范将 开发板上AHT20传感器通过软件IIC1总线初始化, 每间隔一秒输出一次当前温湿度信息
  • 调试效果
21:12:03.928 -> [0] W/STARTUP: OneOS kernel start, version: Kernel-V2.0.1-20210118 [_k_startup][251]
21:12:03.933 -> 
21:12:03.933 -> [0] I/sensor.sensirion.aht20: aht20:[soft_i2c1][0x38] [aht20_init][111]
21:12:03.942 -> [71] I/sensor: os_sensor init success [os_hw_sensor_register][296]
21:12:04.646 -> [99] I/sensor.sensirion.aht20: aht20 temp init success [os_hw_aht20_temp_init][260]
21:12:04.926 -> [100] I/sensor.sensirion.aht20: aht20:[soft_i2c1][0x38] [aht20_init][111]
21:12:04.936 -> [170] I/sensor: os_sensor init success [os_hw_sensor_register][296]
21:12:05.637 -> [198] I/sensor.sensirion.aht20: aht20 baro init success [os_hw_aht20_humi_init][371]
21:12:05.916 -> 
21:12:05.918 -> 
21:12:05.918 -> sh>
21:12:06.919 -> AHT20 test running.
21:12:07.193 -> sensor humi (50.042)%
21:12:07.468 -> sensor temp (26.072)¡æ
21:12:08.741 -> sensor humi (49.559)%
21:12:09.016 -> sensor temp (26.084)¡æ
21:12:10.281 -> sensor humi (49.169)%
21:12:10.556 -> sensor temp (26.106)¡æ
21:12:11.820 -> sensor humi (48.857)%
21:12:12.096 -> sensor temp (26.112)¡æ
21:12:13.361 -> sensor humi (48.557)%
21:12:13.635 -> sensor temp (26.094)¡æ
21:12:14.901 -> sensor humi (48.214)%
21:12:15.176 -> sensor temp (26.067)¡æ
21:12:16.441 -> sensor humi (47.876)%
21:12:16.715 -> sensor temp (26.070)¡æ
21:12:17.981 -> sensor humi (47.640)%

4.6 外设部分-ESP8266例程

  • 核心代码
/**
 ***********************************************************************************************************************
 * Copyright (c) 2020, China Mobile Communications Group Co.,Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 *
 * @file        main.c
 *
 * @brief       User application entry
 *
 * @revision
 * Date         Author          Notes
 * 2020-02-20   OneOS Team      First Version
 ***********************************************************************************************************************
 */

#include <board.h>
#include <timer/clocksource.h>

#include "mo_common.h"
#include "esp8266.h"

// *************************** 例程说明 ***************************
// 
// 测试需要准备 <OneOS 启物开发板> 一块
// 推荐 MDK 版本为 MDK5.28a
// 
// 调试下载需要准备 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器> 一个
// 或者使用 <标准 Jlink> 进行下载调试连接亦可
// 
// 确认连接无误 上电 可使用调试下载器供电 但推荐使用 USB供电 可通过CH340的Type-C进行供电
// 烧录本例程后 如果使用的是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 可以直接在串口助手中打开对应串口
// 如果使用的并不是 <逐飞科技 CMSIS-DAP 调试下载器> 或 <ARM 调试下载器>
// 请接上 CH340 标识的Type-C接口到电脑USB 再打开串口调试助手打开对应串口
// 
// 本例程示范将 开发板上ESP8266WIFI模块通过Molink组件初始化
// 输出自身IP地址 进行Ping测试 
// 然后构建 TCP 连接 并且对远端地址进行收发数据测试
// 相关信息通过 shell 输出
// 
// 需要先行设置 
// OneOS-Cube->Components->Network->Molink->Enable IoT Modules->WiFi Modules Support->ESP8266->ESP8266 Config
// ESP8266 Connect AP SSID 为测试环境的 WiFi 名称/SSID
// ESP8266 Connect AP Password 为测试环境的 WiFi 密码/Password
// 
// 本例程需要一个可以使用网络调试功能的调试助手
// 可以使用 sscom 端口设置为 TCP_Server 并更根据地址更改下方 REMOTE_IP
// 端口默认设置为 8080 端口
// 设置完成后点击侦听准备好测试
// 
// 确认准备完成后烧录程序开始运行测试
// 
// 打开新的工程或者工程移动了位置务必执行以下操作
// 第一步 关闭上面所有打开的文件
// 第二步 project->clean  等待下方进度条走完
// 
// 2021-08-12	SEEKFREE
// 
// *************************** 例程说明 ***************************

#define PING_IP				"192.168.1.110"											// PING 测试的对象地址 这里可以设置为网关 根据测试自行修改
#define REMOTE_IP			"192.168.2.16"											// 远端通信地址 这里设置为测试时使用的的电脑的IP
#define REMOTE_PORT			8080													// 通信端口

static void user_task(void *parameter)
{
	os_err_t molink_result = OS_ERROR;												// 执行状态变量

	mo_object_t *molink_modle = mo_get_by_name(ESP8266_NAME);						// 获取 ESP8266 对象
	OS_ASSERT(molink_modle != OS_NULL);												// 确认对象实例正常

	char molink_data_buffer[16];													// 新建一个缓冲区用来存放 IP 地址
	molink_result = mo_get_ipaddr(molink_modle, molink_data_buffer);				// 获取自身的 IP 地址
	if(molink_result != OS_EOK)														// 判断获取是否成功
	{
		LOG_W("mo_get_ipaddr", "get ipaddr faild.");								// 获取地址失败 输出错误信息
	}
	else
	{
		LOG_I("mo_get_ipaddr", "IP:%s.", molink_data_buffer);						// 获取地址成功 输出 IP 地址信息
	}

	ping_resp_t ping_test_t;														// 新建 ping 测试结构体
	molink_result = mo_ping(molink_modle, PING_IP, 64, 10, &ping_test_t);			// ping 测试
	if(molink_result != OS_EOK)														// 判断是否测试成功
	{
		LOG_W("mo_ping", "ping faild.");											// ping 测试失败 输出错误信息
	}
	else
	{
		LOG_I("mo_ping", "PING IP:%s | LEN:%d | TIME OUT:%d | TIME RESPONSE:%d.", 	// ping 测试成功 输出 ping 结果信息
			inet_ntoa(ping_test_t.ip_addr.addr),									// 将 IP 从数字模式转换为字符串
			ping_test_t.data_len,													// 显示 ping 测试的数据长度
			ping_test_t.ttl,														// 显示超时时长
			ping_test_t.time);														// 显示延迟时间
	}

	mo_netconn_t *test_netconn = mo_netconn_create(molink_modle, NETCONN_TYPE_TCP);	// 新建构建 netceonn 的对象实例 方式为 TCP
	if(test_netconn == OS_NULL)														// 判断是否新建实例成功
	{
		LOG_W("mo_netconn_create", "netconn create faild.");						// 新建实例出错 输出错误信息
	}

    ip_addr_t server_addr = {0};													// 新建一个 IP 地址的缓冲区
    inet_aton(REMOTE_IP, &server_addr);												// 将远端 IP 地址转换为数字形式
	molink_result = mo_netconn_connect(molink_modle, test_netconn, server_addr, REMOTE_PORT);	// 对该地址建立连接
	if(molink_result != OS_EOK)														// 判断是否连接建立成功
	{
		LOG_W("mo_netconn_connect", "netconn connect faild.");						// 建立连接错误 输出错误信息
	}
	else
	{
		LOG_I("mo_netconn_connect", "remote IP:%s.", REMOTE_IP);					// 建立连接成功 输出远端 IP
	}

    os_size_t sent_size = mo_netconn_send(molink_modle, test_netconn, "Hello", 5);	// 对远端发送数据
	if(sent_size != 5)																// 判断发送数据长度跟
	{
		LOG_W("mo_netconn_send", "netconn send faild.");
	}
	else
	{
		LOG_I("mo_netconn_send", "send success.");
	}

    void *data_ptr = OS_NULL;
    os_size_t data_size = 0;
    while (1)
    {
		molink_result = mo_netconn_recv(molink_modle, test_netconn, &data_ptr, &data_size, OS_WAIT_FOREVER);
		if(molink_result != OS_EOK)
		{
			LOG_W("mo_netconn_recv", "netconn recv faild.");
		}
		else
		{
			LOG_I("mo_netconn_recv",
				"Module %s, netconn %d, receive data_len: %d, message: %s.",
				molink_modle->name,
				test_netconn->connect_id,
				data_size,
				data_ptr
			);
			sent_size = mo_netconn_send(molink_modle, test_netconn, data_ptr, data_size);
			if(sent_size != data_size)
			{
				LOG_W("mo_netconn_send", "netconn send faild.");
			}
			else
			{
				LOG_I("mo_netconn_send", "send success.");
			}
		}
    }
}

int main(void)
{
    os_task_t *task;

    task = os_task_create("user", user_task, NULL, 1024*8, 3);
    OS_ASSERT(task);
    os_task_startup(task);

    return 0;
}

  • 代码分析
    // 本例程示范将 开发板上ESP8266WIFI模块通过Molink组件初始化
    // 输出自身IP地址 进行Ping测试
    // 然后构建 TCP 连接 并且对远端地址进行收发数据测试
    // 相关信息通过 shell 输出
    //
    // 需要先行设置
    // OneOS-Cube->Components->Network->Molink->Enable IoT Modules->WiFi Modules Support->ESP8266->ESP8266 Config
    // ESP8266 Connect AP SSID 为测试环境的 WiFi 名称/SSID
    // ESP8266 Connect AP Password 为测试环境的 WiFi 密码/Password
    //
    // 本例程需要一个可以使用网络调试功能的调试助手
    // 可以使用 sscom 端口设置为 TCP_Server 并更根据地址更改下方 REMOTE_IP
    // 端口默认设置为 8080 端口
    // 设置完成后点击侦听准备好测试
  • 调试效果
    我的wifi正常连接,但是tcp无法接入
    在这里插入图片描述
22:02:01.548 -> [0] W/STARTUP: OneOS kernel start, version: Kernel-V2.0.1-20210118 [_k_startup][251]
22:02:01.553 -> 
22:02:01.553 -> [302] I/esp8266.wifi: ESP8266 WIFI disconnected. [urc_connect_func][333]
22:02:04.575 -> [548] I/esp8266.wifi: ESP8266 WIFI connected. [urc_connect_func][328]
22:02:07.039 -> [802] I/esp8266: Auto create esp8266 module object success! [esp8266_auto_create][302]
22:02:09.574 -> 
22:02:09.576 -> sh>[803] I/mo_get_ipaddr: IP:192.168.1.110. [user_task][88]
22:02:09.590 -> [895] E/at.parser: execute command (AT+PING="192.168.1.110") failed, parser->resp_status:2 [at_parser_exec_cmd_valist][248]
22:02:10.517 -> [897] W/mo_ping: ping faild. [user_task][95]
22:02:10.521 -> [1220] E/at.parser: execute command (AT+CIPSTART=0,"TCP","192.168.2.16",8080,60) failed, parser->resp_status:2 [at_parser_exec_cmd_valist][248]
22:02:13.767 -> [1222] E/esp8266.netconn: Module esp8266 connect to 192.168.2.16:8080 failed! [esp8266_netconn_connect][274]
22:02:13.779 -> [1223] W/mo_netconn_connect: netconn connect faild. [user_task][117]
22:02:13.783 -> [1223] E/molink.netconn: Module esp8266 netconn 0 does not connect to server, send failed! [mo_netconn_send][336]
22:02:13.795 -> [1224] W/mo_netconn_send: netconn send faild. [user_task][127]
22:02:13.804 -> 
22:02:13.804 -> [1225] W/esp8266.netconn: Module esp8266 receive close urc data of connect 0 [urc_close_func][479]

bug收集

  • ISP下载模式
    在这里插入图片描述

参照:【OneOS万耦启物】4.复位与解锁

  • JTAG下载出现问题
    在这里插入图片描述
    ,请参考:STM32bug【 KEILMDK中出现Error: Flash Download failed - “Cortex-M3“】
    在这里插入图片描述
  • wifi修改
    在BSP文件下找oneos_config.h,大约在355行。
    在这里插入图片描述

相关文章:

  • PyMol作图:同时显示“Cartoon“ + “Surface“
  • SpringBoot整合Flowable工作流引擎框架
  • 七大排序之快速排序
  • vi vim 笔记心得2209010344
  • 忘记电脑密码的解决方法——使用pe工具重置电脑密码
  • 如何避免死锁呢?
  • Fedora36启用root,并且root直接通过ssh远程连接 2209010539
  • Slipped Conditions
  • 嵌套管程锁死
  • 图解LeetCode——1475. 商品折扣后的最终价格(难度:简单)
  • Java中的锁详解说明
  • GPIO相关介绍
  • 软件工程、软件生命周期、软件定义阶段、需求的层次/特征、概要设计、详细设计
  • 台式机电源更换笔记
  • 从文件资源管理器中隐藏文件
  • 2017年终总结、随想
  • Docker入门(二) - Dockerfile
  • ECMAScript入门(七)--Module语法
  • Koa2 之文件上传下载
  • Nodejs和JavaWeb协助开发
  • php ci框架整合银盛支付
  • Windows Containers 大冒险: 容器网络
  • 阿里云购买磁盘后挂载
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 关于使用markdown的方法(引自CSDN教程)
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 区块链共识机制优缺点对比都是什么
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用putty远程连接linux
  • 我的业余项目总结
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #pragma once
  • #stm32驱动外设模块总结w5500模块
  • #微信小程序:微信小程序常见的配置传旨
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (¥1011)-(一千零一拾一元整)输出
  • (Java数据结构)ArrayList
  • (搬运以学习)flask 上下文的实现
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (一)Neo4j下载安装以及初次使用
  • (译) 函数式 JS #1:简介
  • (转)shell调试方法
  • (转)visual stdio 书签功能介绍
  • *2 echo、printf、mkdir命令的应用
  • ./和../以及/和~之间的区别
  • .NET Core WebAPI中封装Swagger配置
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .net连接oracle数据库
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • []C/C++读取串口接收到的数据程序
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [2023年]-hadoop面试真题(一)
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [Android] Amazon 的 android 音视频开发文档