蓝桥杯嵌入式(STM32G431RBT6)入门第五天——串口通讯(USART)|CSDN创作打卡

今天学习了关于串口的一些知识,现在主流使用的还是异步串行通讯:通讯双方在没有同步时钟的前提下,将一个字符(包括特定的附加位)按位进行传输的通讯方式。

然后查看官方提供的CT117E-M4产品手册,可以看到开发板的PA9和PA10引脚是作为串口收发引脚与数据线相连的,所以PA9是开发板的TX,PA10是开发板的RX。

下面打开STM32CubeMX进行配置,首先配置RCC打开高速时钟,将时钟频率设置为80MHz,然后配置所有LED灯对应的IO口以及LE引脚对应的PD2,设置好初始化电平状态后进入到最重要的串口设置环节。

 

在Connectivity下拉找到USART1将其模式设置为Asynchronous 异步通讯,并修改PA9和PA10引脚作为USART的接收和发送引脚,并使能中断。一开始我没有查阅官方提供的数据手册,使用默认IO口作为串口接收和发送引脚,无论怎么修改代码更换上位机都没法实现功能,最后发现原因在没有修改IO口。

 修改好工程设置后即可生成代码。

 打开工程添加一下启动文件,并编译。下面了解几个关于串口的函数:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

这两个分别是阻塞式发送函数和阻塞式接收函数,即在未完成发送或接收前不会执行后面的代码,适合初学者使用,对应的变量分别是串口号,发送的数据或接收到的数据存放的位置,停止位,完成时间(在时间内未完成就会停止接收或发送,进行下面的程序)。

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

这两个函数名称后面多了一个IT,对应的是非阻塞式发送函数和非阻塞式接收函数,在执行完成接收或发送的任务,可在中断中执行想要实现的功能。下面实现一组功能,在上电开始打开LED4并使用阻塞式发送HELLO WORLD给上位机,发送完成后关闭LED4。使用非阻塞式接收,在接收到0xA2时打开LED1并发送LED1 OPEN给上位机,接收到0xA1时关闭LED1并发送LED1 CLOSE给上位机。上位机发送时使用16进制发送。下面代码添加到main.c中即可。

uint8_t rx = 0;//定义接收的变量
//定义三个发送的字符串
uint8_t tx[]="HELLO WORLD\r\n";
uint8_t tx1[]="LED1 OPEN\r\n";
uint8_t tx2[]="LED1 CLOSE\r\n";
int main(void)
{
  
  HAL_Init();


  SystemClock_Config();

 
  MX_GPIO_Init();
  MX_USART1_UART_Init();
 
  HAL_UART_Receive_IT(&huart1, &rx, 1);//开始接收UART1的数据,存放在rx中,停止位为1位
 

  while (1)
  {
        //开灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		HAL_Delay(500);
        //使用UART1发送tx数据,利用sizeof函数获取它的位数并作为停止位,完成时间为50
		HAL_UART_Transmit(&huart1,tx,sizeof(tx),50);
        //发送完成后关灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		HAL_Delay(500);
  }
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
        //如果接收到为A2开灯,并发送tx1
		if(rx==0xA2)
		{
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
			//sprintf(tx, "%04d:Hello,world.\r\n", 100);
			HAL_UART_Transmit(&huart1,tx1,sizeof(tx1),100);
			HAL_UART_Receive_IT(&huart1, &rx, 1);
		}
        //如果接收到为A1关灯,并发送tx2
		else if(rx==0xA1)
		{
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
			//sprintf(tx, "%04d:Hello,world.\r\n", 100);
			HAL_UART_Transmit(&huart1,tx2,sizeof(tx2),100);
			HAL_UART_Receive_IT(&huart1, &rx, 1);
		}
		
	}
}

  • 11
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寻梦旅程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值