为了实现WIFI点灯也是拼了:
1、MCU采用普冉PY32F003
2、WIFI模组为RTL8710
3、RTL8710 AT固件来自博安通
思路就是PY32F003与RTL8710串口通讯,发送AT指令,RTL8710负责WIFI部分
一、前言
开发板原理图如下
3D图:
实物:
WIFI模块是拆机战损版,为了保护,用塑料包裹起来。
二、源码
main.c
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "string.h"
/* Private define ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef UartHandle;
uint8_t aTxBuffer[12] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
uint8_t aRxBuffer[100] = {0xff};
uint8_t recvByte;
int rx_count=0; //接收计数
/* Private user code ---------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/**
* @brief 初始化LED
* @param 无
* @retval 无
*/
static void APP_LedConfig(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE(); /* GPIOB时钟使能 */
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
GPIO_InitStruct.Pull = GPIO_PULLUP; /* 使能上拉 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; /* GPIO速度 */
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* GPIO初始化 */
}
/**
*
*
*/
void RTL8710_USART_Config(void)
{
UartHandle.Instance = USART2; //AF9:PA0(TX),PA1(RX)
UartHandle.Init.BaudRate = 38400;
UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
UartHandle.Init.StopBits = UART_STOPBITS_1;
UartHandle.Init.Parity = UART_PARITY_NONE;
UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
UartHandle.Init.Mode = UART_MODE_TX_RX;
if (HAL_UART_Init(&UartHandle) != HAL_OK)
{
APP_ErrorHandler();
}
}
/**
*
*
*/
void RTL8710_UART_Send(uint8_t *str)
{
uint8_t ch;
while(*str!=0){
ch=*str;
HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 200);
str++;
}
}
/**
* @brief 应用程序入口函数.
* @retval int
*/
int main(void)
{
/* systick初始化 */
HAL_Init();
APP_LedConfig();
/* USART初始化 */
RTL8710_USART_Config();
//__HAL_UART_ENABLE_IT(&UartHandle,UART_IT_IDLE);
HAL_Delay(1000);
/* DEBUG USART初始化 */
BSP_USART_Config();
HAL_Delay(1000);
RTL8710_UART_Send("ATSE=0\r\n"); //关闭回显
HAL_Delay(2000);
printf("ATSE=0\r\n");
RTL8710_UART_Send("ATPW=2\r\n");
HAL_Delay(1000);
printf("ATPW=2\r\n"); //AP模式
//HAL_Delay(1000);
RTL8710_UART_Send("ATPA=\"ABCDE\",,11,0\r\n");
HAL_Delay(1000);
printf("ATPA=\"ABCDE\",,11,0\r\n"); //建立AP
//HAL_Delay(1000);
RTL8710_UART_Send("ATPS=0,5001\r\n");
HAL_Delay(1000);
printf("ATPS=0,5001\r\n"); //建立tcpip服务
//HAL_Delay(1000);
RTL8710_UART_Send("ATPK=1\r\n");
HAL_Delay(1000);
printf("ATPK=1\r\n"); //建立自动接收
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_SET);
/*通过中断方式发送数据*/
/*
if (HAL_UART_Transmit_IT(&UartHandle, (uint8_t *)aTxBuffer, 1) != HAL_OK)
{
APP_ErrorHandler();
}
*/
while(HAL_UART_Receive_IT(&UartHandle, &recvByte, 1)!=HAL_OK){
UartHandle.RxState = HAL_UART_STATE_READY;
__HAL_UNLOCK(&UartHandle);
}
while (1)
{
/* 延时500ms */
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}
}
/**
* @brief USART错误回调执行函数
* @param huart:USART句柄
* @retval 无
*/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if((huart==&UartHandle)&&(huart->ErrorCode!=HAL_UART_ERROR_NONE))
{
printf("Uart Error, ErrorCode = %d\r\n", huart->ErrorCode);
if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(huart);
while(HAL_UART_Receive_IT(&UartHandle, &recvByte, 1)!=HAL_OK){
UartHandle.RxState = HAL_UART_STATE_READY;
__HAL_UNLOCK(&UartHandle);
}
}
}
}
/**
* @brief USART发送回调执行函数
* @param huart:USART句柄
* @retval 无
*/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
/*if (HAL_UART_Receive_IT(UartHandle, (uint8_t *)aRxBuffer, 12) != HAL_OK)
{
APP_ErrorHandler();
}*/
}
/**
* @brief USART接收回调执行函数
* @param huart:USART句柄
* @retval 无
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *Handle)
{
/*通过中断方式接收数据*/
if(Handle->Instance==USART2)
{
printf("%c", recvByte);
if(rx_count<99){
aRxBuffer[rx_count++]=recvByte; //rx_count>100丢弃
}
if((0x0A==aRxBuffer[rx_count-1])&&(0X0D==aRxBuffer[rx_count-2]))
{
aRxBuffer[rx_count]='\0';
//收到一个完成指令,执行操作
if((aRxBuffer[14]=='o')&&(aRxBuffer[15]=='n')){ //收到on点灯
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_RESET);
}else if((aRxBuffer[14]=='o')&&(aRxBuffer[15]=='f')&&(aRxBuffer[16]=='f')){ //收到off关灯
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_SET);
}
rx_count=0;
}
while(HAL_UART_Receive_IT(&UartHandle, &recvByte, 1)!=HAL_OK){
UartHandle.RxState = HAL_UART_STATE_READY;
__HAL_UNLOCK(&UartHandle);
}
}
}
/**
* @brief 错误执行函数
* @param 无
* @retval 无
*/
void APP_ErrorHandler(void)
{
/* 无限循环 */
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
/**
* @brief 输出产生断言错误的源文件名及行号
* @param file:源文件名指针
* @param line:发生断言错误的行号
* @retval 无
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* 用户可以根据需要添加自己的打印信息,
例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* 无限循环 */
while (1)
{
}
}
#endif /* USE_FULL_ASSERT */
通过向串口发送AT指令配置WIFI,建立TCPIP
通过串口RX中断方式接收手机网络调试APP的指令,on:点灯;off:灭灯
用到2个UART:UART1用于DEBUG(printf),UART2用于和RTL8710通讯。
总结
1、普冉开发也是HAL库,和32可以无缝过渡
2、UART用的是中断方式,HAL_UART_Receive_IT函数是个大坑
3、所用RTL8710模块引脚有限,只能做为AT固件载体使用,因采用AP模式,还不能用透传指令。