程序中UART1 一开始是正常接收数据,后面卸载UART1功能,将RX改成上升沿外部中断, 触发中断后 屏蔽外部中断,重新初始化UART1,但这时候不能正常接收数据。 伪代码如下 HAL_UART_MspDeInit(&huart1); ....//RX_IO改成上升沿外部中断 ....//RX_IO改成普通IO MX_USART1_UART_Init(); ..DMA_rx.. //uart不能接收数据 |
正常通信采用USART,进入睡眠前切换IO外部中断,退出睡眠又切换USART;周而复始?
基本可以锁定是代码方面的原因。第二次启用UART时,如果想省事点,将之前UART的初始化代码重新调一次,然后再启动UART的收发功能试试。如果想细致点,就看看哪些状态变量或控制寄存器没有正确配置。
基本可以锁定是代码方面的原因。第二次启用UART时,如果想省事点,将之前UART的初始化代码重新调一次,然后 ...
仿真对比过huart1 前后的寄存器 ,是一样的;初始化函数直接使用MX_USART1_UART_Init
看一下IO的配置,是否重新配置过。
看一下IO的配置,是否重新配置过。
仿真看过IO的配置正常。
void PA10_GPIO_MODE_IT_RISING(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void PA10_GPIO_MODE_INPUT(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10); GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); set_reset_uart1_flag; } void restart_uart1_io_func(void) { HAL_NVIC_DisableIRQ(EXTI15_10_IRQn); PA10_GPIO_MODE_INPUT(); MX_USART1_UART_Init(); uart1_dma_func(); } void disable_uart1_io_func(void) { HAL_UART_DMAStop(&huart1); HAL_UART_MspDeInit(&huart1); PA10_GPIO_MODE_IT_RISING(); HAL_NVIC_SetPriority(EXTI15_10_IRQn, 1, 1); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); }
串口的IO配置功能要选择GPIO_InitStruct.Mode = GPIO_MODE_AF_PP,如果是用MX生成的工程,只需要重新初始化串口就可以了MX_USART1_UART_Init。
串口的IO配置功能要选择GPIO_InitStruct.Mode = GPIO_MODE_AF_PP,如果是用MX生成的工程,只需要重新初始化 ...
用的就是MX生成的代码 MX_USART1_UART_Init
用的就是MX生成的代码 MX_USART1_UART_Init
如果用了应该不会有问题的。你现在看串口寄存器和IO的寄存器。串口寄存器的DR是否正常能够显示内容,如果是正常的,看一下huart1的结构里面,是否有产生接收溢出的情况。测试发送是否正常。
如果用了应该不会有问题的。你现在看串口寄存器和IO的寄存器。串口寄存器的DR是否正常能够显示内容,如果 ...
UART1的DR 没有变化,