为啥单片机开发板有两个晶振

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥单片机开发板有两个晶振相关的知识,希望对你有一定的参考价值。

为什么有的单片机开发板有两个晶振,11.0592和12.000,串口通讯的时候用的是哪个

12.000是给PL-2303使用的吧?因为usb通信需要严格的12m时钟。
单片机用11.0592晶振,这样保证串口的波特率没有误差。
参考技术A 串口通信用11.0592M的,因为串口波特率有9600等这种速率的,用11.0592M,可以无误差的产生,比如11.0592M/9600=1152,刚好是整数,如115200波特率,11.0592M/115200=96,都是能整除的。

如果用12M,12M/9600=1250,12M/115200约等于104.16,也就是说在很多波特率下,并不能整除,这样在串口通讯的时候,会产生数据错误的。

所以在串口通讯时,选择11.0592M。
参考技术B 串口通信用11.0592的,否则用12 M的

STM32单片机如何使用内部晶振

以STM32F030,uVision开发环境为例。

        1、打开项目,找到system_stm32f0xx.c并打开

                          技术图片

   2、找到static void SetSysClock(void)函数,用以下代码替换:

       static void SetSysClock(void)

     
         __IO uint32_t StartUpCounter = 0, HSIStatus = 0; //
         RCC->CR |= ((uint32_t)RCC_CR_HSION);                                                  //使能内部时钟 HSI
       do                                                                                                                    //等待内部时钟起振
           
            HSIStatus = RCC->CR & RCC_CR_HSIRDY;                                              // 设置RCC
            StartUpCounter++;                                                                                         //启动计数器
           
       while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));  // 等待 HSE 启动稳定

       if ((RCC->CR & RCC_CR_HSIRDY) != RESET)                                             //判断启动状态
           
            HSIStatus = (uint32_t)0x01;
           
       else
           
             HSIStatus = (uint32_t)0x00;                                                                       //启动不成功
           

       if (HSIStatus == (uint32_t)0x01) //启动成功
           
            /* Enable Prefetch Buffer and set Flash Latency */
           FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;      //flash总线时钟使能

           /* HCLK = SYSCLK */
           RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;                   //外设高速AHB2总线时钟等于系统时钟/1

           /* PCLK = HCLK */
           RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;                   //外设低速APB1总线时钟等于系统时钟/1

           /* PLL configuration = HSI/2 * 12= 48 MHz */
           RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
           RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12);   

                                                                                                                    //RC时钟2分频后 进行12倍频
                                                                                                                    //=8M/2*12=48M
           RCC->CR |= RCC_CR_PLLON;                                                      //使能锁相环倍频开关 /* Enable PLL */

           while((RCC->CR & RCC_CR_PLLRDY) == 0)                                //等待锁相环就绪
                   

           /* Select PLL as system clock source *                                            //选择锁相环输出时钟作为系统时钟
           RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
           RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

           while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
                                                                                                              //等待锁相环输出时钟已经成为系统时钟
           
         else
                                                                                                              //启动失败,在此写代码
       

 

以上是关于为啥单片机开发板有两个晶振的主要内容,如果未能解决你的问题,请参考以下文章

stm32开发板有啥用

单片机开发板哪个比较优质

Arduino单片机开发板如何与Dht11联接

HOTEK 系列单片机(HT67F2360)开发记录

ARM 开发板 问题

stm32为啥要两个晶振