完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
引脚图: 2.单片机及杜邦线等 本文以STM32f013c8t6开发平台为例。 本文接线说明: esp8266 [tr]ESP8266引脚接口[/tr]
[tr]外设引脚[/tr]
开始移植详细步骤
4.下载移植代码包。 复制秘钥,因为下载需要填写。 如下图生成代码包。 下载代码包: 下载后解压,将下图俩个复制到自己的工程。 5.导入代码包到STM32工程。 记得包含头文件位置。 注意:路径地址因人而异。 6.配置单片机基础外设。 (1)串口 本文中,将esp模块连接在串口3,故需要配置串口3。 初始化串口3参考代码: //初始化IO 串口3 //与ESP8266模块通信波特率:9600 //pclk1:PCLK1时钟频率(Mhz) //bound:波特率 void usart3_init(u32 bound) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能 USART_DeInit(USART3); //复位串口3 //USART3_TX PB10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10 //USART3_RX PB11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 PB11 USART_InitStructure.USART_BaudRate = bound;//波特率设置 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART3, &USART_InitStructure); //初始化串口3 USART_Cmd(USART3, ENABLE); //使能串口 //使能接收中断 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断 //设置中断优先级 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 USART3_RX_STA=0; //清零 } (2)定时器 定时器用于和给esp模块提供基准时钟。 本文采用定时3,需要配置1ms的定时。 参考代码: // 定时器3,定时1ms void TIMER3_Init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //初始化 TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; // 72MHz TIM_TimeBaseInitStruct.TIM_Period=10-1; TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct); TIM_ClearFlag(TIM3, TIM_IT_Update); TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE); NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStruct.NVIC_IRQChannelSubPriority=0; NVIC_Init(&NVIC_InitStruct); TIM_Cmd(TIM3,ENABLE); } (3)按键 用户机智云配网,被设计采用外部中断方式实现。 按键PA0,当按下时,接地。故配置上拉、下降沿。 参考代码: //外部中断0服务程序 void KEY_EXTIX_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能 //初始化 WK_UP-->GPIOA.0 上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA0设置成上拉输入 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟 //GPIOA.0 中断线以及中断初始化配置 下升沿触发 PA0 WK_UP GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//选择外部中断而不是外部事件 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿产生中断 EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键WK_UP所在的外部中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; //抢占优先级0, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 } 7.调用机智云接口。 注:以下步骤,执行一步就编译一下。 若现在找不到XX函数,则包含对应的头文件或者声明函数。 注意要清除所有的警告。 (1)机智云读取串口3数据 接口函数:gizPutData(&value, 1) 参考调用代码: void USART3_IRQHandler(void) { u8 value = 0; if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据 { value = USART_ReceiveData(USART3); //读取接收到的数据 gizPutData(&value, 1); // USART_SendData(USART3,value); } } (2)机智云发送数据 补充完整接口函数:int32_t uartWrite(uint8_t *buf, uint32_t len) 位置:gizwits_product.c 让其调用串口3的发送。 补充后参考代码: 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); for(i=0; i GIZWITS_LOG("%02x ", buf); } GIZWITS_LOG("n"); #endif for(i=0; i //USART_SendData(UART, buf);//STM32 test demo //Serial port to achieve the function, the buf sent to the module USART_SendData(USART3, buf); while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); if(i >=2 && buf == 0xFF) { //Serial port to achieve the function, the 0x55 sent to the module //USART_SendData(UART, 0x55);//STM32 test demo USART_SendData(USART3, 0x55); while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } } return len; } (3)机智云系统时间。 在前面配置的定时器3(注意是:1ms定时), 中断服务函数中调用接口gizTimerMs() 参考代码: void TIM3_IRQHandler() { if(TIM_GetITStatus(TIM3, TIM_IT_Update)) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); gizTimerMs(); } } (4)实现系统复位 补充接口:mcuRestart 实现系统复位功能。 位置:如图 参考代码: /** * @brief mcuRestart * MCU Reset function * @param none * @return none */ void mcuRestart(void) { __set_FAULTMASK(1); NVIC_SystemReset(); } (5)实现配置入网 支持 SoftAp 和 AirLink 两种方式配置入网,相应接口为 gizwitsSetMode()。 AirLink 更方便,本设计采用外部中断按键调用的方式。 参考代码: //外部中断0服务程序 void EXTI0_IRQHandler(void) { delay_ms(10);//消抖 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0) //下降沿触发 { gizwitsSetMode(WIFI_AIRLINK_MODE); printf("rnWIFI_AIRLINK_MODErn") ; // 打印调试信息 } EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位 } 至此,stm32已经可以联网了。 8.数据下行 本文以控制LED0点亮、熄灭为例。 在下图位置添加控制代码。 参考代码: 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 { switch(info->event) { case EVENT_LED: currentDataPoint.valueLED = dataPointPtr->valueLED; GIZWITS_LOG("Evt: EVENT_LED %d n", currentDataPoint.valueLED); if(0x01 == currentDataPoint.valueLED) { //user handle LED0 = 0;// 低电平点亮 } else { //user handle LED0 = 1; // 高电平熄灭 } 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 %dn", 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; } 9.数据上行 函数接口:void userHandle(void) 添加方法如图: 本教程没有建立上行数据点。故没有代码。 10.主函数代码 参考代码: 注意波特率为9600 //机智云初始化 void MyGizwistInit(void) { TIMER3_Init();//1ms usart3_init(9600);//gizPutData((uint8_t *)&aRxBuffer,1); userInit();//用户信息初始化,目前只是把结构体信息复位 gizwitsInit();//机智云的初始化 printf("gizwitsInit智能云初始化rn"); } // 主函数 int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//1设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); // 串口1初始化 LED_Init(); // 初始化LED KEY_EXTIX_Init(); // 初始化KEY MyGizwistInit(); while(1) { userHandle();//数据上行 gizwitsHandle((dataPoint_t *)¤tDataPoint); } } 结果测试: 烧录程序,连接串口,打开调试助手。 手机端操作: 单片机按下,按键进入配网。 串口打印调试信息如下。 手机界面会出现设备。 点击连接"test"。 点击开启,即可以点亮LED了。 看到这里,恭喜大家成功联网控制。 谢谢大家的阅读。 有问题欢迎评论交流。 若有帮助,求赞求收藏 常见问题分析 串口错误: 原因: 1.串口波特率错误,esp通信波特率9600. 2.串口配置引脚错误。rx与tx要反接,引脚、端口不要写错。 其他情况: 3.定时器计算错误,定时器应该为1ms。 4.按键配置出错,配置打印调试,确保按键有效。 5.玄学问题–接触不良,或者接错线,,,,, 6.使用问题,比如gizwitsHandle()要多调用,上面的代码是放在了主循环。注释了这个函数可能直接导致联网失败。。。 7.编译警告。某些警告会导致移植失败,建议规范编程,清除掉所有警告。。。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1932 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1705 浏览 1 评论
1185 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
785 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1750 浏览 2 评论
1992浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
827浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
279浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
637浏览 3评论
644浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-2 17:27 , Processed in 0.699110 second(s), Total 42, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号