历史上的今天
今天是: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
史海拾趣
|
1、产品门类多,品种繁杂。仅根据原电子部编制的电子产品分类和编码统计,电子元器件除集成电路以外的产品就有206个大类2519个小类,其中电真空器件13大类260个小类;半导体分立器件(包括激光、光电子器件等)18大类379小类;电子元件17个专业,16 ...… 查看全部问答> |
|
程序放在ram里运行,放在nand里面就不运行了,请问怎么回事 各位,我遇到个问题比较奇怪,请问大家遇到过没有,我把程序放在nand里面,运行不了,提示不是windows ce应用程序,放在ram里面就可以,往nand里面存文件取文件都没有问题,请问是怎么回事 还有一点补充的就是好像以前nand直接访问的话是没有问题 ...… 查看全部问答> |
|
各位,我要将VC下生成的数据文件读取出来,其中的数据有汉字,也有其他英文字符。在VC下写时用的是TCHAR,我在EVC下用TCHAR来读,自动读取出的汉字为乱码????????… 查看全部问答> |
|
我现在做的毕业设计用的就是这款读卡器,需要自己开发一个新的程序包,但是该读卡器自带的说明书过于简单,对该款仪器的命令介绍不全,希望有用该读卡器做过相关项目的高人指点一下。… 查看全部问答> |
|
首先介绍一下我的系统:PXA270 + wince5.0 系统启动过程,上电 --> eboot将wince5.0镜像从flash 搬运到RAM中, -->跳转到RAM运行 现象:用4.2V给系统供电,正极串入电流表,在eboot阶段的电流为300mA左右,跳转到wince5.0后,功耗降到220mA,在bo ...… 查看全部问答> |
|
实验平台是MagicARM2410,我们在做实验时遇到个问题.... 如何在7290的数码管上显示自定义的数据,如:我想显示P-------,该如何做,向哪个子地址发数据? 问题二: 我先做了EINT的一个中断,还要用到串口中断,因为要用I2C和串口都要可操作,所 ...… 查看全部问答> |
|
就是要求把动态的物体从静态的环境里取出。 例如:一个人跳水的视频,把跳水的动作从它所在的环境中分离出来。 要求是C/C++写的,好象要放到MAXPLUSS2里去运行。 我是做软件开发的,一点不懂这方面的东西,但现在急需这个程序,请大家帮个忙了。… 查看全部问答> |




