在线时间185 小时
UID3375312
注册时间2017-6-28
NXP金币12
TA的每日心情 | 开心 2020-12-17 09:04 |
---|
签到天数: 346 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 1363
- 最后登录
- 2025-5-7
|
抽了个时间跑了一下imxrt1010板的demo,前段时间给一个朋友用esp8266模块组了个网,然后正好借此机会用wifi来控制板卡中的LED开关,来模拟智能家居的控制方式。话不多说,开干。
本次实验代码是基于官方的demo函数上做的移植修改,大体框架基本一致,至于ESP8266的AT组网命令大家感兴趣的可以去百度。
- /*
- * Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.
- * Copyright 2016-2017 NXP
- * All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #include "pin_mux.h"
- #include "clock_config.h"
- #include "board.h"
- #include "fsl_lpuart.h"
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
- /*******************************************************************************
- * Definitions
- ******************************************************************************/
- #define DEMO_LPUART LPUART1
- #define DEMO_LPUART_CLK_FREQ BOARD_DebugConsoleSrcFreq()
- #define ECHO_BUFFER_LENGTH 8
- #define EXAMPLE_LED_GPIO BOARD_USER_LED_GPIO
- #define EXAMPLE_LED_GPIO_PIN BOARD_USER_LED_GPIO_PIN
- /*******************************************************************************
- * Prototypes
- ******************************************************************************/
- /* LPUART user callback */
- void LPUART_UserCallback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData);
- /*******************************************************************************
- * Variables
- ******************************************************************************/
- lpuart_handle_t g_lpuartHandle;
- //uint8_t g_tipString[] =
- // "Lpuart interrupt example\r\nBoard receives 8 characters then sends them out\r\nNow please input:\r\n";
- //WIFI AP模式,模块对外的无线参数,可自行修改.
- const uint8_t* wifiap_ssid="Im_RITIAN"; //对外SSID号
- const uint8_t* APport="8086";
- const uint8_t* wifiap_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式
- const uint8_t* wifiap_password="ritianniubi"; //连接密码
- const uint8_t* wifiap_mode="TCP"; //
- const uint8_t* wifiap_ip="192.168.4.123"; //网段格式
- uint8_t g_txBuffer[ECHO_BUFFER_LENGTH] = {0};
- uint8_t g_rxBuffer[ECHO_BUFFER_LENGTH] = {0};
- volatile bool rxBufferEmpty = true;
- volatile bool txBufferFull = false;
- volatile bool txOnGoing = false;
- volatile bool rxOnGoing = false;
- lpuart_transfer_t xfer;
- /*******************************************************************************
- * Code
- ******************************************************************************/
- /* LPUART user callback */
- void LPUART_UserCallback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
- {
- userData = userData;
- if (kStatus_LPUART_TxIdle == status)
- {
- txBufferFull = false;
- txOnGoing = false;
- }
- if (kStatus_LPUART_RxIdle == status)
- {
- rxBufferEmpty = false;
- rxOnGoing = false;
- }
- }
- void delay_init(void)
- {
- SysTick->LOAD = 10000; /* set reload register */
- NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
- SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
- SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
- // SysTick_CTRL_TICKINT_Msk |
- SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
- }
- void delay_us(uint32_t us)
- {
- uint32_t ticks;
- uint32_t told,tnow,tcnt=0;
- uint32_t reload=SysTick->LOAD; //LOAD的值
- ticks=us * (CLOCK_GetFreq(kCLOCK_CpuClk) / 1000000); //需要的节拍数
- told=SysTick->VAL; //刚进入时的计数器值
- while(1)
- {
- tnow=SysTick->VAL;
- if(tnow!=told)
- {
- if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
- else tcnt+=reload-tnow+told;
- told=tnow;
- if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
- }
- };
- }
-
- void delay_ms(uint16_t ms)
- {
- uint32_t i;
- for(i=0;i<ms;i++) delay_us(1000);
- }
- void uart_send_data(uint8_t *data)
- {
- /* Send g_tipString out. */
- xfer.data = data;
- xfer.dataSize = strlen((char*)data);
- txOnGoing = true;
- LPUART_TransferSendNonBlocking(DEMO_LPUART, &g_lpuartHandle, &xfer);
- }
- void reconz_receive()
- {}
- void ESP_WIFI_CONFIG()
- {
- char *p;
- p=(char*)malloc(sizeof(char));
- delay_ms(1000);
- uart_send_data("AT+CWMODE=3\r\n");
- delay_ms(1000);
- delay_ms(1000);
- sprintf(p,"AT+CWSAP="%s","%s",1,4",wifiap_ssid,wifiap_password); //设置无线参数:ssid,密码
- uart_send_data(p); //设置AP模式参数
- uart_send_data("\r\n");
- delay_ms(1000);
- delay_ms(1000);
- delay_ms(1000);
- uart_send_data("AT+RST\r\n");
- delay_ms(1000);
- delay_ms(1000);
- delay_ms(1000); //3s阈量,确保稳定
- uart_send_data("AT+CIPMUX=1\r\n");
- delay_ms(1000);
- sprintf(p,"AT+CIPSERVER=1,%s",(uint8_t*)APport);
- uart_send_data(p);
- uart_send_data("\r\n");
- delay_ms(1000);
- free(p);
- }
- /*!
- * @brief Main function
- */
- int main(void)
- {
- char *str;
- lpuart_config_t config;
- lpuart_transfer_t sendXfer;
- lpuart_transfer_t receiveXfer;
-
- gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
- BOARD_ConfigMPU();
- BOARD_InitPins();
- BOARD_BootClockRUN();
- delay_init();
-
- GPIO_PinInit(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, &led_config);
-
- /*
- * config.baudRate_Bps = 115200U;
- * config.parityMode = kLPUART_ParityDisabled;
- * config.stopBitCount = kLPUART_OneStopBit;
- * config.txFifoWatermark = 0;
- * config.rxFifoWatermark = 0;
- * config.enableTx = false;
- * config.enableRx = false;
- */
- LPUART_GetDefaultConfig(&config);
- config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
- config.enableTx = true;
- config.enableRx = true;
- LPUART_Init(DEMO_LPUART, &config, DEMO_LPUART_CLK_FREQ);
- LPUART_TransferCreateHandle(DEMO_LPUART, &g_lpuartHandle, LPUART_UserCallback, NULL);
-
- ESP_WIFI_CONFIG();
- // /* Start to echo. */
- // sendXfer.data = g_txBuffer;
- // sendXfer.dataSize = ECHO_BUFFER_LENGTH;
- while (1)
- {
- /* If RX is idle and g_rxBuffer is empty, start to read data to g_rxBuffer. */
- if ((!rxOnGoing) && rxBufferEmpty)
- {
- receiveXfer.data = g_rxBuffer;
- receiveXfer.dataSize = ECHO_BUFFER_LENGTH;
- LPUART_TransferReceiveNonBlocking(DEMO_LPUART, &g_lpuartHandle, &receiveXfer, NULL);
- str=strstr((char*)g_rxBuffer,"open");
- }
-
- if(str != NULL)
- {
- while(1)
- {
- GPIO_PortToggle(EXAMPLE_LED_GPIO, 1u << EXAMPLE_LED_GPIO_PIN);
- delay_ms(500);
- }
- }
- // /* If TX is idle and g_txBuffer is full, start to send data. */
- // if ((!txOnGoing) && txBufferFull)
- // {
- // txOnGoing = true;
- // LPUART_TransferSendNonBlocking(DEMO_LPUART, &g_lpuartHandle, &sendXfer);
- // }
- // /* If g_txBuffer is empty and g_rxBuffer is full, copy g_rxBuffer to g_txBuffer. */
- // if ((!rxBufferEmpty) && (!txBufferFull))
- // {
- // memcpy(g_txBuffer, g_rxBuffer, ECHO_BUFFER_LENGTH);
- // rxBufferEmpty = true;
- // txBufferFull = true;
- // }
- }
- }
复制代码 下载编译后,用lpuart0连接esp8266,过一会儿就会组网一个Im_RITIAN的wifi路由了,然后输入密码ritianniubi进行连接,代码中匹配字段"open"来打开led的间歇闪烁,因为是通过网络调试助手来实现的,如果有APP的话完全可以把该字段集成在一个按钮上面。
|
|