蓝桥杯嵌入式-HAL库-USART_RX

硬件设计

所用引脚

PA10 ---------- USART1_RX 串口一接收引脚 用于接收数据
PA9 ---------- USART1_TX 串口一发送引脚 用于发送数据
PC8~PC15 对应G4板上LED灯的LD1~LD8
PD2 连接锁存器
说明:根据原理图可知,LED灯在低电平高电平
锁存器的使能端与PD2相连,低电平时锁存数据(锁存器输出不随输入变化),高电平时不锁存数据(锁存器输出随输入变化)
在这里插入图片描述

知识点

中断接收数据

main.c文件中

1、

uint8_t rx[100];

用于存储接收到的数据

typedef unsigned char uint8_t;
//uint8_t即unsigned char 的别名

2、初始化串口一之后必须使用HAL_UART_Receive_IT(&huart1, rx, 1);
3、

HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

此函数为以非阻塞模式接收数据

HAL_UART_Receive_IT()每次调用仅适用于一次中断,如果要实现连续采用中断接收数据,也要这个函数中调用HAL_UART_Receive_IT()。因为这个回调函数是每次中断发生都会调用,也就相当于每次发生中断处理完数据后又将中断打开,从而实现连续中断接收数据。

编写HAL_UART_RxCpltCallback函数定义

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    
    
	
	GPIOC->ODR = ((rx[0]  <<  8) | 0x00FF);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);		
	
	HAL_UART_Receive_IT(&huart1, rx, 1);
}

stm32g4xx_it.h文件中

声明串口一中断服务函数

void USART1_IRQHandler(void);

注:一般带IRQHandler的会和中断相关

stm32g4xx_it.c文件中

1、外部声明main.c文件中定义的UART_HandleTypeDef huart1;(UART 句柄)

extern UART_HandleTypeDef huart1;

2、编写HAL_UART_IRQHandler函数定义

void USART1_IRQHandler(void)
{
    
    
	HAL_UART_IRQHandler(&huart1); 
}

stm32g4xx_hal_msp.c文件中

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
    
    
  GPIO_InitTypeDef GPIO_InitStruct = {
    
    0};
  if(huart->Instance==USART1)
  {
    
    
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN USART1_MspInit 1 */
	HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);//设置串口一中断的优先级
    HAL_NVIC_EnableIRQ(USART1_IRQn); //使能串口一中断
  /* USER CODE END USART1_MspInit 1 */
  }

}

HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);//设置串口一中断的优先级
HAL_NVIC_EnableIRQ(USART1_IRQn); //开启串口一中断

void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
    
    
  if(huart->Instance==USART1)
  {
    
    
  /* USER CODE BEGIN USART1_MspDeInit 0 */

  /* USER CODE END USART1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_USART1_CLK_DISABLE();
  
    /**USART1 GPIO Configuration    
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX 
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);

    /* USART1 interrupt DeInit */
    HAL_NVIC_DisableIRQ(USART1_IRQn); //失能串口一中断
  /* USER CODE BEGIN USART1_MspDeInit 1 */

  /* USER CODE END USART1_MspDeInit 1 */
  }

}
HAL_NVIC_DisableIRQ(USART1_IRQn); //关闭串口一中断

在HAL库中NVIC中断配置

实验现象

下载程序到G4中后,LED全亮。
0、使用AccessPort向G4发送0(二进制:0000)时,LD5、LD6灭,其他全亮
1、发送1(二进制:0001)时,LD1、LD5、LD6灭,其他全亮
2、发送2(二进制:0010)时,LD2、LD5、LD6灭,其他全亮
3、发送3(二进制:0011)时,LD1、LD2、LD5、LD6灭,其他全亮
4、发送4(二进制:0100)时,LD3、LD5、LD6灭,其他全亮
5、发送5(二进制:0101)时,LD1、LD3、LD5、LD6灭,其他全亮
6、发送6(二进制:0110)时,LD2、LD3、LD5、LD6灭,其他全亮
7、发送7(二进制:0111)时,LD1、LD2、LD3、LD5、LD6灭,其他全亮
8、发送8(二进制:1000)时,LD4、LD5、LD6灭,其他全亮
9、发送9(二进制:1001)时,LD1、LD4、LD5、LD6灭,其他全亮
10、发送10(二进制:1010)时,LD5、LD6灭,其他全亮 现象同0

发送4(二进制:0100)时,LD3、LD5、LD6灭,其他全亮现象如下图。
在这里插入图片描述

在这里插入图片描述

遇到的问题

1、灭的LED灯和预期的不一样。不知道为什么LD5和LD5一直灭?待解决
2、发送10和发送0,现象一样。原因:rx[0]存储一个字符,而串口调试助手发送10为两个字符。故只有0生效。

猜你喜欢

转载自blog.csdn.net/qq_44250317/article/details/114371164