博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
stm32变更外部晶振时如何配置外部时钟(转)
阅读量:4113 次
发布时间:2019-05-25

本文共 1750 字,大约阅读时间需要 5 分钟。

本文转载自千牛卫大将军
由于stm32的库默认是外部晶振8M的情况下实现的,所以配置串口波特率的时候也是按8M,包括主频。
如果采用外部晶振12M,配置时钟为72MHZ 

1)PLL倍频
这样改:
8M:
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//8*9=72

12M:

RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);//12*6=72
库函数:void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul)
例:RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);
2)stm32f10x.h中修改:
8M:
#define HSE_Value ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ 

12M:
#define HSE_Value ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */


接下来说一下内部时钟,内部时钟是由RC振荡产生的,精度不高。用内部时钟产生的功耗更小,还可以节约印制板的空间,程序配置如下:
void RCC_Configuration(void)
{
        /* RCC system reset(for debug purpose) */
        RCC_DeInit();
        RCC_HSICmd(ENABLE);        //打开内部高速时钟
        //等待HSI准备好
        while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);        //开启FLASH预取指功能
        //FLASH时序控制
        //推荐值:SYSCLK = 0~24MHz   Latency=0
        //       SYSCLK = 24~48MHz  Latency=1
        //       SYSCLK = 48~72MHz  Latency=2
        FLASH_SetLatency(FLASH_Latency_2);
        RCC_HCLKConfig(RCC_SYSCLK_Div1);        //设置HCLK(AHB时钟)=SYSCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);                //PCLK2(APB2) = HCLK
        RCC_PCLK1Config(RCC_HCLK_Div1);                //PCLK1(APB1) = HCLK
        //PLL设置 SYSCLK/2 * 12 = 4*12 = 48MHz
        RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);
        //启动PLL
        RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,不能被DISABLE
        //等待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);
}
还有如果修给了
HSE_Value ,但是还有问题,则库文件使用的是LIB文件,而不是C文件。现在看来是stm32f10x_rcc.c转LIB时的问题。它里面把HSE_VALUE编译成死的了,不跟头文件走。
所以,如果库文件使用的是LIB文件,那么改晶振频率后就需要把stm32f10x_rcc.c加到工程里一起编译。
你可能感兴趣的文章
springcloud 连续请求 500
查看>>
vue复用新增和编辑表单
查看>>
Ubuntu 16.04 apt-get更换为国内阿里云源
查看>>
laravel部署到宝塔步骤
查看>>
小程序获取access_token
查看>>
navicat远程连接mysql数据库
查看>>
tp5令牌数据无效 解决方法
查看>>
自己的网站与UCenter整合(大致流程)
查看>>
laravel 制作通用的curd 后台操作
查看>>
【小红书2017年笔试】求一个数组中平均数最大的子数组
查看>>
【java基础】父类与子类中各成员初始化顺序
查看>>
maven安装并在eclipse中配置
查看>>
三种常见字符编码简介:ASCII、Unicode和UTF-8
查看>>
【剑指offer】链表中倒数第K个节点
查看>>
http 请求中的 referer
查看>>
【携程2018校招】数组中非零元素稳定的放到数组前面,零元素放到数组后面
查看>>
【Mac终端】 root与普通用户切换(root/bash-3.2/sh-3.2/MacBook-Pro区别)
查看>>
【rabbitMQ之二】rabbitMQ之工作队列(消息ACK、消息持久化、公平分派)-go语言
查看>>
【git】git的origin和master分析
查看>>
Golang 新手可能会踩的 50 个坑-值得一看,强力推荐
查看>>