物联网智能家居DIY_TC32系列文章目录

1. 环境搭建与点灯
2. TC32透传解析

文章目录

  • 物联网智能家居DIY_TC32系列文章目录
  • 一、前言
  • 二、前置条件
  • 三、本文参考资料
  • 四、正文部分
    • 4.1 GPIO初始化
    • 4.2 点灯逻辑分析
    • 4.3 TC32_SDK分析

一、前言

  上回说到已经完成TC32的点灯,现在结合BLE_AT例程里的串口透传,搞一个小程序点灯。
  主要分为两个部分:TC32端,与微信小程序端。
  本篇文章主要记录TC32端的修订实现,目前还没办法完全理解整个AT例程的框架,只知道如何修改代码以实现小程序点灯功能
  小程序直接选用安信可教程上提供的例程,下一篇将介绍如何进行二次修改。


二、前置条件

  UB18 + TC32 + 串口线


三、本文参考资料

  SDK源码与注释


四、正文部分

4.1 GPIO初始化

  在上一篇的blink例程中可以得到TC32的GPIO初始化还是比较简单的。
  GPIO共有以下几种模式:
    GPIO / MSPI / SWIRE / UART / I2C / SPI / I2S / AMIC / DMIC / SDM / USB / ADC / CMP / ATS / PWM / PWM_N
    
  将IO口设为输出模式只需要以下几个步骤:
    1. 将GPIO口设为GPIO模式
    2. 使能output并禁能input
    3. 最后将电平写入GPIO即可
      gpio_write(GPIO_PC2, 0);
      
  将IO口设为输入模式只需要以下几个步骤:
    1. 将GPIO口设为GPIO模式
    2. 设置为上拉或下拉模式,同时设置相应电阻
      PM_PIN_PULLUP_1M / PM_PIN_PULLDOWN_100K / PM_PIN_PULLUP_10K
    3. 使能input并禁能output
    4. 最后读取电平状态即可
      gpio_read(GPIO_PD2)

void user_init()
{gpio_set_func(GPIO_PC2, AS_GPIO);/* 将PC2设为输出模式 */gpio_set_output_en(GPIO_PC2, 1);gpio_set_input_en(GPIO_PC2, 0); gpio_set_func(GPIO_PD2, AS_GPIO);gpio_setup_up_down_resistor(GPIO_PD2, PM_PIN_PULLUP_10K);gpio_set_output_en(GPIO_PD2, 0);gpio_set_input_en(GPIO_PD2, 1);
}

4.2 点灯逻辑分析

  AT例程主要分为两种模式,一个是BLE未连接时的AT模式,和BLE连接上后的透传模式。
  由于我们需要实现的是小程序点灯,即小程序与TC32是通过BLE联系的,所以我们只需要在起机时对led灯的GPIO进行初始化后,使用小程序连接上TC32,最后在透传模式的代码新增对来自小程序的数据进行解析的功能即可。
  源码内是直接将小程序的数据通过串口直接打印,我们只需要将收到的字符串进行解析,当满足某种人为规定的条件时,将led灯打开或关闭。
  

4.3 TC32_SDK分析

  既然找到了修改的地方,那就顺藤摸瓜反向整理一下整个系统流吧

int main (void)1. blc_pm_select_internal_32k_crystal();              //确定唤醒源是否为内部32k RC2. cpu_wakeup_init();                                 //初始化MCU3. int deepRetWakeUp = pm_is_MCU_deepRetentionWakeup();    //获取MCU深度保留唤醒4. rf_drv_init(RF_MODE_BLE_1M);                            //启动射频模式5. gpio_init( !deepRetWakeUp );                         //初始化GPIO口(非初始化具体GPIO的模式)6. clock_init(SYS_CLK_16/24/32M_Crystal);                //时钟初始化7. blc_app_loadCustomizedParameters();                   //加载自定义频率偏移上限值8. tinyFlash_Init(0x70000,0x4000);                        //初始化KV存储系统9. 若非深度睡眠模式tinyFlash_Read(STORAGE_BAUD, baud_buf, &len); //读取波特率tinyFlash_Read(STORAGE_ATE, &ATE, &len);     //读取ATEtinyFlash_Read(STORAGE_MODE, &device_mode, &len);//读取ATE/**************************************//* 此处开始为可根据实际情况进行修改的部分 */10. app_uart_init(baud_buf[0]);                         //初始化串口11. my_gpio_init();                                      //初始化GPIO12. blt_soft_timer_init();                             // 初始化定时器13. 若非深度睡眠模式判断从步骤9获得的设备模式device_mode若为主机模式(1)ble_master_init_normal();若为从机模式(0)ble_slave_init_normal();13.1 初始化随机数生成器random_generator_init();13.2 BLE协议栈初始化13.2.1 根据传入的flash地址获取公共mac地址与随机静态地址blc_initMacAddress(CFG_ADR_MAC, mac_public, mac_random_static);app_own_address_type13.2.2 Controller初始化blc_ll_initBasicMCU();                      //强制性的blc_ll_initStandby_module(mac_public);      //强制性的blc_ll_initAdvertising_module(mac_public);    //adv模块:BLE从机必须安装,blc_ll_initConnection_module();             //连接模块:BLE从/主设备必须安装blc_ll_initSlaveRole_module();                //从机模块:BLE从机必须,13.2.3 Host初始化gap(通用访问控制配置文件)初始化blc_gap_peripheral_init();gatt(通用属性配置文件)初始化(这个函数非常重要!!!!!!!!!!)my_att_init();设置MTU为247blc_att_setRxMtuSize(247);l2cap(链路控制和适配层)初始化blc_l2cap_register_handler(blc_l2cap_packet_receive);SMP(安全管理)初始化(Smp初始化可能涉及闪存写入/擦除,因此必须在电池检查后进行)(当一个扇区存储太多信息,即将超过扇区阈值时,必须擦除该扇区,并重新存储所有有用信息)#if (BLE_REMOTE_SECURITY_ENABLE)blc_smp_peripheral_init();#elseblc_smp_setSecurityLevel(No_Security);#endif13.3 用户应用层初始化...14. irq_enable();                                       //使能中断15. while (1)                                         //主循环15.1 若使能了看门狗,则清除看门狗wd_clear();15.2 sdk主循环?仅对外提供了一个接口,没描述实现blt_sdk_main_loop();15.3 若当前为主机模式,则进入主机主循环ble_master_mainloop();15.4 串口循环,即用户层UART循环收发数据app_uart_loop();若此时fifo中存在数据,获取并处理数据data = my_fifo_get(&uart_rx_fifo)若此时蓝牙未连接 或 PC5为低电平时需响应AT指令device_in_connection_state == 0 || gpio_read(CONTROL_GPIO) == 0)解析处理并响应fifo中的AT命令at_data_process((char*)(p->data), p->dma_len);a. 过滤 \r \nb. 解析AT命令对应的模式(查询/设置/帮助)mode = data_process_cmd_mode(pbuf);c. AT命令分析与执行data_process_parse(pbuf + 3, mode, len-3)result = cmd_ptr->cmd_handle(ps, mode, dataLen);否则认为当前蓝牙已连接,进入透传模式将数据经由BLE发送出去bls_att_pushNotifyData(SPP_SERVER_TO_CLIENT_DP_H, p->data, p->dma_len);fifo读写时钟同步my_fifo_pop(&uart_rx_fifo);f->rptr++;rptr:要同步到读时钟域的写指针(写时钟)15.5 软件定时器进程blt_soft_timer_process(MAINLOOP_ENTRY);

  步骤13的BLE协议栈部分放在之后的博客上单独拎出来分析吧。。这部分就是整个BLE的核心内容,可以结合这个图进行理解,目前还不太懂。。
  


物联网智能家居DIY_TC32篇(2) BLE_AT透传串口点灯相关推荐

  1. 物联网智能家居DIY_TC32篇(1) 环境搭建与点灯

    物联网智能家居DIY_TC32系列文章目录 1. 环境搭建与点灯 文章目录 物联网智能家居DIY_TC32系列文章目录 一.前言 二.前置条件 三.本文参考资料 四.正文部分 4.1 UB运行环境搭建 ...

  2. 物联网智能家居DIY_Linux篇(1) 使用串口线传输文件

    文章目录 一.前言 二.前置条件 三.本文参考资料 四.正文部分 4.1 格式化U盘 4.2 移植lrzsz到开发板中 4.2.1 获取源码 4.2.2 获取源码将源码放入虚拟机中进行解压 4.2.3 ...

  3. esp8266 蓝牙耳机_走进物联网智能家居-手把手带你制作wifi智能开关-ESP8266学习笔记(二)...

    走进物联网智能家居-手把手带你制作wifi智能开关-ESP8266学习笔记(二) 2020-05-09 13:44:11 9点赞 72收藏 6评论 小编注:此篇文章来自即可瓜分10万金币,周边好礼达标 ...

  4. 【韦东山】7天物联网智能家居实战训练营基础班-DAY1

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.学习路线 二.学习的基础 三.开发流程 四.开发板的介绍 1.ARM分类 2.STM31F103_MINI开发板 ...

  5. 树莓派蓝牙ble gattlib c语言,树莓派构建智能家居控制系统 篇三:花花草草智能监测仪接入树莓派Domoticz...

    树莓派构建智能家居控制系统 篇三:花花草草智能监测仪接入树莓派Domoticz 2017-05-22 19:30:08 35点赞 410收藏 31评论 作为工科男,实在对花花草草没太多感觉.家里阳台养 ...

  6. 7天物联网智能家居实战训练营(百问网)-day1

    目录 前言 一.学习路线 1.什么是嵌入式? 2.怎么学习嵌入式? 3.学习的基础内功? 二.基本概念 1.什么是arm? 2.arm架构的分类. 三.开发流程 1.交叉开发, 2.调试下载 前言 学 ...

  7. 树莓派 + Home Assistant + HomeKit 从零开始打造个人智能家居系统 篇二:初步配置 Home Assistant 并连接小米设备与 HomeKit

    树莓派 + Home Assistant + HomeKit 从零开始打造个人智能家居系统 篇二:初步配置 Home Assistant 并连接小米设备与 HomeKit 通过本篇教程,你将完成对 H ...

  8. 开源项目搭建私有物联网智能家居接入天猫精灵控制

    开源项目搭建私有物联网智能家居接入天猫精灵控制 最近几年随着物联网的高速发展,众多智能硬件厂商都开发出自己的智能家居产品,都想在物联网智能家居市场上占有自己的一席之地,而随着众多智能音箱的问世,智能家 ...

  9. 【百问网7天物联网智能家居】训练营学习笔记(七)

    在完成业务裸机的过程中,会用到freertos的任务通知和队列这两个内容 回顾下我们一开始的项目需求: 现在来看这个需求,在上了前面的课程后,相信大家心里已经有了实现它的方法脉络了 我们对于mini开 ...

最新文章

  1. python3连接mysql_第七篇:Python3连接MySQL
  2. 使用Kettle抽取数据时,出现中文乱码问题解决方案
  3. Intellij IDEA(Android Studio)好用的插件和软件
  4. OpenGL 开发环境配置(Windows) - Visual Studio 2017 + GLFW + GLAD 详细图文教程
  5. 按键精灵 getcursorpos没有用_给你们想要的一键输出II按键精灵脚本开发教程
  6. 2019最全Python入门学习路线,绝对是最全
  7. start与run的区别
  8. java redis快速入门_SpringDataRedis快速入门
  9. samtools idxstats
  10. python if else用法同一行_在Python的同一行中使用if else for和del吗?-问答-阿里云开发者社区-阿里云...
  11. npm install packagename 安装失败的解决办法
  12. 关于移动端点击事件的问题
  13. mogodb集群配置笔记
  14. iphonex适配游戏_Galaxy Fold应用适配大测试,这些软件超有远见!
  15. LeetCode之3Sum Closest(Kotlin)
  16. 快排序和堆排序,最小堆、最大堆
  17. python编程符号大全_2020 年最值得学习的 5 大 AI 编程语言
  18. X-Scan介绍和使用方法
  19. Markdown编辑器语法之代码高亮、标记和文字颜色
  20. Lucid Dream

热门文章

  1. 梦网云通讯API接口匹配状态报告规则
  2. 【Java】Java8特性官网学习之Stream的前世今生
  3. 【简单粗暴】秒数换算时分秒
  4. 生信人值得拥有的编程模板-Perl
  5. Asc/AscB/AscW和Chr/ChrB/ChrW函数之间的区别
  6. 追本溯源,解密第一性原理(上)
  7. 天嵌A40I平台如何调试10.1寸MIPI屏?这份总结收好!
  8. R语言ggplot2 | 如何绘制美观的散点图
  9. 使用Docker搭建NextCloud私人云盘+Collabora文件预览编辑
  10. uniapp学习笔记-跨域问题和真机调试的一些问题