正点原子ESP8266模块+机智云学习笔记

我在用STM32F103精英板学习8266+机智云时,遇到了一些问题。
问题主要是:
1.固件烧写
2.关于配网(手机搜索不到设备,加载到百分之间九十多超时)
3.关于代码移植(按教程走越改错误越多)

建议学习的过程中,先成功使用正点原子的例程,再去实现自己的设想。

1.固件烧写
如果配网那里检测到设备还是配不上,有可能是固件烧写问题。
尝试:
换上手上最短的杜邦线;
使用正点原子自带的烧录软件;(精英板 资料盘(A盘)\9,增值资料\1,ALIENTEK 产品资料\13,ATK-ESP8266 WIFI模块资料\6,ESP8266相关资料\固件烧写及说明\FLASH烧写工具\FLASH_DOWNLOAD_TOOLS)
在这里插入图片描述
2.关于配网
直接尝试带的例程,自己简化代码时很容易因为直接配网而失败,推荐像例程一样采用按键配网
(精英板 资料盘(A盘)\9,增值资料\1,ALIENTEK 产品资料\24,ALIENTEK机智云教程\1,程序源码\STM32F103 机智云IOT例程v1.0_扩展实验SE02\机智云IOT实验-3 多路控制(LED 蜂鸣器)实验)

首先把程序下载进单片机。然后打开串口调试助手。按下KEY_UP。按下KEY_1。显示已进入AIRLINK模式。
之后打开手机的WLAN。等待手机搜索到网络(airlink模式下设备会像手机热点一样被搜索到)。
(这里要用手机像连接WiFi一样连接一次,不然后面可能会失败)
打开机智云APP选择热点配置,输入路由器的ID和密码。乐鑫模组。

如果可以发现设备,但配置超时的话:确认自己自己路由器的账号密码没有错。确保路由器是2.4GHz(有的是5G的会连接失败)。
查看方式:
在这里插入图片描述
在这里插入图片描述
如果能搜索到设备,路由器也没问题,还是超时,重新烧一遍固件。

3.关于代码移植
(因为我学得不多,所以只提供一种快速的实现手机简单控制单片机的方法)
以手机控制一个舵机的转动为例,
比较快速的方法,直接以例程为模板。
把多路控制的例程复制出来,删掉Gizwits和command包。
在这里插入图片描述
然后,去网站生产代码包。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后,把Gizwits和Utils复制到自己的模板,把对应的文件加入工程。
编译后会出现一堆error,首先把代码改到没有error
(其实就是,主要在于product.c,照着官方给的例程的,该删的删)
首先把product.h的stm32f1xx.h改为stm32f10x.h
在这里插入图片描述
然后照着例程,product.c里该删的删掉
(第一个函数留下,其他的复制过来也行)
也就是此时product.c是这样的

/**
************************************************************
* @file         gizwits_product.c
* @brief        Gizwits control protocol processing, and platform-related       hardware initialization 
* @author       Gizwits
* @date         2017-07-19
* @version      V03030000
* @copyright    Gizwits
* 
* @note         机智云.只为智能硬件而生
*               Gizwits Smart Cloud  for Smart Products
*               链接|增值ֵ|开放|中立|安全|自有|自由|生态
*               www.gizwits.com
*
***********************************************************/
#include <stdio.h>
#include <string.h>
//#include "hal_key.h"
#include "gizwits_product.h"
#include "common.h"

static uint32_t timerMsCount;
uint8_t aRxBuffer;

/** User area the current device state structure*/
//dataPoint_t currentDataPoint;
//extern keysTypedef_t keys;

//extern TIM_HandleTypeDef htim2;
//extern UART_HandleTypeDef huart1;
//extern UART_HandleTypeDef huart2;

/**@} */
/**@name Gizwits User Interface
* @{
*/

/**
* @brief Event handling interface
* Description:
* 1. Users can customize the changes in WiFi module status
* 2. Users can add data points in the function of event processing logic, such as calling the relevant hardware peripherals operating interface* @param [in] info: event queue
* @param [in] data: protocol data
* @param [in] len: protocol data length
* @return NULL
* @ref gizwits_protocol.h
*/
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
{
  uint8_t i = 0;
  dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;
  moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;
  protocolTime_t *ptime = (protocolTime_t *)gizdata;
#if MODULE_TYPE
  gprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
#else
  moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
#endif
  if((NULL == info) || (NULL == gizdata))
  {
    return -1;
  }
  for(i=0; i<info->num; i++)
  {
    switch(info->event[i])
    {
      case EVENT_flag:
        currentDataPoint.valueflag = dataPointPtr->valueflag;
        GIZWITS_LOG("Evt: EVENT_flag %d \n", currentDataPoint.valueflag);
        if(0x01 == currentDataPoint.valueflag)
        {
          //user handle
        }
        else
        {
          //user handle    
        }
        break;
      case WIFI_SOFTAP:
        break;
      case WIFI_AIRLINK:
        break;
      case WIFI_STATION:
        break;
      case WIFI_CON_ROUTER:
        break;
      case WIFI_DISCON_ROUTER:
        break;
      case WIFI_CON_M2M:
        break;
      case WIFI_DISCON_M2M:
        break;
      case WIFI_RSSI:
        GIZWITS_LOG("RSSI %d\n", wifiData->rssi);
        break;
      case TRANSPARENT_DATA:
        GIZWITS_LOG("TRANSPARENT_DATA \n");
        //user handle , Fetch data from [data] , size is [len]
        break;
      case WIFI_NTP:
        GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);
        break;
      case MODULE_INFO:
            GIZWITS_LOG("MODULE INFO ...\n");
      #if MODULE_TYPE
            GIZWITS_LOG("GPRS MODULE ...\n");
            //Format By gprsInfo_t
      #else
            GIZWITS_LOG("WIF MODULE ...\n");
            //Format By moduleInfo_t
            GIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);
      #endif
    break;
      default:
        break;
    }
  }
    return 0;
}
/**@} */
/**
* @brief MCU复位函数
* @param none
* @return none
*/
void mcuRestart(void)
{
}
/**@} */
/**
* @brief 系统毫秒计时维护函数,毫秒自增,溢出归零
* @param none
* @return none
*/
static uint32_t timerMsCount;
void gizTimerMs(void)
{
    timerMsCount++;
}
/**
* @brief 读取系统时间毫秒计时数
* @param none
* @return 系统时间毫秒数
*/
uint32_t gizGetTimerCount(void)
{
    return timerMsCount;
}
/**
* @brief 定时器TIM3中断处理函数
* @param none
* @return none
*/
void TIMER_IRQ_FUN(void)
{
  gizTimerMs();
}
/**
* @brief USART2串口中断函数
* 接收功能,用于接收与WiFi模组间的串口协议数据
* @param none
* @return none
*/
void UART_IRQ_FUN(void)
{
  uint8_t value = 0;
  //value = USART_ReceiveData(USART2);//STM32 test demo
  gizPutData(&value, 1);
}
/**
* @brief 串口写操作,发送数据到WiFi模组
*
* @param buf      : 数据地址
* @param len       : 数据长度
*
* @return : 正确返回有效数据长度;-1,错误返回
*/
int32_t uartWrite(uint8_t *buf, uint32_t len)
{
    uint32_t i = 0;   
    if(NULL == buf)
    {
        return -1;
    }
#ifdef PROTOCOL_DEBUG
    GIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);
#endif    
    for(i=0; i<len; i++)
    {
        //USART_SendData(UART, buf[i]);//STM32 test demo
        //实现串口发送函数,将buf[i]发送到模组
  USART_SendData(USART3,buf[i]);
        while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕 
#ifdef PROTOCOL_DEBUG
        GIZWITS_LOG("%02x ", buf[i]);
#endif
        if(i >=2 && buf[i] == 0xFF)
        {
          //实现串口发送函数,将0x55发送到模组
     USART_SendData(USART3,0x55);
         while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕 
#ifdef PROTOCOL_DEBUG
        GIZWITS_LOG("%02x ", 0x55);
#endif
        }
    }   
#ifdef PROTOCOL_DEBUG
    GIZWITS_LOG("\n");
#endif    
    return len;
}

这样编译后有一个重复定义的error,在product.h里把对应的语句注释掉
在这里插入图片描述之后就可以过编译了
然后我们加入自己实现的部分
选择用TIM4_CH1完全重映射(PD12)输出PWM
把相应函数加入timer.c

void TIM4_PWM_Init(u16 arr,u16 psc)
{
 TIM_OCInitTypeDef TIM_OCInitStruct;
 GPIO_InitTypeDef GPIO_InitStruct;
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
// 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//
 GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
// 
 GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP;
 GPIO_InitStruct.GPIO_Pin= GPIO_Pin_12;
 GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
 GPIO_Init(GPIOD,&GPIO_InitStruct);
// 
//
 GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);
// 
//
 TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1 ;
 TIM_TimeBaseInitStruct.TIM_CounterMode=0 ;
 TIM_TimeBaseInitStruct.TIM_Period= arr;
 TIM_TimeBaseInitStruct.TIM_Prescaler= psc;
 TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0 ;
 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);
// 
//
 TIM_OCInitStruct.TIM_OCMode= TIM_OCMode_PWM2;
 TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable ;
 TIM_OCInitStruct.TIM_Pulse= 174;
 TIM_OCInitStruct.TIM_OCPolarity= TIM_OCPolarity_High;
 /************************************************************????*/
 TIM_OC1Init(TIM4,&TIM_OCInitStruct);
// 
 TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
// 
// 
/************************************************************????*/
 TIM_Cmd(TIM4,ENABLE);
}

修改timer.h
主函数加入

TIM4_PWM_Init(199,7199);

修改product.c部分
在这里插入图片描述
就可以了

发布了1 篇原创文章 · 获赞 3 · 访问量 137

猜你喜欢

转载自blog.csdn.net/npuqiyi/article/details/104065556