打印
[应用相关]

stm32 串口出错

[复制链接]
539|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Varus|  楼主 | 2016-7-27 08:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用stm32  库函数调串口  数据不对 波特率19200    每位宽大概50us   实际输出每位宽是80us  这样的话 我发一个数上位机收到两个  求助??
void RCC_Configuration(void)
{

ErrorStatus HSEStartUpStatus;

  /* 复位系统时钟设置*/
  RCC_DeInit();

  /* 开启HSE*/
  RCC_HSEConfig(RCC_HSE_ON);

  /* 等待HSE起震并稳定*/
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

/* HSE是否起振成功 */
  if(HSEStartUpStatus == SUCCESS)
  {
    /* HCLK(AHB)时钟源为SYSCLK 1分频*/
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2时钟源为HCLK(AHB) 1分频 */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1时钟源为HCLK(AHB) 2分频 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* 设置FLASH延时周期为2 */
    FLASH_SetLatency(FLASH_Latency_2);
    /* 使能FLASH预取缓存 */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* 6MHz * 12 = 72MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_12);

    RCC_PLLCmd(ENABLE);

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);        //选择SYSCLK的时钟源为PLL

    while(RCC_GetSYSCLKSource() != 0x08);
  }
   
  /* 打开APB2总线上的GPIOA时钟*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);
}
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* 设置PA2,PA3口为推挽输出,最大翻转频率为50MHz*/
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出
  GPIO_Init(GPIOA , &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin =        GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void UART_Configuration(void)
{
   USART_InitTypeDef USART_InitStructure;
   USART_InitStructure.USART_BaudRate = 19200;
   USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据8位
   USART_InitStructure.USART_StopBits = USART_StopBits_1;  //停止位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;//打开接收和发送
  USART_Init(USART2, &USART_InitStructure);
    USART_Cmd(USART2, ENABLE);
   
}
沙发
lefeng| | 2016-7-27 08:51 | 只看该作者
在USART_Init函数中会调用RCC_GetClocksFreq函数获取内部总线的时钟,你需要跟踪到RCC_GetClocksFreq函数,关注一下该函数里面用到的几个宏定义,尤其是那个HSI_VALUE是否正确。

使用特权

评论回复
板凳
拉克丝| | 2016-7-27 09:11 | 只看该作者

每个型号的STM32都有VREF+信号,只是有些型号没有把这个信号引到外部的引脚上,而是在芯片内部把这个信号与VDDA接在了一起

使用特权

评论回复
地板
mmuuss586| | 2016-7-27 11:59 | 只看该作者
把系统时钟读出来看看,是不是你需要的频率

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

155

主题

703

帖子

1

粉丝