当前位置:网站首页>蓝桥杯嵌入式-HAL库-USART_RX
蓝桥杯嵌入式-HAL库-USART_RX
2022-07-28 10:25:00 【[email protected]】
硬件设计
所用引脚
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); //关闭串口一中断
实验现象
下载程序到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生效。
版权声明
本文为[[email protected]]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_44250317/article/details/114371164
边栏推荐
- 从零开始Blazor Server(2)--整合数据库
- AP Autosar平台设计 1-2 导言、技术范围与方法
- Test question discovery ring of previous test questions
- Inverse element & combinatorial number & fast power
- 【栈的应用】--- 中缀表达式转后缀表达式
- Idea create my first project
- Tensorflow 知识点
- Qt生成.exe文件 并 在无Qt环境下运行(Enigma Virtual Box进行绿色可执行软件封装)图文教程
- Advanced C language: pointer (1)
- GKVoronoiNoiseSource
猜你喜欢

GKRidgedNoiseSource
![Database security - create login user + configure permissions [notes]](/img/02/0c3eb542593e8e0a3a62db75c52850.png)
Database security - create login user + configure permissions [notes]

粒子群实现最优解的求解
![[application of stack] - infix expression to suffix expression](/img/c1/879716342f6dd5eaa8b79c752eca16.png)
[application of stack] - infix expression to suffix expression

SQL Server 2016 learning records - set query

GKConstantNoiseSource

粒子群解决tsp的技术问题

PyQt5快速开发与实战 4.13 菜单栏、工具栏与状态栏 and 4.14 QPrinter

机器学习--手写英文字母2--导入与处理数据

SQL Server 2016 学习记录 --- 集合查询
随机推荐
gcc: error trying to exec 'as': execvp: No such file or directory
Markdown to word or PDF
ACM寒假集训#4
Shortest path topic
SemEval 2022 | 将知识引入NER系统,阿里达摩院获最佳论文奖
ICML 2022 | 图表示学习的结构感知Transformer模型
GKNoiseMap
Inverse element & combinatorial number & fast power
6、MapReduce自定义分区实现
It is said that the global semiconductor equipment giant may build a joint venture factory in Shanghai!
GKSpheresNoiseSource
Machine learning -- handwritten English alphabet 2 -- importing and processing data
GKLinearCongruentialRandomSource
Test question discovery ring of previous test questions
20200229 training match L1 - 2 delete the substring in the string (20 points)
GKConstantNoiseSource
Andorid 开发三 (Intent)
GKARC4RandomSource
Install Office customization. Troubleshooting during installation
Powerful and unique! Yingzhong technology 2020 10th generation core unique product launch