普冉PY32F003+瑞昱RTL8710+AT固件点灯

为了实现WIFI点灯也是拼了:

1、MCU采用普冉PY32F003

2、WIFI模组为RTL8710

3、RTL8710 AT固件来自博安通

思路就是PY32F003与RTL8710串口通讯,发送AT指令,RTL8710负责WIFI部分

一、前言

开发板原理图如下

e9f758c60cce418db28b7691046d964b.png

 3D图:

42a3fde819ed46d28a9527d8fe4188c5.png

 实物:

9e58d6d412a441178d0bd24c5b045095.jpg

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模式,还不能用透传指令。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值