前言:
通过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
USB转TTL线,一头连接电脑,另外一头连接 USART3 上的TX口–PB10,RX口–PB11
工程创建:
1.打开STM32Cube
2.双击你选择的芯片封装后,出现如下界面,现在开始建立工程:
2.1设置系统时钟,串口USART2 USART3
2.2点击 GENERATE CODE 马上生成工程。
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); //???????
}
}