你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F4 重新初始化UART问题

[复制链接]
jackghl 提问时间:2022-9-1 17:55 / 未解决
程序中UART1 一开始是正常接收数据,后面卸载UART1功能,将RX改成上升沿外部中断,
触发中断后 屏蔽外部中断,重新初始化UART1,但这时候不能正常接收数据。

伪代码如下
HAL_UART_MspDeInit(&huart1);
....//RX_IO改成上升沿外部中断
....//RX_IO改成普通IO
MX_USART1_UART_Init();
..DMA_rx..
//uart不能接收数据
收藏 评论10 发布时间:2022-9-1 17:55

举报

10个回答
yklstudent 回答时间:2022-9-1 20:13:57
正常通信采用USART,进入睡眠前切换IO外部中断,退出睡眠又切换USART;周而复始?
xmshao 回答时间:2022-9-2 10:37:11
基本可以锁定是代码方面的原因。第二次启用UART时,如果想省事点,将之前UART的初始化代码重新调一次,然后再启动UART的收发功能试试。如果想细致点,就看看哪些状态变量或控制寄存器没有正确配置。
jackghl 回答时间:2022-9-2 14:43:30
xmshao 发表于 2022-9-2 10:37
基本可以锁定是代码方面的原因。第二次启用UART时,如果想省事点,将之前UART的初始化代码重新调一次,然后 ...

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

废鱼 回答时间:2022-9-3 09:53:01
看一下IO的配置,是否重新配置过。
jackghl 回答时间:2022-9-5 14:49:27
废鱼 发表于 2022-9-3 09:53
看一下IO的配置,是否重新配置过。

仿真看过IO的配置正常。
jackghl 回答时间:2022-9-5 14:50:24
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);
}
废鱼 回答时间:2022-9-6 08:52:40
串口的IO配置功能要选择GPIO_InitStruct.Mode = GPIO_MODE_AF_PP,如果是用MX生成的工程,只需要重新初始化串口就可以了MX_USART1_UART_Init。
jackghl 回答时间:2022-9-6 10:06:40
废鱼 发表于 2022-9-6 08:52
串口的IO配置功能要选择GPIO_InitStruct.Mode = GPIO_MODE_AF_PP,如果是用MX生成的工程,只需要重新初始化 ...

用的就是MX生成的代码 MX_USART1_UART_Init
废鱼 回答时间:2022-9-6 10:22:14
jackghl 发表于 2022-9-6 10:06
用的就是MX生成的代码 MX_USART1_UART_Init

如果用了应该不会有问题的。你现在看串口寄存器和IO的寄存器。串口寄存器的DR是否正常能够显示内容,如果是正常的,看一下huart1的结构里面,是否有产生接收溢出的情况。测试发送是否正常。
jackghl 回答时间:2022-9-7 10:01:12
废鱼 发表于 2022-9-6 10:22
如果用了应该不会有问题的。你现在看串口寄存器和IO的寄存器。串口寄存器的DR是否正常能够显示内容,如果 ...


UART1的DR 没有变化,
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版