OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5378|回复: 3

STM32波特率设置问题

[复制链接]

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2011-11-17
在线时间
8 小时
发表于 2014-9-2 09:33:47 | 显示全部楼层 |阅读模式
5金钱
在使用USART2时出现以下问题,BRR寄存器设置为0X0138,P2CLK为36Mhz,可实际测得波特率为125000,不是115200,不知问题出在哪里?是晶振的问题吗?请教了原子哥!

最佳答案

查看完整内容[请看2#楼]

估计不是晶振问题. 串口2配置代码: [mw_shl_code=c,true]//初始化IO 串口2 //pclk1CLK1时钟频率(Mhz) //bound:波特率 void USART2_Init(u32 pclk1,u32 bound) { RCC->APB2ENR|=1<<2; //使能PORTA口时钟 GPIOA->CRL&=0XFFFF00FF; //IO状态设置 GPIOA->CRL|=0X00008B00; //IO状态设置 RCC->APB1ENR|=1<<17; //使能串口时钟 RCC->APB1RSTR|=1<<17; //复位串口2 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-2 09:33:48 | 显示全部楼层
估计不是晶振问题.
串口2配置代码:
[mw_shl_code=c,true]//初始化IO 串口2 //pclk1CLK1时钟频率(Mhz) //bound:波特率 void USART2_Init(u32 pclk1,u32 bound) { RCC->APB2ENR|=1<<2; //使能PORTA口时钟 GPIOA->CRL&=0XFFFF00FF; //IO状态设置 GPIOA->CRL|=0X00008B00; //IO状态设置 RCC->APB1ENR|=1<<17; //使能串口时钟 RCC->APB1RSTR|=1<<17; //复位串口2 RCC->APB1RSTR&=~(1<<17);//停止复位 //波特率设置 USART2->BRR=(pclk1*1000000)/(bound);// 波特率设置 USART2->CR1|=0X200C; //1位停止,无校验位. USART2->CR3=1<<7; //使能串口2的DMA发送 UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)USART2_TX_BUF);//DMA1通道7,外设为串口2,存储器为USART2_TX_BUF #ifdef USART2_RX_EN //如果使能了接收 //使能接收中断 USART2->CR1|=1<<8; //PE中断使能 USART2->CR1|=1<<5; //接收缓冲区非空中断使能 MY_NVIC_Init(2,3,USART2_IRQn,2);//组2,最低优先级 TIM4_Init(99,7199); //10ms中断 USART2_RX_STA=0; //清零 TIM4_Set(0); //关闭定时器4 #endif }[/mw_shl_code]

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2011-11-17
在线时间
8 小时
 楼主| 发表于 2014-9-10 10:51:06 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥:我用的是库函数的方法,还是不行啊,时总有误差。把波特率降到9600,实际测得10000,误差率太大,和液晶通讯不正常。程序如下:时钟设置:
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);
 
  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable refetch Buffer */
    //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    //FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* CLK2 = HCLK/2 */
    RCC_PCLK2Config(RCC_HCLK_Div2);

    /* CLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div1);


    /* LLCLK = 8MHz * 9 = 72 MHz RCC_PLLSource_HSE_Div2*/
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    /* Enable LL */
    RCC_PLLCmd(ENABLE);

    /* Wait till LL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}

    /* Select LL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till LL is used as system clock source */
    while (RCC_GetSYSCLKSource() != 0x08)
    {}
  }

  /* Enable peripheral clocks --------------------------------------------------*/
  /* GPIOA, GPIOB and SPI1 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_SPI1, ENABLE);

  /* SPI2 eriph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2|RCC_APB1Periph_USART2, ENABLE);

}
USART2 设置:
GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure; 

  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
  RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2,ENABLE);
  /*
  *  USART1_TX -> A2 , USART1_RX -> PA3
  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;          
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);    

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;         
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  USART_InitStructure.USART_BaudRate = 9600;
  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;

  USART_Init(USART2, &USART_InitStructure); 
  //USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  //USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
  USART_Cmd(USART2, ENABLE);
到底是哪里造成的误差?先谢了!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-10 23:31:17 | 显示全部楼层
回复【3楼】zzl3389:
---------------------------------
代码没问题,那就是晶振问题了
检查晶振或者你系统时钟频率设置.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-2 01:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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