看了视频,关于USART_DeInit函数,原子哥

2019-07-21 04:59发布

 

原子哥,你的文档里面所说的串口设置如上图,然后在视频里面说串口复位是指调用USART_DeInit函数,但是查看USART_DeInit的源代码我又觉得不妥了。
void USART_DeInit(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));   if (USARTx == USART1)
  {
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
  }
  else if (USARTx == USART2)
  {
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
  }
  else if (USARTx == USART3)
  {
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
  }   
  else if (USARTx == UART4)
  {
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE);
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE);
  }   
  else
  {
    if (USARTx == UART5)
    {
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE);
      RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE);
    }
  }
}

void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    RCC->APB1RSTR |= RCC_APB1Periph;
  }
  else
  {
    RCC->APB1RSTR &= ~RCC_APB1Periph;
  }
}

这个USART_DeInit函数不是又把USART的时钟复位了吗,这样子usart哪里还有时钟呢?是我什么地方误会了吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
FMX_2011
1楼-- · 2019-07-21 21:05
回复【4楼】正点原子:
---------------------------------
是不是不用void USART_DeInit(USART_TypeDef* USARTx)也可以运行呢?至少俩个板子上串口实验注销掉都可以。
FMX_2011
2楼-- · 2019-07-22 00:03
 精彩回答 2  元偷偷看……
xiedonghui258
3楼-- · 2019-07-22 03:08
USART_DeInit函数 不是把时钟复位了,注意函数,一个是:RCC_APB1PeriphClockCmd(), 一个是 RCC_APB1PeriphResetCmd()

一周热门 更多>