打印

STM32 USART1 波特率

[复制链接]
1427|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
m__dd|  楼主 | 2013-10-28 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的STM32F101 主频36M AHB1 36M    设置波特率19200     BRR值为0X753:117+3/16 = 117.1875也正确,
可是输出不对,用示波器测量一位50us,也就是接近20K/s,整整大了10倍,怎么回事?求解!
沙发
m__dd|  楼主 | 2013-10-28 17:55 | 只看该作者
下面是时钟配置代码:红色部分标识
void RCC_Configuration(void)
{   
  ErrorStatus HSEStartUpStatus;
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();
  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);//RCC_HSE_ON——HSE晶振打开(ON)
  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待HSE起振
  if(HSEStartUpStatus == SUCCESS)
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB时钟=系统时钟

    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2时钟=HCLK
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div1);//RCC_HCLK_Div2——APB1时钟=HCLK/1
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);//FLASH_Latency_2 2延时周期
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//预取指缓存使能
    /* PLLCLK = 4MHz * 9 = 36 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);//设置时钟源及倍频系数,PLL的输入时钟=HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x9

    /* 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);//RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟
    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource()!= 0x08);//0x08:PLL作为系统时钟
  }  
}

使用特权

评论回复
板凳
m__dd|  楼主 | 2013-10-28 17:57 | 只看该作者
USART1配置:
void HW_USART1_Configuration()
{
    unsigned int temp = 0;
    USART_InitTypeDef USART_InitStructure;
    /* USART1 configuration */
    USART_InitStructure.USART_BaudRate = 19200;
    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;
    /* Configure USART1 */
    USART_Init(USART1, &USART_InitStructure);
    /* Enable USART1 Receive interrupts */
    USART_ClearITPendingBit(USART1,USART1_IRQn);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    /* Enable the USART1 */
    USART_Cmd(USART1, ENABLE);
}

管脚配置:
void HW_USART1_GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);
    /* GPIOA/ USART1 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                    //USART1 TX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);                             

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                    //USART1 RX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //复用开漏输入
   
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
}

使用特权

评论回复
地板
bobo5650| | 2013-10-28 17:58 | 只看该作者
19200跟20K,不是差不多吗?怎么是10倍了?

使用特权

评论回复
5
m__dd|  楼主 | 2013-10-28 21:16 | 只看该作者
bobo5650 发表于 2013-10-28 17:58
19200跟20K,不是差不多吗?怎么是10倍了?

好吧!我可以去死了

使用特权

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

本版积分规则

11

主题

79

帖子

0

粉丝