历史上的今天
返回首页

历史上的今天

今天是:2025年04月04日(星期五)

2020年04月04日 | Huawei_LiteOS——STM32F103+Wifi/lwm2m连接OceanConnect平台

2020-04-04 来源:eefocus

硬件环境:秉火STM32F103


官方例程:Huawei LiteOS + (NB-IoT / WIFI / 2G ) + OceanConnect平台的端云Demo


基础例程:https://download.csdn.net/download/sinat_27066063/10809185


之前移植好的可以在stm32f103运行的Huawei_LiteOS,OS移植过程可参考Huawei_LiteOS——STM32F103移植


移植代码分享:https://download.csdn.net/download/sinat_27066063/10938714


0.备注

Wifi模块使用esp8266

基础例程中断接管方式为系统接管:

对接OC平台使用的是lwm2m协议,可进行上传数据,也可下发命令。lwm2m对接的过程可参考论坛中的这一篇博客:https://bbs.huaweicloud.com/forum/thread-12644-1-1.html

agent_tiny_demo.c文件中可修改设备侧的连接方式,包括IP、端口,上传数据的内容可在app_data_report()函数中更改。


下发命令可在agent_tiny_cmd_ioctl.c文件中的atiny_write_app_write()函数中进行更改。


官方例程中有讲解平台侧和端侧的配置方法,可根据其讲解进行配置。

1.添加文件

第一步


复制官方例程..Huawei_LiteOS_DemoSDK_v10components文件夹(全部文件)替换到基础例程中的文件夹..Usercomponents(官方例程中有些文件改动较大,有些额外添加的文件)。


需要添加到工程中的文件目录如下,目录下所有的源文件都需要添加至工程中:


mbedtls接口:..Usercomponentssecuritymbedtlsmbedtls_port


mbedtls源码:..Usercomponentssecuritymbedtlsmbedtls-2.6.0library


coap文件:..Usercomponentsconnectivitylwm2mcoreer-coap-13


lwm2m文件:..Usercomponentsconnectivitylwm2mcore


atiny适配文件:..Usercomponentsconnectivityagent_tinyosadapter


agent_tiny文件:..Usercomponentsconnectivityagent_tinylwm2m_client


agent_demo文件:..Usercomponentsconnectivityagent_tinyexamples


at适配文件:..Usercomponentsconnectivityat_frame


第二步


复制官方例程..Huawei_LiteOS_DemoSDK_v10driversdeviceswifi文件夹(里面有esp8266的驱动)粘贴到基础例程..Userbsp文件夹下。


复制官方例程..Huawei_LiteOS_DemoSDK_v10targetsNB-IoT_STM32L431RxTx_IoTClubSrcdwt.c文件和..Huawei_LiteOS_DemoSDK_v10targetsNB-IoT_STM32L431RxTx_IoTClubIncdwt.h文件粘贴到基础例程..Userbspdwt文件夹下。


将上面的源文件添加到工程中。


第三步


复制gpio和usart驱动文件至基础例程..Userbsp文件夹下,并将源文件添加到工程中。


其根据系统的需要进行编写,gpio用于控制WiFi使能信号,usart.c与at_hal.c文件进行适配。


全部bsp文件下载地址:https://pan.baidu.com/s/1kz0H9U3thFOifTWyC-10sQ


提取码:8zrg

第四步


添加头文件路径:


..Librariesinc;..User;..Userbspdwt;..Userbspgpio;..Userbspled;..Userbspusart;..Userbspwifi;..Userarcharmarm-minclude;..Usercomponentscmsis;..Usercomponentscmsis1.0;..Usercomponentscmsis2.0;..Userkernelinclude;..Userkernelbaseinclude;..Userkernelextendedinclude;..UserOS_CONFIG;..Usercomponentsconnectivitylwm2mcoreer-coap-13;..Usercomponentsconnectivitylwm2mcore;..Usercomponentsconnectivityagent_tinycomminclude;..Usercomponentsconnectivityagent_tinylwm2m_client;..Usercomponentsconnectivityagent_tinyexamples;..Usercomponentsconnectivityagent_tinyosadapter;..Usercomponentsconnectivityat_frame;..Usercomponentssecuritymbedtlsmbedtls_port;..Usercomponentssecuritymbedtlsmbedtls-2.6.0includembedtls;..Usercomponentssecuritymbedtlsmbedtls-2.6.0include


补充以下宏定义:USE_MBED_TLS,MBEDTLS_CONFIG_FILE=,LWM2M_LITTLE_ENDIAN,LWM2M_CLIENT_MODE,NDEBUG,WITH_AT_FRAMEWORK,USE_ESP8266

2.修改错误

在main.c中添加头文件:


#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#include "los_config.h"

#include "los_base.h"

#include "los_sys.h"

#include "los_typedef.h"

#include "los_hwi.h"

#include "los_task.ph"

#include "los_sem.h"

#include "los_event.h"

#include "los_memory.h"

#include "los_queue.ph"

 

#include "stm32f10x.h"

#include "bsp_led.h"

#include "bsp_usart.h"

#include "dwt.h"

#include "bsp_gpio.h"

 

#include "agent_tiny_demo.h"

#if defined WITH_AT_FRAMEWORK

#include "at_api_interface.h"

#endif

编译后会出现很多个错误,逐个更改。


at_api_interface.h:#include "stm32l4xx_hal.h" 改为 #include "stm32f10x_conf.h"和#include

atiny_adapter.c:#include "stm32f4xx.h"改为#include "stm32f10x.h";#include "stm32f4xx_hal_rng.h"注释掉。

at_hal.h:#include "stm32l4xx_hal.h"改为"stm32f10x_conf.h"。

dwt.h:"stm32l4xx.h"修改为 "stm32f10x.h"。

at_hal.c:at框架与hal层的接口,需要大面积修改,包括修改思路是将原usart的设置替换成自己的库。代码在最后贴出。

atiny_adapter.c:删除extern RNG_HandleTypeDef hrng; STM32F4有一个RNG随机数发生器的功能,在移植的时候为了方便,直接简单带过了哈哈哈,好像也没什么影响:

int atiny_random(unsigned char* output, size_t len)

{

    size_t i;

    uint32_t random_number;

 

    for (i = 0; i < len; i += sizeof(uint32_t))

    {

        random_number = 0xffffffff;

        memcpy(output + i, &random_number,

        sizeof(uint32_t) > len - i ? len - i : sizeof(uint32_t));

    }

 

    return 0;

}

 

3.修改main.c

重新改写main.c文件。


main.c文件中定义全局变量UINT32 g_TskHandle,供创建任务时使用。


main()函数如下,使用creat_main_task()函数创建了主任务,create_task1()函数创建了运行灯任务task1:


int main(void)

{

    UINT32 uwRet = LOS_OK;

 

    HardWare_Init();

 

    uwRet = LOS_KernelInit();

    if (uwRet != LOS_OK)

    {

        return LOS_NOK;

    }

 

    uwRet = create_task1();

    if (uwRet != LOS_OK)

    {

        return LOS_NOK;

    }

    uwRet = creat_main_task();

    if (uwRet != LOS_OK)

    {

        return LOS_NOK;

    }

 

    LOS_Start();

}


其中硬件初始化Hardware_Init()函数代码如下,包括dwt、LED、USART、GPIO:


VOID HardWare_Init(VOID)

{

    /* Initialize all configured peripherals */

    dwt_delay_init(SystemCoreClock);

    LED_Init();

    USART1_Config();

    GPIO_Config();

    printf("Welcome to IoT-Club, This is STM32F103 Board.rn");

}

creat_main_task()函数创建了main_task任务。main_task()函数先进行了AT框架初始化at_api_init()函数。at_api_init()函数分别对at frame和WiFi模块esp8266初始化(分别对应adapter.c文件和esp8266.c文件)。最后agent_tiny_entry()函数进入demo入口:


VOID main_task(VOID)

{

#if defined(WITH_LINUX) || defined(WITH_LWIP)

    hieth_hw_init();

    net_init();

#elif defined(WITH_AT_FRAMEWORK) && defined(USE_ESP8266)

    extern at_adaptor_api at_interface;

    at_api_register(&at_interface);

    at_api_init();

#else

#endif

    //user_hw_init();

    agent_tiny_entry();

}


4.修改esp8266.h

esp8266.h设置了WiFi连接的SSID和密码,需要自行需改。因为移植例程与官方历程都是用usart3进行通信,所以这里不做其他部分修改。另外,如需使用其他的串口或指令不同可进行修改。


5.修改agent_tiny_cmd_ioctl.c

在agent_tiny_cmd_ioctl.c文件中添加头文件"bsp_led.h"。


atiny_write_app_write()函数用于对下发命令做出判断,可对其做出如下修改,控制LED2的开关:


int atiny_write_app_write(void* user_data, int len)

{

    int i;

    char  cmd_data[len];

    memcpy(cmd_data,user_data,len);

  

    printf("################## %s",cmd_data);

    if(strstr(cmd_data,"L_ON")>0) //开补光灯

    {

        LED2_ON();    // 输出高电平

    }

    if(strstr(cmd_data,"L_OFF")>0) //关补光灯

    {

        LED2_OFF();  // 输出低电平

    }

    return ATINY_OK;

}

6.对接数据

7.总结

移植的一个难点在于cotex-M4的库函数到cotex-M3的库函数之间的转化,M4的库添加了很多功能,在移植的时候很多功能只能进行简化改写,因此可能并不像源码那么完善。另外一个难点在于与官方的at_frame相结合,我一直在尝试尽量少的去改写官方源码的代码,最后完成只改动了at_hal.c文件,其余改动均添加在了各个bsp文件中。官方给出的at_frame可以说相当精妙了,很方便,有很高的适配性,只需要移植一遍,便可了解整体框架。后面的协议层也挺给力的,试验一次就成功了。


最后贴出自己改写的at_hal.c文件:


#if defined(WITH_AT_FRAMEWORK)

 

#include "atadapter.h"

#include "bsp_usart.h"

 

extern at_task at;

extern at_config at_user_conf;

 

USART_HandleTypeDef at_usart;

 

//uint32_t list_mux;

 

uint32_t wi = 0;

uint32_t wi_bak= 0;

uint32_t ri = 0;

 

void at_irq_handler(void)

{

    if(USART_GetITStatus(at_usart.Instance, USART_IT_RXNE) != RESET)

    {

        at.recv_buf[wi++] = (uint8_t)(at_usart.Instance->DR & (uint16_t)0x00FF);

        if (wi >= at_user_conf.user_buf_len)wi = 0;

    }

    if (USART_GetITStatus(at_usart.Instance,USART_IT_IDLE) != RESET)

    {

        at.recv_buf[wi++] = (uint8_t)(at_usart.Instance->DR & 0x00FF);

        wi_bak = wi;

        LOS_SemPost(at.recv_sem);

    }

}


void at_usart_config(void)

{

    USART_HandleTypeDef * usart = &at_usart;

    usart->Instance = at_user_conf.usart;

    usart->Init.USART_BaudRate = at_user_conf.buardrate;

    usart->Init.USART_WordLength = USART_WordLength_8b;

    usart->Init.USART_StopBits = USART_StopBits_1;

    usart->Init.USART_Parity = USART_Parity_No;

    usart->Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    usart->Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_GpioInit(usart);

    USART_Init(usart->Instance,&usart->Init);

    USART_ClearFlag(usart->Instance,USART_FLAG_TC);

    LOS_HwiCreate(at_user_conf.irqn, 0, 0, at_irq_handler, 0);

    USART_ITConfig(usart->Instance, USART_IT_IDLE, ENABLE);

    USART_ITConfig(usart->Instance, USART_IT_RXNE, ENABLE);

    USART_Cmd(usart->Instance, ENABLE);

}


void at_transmit(uint8_t * cmd, int32_t len,int flag)

{

uint8_t t;  

char * line_end = at_user_conf.line_end;

//    (void)HAL_UART_Transmit(&at_usart, (uint8_t*)cmd, len, 0xffff);

// if(flag == 1)

//    (void)HAL_UART_Transmit(&at_usart, (uint8_t*)line_end, strlen(at_user_conf.line_end), 0xffff);

for(t=0;t {

USART_SendData(at_usart.Instance,cmd[t]);

while(USART_GetFlagStatus(at_usart.Instance, USART_FLAG_TXE) == RESET);

}

if(flag == 1)

{

for(t=0;t {

USART_SendData(at_usart.Instance,line_end[t]);

while(USART_GetFlagStatus(at_usart.Instance, USART_FLAG_TXE) == RESET);

}

}

}

 

int read_resp(uint8_t * buf)

{

    uint32_t len = 0;

    uint32_t wi = wi_bak;

    uint32_t tmp_len = 0;

    if (NULL == buf){

        return -1;

    }

 

    if (wi == ri){

        return 0;

    }

 

    if (wi > ri){

        len = wi - ri;

        memcpy(buf, &at.recv_buf[ri], len);

    } 

    else 

    {

推荐阅读

史海拾趣

全志(Allwinner)公司的发展小趣事

随着平板市场的逐渐饱和,全志科技开始寻求新的增长点。公司在保持原有产品线优势的同时,积极拓展多品类产品线,实施了营销端BU化,并提出了未来大方向的MANS战略。这一转型不仅增强了公司的市场竞争力,也为公司的长期发展打开了新的局面。

Advanced Detector Corp公司的发展小趣事

随着技术的不断成熟和市场的扩大,ADC开始将业务扩展到更广泛的领域。公司不仅继续深耕探测器领域,还逐渐拓展到传感器、测量仪器等多个领域。通过不断推出多样化的产品,ADC成功满足了不同客户的需求,并在市场上取得了良好的口碑。

Flamar公司的发展小趣事

Flamar公司自成立以来,始终将技术创新视为企业发展的核心驱动力。在电子元件领域,公司研发团队成功开发出一种新型高性能磁耦合传送臂,这一创新产品凭借其高效、稳定的传输性能,在半导体设备制造中迅速获得市场认可。通过不断的技术迭代和优化,Flamar公司的磁耦合传送臂逐渐成为行业内的标杆产品,帮助公司在激烈的市场竞争中脱颖而出。

东科半导体(DK)公司的发展小趣事

随着公司产品的不断升级和市场需求的不断增长,东科半导体(DK)公司开始积极拓展国内外市场。公司加强与全球知名企业的合作,产品成功进入苹果、华为、OPPO等一线品牌的供应链。同时,东科还积极参加国际电子展会和论坛,展示公司的最新技术和产品,提升了公司的品牌知名度和影响力。

Adam Tech公司的发展小趣事

随着电子行业的快速发展,Adam Tech意识到只有不断创新才能在激烈的市场竞争中立于不败之地。因此,公司加大了对研发的投入,不断推出具有创新性的电子连接器产品。同时,公司还积极拓展产品线,从最初的插头、插座逐渐扩展到线束、端子、电缆组件等多个领域。这些举措不仅提升了公司的市场竞争力,也为客户提供了更加丰富的选择。

Fortiming Corporation公司的发展小趣事

背景:2001年9月5日,Fortiming Corporation在内华达州正式成立(来源:企查查)。在成立之初,公司就明确了自己的市场定位——专注于提供高质量的石英晶振、晶体振荡器等频率控制产品。

发展:面对当时竞争激烈的电子行业,Fortiming凭借其对技术的深刻理解和对市场需求的敏锐洞察,迅速在石英晶振领域站稳脚跟。公司不仅注重产品研发,还积极引进先进生产设备,提升产品质量和生产效率。

问答坊 | AI 解惑

CANopen 协议介绍(中文)

CANopen 协议介绍(中文)…

查看全部问答>

不可多得51单片机入门教材

在网上找了N年才找到不可多得51单片机入门教材。如果你是高手就没有必要看了。如果你是入门级的嘿嘿。。。…

查看全部问答>

高功率微波武器即将进入武器库

若干高功率微波(HPM)技术已走向成熟,它们正在从工程与制造阶段向战术武器阶段过渡,目前很可能在进攻伊拉克的战斗中看到首次使用微波武器.本文简要介绍美、英、俄三国发展HPM武器技术的计划,评述了几种典型HPM武器研究的重大进展,最后讨论了HPM武器 ...…

查看全部问答>

NIOS设计过程实例讲解

如果设计稍显复杂,那么对底层细节的过多关注就会成为一种累赘。     试想我们平时在电脑上编写C程序,比如在显示器上输出一行字,我们只用一句printf()即可完成,至于打印命令怎么传到显示芯片上,哪个芯片管脚怎么 变化,又怎么传到显 ...…

查看全部问答>

113586004 已开通了《智能家居系统》讨论群

希望参加《智能家居系统》的网友添加113586004群,在群内讨论问题。 [ 本帖最后由 zhaojun_xf 于 2010-7-31 10:28 编辑 ]…

查看全部问答>

请教各位大大~~~~~关于ARM开发板的选择~~~~~~~~~~

小弟最近想学RAM,之前一直用的51,不能说精通吧,至少基本的原理和应用算是比较熟悉了   现在想买块开发板,看上面置顶区里有个团购STM32的活动,不知道这块板子怎么样啊?   还有就是STM32在ARM里算是什么样的定位?适不适合像我这 ...…

查看全部问答>

调试时出现的奇怪现象Program exit reached

如图,调试时出现的现象,右边绿色DebugBreak,下边蓝色部分Program exit reached,请问大家遇到过没有?怎么解决,现在烧不进程序了。…

查看全部问答>

各位大神

给位大神求教:      与ALPS product No   HSPPARC002传感器功能相似的传感器有什么?国外传感器厂商 …

查看全部问答>

msp430的有用书籍

lz新人,需要芯币,第四个麻烦捧捧场吧之后我编的一些程序会与大家分享的 …

查看全部问答>

晒一下AT88CK490开发板

今天早上,收到了AT88CK490开发板。先简单的晒板,然后就预备开始测试了,最后再和MAXIM的DS28E15DEMOK开发板做个比较。 简洁的说明和包装 开发板正面,类似TI的EZ430那样的U盘风格。整个板就包含了4颗ATMEL的芯片:一个AT90USB1287 MCU、3个 ...…

查看全部问答>