查看: 2589|回复: 1

[主题月] IMXRT1010实现ESP8266的AP进行LED控制

[复制链接]
  • TA的每日心情
    开心
    2020-12-17 09:04
  • 签到天数: 346 天

    连续签到: 1 天

    [LV.8]以坛为家I

    19

    主题

    94

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    1363
    最后登录
    2025-5-7
    发表于 2021-6-22 09:44:45 | 显示全部楼层 |阅读模式
      抽了个时间跑了一下imxrt1010板的demo,前段时间给一个朋友用esp8266模块组了个网,然后正好借此机会用wifi来控制板卡中的LED开关,来模拟智能家居的控制方式。话不多说,开干。
      本次实验代码是基于官方的demo函数上做的移植修改,大体框架基本一致,至于ESP8266的AT组网命令大家感兴趣的可以去百度。
    1. /*
    2. * Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
    3. * Copyright 2016-2017 NXP
    4. * All rights reserved.
    5. *
    6. * SPDX-License-Identifier: BSD-3-Clause
    7. */

    8. #include "pin_mux.h"
    9. #include "clock_config.h"
    10. #include "board.h"
    11. #include "fsl_lpuart.h"
    12. #include <string.h>
    13. #include <stdlib.h>
    14. #include <stdio.h>


    15. /*******************************************************************************
    16. * Definitions
    17. ******************************************************************************/
    18. #define DEMO_LPUART          LPUART1
    19. #define DEMO_LPUART_CLK_FREQ BOARD_DebugConsoleSrcFreq()
    20. #define ECHO_BUFFER_LENGTH 8

    21. #define EXAMPLE_LED_GPIO     BOARD_USER_LED_GPIO
    22. #define EXAMPLE_LED_GPIO_PIN BOARD_USER_LED_GPIO_PIN

    23. /*******************************************************************************
    24. * Prototypes
    25. ******************************************************************************/

    26. /* LPUART user callback */
    27. void LPUART_UserCallback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData);

    28. /*******************************************************************************
    29. * Variables
    30. ******************************************************************************/
    31. lpuart_handle_t g_lpuartHandle;

    32. //uint8_t g_tipString[] =
    33. //    "Lpuart interrupt example\r\nBoard receives 8 characters then sends them out\r\nNow please input:\r\n";

    34. //WIFI AP模式,模块对外的无线参数,可自行修改.
    35. const uint8_t* wifiap_ssid="Im_RITIAN";                        //对外SSID号
    36. const uint8_t* APport="8086";               
    37. const uint8_t* wifiap_encryption="wpawpa2_aes";        //wpa/wpa2 aes加密方式
    38. const uint8_t* wifiap_password="ritianniubi";                 //连接密码
    39. const uint8_t* wifiap_mode="TCP";                                //
    40. const uint8_t* wifiap_ip="192.168.4.123";            //网段格式

    41. uint8_t g_txBuffer[ECHO_BUFFER_LENGTH] = {0};
    42. uint8_t g_rxBuffer[ECHO_BUFFER_LENGTH] = {0};
    43. volatile bool rxBufferEmpty            = true;
    44. volatile bool txBufferFull             = false;
    45. volatile bool txOnGoing                = false;
    46. volatile bool rxOnGoing                = false;

    47. lpuart_transfer_t xfer;

    48. /*******************************************************************************
    49. * Code
    50. ******************************************************************************/
    51. /* LPUART user callback */
    52. void LPUART_UserCallback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
    53. {
    54.     userData = userData;

    55.     if (kStatus_LPUART_TxIdle == status)
    56.     {
    57.         txBufferFull = false;
    58.         txOnGoing    = false;
    59.     }

    60.     if (kStatus_LPUART_RxIdle == status)
    61.     {
    62.         rxBufferEmpty = false;
    63.         rxOnGoing     = false;
    64.     }
    65. }

    66. void delay_init(void)
    67. {
    68.     SysTick->LOAD  = 10000;                         /* set reload register */
    69.         NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
    70.         SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
    71.         SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
    72. //                     SysTick_CTRL_TICKINT_Msk   |
    73.                      SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
    74. }                                                                    


    75. void delay_us(uint32_t us)
    76. {        
    77.         uint32_t ticks;
    78.         uint32_t told,tnow,tcnt=0;
    79.         uint32_t reload=SysTick->LOAD;                                //LOAD的值                     
    80.         ticks=us * (CLOCK_GetFreq(kCLOCK_CpuClk) / 1000000); //需要的节拍数
    81.         told=SysTick->VAL;                                        //刚进入时的计数器值
    82.         while(1)
    83.         {
    84.                 tnow=SysTick->VAL;        
    85.                 if(tnow!=told)
    86.                 {            
    87.                         if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
    88.                         else tcnt+=reload-tnow+told;            
    89.                         told=tnow;
    90.                         if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
    91.                 }  
    92.         };
    93. }
    94.   
    95. void delay_ms(uint16_t ms)
    96. {
    97.         uint32_t i;
    98.         for(i=0;i<ms;i++) delay_us(1000);
    99. }



    100. void uart_send_data(uint8_t *data)
    101. {
    102.       /* Send g_tipString out. */
    103.     xfer.data     = data;
    104.     xfer.dataSize = strlen((char*)data);
    105.     txOnGoing     = true;
    106.     LPUART_TransferSendNonBlocking(DEMO_LPUART, &g_lpuartHandle, &xfer);
    107. }

    108. void reconz_receive()
    109. {}

    110. void ESP_WIFI_CONFIG()
    111. {
    112.   char *p;
    113.         p=(char*)malloc(sizeof(char));
    114.         delay_ms(1000);
    115.   uart_send_data("AT+CWMODE=3\r\n");
    116.         delay_ms(1000);       
    117.         delay_ms(1000);
    118.         sprintf(p,"AT+CWSAP="%s","%s",1,4",wifiap_ssid,wifiap_password);       //设置无线参数:ssid,密码
    119.   uart_send_data(p);                                                                                       //设置AP模式参数
    120.         uart_send_data("\r\n");
    121.         delay_ms(1000);
    122.         delay_ms(1000);
    123.         delay_ms(1000);
    124.   uart_send_data("AT+RST\r\n");
    125.         delay_ms(1000);
    126.         delay_ms(1000);
    127.         delay_ms(1000);                                                            //3s阈量,确保稳定
    128.   uart_send_data("AT+CIPMUX=1\r\n");
    129.         delay_ms(1000);       
    130.   sprintf(p,"AT+CIPSERVER=1,%s",(uint8_t*)APport);
    131.         uart_send_data(p);                                                                                       
    132.         uart_send_data("\r\n");
    133.         delay_ms(1000);
    134.         free(p);
    135. }

    136. /*!
    137. * @brief Main function
    138. */
    139. int main(void)
    140. {
    141.           char *str;
    142.     lpuart_config_t config;
    143.     lpuart_transfer_t sendXfer;
    144.     lpuart_transfer_t receiveXfer;
    145.        
    146.           gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};

    147.     BOARD_ConfigMPU();
    148.     BOARD_InitPins();
    149.     BOARD_BootClockRUN();
    150.           delay_init();
    151.    
    152.           GPIO_PinInit(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, &led_config);
    153.        
    154.     /*
    155.      * config.baudRate_Bps = 115200U;
    156.      * config.parityMode = kLPUART_ParityDisabled;
    157.      * config.stopBitCount = kLPUART_OneStopBit;
    158.      * config.txFifoWatermark = 0;
    159.      * config.rxFifoWatermark = 0;
    160.      * config.enableTx = false;
    161.      * config.enableRx = false;
    162.      */
    163.     LPUART_GetDefaultConfig(&config);
    164.     config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
    165.     config.enableTx     = true;
    166.     config.enableRx     = true;

    167.     LPUART_Init(DEMO_LPUART, &config, DEMO_LPUART_CLK_FREQ);
    168.     LPUART_TransferCreateHandle(DEMO_LPUART, &g_lpuartHandle, LPUART_UserCallback, NULL);
    169.                
    170.                 ESP_WIFI_CONFIG();


    171. //    /* Start to echo. */
    172. //    sendXfer.data        = g_txBuffer;
    173. //    sendXfer.dataSize    = ECHO_BUFFER_LENGTH;


    174.     while (1)
    175.     {
    176.         /* If RX is idle and g_rxBuffer is empty, start to read data to g_rxBuffer. */
    177.         if ((!rxOnGoing) && rxBufferEmpty)
    178.         {
    179.                                           receiveXfer.data     = g_rxBuffer;
    180.             receiveXfer.dataSize = ECHO_BUFFER_LENGTH;
    181.             LPUART_TransferReceiveNonBlocking(DEMO_LPUART, &g_lpuartHandle, &receiveXfer, NULL);
    182.                                           str=strstr((char*)g_rxBuffer,"open");
    183.         }
    184.                                
    185.                                                 if(str != NULL)
    186.                                                 {
    187.                                                         while(1)
    188.                                                         {
    189.                                                   GPIO_PortToggle(EXAMPLE_LED_GPIO, 1u << EXAMPLE_LED_GPIO_PIN);
    190.                                                                 delay_ms(500);
    191.                                                         }
    192.                                                 }

    193. //        /* If TX is idle and g_txBuffer is full, start to send data. */
    194. //        if ((!txOnGoing) && txBufferFull)
    195. //        {
    196. //            txOnGoing = true;
    197. //            LPUART_TransferSendNonBlocking(DEMO_LPUART, &g_lpuartHandle, &sendXfer);
    198. //        }

    199. //        /* If g_txBuffer is empty and g_rxBuffer is full, copy g_rxBuffer to g_txBuffer. */
    200. //        if ((!rxBufferEmpty) && (!txBufferFull))
    201. //        {
    202. //            memcpy(g_txBuffer, g_rxBuffer, ECHO_BUFFER_LENGTH);
    203. //            rxBufferEmpty = true;
    204. //            txBufferFull  = true;
    205. //        }
    206.     }
    207. }
    复制代码
      下载编译后,用lpuart0连接esp8266,过一会儿就会组网一个Im_RITIAN的wifi路由了,然后输入密码ritianniubi进行连接,代码中匹配字段"open"来打开led的间歇闪烁,因为是通过网络调试助手来实现的,如果有APP的话完全可以把该字段集成在一个按钮上面。
    ee422ab956a635c70d2480a9457be6f.jpg
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3899

    主题

    7512

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39622
    最后登录
    2025-7-31
    发表于 2021-6-22 10:09:30 | 显示全部楼层
    还是你突出
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-31 23:58 , Processed in 0.079531 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表