STM32HAL库串口通信

一、硬件连接

将PA9和RXD连接PA10和TXD连接

二、cubemx配置

以正点原子精英版stm32f103zet6为例

sys配置

rcc(时钟)配置

gpio配置(led灯)

usart1配置

打开usart1中断

二、keil5代码

(1)利用printf函数打印

1、printf函数部分

首先在usart1.c中引用stdio.h

在usart1.c中重定向printf函数

/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
 
/**
  * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}

2、接收中断回调函数部分

usart1.c文件中定义接收的数组

uint8_t aRxBuffer1[1];

定义中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //接收完成中断
{
    if(huart->Instance == USART1)    
    {
        if(aRxBuffer1[0] == 'a')  //如果从电脑接收的数据为‘a’,
        {
            printf("RX Correct!\r\n");  //串口打印
			HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);  //则反转PB5的电平
        }
    }
    HAL_UART_Receive_IT(&huart1,aRxBuffer1,1);			
    //重新打开串口中断,若无此语句,只能打开一次中断
}

3、main主函数部分

打开串口中断

  HAL_UART_Receive_IT(&huart1,aRxBuffer1,1); //最后的1表示接收一次进行一次中断

while循环函数添加代码

	  if(aRxBuffer1[0]=='b')  //如果接收的数据为‘b’
	  {
		  HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);	  //翻转PE5的电平
	  }

(2)利用HAL_UART_Transmit实现

首先在main函数中定义一个数组

uint8_t temp[]="usart test\r\n";

然后在while中添加相关代码

	  HAL_UART_Transmit(&huart1,temp,15,10000);
	  HAL_Delay(500);

三、实验结果xcom部分

(1)printf实验

验证串口代码部分,电脑发送a给32,单片机回应,同时PB5的LED灯电平翻转(亮变暗或暗变亮)

验证主函数部分代码,发送b另一个led灯电平翻转

实验成功

(2)HAL_UART_Transmit实验 

下载到单片机复位后每0.5s发送一个“usart test” 

实验成功 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值