久芯网

STM32F4 重新初始化UART问题

avatar jackghl 提问时间: 2023-07-19 10:09:11 / 未解决
程序中UART1 一开始是正常接收数据,后面卸载UART1功能,将RX改成上升沿外部中断,
触发中断后 屏蔽外部中断,重新初始化UART1,但这时候不能正常接收数据。

伪代码如下
HAL_UART_MspDeInit(&huart1);
....//RX_IO改成上升沿外部中断
....//RX_IO改成普通IO
MX_USART1_UART_Init();
..DMA_rx..
//uart不能接收数据

如需获得 STM32F4 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

10个回答
  • avatar yklstudent
    回答时间: 2023-07-19 10:35:33

    正常通信采用USART,进入睡眠前切换IO外部中断,退出睡眠又切换USART;周而复始?

  • avatar xmshao
    回答时间: 2023-07-19 11:01:00

    基本可以锁定是代码方面的原因。第二次启用UART时,如果想省事点,将之前UART的初始化代码重新调一次,然后再启动UART的收发功能试试。如果想细致点,就看看哪些状态变量或控制寄存器没有正确配置。

  • avatar jackghl
    回答时间: 2023-07-19 11:19:07
    xmshao 发表于 2022-9-2 10:37
    基本可以锁定是代码方面的原因。第二次启用UART时,如果想省事点,将之前UART的初始化代码重新调一次,然后 ...

    仿真对比过huart1 前后的寄存器 ,是一样的;初始化函数直接使用MX_USART1_UART_Init

  • avatar 废鱼
    回答时间: 2023-07-19 11:37:15

    看一下IO的配置,是否重新配置过。

  • avatar jackghl
    回答时间: 2023-07-19 12:02:20
    废鱼 发表于 2022-9-3 09:53
    看一下IO的配置,是否重新配置过。

    仿真看过IO的配置正常。

  • avatar jackghl
    回答时间: 2023-07-19 12:31:16

    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); }

  • avatar 废鱼
    回答时间: 2023-07-19 12:58:33

    串口的IO配置功能要选择GPIO_InitStruct.Mode = GPIO_MODE_AF_PP,如果是用MX生成的工程,只需要重新初始化串口就可以了MX_USART1_UART_Init。

  • avatar jackghl
    回答时间: 2023-07-19 13:22:32
    废鱼 发表于 2022-9-6 08:52
    串口的IO配置功能要选择GPIO_InitStruct.Mode = GPIO_MODE_AF_PP,如果是用MX生成的工程,只需要重新初始化 ...

    用的就是MX生成的代码 MX_USART1_UART_Init

  • avatar 废鱼
    回答时间: 2023-07-19 13:45:47
    jackghl 发表于 2022-9-6 10:06
    用的就是MX生成的代码 MX_USART1_UART_Init

    如果用了应该不会有问题的。你现在看串口寄存器和IO的寄存器。串口寄存器的DR是否正常能够显示内容,如果是正常的,看一下huart1的结构里面,是否有产生接收溢出的情况。测试发送是否正常。

  • avatar jackghl
    回答时间: 2023-07-19 14:17:17
    废鱼 发表于 2022-9-6 10:22
    如果用了应该不会有问题的。你现在看串口寄存器和IO的寄存器。串口寄存器的DR是否正常能够显示内容,如果 ...

    UART1的DR 没有变化,

会员中心 微信客服
客服
回到顶部