代码之家  ›  专栏  ›  技术社区  ›  GeeF

使用HSE的STM32L152 UART半波特率

  •  1
  • GeeF  · 技术社区  · 7 年前

    这是RCC init代码,我猜这几乎是标准的。

    int RCC_Configuration(void)
    {
      /* DISABLE HSI and target clocks prior to clock config */
      RCC_HSICmd(DISABLE);
      RCC_PLLCmd(DISABLE);
      RCC_HSEConfig(RCC_HSE_OFF);
    
      /* Set HSE as sys clock*/
      RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
    
      /* Enable ADC & SYSCFG clocks */
      RCC_APB2Periph_SYSCFG , ENABLE);
    
      /* Allow access to the RTC */
      PWR_RTCAccessCmd(ENABLE);
    
      /* Reset RTC Backup Domain */
      RCC_RTCResetCmd(ENABLE);
      RCC_RTCResetCmd(DISABLE);
    
      /* LSI used as RTC source clock */
      /* The RTC Clock may varies due to LSI frequency dispersion. */
      /* Enable the LSI OSC */
      RCC_LSICmd(ENABLE);
    
      /* Wait until LSE is ready */
      while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
    
      /* Select the RTC Clock Source */
      RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
    
      /* Enable the RTC */
      RCC_RTCCLKCmd(ENABLE);
    
      /* Wait for RTC APB registers synchronisation */
      RTC_WaitForSynchro();
    
      // ENABLE HSE
      RCC_HSEConfig(RCC_HSE_ON);
      ErrorStatus HSEStartUpStatus = RCC_WaitForHSEStartUp();
    
      if(HSEStartUpStatus == SUCCESS)
      {
          /* 32Mhz = 8Mhz * 12 / 3 */
          RCC_PLLConfig(RCC_PLLSource_HSE, RCC_PLLMul_12, RCC_PLLDiv_3);
    
          /* Enable PLL */
          RCC_PLLCmd(ENABLE);
    
          /* Wait till PLL is ready */
          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
          {
          }
    
          /* Select PLL as system clock source */
          RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    
          /* Wait till PLL is used as system clock source */
          while(RCC_GetSYSCLKSource() != 0x0C)  // 0x0C = PLL
          {
          }
    
          /* Enable the PWR clock */
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
          PWR->CR = PWR_CR_VOS_0;                /* Select the Voltage Range 1 (1.8V) */
          while((PWR->CSR & PWR_CSR_VOSF) != 0); /* Wait for Voltage Regulator Ready  */
    
          /* HCLK = SYSCLK */
          RCC_HCLKConfig(RCC_SYSCLK_Div1);
    
          /* PCLK1 = HCLK/2 */
          RCC_PCLK1Config(RCC_HCLK_Div2);
    
          /* PCLK2 = HCLK */
          RCC_PCLK2Config(RCC_HCLK_Div1);
    
          /* Enable the GPIOs clocks */
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC| RCC_AHBPeriph_GPIOD| RCC_AHBPeriph_GPIOE| RCC_AHBPeriph_GPIOH, ENABLE);
          /* Enable comparator, LCD and PWR mngt clocks */
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP | RCC_APB1Periph_LCD | RCC_APB1Periph_PWR,ENABLE);
      }
    
      return 0;
    
    }
    

    这是UART初始化代码:

    void usartinit(void)
    {
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    USART_InitStructure.USART_BaudRate = 115200 ;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    
    /* Enable GPIO clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    
    GPIO_PinAFConfig(USARTx_GPIO, GPIO_PinSource9, GPIO_AF_USART1);
    GPIO_PinAFConfig(USARTx_GPIO, GPIO_PinSource10, GPIO_AF_USART1);
    
    /* Configure USART Tx as alternate function push-pull */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin = USARTx_TX;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(USARTx_GPIO, &GPIO_InitStructure);
    
    /* Configure USART Rx as input floating */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin = USARTx_RX;
    GPIO_Init(USARTx_GPIO, &GPIO_InitStructure);
    
    /* USART configuration */
    USART_Init(USART1, &USART_InitStructure);
    
    /* Enable USART */
    USART_Cmd(USART1, ENABLE);
    }
    

    我现在唯一能想到的可能性是,晶体只有4兆赫,但这是一个核子板和MCO从所附的STLink是用于健康、安全和环境,这肯定是8兆赫。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Dheeraj Kumar    7 年前

    时钟好像坏了。检查代码中的HSE\u VALUE宏。可能是使用默认的Dev board crystal值。我建议将该值更改为您正在使用的水晶。你可以用 this 链接以设置时钟速度。

        2
  •  1
  •   Realtime Rik    7 年前

    我怀疑HSE值设置为16MHz。

    HSE值将在启动代码中的某个地方。

    该值由USART代码使用,以便它知道用什么频率驱动USART以计算波特率。

        3
  •  1
  •   GeeF    7 年前

    所以,我想不要相信你的评估委员会。。。现在将得到一些晶体和填充“真正的”外部时钟在这些板上。