[经验] STM32时钟的两种配置方法

[复制链接]

高级工程师

发表于 2017-3-21 12:31:52   568 查看 5 回复 显示全部楼层 倒序浏览
分享
本帖最后由 猎国倾城 于 2017-3-21 12:30 编辑

我所讲的时钟配置都是基于库函数,3.5版本的的标准库。
第一种是基于system_stm32f10x.c来配置的,这个文件就是完成时钟配置的,其他啥作用都没有。首先打开stm32的启动文件,就是那个汇编文件,定位到如下:
  1. ; Reset handler
  2. Reset_Handler   PROC
  3.     EXPORT  Reset_Handler             [WEAK]
  4.     IMPORT  __main
  5.     IMPORT  SystemInit
  6.     LDR     R0, =SystemInit
  7.     BLX     R0               
  8.    LDR     R0, =__main
  9.    BX      R0
  10.                 ENDP
复制代码
这是单片机复位处理部分,一旦复位,它首先定位到main函数部分,然后接着定位到system_stm32f10x.c里的SystemInit()函数,紧接着执行这个函数,完成时钟配置,在此之前,单片机用的都是内部高速时钟(HSI)。这个执行完后,紧接着开始执行C语言里的main函数。另外再告诉你一个小技巧,你可以将汇编语言里的main改成其他名称,让别人行不见你的主函数,当你下载了一个工程,发现里面并没有main函数,就要定位到这里看他把main改成啥了,然后再进行定位主函数。当然用这种方法配置时钟,需要在system_stm32f10x.c改一改,定位到如下代码处。
  1. #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
  2.    /* #define SYSCLK_FREQ_HSE    HSE_VALUE */
  3.    #define SYSCLK_FREQ_24MHz  24000000
  4. #else
  5.    /*#define SYSCLK_FREQ_HSE  HSE_VALUE*/
  6.    /* #define SYSCLK_FREQ_24MHz  24000000 */
  7.    /* #define SYSCLK_FREQ_36MHz  36000000 */
  8.    /* #define SYSCLK_FREQ_48MHz  48000000 */
  9.    /* #define SYSCLK_FREQ_56MHz  56000000 */
  10.   #define SYSCLK_FREQ_72MHz  72000000
  11. #endif
复制代码

将#else下的/* #define SYSCLK_FREQ_HSE  HSE_VALUE*/取消注释,将HSE_VALUE改为外部晶振值,单位为Hz。
个别单片机要从#if defined下改,支持72M的在#else下改就可以了,比较常用的103系列在这下面改就行了。选什么时钟,就将该时钟的宏定义取消注释即可,注意只能选一个。第一种方法就介绍到这里。
第二种是基于stm32f10x_rcc.c配置的。配置方法如下:
  1. void RCC_Configuration()
  2. {
  3.     ErrorStatus HSEStartUpStatus;
  4.         RCC_DeInit();                                                         //重置时钟
  5.         RCC_HSEConfig(RCC_HSE_ON);                                            //外部晶振开
  6.         HSEStartUpStatus=RCC_WaitForHSEStartUp();
  7.         if(HSEStartUpStatus==SUCCESS)
  8.         {
  9.                 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);             //预取值缓存使能
  10.                 FLASH_SetLatency(FLASH_Latency_2);                                //设置代码延时值
  11.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);                                  //设置AHB时钟=系统时钟
  12.                 RCC_PCLK2Config(RCC_HCLK_Div1);                                   //设置APB=HCLK
  13.                 RCC_PCLK1Config(RCC_HCLK_Div2);                                   //APB1=HCLK/2
  14.                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);                              //PLL频率等于外部晶振频率,倍频系数*9   72MHz
  15.                 RCC_PLLCmd(ENABLE);                                               //等待PLL初始化成功
  16.                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
  17.             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                         //选择PLL倍频后的时钟作为系统时钟;
  18.                 while(RCC_GetSYSCLKSource()!=0x08);                                //等待PLL倍频后的时钟作为系统时钟成功   
  19.     }
  20. }
复制代码
这个直接在主函数内调用一下,建议初始化时,main函数第一个调用它。这样方能和第一种方法统一起来。不过采用这种方法,将启动文件得要改改,就是将下面的汇编语句删除或者用分号注释掉,至于为什么这样做,理由后述。
  1. IMPORT  SystemInit
  2.                 LDR     R0, =SystemInit
  3.                 BLX     R0      
复制代码
最后说一下keil工程建立,采用第一种方法配置时钟时,工程必须包含system_stm32f10x.c和system_stm32f10x.h文件,但这种方式仅仅配置好了AHB时钟,剩下的APB等时钟还得要借用stm32f10x_rcc.c里面的函数来完成配置。
采用第二种方式,工程里不需要有system_stm32f10x.c和system_stm32f10x.h文件,只需要有stm32f10x_rcc.c文件就行了。要将汇编语言内有关 SystemInit语句注释或者删掉,要不然编译会报错,提示找不到SystemInit()。
标签:STM32时钟

高级工程师

发表于 2017-3-21 12:34:00    楼主|

PCB在线计价下单

板子大小:

cm
X
cm

层数:

2

板子数量:

10

厚度:

1.6
欢迎诸位批评指正
回复

点赞

总工程师

发表于 2017-3-21 20:45:55  
感谢楼主出山分享资料   学习了
回复

点赞

发表于 2017-3-21 21:28:55  
666,没毛病。。。。。。。。
回复

技术员

发表于 2017-3-27 15:05:29  
网上有很多配置的例程,感谢分享
回复

点赞

实习生

发表于 2017-3-31 23:28:25  
感谢楼主出山分享资料   学习了
回复

点赞

高级模式
您需要登录后才可以回帖 登录 | 注册

专家问答 查看更多>>
关闭

站长推荐 上一条 /5 下一条

小黑屋|手机版|Archiver| 电子发烧友 ( 粤ICP备14022951号-2 )     

GMT+8, 2017-5-23 13:02 , Processed in 0.084582 second(s), 14 queries , Memcache On.

微信扫描
快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

我的提问

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

-

硬件设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PCB设计论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

树莓派论坛

智能硬件论坛

开发快智能硬件开发平台

Intel物联网开发者专区

Waveshare

乐美客SBC专区

Arduino论坛

BeagleBone论坛

机器人论坛

创客神器NanoPi

小钢炮CANNON

比派科技banana pi专区

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

个人版区

阿东Verilog技术专版

直流马达驱动电路设计

LabVIEW英雄联盟

特权同学FPGA专区

-

厂商专区

灵动微电子 MM32

盈鹏飞嵌入式

TI论坛

TI Deyisupport社区

芯灵思嵌入式论坛

Tisan

米尔科技

庆科社区

WIZnet技术专区

Cypress技术论坛

飞凌嵌入式

Qualcomm技术论坛

英创嵌入式

机智云GoKit论坛

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区