收藏官网首页
查看: 1491|回复: 0

[经验分享] 机智云协议移植到tencent os

106

主题

107

帖子

7261

积分

论坛元老

Rank: 8Rank: 8

积分
7261
跳转到指定楼层
楼主
 楼主| 发表于 2023-10-4 23:43:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
校园创客福利
    腾讯物联网终端操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率。TencentOS tiny 提供精简的 RTOS 内核,内核组件可裁剪可配置,可快速移植到多种主流 MCU 及模组芯片上。而且,基于RTOS内核提供了丰富的物联网组件,内部集成主流物联网协议栈(如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等),可助力物联网终端设备及业务快速接入腾讯云物联网平台
在tencentos 移植机智云协议,可以为后续腾讯云平台联合机智云平台开发提供便捷的途径。

首先,新建一个项目,选择腾讯os,选择对应的单片机芯片



然后,我们创建Gizwits 和utils文件夹,并且把从机智云平台下载的通用代码对应文件夹内的文件复制进去



然后到编译器里包含对应的文件夹,格式如图所示:



配置对应的串口中断和定时器中断:

  1. void UART5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
  2. void TIM6_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

  3. /* Global Variable */
  4. void Uart5_Init(void){
  5.     GPIO_InitTypeDef  GPIO_InitStructure = {0};
  6.     USART_InitTypeDef USART_InitStructure = {0};
  7.     NVIC_InitTypeDef  NVIC_InitStructure = {0};
  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
  9.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  10.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  14.     GPIO_Init(GPIOC, &GPIO_InitStructure);
  15.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  16.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  17.     GPIO_Init(GPIOD, &GPIO_InitStructure);

  18.     USART_InitStructure.USART_BaudRate = 9600;
  19.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  20.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  21.     USART_InitStructure.USART_Parity = USART_Parity_No;
  22.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  23.     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

  24.     USART_Init(UART5, &USART_InitStructure);
  25.     USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);

  26.     NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
  27.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  28.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  29.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  30.     NVIC_Init(&NVIC_InitStructure);

  31.     USART_Cmd(UART5, ENABLE);

  32. }
  33. void Tim6_init(){
  34.     TIM_TimeBaseInitTypeDef TIM_InitStructure={0};
  35.     NVIC_InitTypeDef  NVIC_InitStructure = {0};
  36.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
  37.     TIM_InitStructure.TIM_Period=1000-1;
  38.     TIM_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;
  39.     TIM_InitStructure.TIM_Prescaler=96-1;
  40.     TIM_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  41.     TIM_TimeBaseInit(TIM6, &TIM_InitStructure);

  42.     TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

  43.     NVIC_InitStructure.NVIC_IRQChannel=TIM6_IRQn;
  44.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  45.     NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
  46.     NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  47.     NVIC_Init(&NVIC_InitStructure);
  48.     TIM_Cmd(TIM6, ENABLE);
  49. }
复制代码



在中断里引用对应机智云需要的函数:



完善机智云对应的函数:

  1. int32_t uartWrite(uint8_t *buf, uint32_t len)
  2. {
  3.     uint32_t i = 0;
  4.    
  5.     if(NULL == buf)
  6.     {
  7.         return -1;
  8.     }
  9.    
  10.     #ifdef PROTOCOL_DEBUG
  11.     GIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);
  12.     for(i=0; i<len; i++)
  13.     {
  14.         GIZWITS_LOG("%02x ", buf[i]);
  15.     }
  16.     GIZWITS_LOG("\n");
  17.     #endif

  18.     for(i=0; i<len; i++)
  19.     {
  20.         //USART_SendData(UART, buf[i]);//STM32 test demo
  21.         //Serial port to achieve the function, the buf[i] sent to the module
  22.         USART_SendData(UART5, buf[i]);
  23.         while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET);
  24.         if(i >=2 && buf[i] == 0xFF)
  25.         {
  26.           //Serial port to achieve the function, the 0x55 sent to the module
  27.           //USART_SendData(UART, 0x55);//STM32 test demo
  28.             USART_SendData(UART5, 0x55);
  29.             while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET);
  30.         }
  31.     }


  32.    
  33.     return len;
  34. }
复制代码


在tencent os里新建任务,任务里运行机智云的线程:

  1. #define TASK1_STK_SIZE       2048
  2. k_task_t task1;
  3. __aligned(4) uint8_t task1_stk[TASK1_STK_SIZE];



  4. void task1_entry(void *arg)
  5. {
  6.     while (1)
  7.     {
  8.         userHandle();
  9.         gizwitsHandle((dataPoint_t *)&currentDataPoint);
  10.         tos_task_delay(10);
  11.     }
  12. }
复制代码


在开始任务调度前初始化数据点,然后启动任务和进程调度:
  1. userInit();
  2.         gizwitsInit();
  3.     tos_knl_init();
  4.     tos_task_create(&task1, "task1", task1_entry, NULL, 3, task1_stk, TASK1_STK_SIZE, 0); // Create task1
  5.     tos_knl_start();
复制代码


效果展示:


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表