硬件设计
所用引脚
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生效。