OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3304|回复: 2

求STM32F051内部晶振做系统时钟的程序

[复制链接]

7

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2015-12-26
在线时间
22 小时
发表于 2016-6-24 18:43:41 | 显示全部楼层 |阅读模式
本人做一个小产品,板子要小,所以就省去外部晶振,但是如何用内部晶振作为时钟源没弄出来,自己也摸索一段时间,真正苦恼!谢谢!!最好是寄存器版本
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-11-30
在线时间
7 小时
发表于 2016-6-30 01:01:02 | 显示全部楼层
回复 支持 反对

使用道具 举报

10

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2015-1-17
在线时间
16 小时
发表于 2016-7-6 16:13:54 | 显示全部楼层
给你一个STM32F030的内部晶振时钟程序。可以参考下试试051的。
记得把system_stm32f0xx.c中的systemInit中的SetSysClock()注释掉。

[mw_shl_code=c,true]/************************************************************************/
/* 功能:设置根据HSI调整的PLL为主时钟,16Mhz
* 描述:SYSCLK=HCLK=PCLK=16Mhz AHB和APB均未分频
* 形参:
* 返回:                       */
/************************************************************************/
static void clk_init(void)
{
        //我用的是HSI 时钟
        __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
        RCC->CR |= ((uint32_t)RCC_CR_HSION);

        do
        {
                HSIStatus = RCC->CR & RCC_CR_HSIRDY;                        //等待HSI稳定,稳定会置1
                StartUpCounter++;  
        } while((HSIStatus == 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));

        if ((RCC->CR & RCC_CR_HSIRDY) != RESET)                        //如果稳定了,就启动时钟
        {
                HSIStatus = (uint32_t)0x01;
        }
        else
        {
                HSIStatus = (uint32_t)0x00;
        }  

        if (HSIStatus == (uint32_t)0x01)                                        //如果HSI已经启动
        {
                FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
                /* HCLK = SYSCLK 不分频*/
                RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;   
                /* PCLK = HCLK */
                RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
                /* PLL configuration 设置HSI/2=4Mhz为输入 4倍频=PLL时钟16Mhz */
                RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
                RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_DIV2  | RCC_CFGR_PLLMULL4);           
                /* Enable PLL */
                RCC->CR |= RCC_CR_PLLON;
                /* Wait till PLL is ready */
                while((RCC->CR & RCC_CR_PLLRDY) == 0)
                {
                }
                /* 设置PLL为主时钟SYSCLK,即16Mhz,而HCLK,PCLK未分频均即16Mhz */
                RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
                RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
               
                /* Wait till PLL is used as system clock source */
                while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
                {
                }
        }
        //RCC_HSEConfig(RCC_HSE_OFF);
        RCC->CR &= ~RCC_CR_HSEON;                //关闭HSE
        SystemCoreClockUpdate();
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-5 23:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表