历史上的今天
返回首页

历史上的今天

今天是:2025年02月10日(星期一)

正在发生

2020年02月10日 | STM32F103之系统时钟初始化及延迟函数

2020-02-10 来源:eefocus

一、简介


本文以STM32F103编程为例,介绍STM32F103系统时钟初始化及延迟函数编写


二、实验平台


电脑平台:Windows7 64位旗舰


编译软件:Keil5


硬件平台:STM32F103RC


三、版权声明


四、实验前提


1、在进行本文步骤前,请先安装keil5版本;准备好STM32F103RC硬件平台。


五、基础知识


暂无


六、源码地址


暂无


七、关联文章


暂无


八、实验内容


1.初始化系统时钟


/*外部时钟最高72MHz  内部时钟最高64MHz*/

typedef enum{

    HAL_CLOCK_HSE_SYS = (unsigned char)0x01,                /*外部时钟*/

    HAL_CLOCK_HSI_SYS = (unsigned char)0x02                    /*内部时钟*/

}Type_Hal_Clock_Sys;

 

typedef enum{

    HAL_CLOCK_36MHZ = (unsigned char)0x01,

    HAL_CLOCK_48MHZ = (unsigned char)0x02,

    HAL_CLOCK_56MHZ = (unsigned char)0x03,

    HAL_CLOCK_64MHZ = (unsigned char)0x04,

    HAL_CLOCK_72MHZ = (unsigned char)0x05

}Type_Hal_Clock_Mhzx;

     

 

 

/*********************************************************************

* @fn      Hal_SysClock_Init()

*

* @brief   系统时钟初始化

*

* @param   Type_Hal_Clock_Sys : HAL_CLOCK_HSE_SYS HAL_CLOCK_HSI_SYS 

* @param     Type_Hal_Clock_Mhzx : HAL_CLOCK_20MHZ HAL_CLOCK_36MHZ HAL_CLOCK_48MHZ HAL_CLOCK_56MHZ HAL_CLOCK_64MHZ HAL_CLOCK_72MHZ

*

* @return  None.

********************************************************************/

 

unsigned int Hal_SysClock_Init(Type_Hal_Clock_Sys clockx,Type_Hal_Clock_Mhzx mHzx)

{

    unsigned int newSysClock = 0;

    RCC_DeInit();

  switch(clockx)

    {

        case HAL_CLOCK_HSE_SYS:

        {

            ErrorStatus HSEStartUpStatus;

            RCC_HSEConfig(RCC_HSE_ON);  

            HSEStartUpStatus = RCC_WaitForHSEStartUp();      

            if(HSEStartUpStatus == SUCCESS)  

            {

                RCC_HCLKConfig(RCC_SYSCLK_Div1);         

                RCC_PCLK2Config(RCC_HCLK_Div1);   

                RCC_PCLK1Config(RCC_HCLK_Div2); 

                

                RCC_ADCCLKConfig(RCC_PCLK2_Div6);                   

                FLASH_SetLatency(FLASH_Latency_2);                   

                FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); 

                switch(mHzx)

                {

                    case HAL_CLOCK_36MHZ:

                    {

                        RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9); 

                        newSysClock = 36000000;

                    }

                    break;

                    case HAL_CLOCK_48MHZ:

                    {

                        RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_12); 

                        newSysClock = 48000000;

                    }

                    break;

                    case HAL_CLOCK_56MHZ:

                    {

                        RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_14); 

                        newSysClock = 56000000;

                    }

                    break;

                    case HAL_CLOCK_64MHZ:

                    {

                        RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_16); 

                        newSysClock = 64000000;

                    }

                    break;

                    case HAL_CLOCK_72MHZ:

                    {

                        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); 

                        newSysClock = 72000000;

                    }

                    break;            

                    default:

                        break;

                }

            }

        }

        break;

        case HAL_CLOCK_HSI_SYS:

        {

            RCC_HSICmd(ENABLE);

            while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

            RCC_HCLKConfig(RCC_SYSCLK_Div1);

            RCC_PCLK2Config(RCC_HCLK_Div1);

            RCC_PCLK1Config(RCC_HCLK_Div2);

            RCC_ADCCLKConfig(RCC_PCLK2_Div8);

            FLASH_SetLatency(FLASH_Latency_2);

            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

            switch(mHzx)

            {

                case HAL_CLOCK_36MHZ:

                {

                    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9); 

                    newSysClock = 36000000;

                }

                break;

                case HAL_CLOCK_48MHZ:

                {

                    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12); 

                    newSysClock = 48000000;

                }

                break;

                case HAL_CLOCK_56MHZ:

                {

                    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_14); 

                    newSysClock = 56000000;

                }

                break;

                case HAL_CLOCK_64MHZ:

                {

                    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);

                    newSysClock = 64000000;

                }

                break;

                default:

                    break;

            }

        }

            break;

        default:

            break;

    }

    RCC_PLLCmd(ENABLE);

    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    while (RCC_GetSYSCLKSource() != 0x08);

    return newSysClock;

}

2.延迟函数相关

提示:选择系统时钟36M时延迟误差较大


static unsigned charfac_us=0;                            //us延时倍乘数

static unsigned short fac_ms=0;                            //ms延时倍乘数,在ucos下,代表每个节拍的ms数

 

 

/*********************************************************************

* @fn      Hal_delay_init()

*

* @brief   延迟函数初始化

*

* @param   mHzx :    HAL_CLOCK_36MHZ HAL_CLOCK_48MHZ HAL_CLOCK_46MHZ HAL_CLOCK_64MHZ HAL_CLOCK_72MHZ

* @param   sysClock : 系统时钟 例如 72000000M

推荐阅读

史海拾趣

Califia Lighting公司的发展小趣事

在环保理念日益深入人心的背景下,Califia Lighting积极响应国家号召,致力于推动绿色照明技术的发展。公司研发了一系列环保型LED产品,降低了能源消耗和环境污染。同时,公司还关注未来照明技术的发展趋势,不断探索新的应用领域和市场机会,为公司的可持续发展奠定了坚实基础。

通过以上五个故事,我们可以看到Califia Lighting公司在电子行业里发展起来的艰辛与辉煌。他们凭借技术创新、市场拓展、品质管理和绿色发展等方面的不断努力,逐渐成为了电子照明行业的佼佼者。

Graseby Infrared公司的发展小趣事
首先确认三相电源是否正常,可以使用万用表测量电源电压和相序。
Einfochips公司的发展小趣事

随着硬件设计和验证领域的发展,SystemVerilog逐渐成为行业内的主流语言。Einfochips公司敏锐地捕捉到了这一趋势,并决定为客户提供从其他传统语言和环境转变到SystemVerilog的验证迁移服务。这一服务的推出,不仅帮助客户提高了设计和验证效率,还进一步扩大了Einfochips在硬件设计和验证领域的市场份额。

锋鸣电子(Fengming)公司的发展小趣事

随着新能源和储能市场的快速发展,福斯特公司也积极拓展相关业务领域。公司不仅关注光伏材料的研发和生产,还将目光投向了动力电池及储能领域。例如,公司推出的铝塑复合膜产品已完成一期2000万平米扩产项目,并计划未来进一步拓展至动力电池及储能领域。这一举措不仅丰富了公司的产品线,还为公司带来了新的增长点和发展机遇。同时,福斯特还加强与新能源产业链上下游企业的合作,共同推动新能源和储能产业的发展。

Comtronic Gmbh-Verbindungstechnik公司的发展小趣事

福斯特集团在半导体封测领域也展现了强大的实力。集团旗下拥有安徽龙芯微科技有限公司和泸州龙芯微科技有限公司等多家子公司,这些公司均配备有全球领先的集成电路封装测试线。通过不断的技术创新和设备升级,福斯特集团能够满足客户全方位的器件封测要求,为客户提供高质量、高效率的封测服务。此外,公司还积极投入研发,推出多项新技术和新产品,进一步巩固其在半导体封测领域的领先地位。

GE Power Electronics Inc公司的发展小趣事
合理设计电路布局和布线,避免信号干扰和串扰。同时,采用适当的保护电路,如过压保护、过流保护等。

问答坊 | AI 解惑

电子元器件产品的五大特点

1、产品门类多,品种繁杂。仅根据原电子部编制的电子产品分类和编码统计,电子元器件除集成电路以外的产品就有206个大类2519个小类,其中电真空器件13大类260个小类;半导体分立器件(包括激光、光电子器件等)18大类379小类;电子元件17个专业,16 ...…

查看全部问答>

不光可以晒创意,还可以晒电子方面的任何东西哦

如题, 比如电子焊接中碰到的稀奇古怪的事,或者好的窍门,贴出来供广大电子爱好者一个走捷径的机会,先谢过大家的无私奉献, …

查看全部问答>

程序放在ram里运行,放在nand里面就不运行了,请问怎么回事

各位,我遇到个问题比较奇怪,请问大家遇到过没有,我把程序放在nand里面,运行不了,提示不是windows ce应用程序,放在ram里面就可以,往nand里面存文件取文件都没有问题,请问是怎么回事 还有一点补充的就是好像以前nand直接访问的话是没有问题 ...…

查看全部问答>

EVC和VC读写文件中的汉字

各位,我要将VC下生成的数据文件读取出来,其中的数据有汉字,也有其他英文字符。在VC下写时用的是TCHAR,我在EVC下用TCHAR来读,自动读取出的汉字为乱码????????…

查看全部问答>

有用广州倍思得BST-URD9201做过开发的高人请进

我现在做的毕业设计用的就是这款读卡器,需要自己开发一个新的程序包,但是该读卡器自带的说明书过于简单,对该款仪器的命令介绍不全,希望有用该读卡器做过相关项目的高人指点一下。…

查看全部问答>

为什么Eboot阶段的功耗大于wince运行阶段

首先介绍一下我的系统:PXA270 + wince5.0 系统启动过程,上电 --> eboot将wince5.0镜像从flash 搬运到RAM中, -->跳转到RAM运行 现象:用4.2V给系统供电,正极串入电流表,在eboot阶段的电流为300mA左右,跳转到wince5.0后,功耗降到220mA,在bo ...…

查看全部问答>

关于周立功7290和I2C使用的问题

实验平台是MagicARM2410,我们在做实验时遇到个问题.... 如何在7290的数码管上显示自定义的数据,如:我想显示P-------,该如何做,向哪个子地址发数据? 问题二: 我先做了EINT的一个中断,还要用到串口中断,因为要用I2C和串口都要可操作,所 ...…

查看全部问答>

求一C源程序(基于运动信息视频对象分割技术)

就是要求把动态的物体从静态的环境里取出。 例如:一个人跳水的视频,把跳水的动作从它所在的环境中分离出来。 要求是C/C++写的,好象要放到MAXPLUSS2里去运行。 我是做软件开发的,一点不懂这方面的东西,但现在急需这个程序,请大家帮个忙了。…

查看全部问答>

allegro的走线设置

请问怎样设置才能消除缺口,第一次使用allegro,知道的热心人请指点。。。。只有50分,全给了。。。。…

查看全部问答>

淘---利尔达的EZ430-RF5137-433

本人急需几块 利尔达的EZ430-RF5137-433  开发套件。     大家如有闲置,可以转给俺,qq:4l72484O9…

查看全部问答>