打印
[STM32F1]

stm32f103串口设置的波特率和实际的不一样

[复制链接]
3947|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
肥羊|  楼主 | 2017-12-18 19:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是用内部的时钟的
下面是时钟函数





void RCC_Configuration(void)  
{  
        GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_DeInit();//将外设 RCC寄存器重设为缺省值  
  
    RCC_HSICmd(ENABLE);//使能HSI   
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功  
  

    RCC_HCLKConfig(RCC_SYSCLK_Div1);     
    RCC_PCLK1Config(RCC_HCLK_Div1);  
    RCC_PCLK2Config(RCC_HCLK_Div1);  
    //RCC_ADCCLKConfig(RCC_PCLK2_Div6);          
    //设置 PLL 时钟源及倍频系数  
    //经过测试这里最多设置成RCC_PLLMul_13高了就会死机


        /*
        These bits represent the ratio of the SYSCLK (system clock) period to the Flash access
        time.
        000 Zero wait state, if 0 < SYSCLK≤ 24 MHz
        001 One wait state, if 24 MHz < SYSCLK ≤ 48 MHz
        010 Two wait states, if 48 MHz < SYSCLK ≤ 72 MHz
        */
       
        /* Enable refetch Buffer */
        //FLASH->ACR |= FLASH_ACR_PRFTBE;

        /* Flash 2 wait state */
        //FLASH->ACR &= (u32)((u32)~FLASH_ACR_LATENCY);
        //FLASH->ACR |= (u32)FLASH_ACR_LATENCY_2;

        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  
    FLASH_SetLatency(FLASH_Latency_2);  
     

    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE   
    RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能  
    //等待指定的 RCC 标志位设置成功 等待PLL初始化成功  
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);  
  
    //设置系统时钟(SYSCLK) 设置PLL为系统时钟源  
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择想要的系统时钟   
    //等待PLL成功用作于系统时钟的时钟源  
    //  0x00:HSI 作为系统时钟   
    //  0x04:HSE作为系统时钟   
    //  0x08:PLL作为系统时钟   
    while(RCC_GetSYSCLKSource() != 0x08);//需与被选择的系统时钟对应起来,RCC_SYSCLKSource_PLL  

    /*
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
        RCC_MCOConfig(RCC_MCO_HSI);
    */
}


下面是串口的初始化

//初始化IO 串口1
//bound:波特率
void uart_init(u32 bound){
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);        //使能USART2,GPIOA时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);         
        USART_DeInit(USART2);
         //USART2_TX   PA.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
   
    //USART2_RX          PA.3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA3

   //Usart2 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

         USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
         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_TC, ENABLE);//开启中断
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART2, ENABLE);                    //使能串口

}
沙发
mmuuss586| | 2017-12-18 21:35 | 只看该作者
不一样,差多少呢?

使用特权

评论回复
板凳
gejigeji521| | 2017-12-18 23:00 | 只看该作者
想 要多少,实际多少?

使用特权

评论回复
地板
tomzbj| | 2017-12-19 09:16 | 只看该作者
PLL 13倍频死机?
这两行的注释去掉没有, 要是没去掉肯定要死机啊

       //FLASH->ACR &= (u32)((u32)~FLASH_ACR_LATENCY);
        //FLASH->ACR |= (u32)FLASH_ACR_LATENCY_2;

使用特权

评论回复
5
肥羊|  楼主 | 2017-12-19 09:21 | 只看该作者
我用外部时钟就可以

使用特权

评论回复
6
肥羊|  楼主 | 2017-12-19 09:22 | 只看该作者
但是用内部时钟就不行了

使用特权

评论回复
7
肥羊|  楼主 | 2017-12-19 10:44 | 只看该作者
tomzbj 发表于 2017-12-19 09:16
PLL 13倍频死机?
这两行的注释去掉没有, 要是没去掉肯定要死机啊

和你说得刚刚相反,去掉会去掉会死机

使用特权

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

本版积分规则

35

主题

271

帖子

1

粉丝