查看: 615|回复: 5
打印 上一主题 下一主题

stm32 串口出错

[复制链接] qrcode

29

主题

37

帖子

109

积分

注册会员

Rank: 2

积分
109
楼主
跳转到指定楼层
发表于 2015-11-6 05:22 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

回复

使用道具 举报

2

主题

85

帖子

48

积分

新手上路

Rank: 1

积分
48
沙发
发表于 2015-11-6 07:11 PM | 只看该作者

USART_Init函数中会调用RCC_GetClocksFreq函数获取内部总线的时钟,你需要跟踪到RCC_GetClocksFreq函数,关注一下该函数里面用到的几个宏定义,尤其是那个HSI_VALUE是否正确。

回复 支持 反对

使用道具 举报

0

主题

75

帖子

12

积分

新手上路

Rank: 1

积分
12
板凳
发表于 2015-11-9 09:59 AM | 只看该作者
我板子用的是6M晶振, HSI_VALUE和HSE_VALUE 库定义的是8M ,改过来就行了,多谢
回复 支持 反对

使用道具 举报

0

主题

91

帖子

6

积分

新手上路

Rank: 1

积分
6
地板
发表于 2015-11-9 11:11 AM | 只看该作者
这个以后再设计的时候或者使用期间的时候,尽量使用推荐的参数!具体的可以参照Datasheet!包括电阻电容的取值等等!否则有可能会出现一些莫名其妙的问题!
回复 支持 反对

使用道具 举报

0

主题

168

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
5#
发表于 2015-11-9 04:28 PM | 只看该作者
高手就是搞手
回复 支持 反对

使用道具 举报

0

主题

87

帖子

22

积分

新手上路

Rank: 1

积分
22
6#
发表于 2015-11-13 08:37 PM | 只看该作者
晶振是通信稳定的重要内容,还有就是不要用片内晶振。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表