赞
踩
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是通用同步/异步串行接收/发送器的缩写。这种通讯协议发展历史非常遥远,它甚至在PC还未普及之前就已经大规模在工业领域进行推广(用于PLC等简单运算单元之间的通信)。详细可以见这位大佬的链接。
当然,我想大家肯定还听说过USART(RS232、RS422、RS485)等其中的一个或者其他名词。他们在通信逻辑方面和USART是一致的,但是他们的逻辑1和逻辑0的表达电平不同。
为了在工业领域使用,他们的电平都比单片机使用的TTL电平要高,如果直接通入单片机引脚,那么单片机会立即被击穿。但是在工业领域,这样的高电平协议有很好的抗干扰性。详细可见链接。
其余的有关串口的基础知识在网上也有很多了。本着不重复造轮子的原则,我这里就不再赘述了。本文主要是介绍如何在CubeMX上设置串口,以及如何在Keil5中使用代码以实现功能。最后用我新买的30块大洋的逻辑分析仪来看看具体波形,验证我们设置的内容。
打开CubeMX,准备一个工程,(此处可参考鄙人以前的博文)。当我们打开Connectivity一栏后,我们可以看到三大通讯协议IIC、SPI、USART协议都在此处。我们在芯片引脚图中选中我们需要的引脚,图中为PB6、PB7。强烈建议先选择Pin,打上大头针后,再启用左侧菜单栏中的功能,因为很多功能都有复用的引脚,直接启用功能可能会应用在我们不需要的引脚上。
在中间Mode一栏中有选择模式和硬件流控制(RS232)。其中RS232我没有用过,其中包含RTS和CTS两种功能,都是串口流控的功能。
Mode中的功能如下:
在本文中,我们使用的是Asynchronous(异步)功能。我们可以看到下面的参数设置只有六项。最重要的就是波特率(Baud Rate),在串口通信中只有接收发送双方约定好相同的波特率,才能进行通信。有效位数(Word Length) 是规定了一次传输数据的大小,在这里我们可以看到它是包含(Parity)的。这是 校验位(Parity),是用于让接收方校验数据的。包含的校验方式有奇校验、偶校验和无校验。停止位(Stop) 也是双方约定的,开始必定由1位逻辑0开始,结束以1位还是2位逻辑1结束,需要双方约定,注:信号线上默认拉高(逻辑1)。下面的高级的选项分别是接收和发送功能选择和过采样位数。
还要说一下除了参数设置外其他的设置。NVIC设置中,我们可以启用全局中断来使用串口中断来收发数据。DMA设置中,我们可以将串口接收和发送的数据放在DMA中,让其自动存储和自动发送,这一部分内容可以在以后讲DMA的博文中看到具体的实验验证。GPIO设置是CubeMX帮我们默认设置好的,如果需要可以添加User_label。用户常量设置也可以按需设置,本文就用不到了。
基本的初始化代码,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);
本文不介绍中断接收发送和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 */
当然不能忘了设置一个我们需要发送的信息数组。由于串口一次只能发送8bit的数据,所以发送char类型或者字符串数组作为实验是非常合适的。我们设置一个字符串数组为"CTRL",就是唱跳Rap声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。