STM32 CubeIDE(九)串口通讯

STM32 CubeIDE(九)串口通讯

串口通讯

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息,本篇串口通讯均为异步串口通讯。

串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其组成见图。
在这里插入图片描述
STM32串口
STM32 芯片具有多个 USART 外设用于串口通讯,它是 Universal Synchronous Asynchronous Receiver and Transmitter 的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于 USART,它还有具有 UART 外设(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。

USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个 USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。

USART 功能框图
在这里插入图片描述
①功能引脚
TX:发送数据输出引脚。
RX:接收数据输入引脚。
SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS:请求以发送(Request To Send),n 表示低电平有效。如果使能 RTS 流控制,当USART 接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,
nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
nCTS:清除以发送(Clear To Send),n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

②数据寄存器
USART 数据寄存器(USART_DR)只有低 9 位有效,并且第 9 位数据是否有效要取决于USART 控制寄存器 1(USART_CR1)的 M 位设置,当 M 位为 0 时表示 8 位数据字长,当 M 位为 1 表示 9 位数据字长,我们一般使用 8 位数据字长。
USART_DR 包含了已发送的数据或者接收到的数据。USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写 TDR,一个专门用于接收的可读 RDR。当进行发送操作时,往 USART_DR 写入数据会自动存储在 TDR 内;当进行读取操作时,向 USART_DR读取数据会自动提取 RDR 数据。

③控制器
USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用 USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能 USART。发送或者接收数据字长可选 8 位或 9 位,由 USART_CR1 的 M 位控制。

④小数波特率生成
波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位 bit/s(bps)。对于 USART 波特率与比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。USART 的发送器和接收器使用相同的波特率。计算公式如下:
在这里插入图片描述
⑤校验控制
STM32F4xx 系列控制器 USART 支持奇偶校验。当使用校验位时,串口传输的长度将是 8 位的数据帧加上 1 位的校验位总共 9 位,此时 USART_CR1 寄存器的 M 位需要设置为1,即 9 数据位。将 USART_CR1 寄存器的 PCE 位置 1 就可以启动奇偶校验控制,奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见 USART_SR 寄存器的 PE 位置 1,并可以产生奇偶校验中断。使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+数据帧+校验位+停止位。

UART初始化结构体

/**
  * @brief UART Init Structure definition
  */
typedef struct
{
  uint32_t BaudRate;                  /*!< 波特率 */

  uint32_t WordLength;                /*!< 数据字长 */

  uint32_t StopBits;                  /*!< 停止位 */

  uint32_t Parity;                    /*!< 校验控制 */

  uint32_t Mode;                      /*!< UART模式 */

  uint32_t HwFlowCtl;                 /*!< 硬件流控 */

  uint32_t OverSampling;              /*!< 过采样倍率 */
} UART_InitTypeDef;

UART函数

HAL_UART_Init(UART_HandleTypeDef *huart);	//串口初始化
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);		//串口接收字符
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);		//串口发送字符
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);	//接受中断
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);	//发送中断

UART实验
本次实验基于野火STM32F407-霸天虎V2开发板实现,使用串口1与电脑进行数据通讯,通讯方式为轮询和中断。

打开Cube,在Connectivity中激活USART1,设置为Asynchronous异步串口,不打开硬件流,设置波特率为115200,8位数据字长,无校验,1位停止位,收发模式,16倍过采样,开启NVIC中断。
在这里插入图片描述

生成代码后,在usart.c文件中相应位置添加如下代码,此为轮询方式。

/* USER CODE BEGIN 1 */
void Usart_SendString(uint8_t *str)
{
	uint8_t k=0;
	do
	{
		HAL_UART_Transmit(&huart1,(uint8_t *)(str + k) ,1,1000);
		k++;
	}while(*(str + k)!='\0');

}


#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;
}
/* USER CODE END 1 */

在main.c文件中相应位置添加如下代码。

int main(void)
{
  /* USER CODE BEGIN 1 */
	char ch;
  /* USER CODE END 1 */
  
	//..........//
	
	/* USER CODE BEGIN WHILE */
  while (1)
  {
	  Usart_SendString((uint8_t *)"Hello World!\r\n");
	  printf("Nice!\r\n");

	  ch = '\0';
	  HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);
	  if(ch != '\0')
		  printf("Receive is %c\r\n",ch);

	  HAL_Delay(1000);

    /* USER CODE END WHILE */	
    
	//..........//

在main.c文件中相应位置添加如下代码,此为中断方式。

/* USER CODE BEGIN PV */
uint8_t Buffer[5];
/* USER CODE END PV */
 
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,Buffer, sizeof(Buffer));
/* USER CODE END 2 */

在stm32f4xx_it.c中添加如下代码,每触发一次接受中断后都需要重新打开中断。

/* USER CODE BEGIN 1 */
extern uint8_t Buffer[5];

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
		HAL_UART_Receive_IT(&huart1,Buffer, sizeof(Buffer));
		HAL_UART_Transmit(&huart1,Buffer,sizeof(Buffer),100);
	}
}
/* USER CODE END 1 */

使用上位机必须发送5个数据才会触发一次中断,看到回显内容。如果需要每次发一个数据都能回显,需要空闲中断接受不定长数据,以后再更。

  • 10
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32CubeIDE是一款集成开发环境(IDE),用于开发STM32系列微控制器应用程序。它提供了许多工具和资源,帮助开发人员快速、高效地开发STM32应用程序。 在STM32CubeIDE中,串口通讯是一个非常常见的应用。STM32微控制器通常具有多个串口,可以用于与其他设备进行通信,例如传感器、显示屏、WiFi模块等。以下是在STM32CubeIDE中实现串口通讯的步骤: 1. 配置串口引脚 在STM32CubeIDE中,可以使用CubeMX插件来配置STM32微控制器的引脚。在CubeMX中,选择相应的微控制器型号,然后选择“Pinout”选项卡。在这里,可以选择要用作串口引脚的GPIO引脚。 2. 配置串口外设 在CubeMX中,选择“Configuration”选项卡,然后选择“USART”外设。在这里,可以配置串口的波特率、数据位、停止位和校验位等参数。 3. 生成代码 在CubeMX中完成串口配置后,可以单击“Generate Code”按钮生成相应的代码。这将生成一个包含初始化串口的代码的C文件。 4. 编写串口通讯代码 在生成的代码中,可以使用HAL库函数来编写串口通讯代码。HAL库提供了许多函数,可以发送和接收数据,以及处理串口中断等。 5. 测试代码 在编写完串口通讯代码后,可以将代码下载到STM32微控制器中,然后使用串口调试工具进行测试。串口调试工具可以显示发送和接收的数据,并且可以检查数据是否正确。 总之,在STM32CubeIDE中实现串口通讯需要进行引脚配置、外设配置、代码编写和测试。通过使用HAL库函数,可以轻松地实现串口通讯,并与其他设备进行通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值