STM32cube HAL库 实现BLE USART串口收发数据

STM32cube HAL库 实现BLE USART串口收发数据

前言:
通过STM32Cube建立工程,实现配置USART2和USART3,以及中断配置。最终实现STM32开发板通过BT05与手机互发数据

用到工具:
1.STM32F103ZET6开发板
2.STM32Cube软件
3.MDK-keil 5
4.STM32F1XX HAL库
5.蓝牙模块BT05

知识点:
1.通过STM32Cube创建例程
2.HAL库中的串口配置,优先级配置,中断配置
3.重定义printf函数
4.在中断里 接收USART2串口发来的数据,并通过USART3发走
在中断里 接收USART3串口发来的数据,并通过USART2发走

硬件连接
BT05的RXD连接到开发板上的 USART2 上的TX口–PA2
BT05的TXD连接到开发板上的 USART2 上的RX口–PA3
BT05的GND连接到开发板上的 GND
BT05的VCC连接到开发板上的 VCC–5V
STM32cube HAL库 实现BLE USART串口收发数据_第1张图片
USB转TTL线,一头连接电脑,另外一头连接 USART3 上的TX口–PB10,RX口–PB11

工程创建:
1.打开STM32Cube
STM32cube HAL库 实现BLE USART串口收发数据_第2张图片
STM32cube HAL库 实现BLE USART串口收发数据_第3张图片
2.双击你选择的芯片封装后,出现如下界面,现在开始建立工程:
STM32cube HAL库 实现BLE USART串口收发数据_第4张图片
2.1设置系统时钟,串口USART2 USART3
STM32cube HAL库 实现BLE USART串口收发数据_第5张图片
STM32cube HAL库 实现BLE USART串口收发数据_第6张图片
STM32cube HAL库 实现BLE USART串口收发数据_第7张图片
STM32cube HAL库 实现BLE USART串口收发数据_第8张图片
STM32cube HAL库 实现BLE USART串口收发数据_第9张图片
STM32cube HAL库 实现BLE USART串口收发数据_第10张图片
STM32cube HAL库 实现BLE USART串口收发数据_第11张图片
STM32cube HAL库 实现BLE USART串口收发数据_第12张图片
2.2点击 GENERATE CODE 马上生成工程。
STM32cube HAL库 实现BLE USART串口收发数据_第13张图片
3.编辑代码
3.1 在usart.c中新增重定向printf的函数

/* USER CODE BEGIN 1 */
/*将串口3连接到电脑上,所以将串口3的printf重映射一下*/
int fputc(int ch,FILE *f)
{
  HAL_UART_Transmit(&huart3,(uint8_t *)&ch,1,0xFFFF);
  return ch;
}
/*接收串口2的内容,这里暂时用不到*/
int fgetc(FILE *f)
{
  uint8_t ch = 0;
 HAL_UART_Receive(&huart2,&ch,1,0xFFFF);
  return ch;
}
/* USER CODE END 1 */

3.2 在main.c中重新编写串口中断回调函数

/* USER CODE BEGIN Includes */
#include 
/* USER CODE END Includes */
/* USER CODE BEGIN PD */
#define RXBUFFERSIZE 256
char RxBuffer[RXBUFFERSIZE];
char RxBuffer_2[RXBUFFERSIZE];
uint8_t aRxBuffer;
uint8_t aRxBuffer_2;
uint8_t Uart2_Rx_Cnt = 0;
uint8_t Uart3_Rx_Cnt = 0;
/* USER CODE END PD */

main函数中新增如下内容(while(1)前)

  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart2,(uint8_t *)&aRxBuffer,1);
  HAL_UART_Receive_IT(&huart3,(uint8_t *)&aRxBuffer_2,1);
  /* USER CODE END 2 */

main函数外重新编写中断回调函数

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  UNUSED(huart);
  if(huart->Instance == USART2)
  {
    if(Uart2_Rx_Cnt > 255)
    {
     Uart2_Rx_Cnt = 0;
     memset(RxBuffer,0x00,sizeof(RxBuffer));
     HAL_UART_Transmit(&huart2,(uint8_t *)"outof range",12,0xffff);
    }
    else
    {
     RxBuffer[Uart2_Rx_Cnt++] = aRxBuffer; 
     if((RxBuffer[Uart2_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart2_Rx_Cnt-2] == 0x0D))
     {
	 HAL_UART_Transmit(&huart3, (uint8_t *)&RxBuffer, Uart2_Rx_Cnt,0xFFFF); //
	 while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);//
	 Uart2_Rx_Cnt = 0;
	 memset(RxBuffer,0x00,sizeof(RxBuffer)); // 
      }
    }
    HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1); 
  }
  
 if(huart->Instance == USART3)
 {
  if(Uart3_Rx_Cnt > 255)
  {
   Uart3_Rx_Cnt = 0;
   memset(RxBuffer_2,0x00,sizeof(RxBuffer_2));
   HAL_UART_Transmit(&huart3,(uint8_t *)"outof range",12,0xffff);
  }  
  else
  {
   RxBuffer_2[Uart3_Rx_Cnt++] = aRxBuffer_2;
   if((RxBuffer_2[Uart3_Rx_Cnt-1] == 0x0A)&&(RxBuffer_2[Uart3_Rx_Cnt-2] == 0x0D))
   {
    HAL_UART_Transmit(&huart2, (uint8_t *)&RxBuffer_2, Uart3_Rx_Cnt,0xFFFF); //??????????
    while(HAL_UART_GetState(&huart2) == HAL_UART_STATE_BUSY_TX);//??UART????
    Uart3_Rx_Cnt = 0;
    memset(RxBuffer_2,0x00,sizeof(RxBuffer_2)); //????
   }
  }
  HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer_2, 1);   //???????
 }
}

你可能感兴趣的:(STM32cube HAL库 实现BLE USART串口收发数据)