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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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);
		}
		
	}
}

你可能感兴趣的:(蓝桥杯嵌入式,stm32,单片机,蓝桥杯,arm,嵌入式硬件)