(HAL库学习1)STM32CubeMX开启串口通信HAL库

使用STM32CubeMX使能串口并完成发送+接收

第一步,在STM32CubeMX上使能串口,完成属性配置并且打开串口中断(测试使用的是f103c8t6,但是其他板子操作是一样的,关于CubeMX创建工程以及工程的必要初始化配置看我博客第一篇文章)

在这里插入图片描述
按照上面这张图进行串口使能配置,属性除了波特率有很大可能改动以外大多数情况都是用默认的,使能后打开中断设置进行优先级配置
在这里插入图片描述
这样就完成了第一步,点击生成工程就可以了

第二步,进行发送重定向(使用用习惯了的printf打印输出)

按照我博客第一篇建立的工程,然后按照上面第一步进行配置后,用keil打开工程,在usart.c中添加以下代码,记住!!!添加在BEGIN END 之间。下面配了一张图

#include "stdio.h"
#ifdef __GNUC_
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
	return ch;
}

在这里插入图片描述

第三步:测试使用printf发送(PA9连usb转ttl-Rx,PA10连usb转ttl-Tx)

现在main.c中包含头文件 #include “stdio.h” 同样记住,写在BEGIN-END之间
直接在组函数的循环中添加print语句即可使用,没什么别的要加的,很简单。
在这里插入图片描述

第四步:测试串口接收

在这里插入图片描述
要添加的代码在这里:

uint8_t RX_Buffer[20];
void user_usart1_rx_logic()
{
	printf("在这里面实现用户逻辑\r\n");
}
void SystemClock_Config(void);  //这个是顺带复制的,本来工程中就有了
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  UNUSED(huart);
  HAL_UART_Transmit(&huart1, (uint8_t *)RX_Buffer, 10,0xFFFF);//发送10个数据给串口1,可以直接使用printf(RX_Buffer)打印
	printf("\r\n");  //打印的时候加入回车换行符
  HAL_UART_Receive_IT(&huart1,RX_Buffer,10);  // 重新使能串口1接收中断
	user_usart1_rx_logic();
}

如果你是接收很快的数据就需要在循环或者定时器内快速处理逻辑并且使能串口接收,否则可能导致接收失效(其他功能不受影响),然后就可以在组函数的循环中使用 HAL_UART_Receive_IT(&huart1,RX_Buffer,10); 来进行接收了,注意这里传入的参数,那个10,代表接收为10个字符后出发中断,可以自己改。这样,接收发送就都弄好了,注意上面的 HAL_UART_Transmit 这个函数也是发送打印,只是这个用的是库自带的函数,没有用我们自己重定向的

第五步:一些拓展资料

大家可以点开查看Cube创建的工程中自带的函数
在这里插入图片描述
里面有很多函数,大家有兴趣可以自己了解,包括DMA方式的一些操作,下面给大家总结了几个常用的
串口的发送接收函数:
HAL_UART_Transmit();//串口轮询模式发送,使用超时管理机制
HAL_UART_Receive();//串口轮询模式接收,使用超时管理机制
HAL_UART_Transmit_IT();//串口中断模式发送
HAL_UART_Receive_IT();//串口中断模式接收
HAL_UART_Transmit_DMA();//串口DMA模式发送
HAL_UART_Receive_DMA();//串口DMA模式接收

串口相关的中断函数:
HAL_UART_TxHalfCpltCallback() 一半数据(half transfer)发送完成后,通过中断处理函数调用。
HAL_UART_TxCpltCallback() 发送完成后,通过中断处理函数调用。
HAL_UART_RxHalfCpltCallback() 一半数据(half transfer)接收完成后,通过中断处理函数调用。
HAL_UART_RxCpltCallback() 接收完成后,通过中断处理函数调用。
HAL_UART_ErrorCallback() 传输过程中出现错误时,通过中断处理函数调用。

串口有三种通信模式:
第一种是轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。

第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。

第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
最后总结这部分是参考了另外一位博主的资料。

最后

我是一个新人博主,目前也是一个大学生,但是真心喜欢嵌入式和物联网,已经自学3年了,我会带着热爱一直把博文写下去,也是自己记笔记的一种方式,大家可以关注我,给我留言,一起学习

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值