HAL通信

本来是因为很久不用就容易忘记,想转载大佬的文当笔记,发现自己不会转载操作。。。尴尬,所以就自己写一下吧

好吧,,,最后还是借鉴了佬的,然后自己改了一下printf的重定向

STM32的串口简介
        在STM32中,串口分USART和UART两种,USART与UART其中最简单的区别是USART有两种通信模式(异步和同步),而UART通信只有异步模式。
        简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。
在STM32中一共有五个串口,如下:

本次使用到的函数:阻塞模式下的发送函数(HAL_UART_Transmit())中断模式下的接收函数(HAL_UART_Receive_IT()) 

软件实现

开RCC时钟,系统时钟,烧录下载,串口,中断

 

 

     (1)使用阻塞模式,发送数据

int main(void)
{
  /* USER CODE BEGIN 1 */
    uint8_t Data[] = "HELLO WORLD !\n";
  /* USER CODE END 1 */


  /* USER CODE BEGIN 2 */
  
   //参数1:使用的串口,2:要发送的数据,3:数据大小,4:发送的超时时间
    HAL_UART_Transmit(&huart1,Data,sizeof(Data),1000);
    
  /* USER CODE END 2 */


}

   编译下载程序可在串口助手中看到:

 在使用串口发送数据时,常用 printf() 语句进行发送。而在STM32中使用printf() 语句需要进行printf() 语句的重定向。代码如下:

        在 usart.h 文件中添加

/* USER CODE BEGIN Includes */
#include <stdio.h>

/* USER CODE END Includes */

         在 usart.c 文件中添加:

/* USER CODE BEGIN 0 */

//通过这段代码,可以实现通过printf函数输出的内容被重定向到USART串口
//从而可以通过串口将printf输出的内容发送到外部设备或者调试工具上
#include <stdio.h>
 #ifdef __GNUC__
     #define PUTCHAR_PROTOTYPE int _io_putchar(int ch)
 #else
     #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
 #endif /* __GNUC__*/
 
 /******************************************************************
     *@brief  Retargets the C library printf  function to the USART.
     *@param  None
     *@retval None
 ******************************************************************/
 PUTCHAR_PROTOTYPE
 {
     HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1,0xFFFF);
     return ch;
 }


/* USER CODE END 0 */

         做完以上步骤后即可实现 printf() 语句的重定向

/* USER CODE BEGIN 2 */
  
   //参数1:使用的串口,2:要发送的数据,3:数据大小,4:发送的超时时间
    HAL_UART_Transmit(&huart1,Data,sizeof(Data),1000);
    
    printf("HELLO STM32 !\n");
    
  /* USER CODE END 2 */

  (2)使用中断模式,接收数据
1.在main函数中添加:

/* USER CODE BEGIN 2 */
  //参数说明, 1:使用的串口,2:接收数据的缓存区,3:接收数据的字节数
  HAL_UART_Receive_IT(&huart1,Rx_Data,3);

2. 调用中断回调函数,将接收到的数据发送出去

        

uint8_t Rx_Data[3];


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        HAL_UART_Transmit(&huart1,Rx_Data,sizeof(Rx_Data),100);
        HAL_UART_Receive_IT(&huart1,Rx_Data,3);  //接收结束后需要重新调用该函数,不然只能接收一次
    }
}

 HAL_UART_Receive_IT(&huart1,Rx_Data,3);  //接收结束后需要重新调用该函数,不然只能接收一次这里强调一下!回调函数尾巴这里一定要再写一次接收函数!!!是为了下次的接收启动串口中断接收

实验现象如下:

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/cairongshou/article/details/127340984

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值