八、HAL_UART(串口)的接收和发送

文章介绍了基于STM32F407ZGT6的开发环境,包括KeilMDK和STM32CubeMX的版本,以及UART和USART的区别。详细阐述了串口的阻塞和中断发送模式,并指导如何在STM32CubeMX中配置时钟和串口。此外,还提到了printf函数的重定向以及提供了一个串口中断接收的示例代码。
摘要由CSDN通过智能技术生成

1、开发环境

(1)Keil MDK: V5.38.0.0

(2)STM32CubeMX: V6.8.1

(3)MCU: STM32F407ZGT6

2、UART和USART的区别

2.1、UART

(1)通用异步收发收发器:Universal Asynchronous Receiver/Transmitter)。

2.2、USART

(1)通用同步异步收发器:Universal Synchronous/Asynchronous Receiver/Transmitter

(2)同步:Synchronous。

(3)目前只用到异步收发的场景,同步收发场景没有用过。同步应该类似IIC总线,需要一个时钟。

3、中文芯片参考手册去哪找的。

(1)进入STMCU中文官网:STMCU中文官网

(2)点击设计资源→芯片文档。找到相应芯片的英文参考手册,点击蓝色字体就能直接下载英文的参口手册了。

(3)网页搜索框搜索RM0090。

(4)搜索后便有可能找到中文参考手册。

(5)也可直接搜索该芯片,筛选选择中文译文。

4、示例程序的目的

(1)通过串口实现阻塞发送和中断接收;将中断接收到的内容通过阻塞形式发送出去。。

(2)阻塞模式串口发送。MCU的CPU一个字节一个字节的将要发送的内容丢给串口模块,然后看着串口模块将这个字节发送出去,然后CPU再去拿下一个字节来丢给串口模块。直到本次要发送的所有字节全部发完,CPU才会去做其他事。

(3)中断模式串口发送。MCU的CPU向串口模块丢一个字节,然后串口模块慢慢发,CPU丢完这个字节后会跳出去做其他事情,等串口模块发完这个字节后会生成一个中断,中断会通知CPU过来继续丢下一个字节。这主要是因为CPU主频远远大于串口的发送速度,CPU一直在这看着挺浪费的。这种方式更加充分利用了CPU。

(4)在程序开发过程中,会通过串口打印很多调试信息。可以通过宏定义的方式,在调试时允许打印,在正式版中屏蔽打印。

5、原理图

(1)CH340芯片部分。

(2)使用的串口是USART1。STM32大多数串口1都是接PA9、PA10引脚。

6、STM32CubeMX创建工程及时钟配置

6.1、创建工程

(1)打开STM32CubeMX软件。

(2)点击File→NewProject。

(3) Commercial Part Number(商用部件号)处输入MCU型号,然后选择正确的单片机型号,点击Start Project(开始项目)。

(4)配置工程名、工程存放文件等。

点击Project Manager(项目经理)进行如下配置。

点击Code Generator(代码生成器)进行如下配置。

(5)点击GENERATE CODE生成KeilMDK工程。

6.2、配置时钟

(1)HSE、LSE时钟源选择

  • HSE:高速外部时钟源
  • LSE:低速外部时钟源
  • Disable:禁用
  • BYPASS Clock Source:旁路时钟源
  • Crystal/Ceramic Resonator :水晶/陶瓷共振器
  • 一般选择水晶陶瓷共振器
  • 旁路时钟源就是由外部给定一个时钟信号,一般用于作为同步时钟。
  • 水晶/陶瓷共振器:指外接晶振,经过内部振荡电路产生时钟。

(2)时钟树配置

(3)点击GENERATE CODE更新KeilMDK工程。 

7、STM32CubeMX配置串口

(1)USART1模式配置,选择异步

  • Asynchronous: 异步
  • Synchronous: 同步
  • Single Wire(Half-Duplex): 单线(半双工)
  • Multiprocessor Communication: 多处理器通信

(2)串口1参数设置

  • Parameter Settings: 参数设置
  • Basic Parameters: 基本参数
  • Baud Rate: 波特率
  • Word Length: 字长
  • including Parity:包括奇偶校验
  • Parity: 奇偶校验
  • Stop Bits: 停止位

(3)使能串口中断

8、Keil MDK软件编写

8.1、串口中断接收

/*
 *功能:接收完成回调函数
 *参数:串口x
 *返回值:无
 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
      HAL_UART_Transmit(&huart1, &UART_Data.DebugRxBuf[0], 1,0xFF);  /*将接收到的内容发送出去*/
      HAL_UART_Receive_IT(&huart1, UART_Data.DebugRxBuf,1);
    }
}

8.2、printf的重定向

(1)需要勾选Keil微库。

/*
 *功能:将C库printf函数重定向到USART1
 *参数:无
 *返回值:无
 */
int fputc(int ch, FILE *f)
{
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
}

8.3、完整工程下载地址。

(1)完整工程存储在码云。

(2)STM32_CSDN: CSDN中STM32专栏的所有示例代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码织梦师小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值