小肥羊dsf 发表于 2017-12-19 09:28:43

stm32F103CBT6 配置成内部时钟然后串口的波特率不对了

我用内部RC作为内部时钟时候波特不对
焊接上晶振就对了
下面是时钟函数





void RCC_Configuration(void)
{
        GPIO_InitTypeDefGPIO_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);
    */
}


小肥羊dsf 发表于 2017-12-19 09:57:22

自己给自己顶一下

toofree 发表于 2017-12-19 10:59:30

你这属于不按套路出牌风格呀,:L
看一下串口波特率怎么定的,里面调用了系统时钟的宏定义参数。

你这是哪个版本的库

小肥羊dsf 发表于 2017-12-19 11:11:33

toofree 发表于 2017-12-19 10:59
你这属于不按套路出牌风格呀,
看一下串口波特率怎么定的,里面调用了系统时钟的宏定义参数。



串口的配置

//初始化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);                  //使能串口

}

我用的是3.5的库

toofree 发表于 2017-12-19 12:01:40

看一下,USART_Init()里面是什么?
用到了RCC_ClocksStatus.PCLK2_Frequency,RCC_ClocksStatus.PCLK1_Frequency,这是跟系统时钟有关系的。请参考文件“Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c”

toofree 发表于 2017-12-19 12:03:20

默认是外部时钟,你要改成内部的,system_stm32f10x.c文件得修改,用内部时钟时系统时钟最快64M。

小肥羊dsf 发表于 2017-12-20 11:03:35

那一条函数不是修改了吗void RCC_Configuration(void)

小肥羊dsf 发表于 2017-12-20 18:33:14

但是还是不对啊
页: [1]
查看完整版本: stm32F103CBT6 配置成内部时钟然后串口的波特率不对了