当前位置:   article > 正文

STM32+正点原子ESP8266_stm32 正点原子 esp8266

stm32 正点原子 esp8266

1、准备

        STM32F103C8T6单片机

        ATK-ESP8266(原子云固件

        杜邦线

2、接线

        ESP8266

                IO_0        烧录固件使用,不需连接

                RST        模块复位,接任意IO,低电平有效

                RXD        模块接收,接PB10

                TXD        模块发送,接PB11

                GND        电源地

                VCC        电源5V

        STM32F103C8T6

3、原子云

        注册原子云,建立ESP8266设备

        设备名称和密码任意,

        在分组管理创建一个分组添加这个设备。

4、控制ESP8266初始化

        1、连接 RST 的 IO 拉低再拉高,使模块复位

        2、AT指令测试:(串口 PB10)发送 “AT”,(串口 PB11)收到 “OK”;

        3、设置 Station 工作模式:发 AT+CWMODE=1,回 OK;

        4、软件复位:发 AT+RST,回 OK;

        5、关闭回显:发 ATE0,回 OK;

        6、连接WIFI:发 AT+CWJAP="WIFI_ID","WIFI_Password",回 WIFI GOT IP

                WIFI_ID 和 WIFI_Password 对应连接的 WIFI 名字和密码

        7、获取IP地址:发 AT+CIFSR,回 OK

        8、连接原子云:发AT+ATKCLDSTA="ID","Password",回CLOUD CONNECTED

                ID 和 Password 对应原子云设备编号和密码

        以上接收都没问题后就可以后,单片机就可以通过串口3和原子云通信。

5、控制代码

        1、串口3正常初始化,波特率115200,开启串口中断和串口空闲中断,可以使用CubeMX生成;

        2、串口收发函数( UART3_Rx_flg在串口空闲置1 )

  1. // UART3
  2. uint8_t UART3_Rx_Buf[UART3_Rx_COUNT] = {0}; //USART3存储接收数据
  3. uint8_t UART3_data = 0; //USART3接收数据缓存
  4. uint16_t UART3_Rx_cnt = 0; //USART3接受数据计数器
  5. uint8_t UART3_Rx_flg = 0; //USART3接收完成标志
  6. uint8_t UART3_Tx_Buf[UART3_Tx_COUNT] = {0}; //USART3发送缓冲
  7. /**
  8. * @brief UART3 printf
  9. * @param fmt: 待打印的数据
  10. * @retval 无
  11. */
  12. void usart3_printf(char *fmt, ...)
  13. {
  14. va_list ap;
  15. uint16_t len;
  16. va_start(ap, fmt);
  17. vsprintf((char *)UART3_Tx_Buf, fmt, ap);
  18. va_end(ap);
  19. len = strlen((const char *)UART3_Tx_Buf);
  20. HAL_UART_Transmit(&huart3, UART3_Tx_Buf, len, HAL_MAX_DELAY);
  21. }
  22. /**
  23. * @brief UART3 清标志位
  24. * @param 无
  25. * @retval 无
  26. */
  27. void usart3_close_flag(void)
  28. {
  29. UART3_Rx_cnt = 0;
  30. UART3_Rx_flg = 0;
  31. }
  32. /**
  33. * @brief UART3 接收到的一帧数据
  34. * @param 无
  35. * @retval NULL: 未接收到一帧数据
  36. * 其他: 接收到的一帧数据
  37. */
  38. uint8_t *usart3_uart_dat(void)
  39. {
  40. if (UART3_Rx_flg == 1)
  41. {
  42. UART3_Rx_Buf[UART3_Rx_cnt] = '\0';
  43. return UART3_Rx_Buf;
  44. }
  45. else
  46. {
  47. return NULL;
  48. }
  49. }
  50. /**
  51. * @brief 获取 UART3 接收到的一帧数据的长度
  52. * @param 无
  53. * @retval 0 : 未接收到一帧数据
  54. * 其他: 接收到的一帧数据的长度
  55. */
  56. uint16_t usart3_uart_dat_len(void)
  57. {
  58. if (UART3_Rx_flg == 1)
  59. {
  60. return UART3_Rx_cnt;
  61. }
  62. else
  63. {
  64. return 0;
  65. }
  66. }

        3、ESP8266初始化(8266子函数在正点原子ESP8266随便一个板型例程找,一样)

  1. #define WIFI_ID(a) (a ? "vivo X80" : "JC-R&D") //WIFI名称
  2. #define WIFI_PASSWORD(a) (a ? "YQY1122334455" : "jc12345678") //WIFI密码
  3. #define WIFI_SERVER_ID "11111111111111111111" //原子云设备编号
  4. #define WIFI_SERVER_PASSWORD "12345678" //原子云设备密码
  5. /**
  6. * @brief ATK-MW8266D初始化
  7. * @retval 0: ATK-MW8266D初始化成功,函数执行成功
  8. * 1: ATK-MW8266D初始化失败,函数执行失败
  9. */
  10. void ATK_MW8266D_Init(void)
  11. {
  12. uint8_t flag; //返回标志
  13. char ip_buf[16]; //ip地址
  14. atk_mw8266d_reset(); /* ATK-MW8266D硬件复位 */
  15. flag = atk_mw8266d_at_test(); /* ATK-MW8266D AT指令测试 */
  16. if (flag != ATK_MW8266D_EOK) // 有错
  17. {
  18. OLED_ShowString_fun("8266 Init ERROR");
  19. printf("ATK-MW8266 Init ERROR\r\n");
  20. while(1);
  21. }
  22. OLED_ShowString_fun("8266 Init OK");
  23. printf("ATK-MW8266 Init OK\r\n");
  24. // flag = atk_mw8266d_restore(); /* 恢复出厂设置 */
  25. // flag += atk_mw8266d_at_test(); /* AT测试 */
  26. flag = atk_mw8266d_set_mode(1); /* Station模式 */
  27. flag += atk_mw8266d_sw_reset(); /* 软件复位 */
  28. flag += atk_mw8266d_ate_config(0); /* 关闭回显功能 */
  29. flag += atk_mw8266d_join_ap(WIFI_ID(1), WIFI_PASSWORD(1)); /* 连接WIFI */
  30. flag += atk_mw8266d_get_ip(ip_buf); /* 获取IP地址 */
  31. if (flag != 0) // 有错
  32. {
  33. OLED_ShowString_fun("8266 Wifi ERROR");
  34. printf("ATK-MW8266 Wifi ERROR\r\n");
  35. while (1);
  36. }
  37. OLED_ShowString_fun("8266 Wifi OK");
  38. printf("ATK-MW8266 Wifi OK\r\n");
  39. flag = atk_mw8266d_connect_atkcld(WIFI_SERVER_ID, WIFI_SERVER_PASSWORD); /* 连接原子云 */
  40. if (flag != 0)
  41. {
  42. OLED_ShowString_fun("8266 Link ERROR");
  43. printf("ATK-MW8266 Link ERROR\r\n");
  44. while (1);
  45. }
  46. OLED_ShowString_fun("8266 Link OK");
  47. printf("ATK-MW8266 Link OK\r\n");
  48. usart3_close_flag(); /* 清标志位 */
  49. }
  50. /**
  51. * @brief ATK-MW8266D发送AT指令
  52. * @param cmd : 待发送的AT指令
  53. * ack : 等待的响应
  54. * timeout: 等待超时时间
  55. * @retval 0: 函数执行成功
  56. * 2: 等待期望应答超时,函数执行失败
  57. */
  58. uint8_t atk_mw8266d_send_at_cmd(char *cmd, char *ack, uint32_t timeout)
  59. {
  60. uint8_t *ret = NULL;
  61. usart3_close_flag();
  62. usart3_printf("%s\r\n", cmd);
  63. if ((ack == NULL) || (timeout == 0))
  64. {
  65. return ATK_MW8266D_EOK;
  66. }
  67. else
  68. {
  69. while (timeout > 0)
  70. {
  71. ret = usart3_uart_dat();
  72. if (ret != NULL)
  73. {
  74. if (strstr((const char *)ret, ack) != NULL)
  75. {
  76. return ATK_MW8266D_EOK;
  77. }
  78. else
  79. {
  80. usart3_close_flag();
  81. }
  82. }
  83. timeout--;
  84. delay_ms(1);
  85. }
  86. return ATK_MW8266D_ETIMEOUT;
  87. }
  88. }

        4、主函数

  1. /**
  2. * @brief The application entry point.
  3. * @retval int
  4. */
  5. int main(void)
  6. {
  7. uint8_t* buf;
  8. char oled_buf[64];
  9. uint8_t run_flag = 0;
  10. uint8_t flag = 1;
  11. HAL_Init();
  12. SystemClock_Config();
  13. MX_GPIO_Init();
  14. MX_TIM3_Init();
  15. HAL_TIM_Base_Start_IT(&htim3);
  16. MX_USART1_UART_Init();
  17. HAL_UART_Receive_IT(&huart1, (uint8_t *)UART1_temp, REC_LENGTH);
  18. printf("USART1 Init");
  19. MX_USART3_UART_Init();
  20. HAL_UART_Receive_IT(&huart3, &UART3_data, 1);
  21. HAL_UART_Transmit(&huart3, "USART3 Init", 11, HAL_MAX_DELAY);
  22. MX_I2C1_Init();
  23. OLED_Init();
  24. OLED_ShowString_fun("OLED_OK!");
  25. ATK_MW8266D_Init(); //ATK-MW8266D初始化
  26. while(1)
  27. {
  28. buf = usart3_uart_dat(); /* 接收来自ATK-MW8266D UART的一帧数据 */
  29. if (buf != NULL)
  30. {
  31. sprintf(oled_buf, "%s", buf);
  32. OLED_ShowString_fun(oled_buf);
  33. if(!strcmp((char*)buf, "open"))
  34. {
  35. run_flag = 1;
  36. }
  37. if(!strcmp((char*)buf, "close"))
  38. {
  39. run_flag = 0;
  40. }
  41. usart3_close_flag(); /* 重开开始接收来自ATK-MW8266D UART的数据 */
  42. }
  43. }
  44. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/772777
推荐阅读
相关标签
  

闽ICP备14008679号