keil 手机TCP控制灯光 stm32f103
/**
******************************************************************************
* 硬石YS-F1Pro开发板例程功能说明
*
* 例程名称: 3. 手机端APP通过Wifi控制开发板
*
******************************************************************************
* 说明:
* 本例程配套硬石stm32开发板YS-F1Pro使用。
* 版权归硬石嵌入式开发团队所有,请勿商用。
******************************************************************************
*/
【1】例程简介
RS232是一个国际通用标准的串行数据通信接口,用于两个设备直接数据交换。本例程使用USART
外设功能,实现stm32向PC端发送数据,并等待接收来着PC端的信息中断,然后再回传信息给PC端。
YS_F1Pro开发板上集成一个ESP8266 WiFi模块,只需要通过USART即可与之通信,开发板设计
通过跳线帽即可选择USART2与之连接。
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号 IO端口 目标功能引脚 出厂默认设置
JP1 PA10 TXD(CH340G) 已接入
JP2 PA9 RXD(CH340G) 已接入
JP3 PB0 LED1 已接入
JP4 PG6 LED2 已接入
JP5 PG7 LED3 已接入
JP6 PD3 DATA(AM2302) 已接入
CN10 PA2 RXD(WIFI) 已接入
CN10 PA3 TXD(WIFI) 已接入
【3】操作及现象
保证JP1、JP2、JP3..JP6和CN10端子上的8个跳线帽插入正确。参考文档
《硬石YS-F1Pro开发板软件设计手册(手机通过ESP8266控制开发板).pdf》。
修过本例程中main.c文件中有关WiFi账号、密码,以及要连接的服务器IP(自己电脑IP)和端口(8000),
编译程序。然后使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口,在
电脑端打开串口调试助手工具,选择对应端口,设置参数为115200 8-NO-1,下载程序之后,在串口调
试助手窗口可接收到信息。等待ESP8266正确连接上网络后在网络调试助手接口接收到数据。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
单片机源程序如下:
- /**
- ******************************************************************************
- * 文件名程: main.c
- * 作 者: 硬石嵌入式开发团队
- * 版 本: V1.0
- * 编写日期: 2015-10-04
- * 功 能: WiFi(ESP8266)底层驱动实现
- ******************************************************************************
- * 说明:
- * 本例程配套硬石stm32开发板YS-F1Pro使用。
- * 版权归硬石嵌入式开发团队所有,请勿商用。
- ******************************************************************************
- */
- /* 包含头文件 ----------------------------------------------------------------*/
- #include "stm32f1xx_hal.h"
- #include "usart/bsp_debug_usart.h"
- #include "ESP8266/bsp_esp8266.h"
- #include "beep/bsp_beep.h"
- #include "led/bsp_led.h"
- #include "stdlib.h"
- #include <string.h>
- #include "GeneralTIM/bsp_GeneralTIM.h"
- /* 私有类型定义 --------------------------------------------------------------*/
- /* 私有宏定义 ----------------------------------------------------------------*/
- #define User_ESP8266_ApSsid "yingshi" //要连接的热点的名称
- #define User_ESP8266_ApPwd "yingshi123" //要连接的热点的密钥
- #define User_ESP8266_TcpServer_IP "192.168.3.4" //要连接的服务器的 IP
- #define User_ESP8266_TcpServer_Port "1234" //要连接的服务器的端口
- /* 私有变量 ------------------------------------------------------------------*/
- static uint8_t PWM_start=0;
- static uint8_t First_stemp=0;
- static uint8_t Second_stemp=0;
- static uint8_t stop_stemp=0;
- static uint8_t Third_temp=0;
- /* 扩展变量 ------------------------------------------------------------------*/
- extern __IO uint8_t ucTcpClosedFlag;
- /* 私有函数原形 --------------------------------------------------------------*/
- /* 函数体 --------------------------------------------------------------------*/
- /**
- * 函数功能: 系统时钟配置
- * 输入参数: 无
- * 返 回 值: 无
- * 说 明: 无
- */
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct;
- RCC_ClkInitTypeDef RCC_ClkInitStruct;
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 外部晶振,8MHz
- RCC_OscInitStruct.HSEState = RCC_HSE_ON;
- RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 9倍频,得到72MHz主时钟
- HAL_RCC_OscConfig(&RCC_OscInitStruct);
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 系统时钟:72MHz
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟:72MHz
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1时钟:36MHz
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2时钟:72MHz
- HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
- // HAL_RCC_GetHCLKFreq()/1000 1ms中断一次
- // HAL_RCC_GetHCLKFreq()/100000 10us中断一次
- // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次
- HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); // 配置并启动系统滴答定时器
- /* 系统滴答定时器时钟源 */
- HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
- /* 系统滴答定时器中断优先级配置 */
- HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
- }
- /**
- * 函数功能: 主函数.
- * 输入参数: 无
- * 返 回 值: 无
- * 说 明: 无
- */
- int main(void)
- {
- uint8_t ucStatus;
- uint8_t pCH;
-
- /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
- HAL_Init();
- /* 配置系统时钟 */
- SystemClock_Config();
- LED_GPIO_Init();
- BEEP_GPIO_Init();
-
- /* 通用定时器初始化并配置PWM输出功能 */
- GENERAL_TIMx_Init();
- /* 初始化串口并配置串口中断优先级 */
- MX_DEBUG_USART_Init();
-
- ESP8266_Init();
-
- ESP8266_Init();
- printf("正在配置 ESP8266 ......\n" );
-
- if(ESP8266_AT_Test())
- {
- printf("AT test OK\n");
- }
- printf("\n< 1 >\n");
- if(ESP8266_Net_Mode_Choose(STA))
- {
- printf("ESP8266_Net_Mode_Choose OK\n");
- }
- printf("\n< 2 >\n");
- while(!ESP8266_JoinAP(User_ESP8266_ApSsid,User_ESP8266_ApPwd));
- printf("\n< 3 >\n");
- ESP8266_Enable_MultipleId(DISABLE);
- while(!ESP8266_Link_Server(enumTCP,User_ESP8266_TcpServer_IP,User_ESP8266_TcpServer_Port,Single_ID_0));
- printf("\n< 4 >\n");
- while(!ESP8266_UnvarnishSend());
- printf("配置 ESP8266 完毕\n");
- __HAL_UART_ENABLE_IT(&husartx_esp8266, UART_IT_IDLE);
- /* 无限循环 */
- while (1)
- {
- ESP8266_ReceiveString(ENABLE);
- if(strEsp8266_Fram_Record .InfBit .FramFinishFlag )
- {
- strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';
- printf ( "\r\n%s\r\n", strEsp8266_Fram_Record .Data_RX_BUF );
- /*将接收到的字符串转成整形数*/
- pCH=atoi(strEsp8266_Fram_Record .Data_RX_BUF);
- switch(pCH)
- {
- case 0:
- PWM_start=1;
- First_stemp=1;
- Third_temp++;
- break;
- case 1:
- PWM_start=1;
- Second_stemp=1;
- break;
- case 2:
- PWM_start=1;
- stop_stemp=1;
- break;
- }
- }
- if(PWM_start==1)
- {
- PWM_start=0;
- HAL_TIM_Base_Start_IT(&htimx);
- HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_3);
- }
- HAL_Delay(100);
-
- if(ucTcpClosedFlag) //检测是否失去连接
- {
- ESP8266_ExitUnvarnishSend(); //退出透传模式
- do ucStatus = ESP8266_Get_LinkStatus(); //获取连接状态
- while(!ucStatus);
- if(ucStatus==4) //确认失去连接后重连
- {
- printf("正在重连热点和服务器 ......\n");
- while(!ESP8266_JoinAP(User_ESP8266_ApSsid,User_ESP8266_ApPwd));
- while(!ESP8266_Link_Server(enumTCP,User_ESP8266_TcpServer_IP,User_ESP8266_TcpServer_Port,Single_ID_0));
- printf("重连热点和服务器成功!!!\n");
- }
- while(!ESP8266_UnvarnishSend());
- }
- }
- }
- /**
- * 函数功能: 串口接收完成回调函数
- * 输入参数: 无
- * 返 回 值: 无
- * 说 明:无
- */
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
- {
- if(strEsp8266_Fram_Record.InfBit.FramLength<(RX_BUF_MAX_LEN-1)) //预留1个字节写结束符
- {
- strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.InfBit.FramLength]=esp8266_rxdata;
- strEsp8266_Fram_Record.InfBit.FramLength++;
- HAL_UART_Receive_IT(&husartx_esp8266,&esp8266_rxdata,1);
- }
- }
- /**
- * 函数功能: 非阻塞模式下定时器的回调函数
- * 输入参数: htim:定时器句柄
- * 返 回 值: 无
- * 说 明: 无
- */
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- {
- static uint8_t period_cnt = 0; /* 用于计算周期数 */
- static uint8_t PWM_data = 0;
- period_cnt++;
- /* 若输出的周期数大于20,输出下一种脉冲宽的PWM波 */
- if(period_cnt >= 10)
- {
- /* 根据PWM表修改定时器的比较寄存器值 */
- htimx.Instance->CCR3 = PWM_data;
- //第一种情况,设定百分之十的亮度
- if((First_stemp==1)&&(Third_temp==1))
- {
- PWM_data++;
- if( PWM_data >= 255*0.1)
- {
- First_stemp=0;
- PWM_data=255*0.1;
- }
- }
- //第二种情况,设定百分之七十的亮度
- if(Second_stemp==1)
- {
- PWM_data++;
- if( PWM_data >= 255*0.7)
- {
- Third_temp=1;
- Second_stemp=0;
- PWM_data=255*0.7;
- }
- }
- //第三种情况,在百分之七十的基础上回到百分之十的亮度
- if((Third_temp==2)&&(First_stemp==1))
- {
- PWM_data--;
- if( PWM_data<= 255*0.1)
- {
- Third_temp=0;
- First_stemp=0;
- PWM_data=0;
- PWM_data=255*0.1;
- }
- }
- //第四种情况,停止显示
- if(stop_stemp==1)
- {
- PWM_data=0;
- if( PWM_data == 0)
- {
- Third_temp=0;
- stop_stemp=0;
- PWM_data=0;
- }
- }
-
- /* 重置周期计数标志 */
- period_cnt=0;
- }
- }
- /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码
所有资料51hei提供下载:
3. 手机端APP通过Wifi控制LED呼吸灯状况.rar
(7.43 MB, 下载次数: 138)
|