概述
一、为什么是uart而不是usart?
因为是在XCOM里直接输入完成所有的数据再发送,接着单片机再逐个接收数据直至结束符,所以是异步模式,也就是uart
二、为什么涉及到中断?
因为在实际应用中肯定不知道什么时候才接收数据,所以需要中断的形式。
三、程序运行的过程?
1、打开中断入口(也就是准备接收)
HAL_UART_Receive_IT(&huart1, rx, 1);//huart1代表是uart1,写入rx一个字节。没有接收完成,只是说知道了
2、正常运行主函数程序
3、当数据发送到RX时,触发中断,进入"HAL_UART_IRQHandler"
4、"HAL_UART_IRQHandler()"调用“UART_Receive_IT()”进入处理数据的过程
5、“UART_Receive_IT()”进行一系列处理之后还会关闭中断入口,并且在完成数据接受之后调用HAL_UART_RxCpltCallback()函数进行完成用户在接受数据之后完成的动作
6、HAL_UART_RxCpltCallback()根据接收到的信息完成设定的动作之后,再次打开中断入口
四、我们配置时需要做的东西?
- "HAL_UART_Receive_IT"开启中断
- "HAL_UART_RxCpltCallback"(接收完成回调函数)用户处理中断,并再次开启中断
五、以串口接收特定数字来实现相应led灯灭为例:
uint8_t rx[100];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(rx[0]<9)
{
HAL_GPIO_WritePin(GPIOC ,0x0100<<(rx[0]-1),1);//按哪个哪个灭
HAL_GPIO_WritePin(GPIOD ,GPIO_PIN_2 ,1);
HAL_GPIO_WritePin(GPIOD ,GPIO_PIN_2 ,0);
}
else
{
HAL_GPIO_WritePin(GPIOC ,GPIO_PIN_All ,1);//全灭
HAL_GPIO_WritePin(GPIOD ,GPIO_PIN_2 ,1);
HAL_GPIO_WritePin(GPIOD ,GPIO_PIN_2 ,0);
}
HAL_UART_Receive_IT(&huart1, rx, 1);//再重新打开中断入口
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, rx, 1);
while (1)
{
}
}
效果就是,输入对应数字,对应led灭。注意在使用XCOM时,以十六进制发送且不要发送新行!!
六、总结
在考试时配置完成之后,要会找相应的函数出来,配置出来后HAL_UART_RxCpltCallback()是弱定义(weak),然后把它再按照自己的需要正式定义,就可以用了。
最后
以上就是专一小天鹅为你收集整理的蓝桥杯学习笔记六:usart Rx的配置和使用(uart)一、为什么是uart而不是usart?二、为什么涉及到中断?三、程序运行的过程?四、我们配置时需要做的东西?五、以串口接收特定数字来实现相应led灯灭为例:六、总结的全部内容,希望文章能够帮你解决蓝桥杯学习笔记六:usart Rx的配置和使用(uart)一、为什么是uart而不是usart?二、为什么涉及到中断?三、程序运行的过程?四、我们配置时需要做的东西?五、以串口接收特定数字来实现相应led灯灭为例:六、总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复