蓝桥杯嵌入式-HAL库-USART_RX

   日期:2021-03-06     浏览:102    评论:0    
核心提示:硬件设计所用引脚PA10 ---------- USART1_RX 串口一接收引脚 用于接收数据PA9 ---------- USART1_TX 串口一发送引脚 用于发送数据PC8~PC15 对应G4板上LED灯的LD1~LD8PD2 连接锁存器说明:根据原理图可知,LED灯在低电平时亮,高电平时灭锁存器的使能端与PD2相连,低电平时锁存数据(锁存器输出不随输入变化),高电平时不锁存数据(锁存器输出随输入变化)...

硬件设计

所用引脚

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)
  { 
  

  
    
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    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);

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

}

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

void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{ 
  if(huart->Instance==USART1)
  { 
  

  
    
    __HAL_RCC_USART1_CLK_DISABLE();
  
    
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);

    
    HAL_NVIC_DisableIRQ(USART1_IRQn); //失能串口一中断
  

  
  }

}
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生效。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服