当前位置:   article > 正文

STM32之CubeMX学习笔记(6)USART串口基础功能验证_stm32cubemx学习笔记

stm32cubemx学习笔记


USART是什么

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是通用同步/异步串行接收/发送器的缩写。这种通讯协议发展历史非常遥远,它甚至在PC还未普及之前就已经大规模在工业领域进行推广(用于PLC等简单运算单元之间的通信)。详细可以见这位大佬的链接

当然,我想大家肯定还听说过USART(RS232、RS422、RS485)等其中的一个或者其他名词。他们在通信逻辑方面和USART是一致的,但是他们的逻辑1逻辑0的表达电平不同。
为了在工业领域使用,他们的电平都比单片机使用的TTL电平要高,如果直接通入单片机引脚,那么单片机会立即被击穿。但是在工业领域,这样的高电平协议有很好的抗干扰性。详细可见链接

其余的有关串口的基础知识在网上也有很多了。本着不重复造轮子的原则,我这里就不再赘述了。本文主要是介绍如何在CubeMX上设置串口,以及如何在Keil5中使用代码以实现功能。最后用我新买的30块大洋的逻辑分析仪来看看具体波形,验证我们设置的内容。

CubeMX串口设置

打开CubeMX,准备一个工程,(此处可参考鄙人以前的博文)。当我们打开Connectivity一栏后,我们可以看到三大通讯协议IIC、SPI、USART协议都在此处。我们在芯片引脚图中选中我们需要的引脚,图中为PB6、PB7。强烈建议先选择Pin,打上大头针后,再启用左侧菜单栏中的功能,因为很多功能都有复用的引脚,直接启用功能可能会应用在我们不需要的引脚上

在这里插入图片描述
在中间Mode一栏中有选择模式和硬件流控制(RS232)。其中RS232我没有用过,其中包含RTS和CTS两种功能,都是串口流控的功能。

Mode中的功能如下:

  1. Asynchronous(异步):最常用的功能,需要两线(双向单车道),TX和RX,一根用于发送一根用于接收。
  2. Synchronous(同步):比异步多一根CK(时钟线)。
  3. Single wire(单线):只是用一根线来发送和接收,只可用在半双工模式,不能同时发送和接收。
  4. 微处理器通信:多一个唤醒功能。
  5. IrDA:红外通信。
  6. LIN总线:低配版的CAN总线协议,用于单主多从通信领域、车用。
  7. Smartcard:智能卡,就是IC卡。
  8. Smartcard with card clock:高级的带时钟的智能卡。

在本文中,我们使用的是Asynchronous(异步)功能。我们可以看到下面的参数设置只有六项。最重要的就是波特率(Baud Rate),在串口通信中只有接收发送双方约定好相同的波特率,才能进行通信。有效位数(Word Length) 是规定了一次传输数据的大小,在这里我们可以看到它是包含(Parity)的。这是 校验位(Parity),是用于让接收方校验数据的。包含的校验方式有奇校验偶校验无校验停止位(Stop) 也是双方约定的,开始必定由1位逻辑0开始,结束以1位还是2位逻辑1结束,需要双方约定,注:信号线上默认拉高(逻辑1)。下面的高级的选项分别是接收和发送功能选择过采样位数

还要说一下除了参数设置外其他的设置。NVIC设置中,我们可以启用全局中断来使用串口中断来收发数据。DMA设置中,我们可以将串口接收和发送的数据放在DMA中,让其自动存储和自动发送,这一部分内容可以在以后讲DMA的博文中看到具体的实验验证。GPIO设置是CubeMX帮我们默认设置好的,如果需要可以添加User_label。用户常量设置也可以按需设置,本文就用不到了。

Keil v5中初始化和发送

基本的初始化代码,CubeMX已经自动生成,并把它放到了我们不能修改的 /* USER CODE BEGIN 2 */上方,这里我们不需要修改。如果需要使用串口中断,我们还需要在下方初始化启用串口中断(别忘了在CubeMX中的NVIC中勾选USART1全局中断global interrupt)。

HAL_UART_Receive_IT(&huart1, &ReceveDATA, 1);
or
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  • 1
  • 2
  • 3

本文不介绍中断接收发送和DMA接收和发送。可能未来会在高级一点的笔记中总结,请查找其他博主的文章。

我们在主循环中添加一个按下按键进行发送的代码,如下:

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		
	  HAL_Delay(500);
	  HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
	  if(KEY4 == 0)
		HAL_UART_Transmit(&huart1, data, 4, 20);
    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

当然不能忘了设置一个我们需要发送的信息数组。由于串口一次只能发送8bit的数据,所以发送char类型或者字符串数组作为实验是非常合适的。我们设置一个字符串数组为"CTRL",就是唱跳Rap声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】

推荐阅读
相关标签