stm32如何配置时钟
STM32F407的系统时钟配置
STM32F4的系统时钟树时钟系统是微处理器同步系统的基准和运行节拍,如同人的心跳节拍一样。
因此时钟系统是微处理器中最重要的一个核心部分。
STM32F4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切。
问:采用一个系统时钟不是很简单吗?为什么STM32要有多个时钟源呢?答:因为首先STM32本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十k的时钟即可。
同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般都是采取多时钟源的方法来解决这些问题。
时钟总线:STM32F407上挂载有3根时钟总线,分别为AHB、APB1、APB2;其芯片的外设大部分都挂载在这三根总线上,因此还需要弄清楚这三根总线的时钟频率。
在STM32F4中,有5个最重要的时钟源,为HSI、HSE、LSI、LSE、PLL。
PLL实际是分为两个时钟源,分别为主PLL和专用PLL。
从时钟频率来分可以分为高速时钟源和低速时钟源,在这5个中HSI,HSE以及PLL是高速时钟,LSI和LSE是低速时钟。
从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中HSE和LSE是外部时钟源,其他的是内部时钟源。
根据左边的时钟系统图中的红色标记分别为:①LSI是低速内部时钟,RC振荡器,频率为32kHz左右。
供独立看门狗和自动唤醒单元使用②LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
这个主要是RTC的时钟源。
③HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。
HSE也可以直接做为系统时钟或者PLL输入。
④HSI是高速内部时钟,RC振荡器,频率为16MHz。
可以直接作为系统时钟或者用作PLL输入。
⑤PLL为锁相环倍频输出。
STM32F4有两个PLL:1)主PLL(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。
stm32定时器时钟以及中间对齐模式
stm32定时器时钟以及中间对齐模式在永磁同步电机的控制中,需要对电机的三相定⼦施加⼀定的电压,才能控制电机转动。
现在⽤的较多的是SVPWM(SVPWM的具体原理会在后⾯另写⼀篇博客说明),要想产⽣SVPWM波形,需要控制的三相电压呈如下形式,即A、B、C三相的电压是中间对齐的,这就需要⽤到stm32定时器的中间对齐模式了。
1、stm32的时钟树stm32的时钟树如下图所⽰,简单介绍⼀下stm32时钟的配置过程。
以外部时钟作为时钟源为例。
HSE代表外部时钟(假设为8M)、SYSCLK为系统时钟,经过倍频器之后变成168M、SYSCLK经过AHB预分频器(假设分频系数为1)后变成HCLK时钟等于系统时钟SYSCLK,HCLK即AHB外部总线时钟,经过APB预分频器分出APB1时钟(分频系数为2,低速设备SYSCLK/4)与APB2时钟(分频系数为1,⾼速设备SYSCLK/2)HSE->SYSCLK->HCLK->APB1、APB2。
针对stm32f427的配置源码如下static void SetSysClock(void){#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)/******************************************************************************//* PLL (clocked by HSE) used as System clock source *//******************************************************************************/__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/* Enable HSE */RCC->CR |= ((uint32_t)RCC_CR_HSEON);/* Wait till HSE is ready and if Time out is reached exit */do{HSEStatus = RCC->CR & RCC_CR_HSERDY;StartUpCounter++;} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));if ((RCC->CR & RCC_CR_HSERDY) != RESET){HSEStatus = (uint32_t)0x01;}else{HSEStatus = (uint32_t)0x00;}if (HSEStatus == (uint32_t)0x01){/* Select regulator voltage output Scale 1 mode */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;//AHB时钟#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)/* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;//APB2时钟/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;//APB1时钟#endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx *//* Configure the main PLL */RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);/* Enable the main PLL */RCC->CR |= RCC_CR_PLLON;/* Wait till the main PLL is ready */while((RCC->CR & RCC_CR_PLLRDY) == 0){}#if defined (STM32F427_437xx) || defined (STM32F429_439xx)/* Enable the Over-drive to extend the clock frequency to 180 Mhz */PWR->CR |= PWR_CR_ODEN;while((PWR->CSR & PWR_CSR_ODRDY) == 0){}PWR->CR |= PWR_CR_ODSWEN;while((PWR->CSR & PWR_CSR_ODSWRDY) == 0){}/* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS; #endif /* STM32F427_437x || STM32F429_439xx *//* Select the main PLL as system clock source */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= RCC_CFGR_SW_PLL;/* Wait till the main PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);{}}else{ /* If HSE fails to start-up, the application will have wrong clockconfiguration. User can add here some code to deal with this error */}}2、stm32定时器的时钟stm32定时器分为⾼级定时器(TIM1与TIM8)、通⽤定时器(TIM2-TIM5、TIM9-TIM14)、基本定时器(TIM6、TIM7)。
STM32F051使用自带时钟48M设置
}
}
去掉外部晶振后,单片机时钟源会默认的使用内部高速RC振荡器HSI,HSI频率大约为8M,所以要想使系统获得48M的频率需要用PLL倍频后做为系统的时钟,PLL是一个锁相环,专门用来倍频或者分频的。(倍频后所得的频率一般叫PLL时钟)
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_12);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08) //µÈ´ýϵͳʱÖÓ³õʼ»¯³É¹¦
whilerccgetsysclksource去掉外部晶振后单片机时钟源会默认的使用内部高速rc振荡器hsihsi频率大约为8m所以要想使系统获得48m的频率需要用pll倍频后做为系统的时钟pll是一个锁相环专门用来倍频或者分频的
正确设置:
void RCC_Configuration(void);
void RCC_Configuration(void)
{
//ÉèÖÃPLLʱÖÓÔ´¼°±¶ÆµÏµÊý
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_12);///*!< PLL input clock*12*/
//ʹÄÜPõʼ»¯³É¹¦
这句话的意思是将HSI时钟12倍频,为什么是12倍频而不是6倍频呢?如下图STM32F051系列的时钟树所示:
根据时钟树可以看出用PLL对HSI进行倍频时,硬件将首先对HSI二分频,也就是为4M,所以必须再对其进行12倍频才能变成48M,最后通过RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);语句将PLL时钟作为系统时钟,至此系统的时钟变为48M
STM32F0xx 微控制器的时钟配置介绍
2 年 05 月
文档 ID 022837 第 1 版
1/16
目录
目录
AN4055
1
术语表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2 专家模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4
已知限制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
文档 ID 022837 第 1 版
3/16
3
图片索引
图片索引
AN4055
图 1. 图 2. 图 3. 图 4. 图 5. 图 6. 图 7.
时钟结构图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 I2S 时钟结构图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 向导模式用户界面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 选择时钟源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 文件生成错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 专家模式用户界面 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 超出系统时钟频率 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
STM32单片机RTC时钟的使用方法及步骤
STM32单片机RTC时钟的使用方法及步骤以下是使用STM32单片机的RTC时钟的步骤:1.初始化RTC模块:首先,需要在RCC寄存器中使能RTC和LSE(Low-Speed External)晶振模块。
然后,配置RTC的时钟源和预分频器,选择合适的时钟频率。
2.配置RTC时间和日期:通过设置RTC的寄存器来配置当前时间和日期。
需要设置秒、分钟、小时、星期、日期、月份和年份,确保其具有正确的值。
3.启动RTC时钟:设置RTC的控制寄存器,使其开始工作。
可以选择启用或禁用闹钟功能,设置闹钟的时间和日期。
4.读取RTC数据:可以随时读取RTC的时间和日期数据。
读取数据后,可以进行各种计算和处理,如计算两个时间之间的差异、比较时间等。
5.处理RTC中断:可以设置RTC中断来触发一些操作,如闹钟触发时执行一些任务。
需要配置NVIC(Nested Vector Interrupt Controller)中断向量表,使能相应的中断。
6.备份和恢复RTC数据:RTC模块提供了备份寄存器,可以用来存储额外的信息。
可以使用一些特殊的寄存器,如BKP (Backup)寄存器或CPU的系统寄存器来备份和恢复数据。
7.断电维持能力:RTC模块的一个关键特性是其断电维持能力。
即使在断电情况下,RTC模块中的数据仍然能够保持。
可以通过电池供电电路来提供必要的电力。
8.节能模式:可以利用RTC模块的节能模式来降低功耗。
可以选择性地关闭RTC模块的不需要的功能,以减少功耗。
需要注意的是,具体的步骤可能会因芯片型号和开发工具的不同而有所差异。
因此,在使用STM32单片机的RTC时钟之前,需查阅相关的技术文档和参考手册,以了解具体操作步骤和寄存器配置。
以上是使用STM32单片机的RTC时钟的基本步骤。
在实际应用中,可以根据具体需求对RTC进行更多的配置和使用。
STM32F103RC系统时钟配置
地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 STM32F103RC 系统时钟配置1、打开D:\program\KEL_MDT_ARM\STM32_Template\USER 目录,找到STM32-DEMO 文件,双击打开,KEIL-uVision4就开始运行了,得到下图:2、双击“STARTCODE ”下面的“start_stm32f10x_hd.s ”打开STM32F103RC 的启动文件,找“SystemInit ”,得到下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司3、点击当前的行,右击鼠标,将光标移动到“Go To Definition Of SystemInit”,见下图:4、点击“Go To Definition Of SystemInit ”,会跳转到system_stm32f10x.c 文件,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司5、在“system_stm32f10x.c ”文件中,在“void SystemInit (void)”函数体内找到“SetSysClock();”,见下图:6、点击“SetSysClock()”,右击鼠标,将光标移动到“Go To Definition Of SystemClock”,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司 7、点击“Go To Definition Of SystemClock”,会跳转到system_stm32f10x.c 文件,见下图:8、点击“defined SYSCLK_FREQ_72MHz ”,右击鼠标,将光标移到到“Go To Definition Of SYSCLK_FREQ_72MHz ”,见下图:地址:安徽省、合肥市、肥东县、店埠镇,合肥市福来德电子科技有限公司9、点击“Go To Definition Of SYSCLK_FREQ_72MHz ”,会跳转到下图:10、在上图中,我们可以设置所需要的系统时钟,这里设置系统时钟是SYSCLK_FREQ_72MHz ,见下面粘贴的部分#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* #define SYSCLK_FREQ_HSE HSE_VALUE */#define SYSCLK_FREQ_24MHz 24000000#else/* #define SYSCLK_FREQ_HSE HSE_VALUE *//* #define SYSCLK_FREQ_24MHz 24000000 *//* #define SYSCLK_FREQ_36MHz 36000000 *//* #define SYSCLK_FREQ_48MHz 48000000 *//* #define SYSCLK_FREQ_56MHz 56000000 */#define SYSCLK_FREQ_72MHz 72000000 //这是我们要设置的系统时钟#endif。
stm32芯片时钟(晶振)连接到芯片的 引脚
STM32芯片时钟(晶振)连接到芯片引脚一、引言STM32芯片是一款由STMicroelectronics公司生产的32位微控制器,具有高性能、低功耗、丰富的外设和可扩展性等特点。
在STM32芯片中,时钟(晶振)连接到芯片引脚是一个非常重要的部分,直接关系到芯片的工作频率和稳定性。
二、 STM32芯片时钟STM32芯片的时钟系统包括内部RC振荡器、内部RC振荡器、外部晶体振荡器等,其中晶振作为一种最常用的外部时钟源,具有稳定性高、精度好等优点,因此在实际应用中得到了广泛的应用。
三、连接方式STM32芯片中,晶振可以连接到芯片的多个引脚上,通常采用的是双向连接方式,即一个晶振同时连接到芯片的两个引脚上,以提高时钟信号的稳定性和可靠性。
四、连接引脚STM32芯片的不同系列和不同型号,在连接晶振时会有所不同,但基本的连接原理是相通的。
一般来说,连接引脚包括晶振输入引脚(XTAL1)和晶振输出引脚(XTAL2),分别用来输入晶振的信号和输出晶振的信号,并通过外部电路提供稳定的时钟信号给芯片内部的时钟系统。
五、连接建议在实际应用中,连接晶振时需要注意以下几点:1. 选择合适的晶振型号和频率,根据实际需求选择合适的晶振型号和频率,以保证芯片的工作稳定。
2. 连接线路布局合理,尽量减小晶振到芯片引脚的连接长度,减小外界干扰。
3. 使用合适的外围电路,包括对晶振输入引脚和晶振输出引脚的连接电路、滤波电路等。
六、结语正确连接STM32芯片时钟(晶振)到芯片引脚对于芯片的正常工作和稳定性有着重要的意义,希望本文能为您在实际应用中提供一些帮助。
感谢您的阅读。
七、晶振类型和频率选择在选择晶振类型和频率时,需要根据具体的应用需求进行选择。
一般来说,晶振的频率可以选择从几十kHz到几十MHz不等。
对于低功耗应用,可以选择较低频率的晶振,而对于需要高性能的应用,则需要选择较高频率的晶振。
还需要考虑晶振的负载电容和稳定性等因素,以保证晶振在工作时能够提供稳定可靠的时钟信号。
STM32定时器定时时间配置总结
STM32定时器定时时间配置总结STM32系列微控制器内置了多个定时器模块,它们可以用于各种定时功能,如延时、周期性触发、脉冲计数等。
在使用STM32定时器之前,我们需要进行定时时间配置,本文将总结一下STM32定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。
首先,我们需要选择定时器的工作模式。
STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。
基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。
根据具体的应用需求,选择合适的工作模式。
其次,我们需要选择定时器的时钟源。
STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。
内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。
然后,我们需要选择定时器的时钟分频系数。
定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。
我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。
时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。
接着,我们需要配置定时器的计数器重载值。
定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。
通过改变计数器重载值,可以实现不同的定时时间。
计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。
最后,我们需要配置定时器的中断。
定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。
在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。
通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。
需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。
STM32F时钟配置1
//程序中需要用的其他时钟也可以确定了。 //因为 APB1 Prescaler=1(没有分频),所以 TIMxCLK=PLCK1=36M //因为 APB2 Prescaler=1(没有分频),所以 TIM1CLK=PLCK2=36M //在 SystemInit 中 ADCPRE:ADC 预分频 00:PCLK2 2 分频后作为 ADC 时钟,即 ADCCLK=PCLK2/2,所以 ADCCLK=18M
FLASH->ACR |= FLASH_ACR_PRFTBE;
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1;
CanolaFlower
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
RCC->CIR = 0x009F0000;
SetSysClock(); }
static void SetSysClockTo36(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
//注释为:SYSLCK,HCLK,PCLK2 和 PCLK1 的配置
RCC->CR |= RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0) { }
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
STM32时钟详细配置
STM32时钟配置STM32时钟配置步骤// 开启HSI时钟寄存器操作1).开启高速时钟HSE // 设置时钟控制寄存器RCC_CR 位16 置1使能RCC->CR|= 0x00010000;位16 :HSEON:外部高速时钟使能当进入待机和停止模式时,该位由硬件清零,关闭4-16MHz外部振荡器。
当外部4-16MHz 振荡器被用作或被选择将要作为系统时钟时,该位不能被清零。
2).等待高速时钟就绪// 读取时钟控制寄存器RCC_CR位17为1就位while(!(RCC-> CR>>17));位17:HSERDY:外部高速时钟就绪标志由硬件置’1’来指示外部4-16MHz振荡器已经稳定。
在HSEON位清零后,该位需要6个外部4-25MHz振荡器周期清零。
3).设置APB1,APB2,AHB分频系数// 设置时钟配置寄存器RCC_CFGRRCC_CFGR=0x00000400;(AHB :位4-7, (低速)APB1 :位8-10, (高速)APB2 :位11-13)位7:4:HPRE[3:0]:AHB预分频(AHB Prescaler)0xxx:SYSCLK不分频位10:8:PPRE1[2:0]:低速APB预分频(APB1) 100:HCLK 2分频位13:11:PPRE2[2:0]:高速APB预分频(APB2) 0xx:HCLK不分频4).设置PLL倍频// 配置时钟配置寄存器RCC_CFGR 位18-21RCC_CFGR|=7<<18;位21:18:PLLMUL:PLL倍频系数0111:PLL 9倍频输出5).PLL输入时钟源选择// 配置时钟配置寄存器RCC_CFGR 位16RCC_CFGR|=1<<16;位16:PLLSRC:PLL输入时钟源(PLL entry clock source) 1:HSE时钟作为PLL输入时钟。
由软件置’1’或清’0’来选择PLL输入时钟源。
STM32时钟配置方法详解
一、在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
①HSI是高速内部时钟,RC振荡器,频率为8MHz。
②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③LSI是低速内部时钟,RC振荡器,频率为40kHz。
④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。
倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
二、在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法:如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:①对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。
②对于少于100脚的产品,有2种接法:第1种:OSC_IN和OSC_OUT分别通过10K电阻接地。
此方法可提高EMC性能;第2种:分别重映射OSC_IN 和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。
此方法可以减小功耗并(相对上面)节省2个外部电阻。
三、用HSE时钟,程序设置时钟参数流程:01、将RCC寄存器重新设置为默认值RCC_DeInit;02、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);03、等待外部高速时钟晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp();04、设置AHB时钟RCC_HCLKConfig;05、设置高速AHB时钟RCC_PCLK2Config;06、设置低速速AHB时钟RCC_PCLK1Config;07、设置PLL RCC_PLLConfig;08、打开PLL RCC_PLLCmd(ENABLE);09、等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)10、设置系统时钟RCC_SYSCLKConfig;11、判断是否PLL是系统时钟while(RCC_GetSYSCLKSource() != 0x08)12、打开要使用的外设时钟RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()四、下面是STM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振)/******************************************************************************** Function Name : RCC_Configuration* Description : RCC配置(使用外部8MHz晶振)* Input : 无* Output : 无* Return : 无*******************************************************************************/void RCC_Configuration(void){/*将外设RCC寄存器重设为缺省值*/RCC_DeInit();/*设置外部高速晶振(HSE)*/RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打开(ON)/*等待HSE起振*/HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪 {/*设置AHB时钟(HCLK)*/RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB 时钟= 系统时钟/* 设置高速AHB时钟(PCLK2)*/RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2时钟= HCLK/*设置低速AHB时钟(PCLK1)*/RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2——APB1时钟= HCLK / 2/*设置FLASH存储器延时时钟周期数*/FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2 2延时周期/*选择FLASH预取指缓存的模式*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能/*设置PLL时钟源及倍频系数*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);// PLL的输入时钟= HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9/*使能PLL */RCC_PLLCmd(ENABLE);/*检查指定的RCC标志位(PLL准备好标志)设置与否*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/*设置系统时钟(SYSCLK)*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟/* PLL返回用作系统时钟的时钟源*/while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作为系统时钟 {}}/*使能或者失能APB2外设时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph _GPIOB |RCC_APB2Periph_GPIOC , ENABLE);//RCC_APB2Periph_GPIOA GPIOA时钟//RCC_APB2Periph_GPIOB GPIOB时钟//RCC_APB2Periph_GPIOC GPIOC时钟//RCC_APB2Periph_GPIOD GPIOD时钟}五、时钟频率STM32F103内部8M的内部震荡,经过倍频后最高可以达到72M。
STM32单片机RTC时钟的使用方法及步骤
STM32单片机RTC时钟的使用方法及步骤一、配置RTC模块时钟源RTC模块的时钟源可以选择外部低速晶振(LSE)或者低速内部时钟(LSI)。
通过以下步骤配置RTC时钟源:1.使能外部低速晶振(LSE)或者低速内部时钟(LSI)。
例如,如果使用外部低速晶振,则需要使能相应的GPIO端口,并配置为晶振模式。
2.配置RCC时钟控制寄存器(RCC_CR)和时钟配置寄存器(RCC_CSR)。
二、使能RTC模块时钟1.使能PWR模块时钟和备份寄存器访问。
RCC_APB1ENR,=(1<<28);RCC_APB1ENR,=(1<<27);2.校验并关闭RTC模块。
RCC->BDCR,=RCC_BDCR_RTCEN;PWR->CR,=PWR_CR_DBP;if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0)RCC->BDCR,=RCC_BDCR_RTCEN;3.配置RTC时钟预分频器和提供给RTC的时钟源。
RTC->PRER ,= rtc_prescaler_value << RTC_PRER_PREDIV_S_Pos;RTC->PRER ,= 127 << RTC_PRER_PREDIV_A_Pos;RTC->CR&=~RTC_CR_FMT;三、配置RTC模块时间和日期1.关闭RTC时钟写保护功能。
RTC->WPR=0xCA;RTC->WPR=0x53;RTC->ISR,=RTC_ISR_INIT;while((RTC->ISR & RTC_ISR_INITF) == 0);2.配置RTC的时间和日期寄存器。
RTC->TR ,= (uint32_t)((hours / 10) << RTC_TR_Hours10_Pos);RTC->TR ,= (uint32_t)((hours % 10) << RTC_TR_Hours1_Pos);RTC->TR ,= (uint32_t)((minutes / 10) <<RTC_TR_Minutes10_Pos);RTC->TR ,= (uint32_t)((minutes % 10) <<RTC_TR_Minutes1_Pos);RTC->TR ,= (uint32_t)((seconds / 10) <<RTC_TR_Seconds10_Pos);RTC->TR ,= (uint32_t)((seconds % 10) <<RTC_TR_Seconds1_Pos);RTC->DR ,= (uint32_t)((year / 10) << RTC_DR_YT_Pos);RTC->DR ,= (uint32_t)((year % 10) << RTC_DR_YU_Pos);RTC->DR ,= (uint32_t)((month / 10) << RTC_DR_MT_Pos);RTC->DR ,= (uint32_t)((month % 10) << RTC_DR_MU_Pos);RTC->DR ,= (uint32_t)((day / 10) << RTC_DR_DT_Pos);RTC->DR ,= (uint32_t)((day % 10) << RTC_DR_DU_Pos);3.开启RTC时钟写保护功能。
STM32f407系统定时器时钟配置计算
STM32f407系统定时器时钟配置计算首先,我们需要配置系统定时器的时钟源。
STM32F407的系统定时器可以使用内部时钟源(HCLK/8)或外部时钟源。
通过软件配置,我们可以选择其中一种时钟源。
1.配置内部时钟源:要使用内部时钟源,可以通过RCC寄存器来配置。
具体需要做以下几步:a. 使能系统定时器时钟:在 RCC_APBxENR 寄存器中设置位SysTickEN=1,其中 x 为适当的 APBx 总线索引。
b.配置系统定时器时钟源:在STK_CTRL寄存器中设置位CLKSOURCE=12.配置外部时钟源:如果要使用外部时钟源作为系统定时器的时钟源,我们需要将外部时钟源与系统的时钟树相连。
具体的配置方法因时钟源的不同而不同,可参考具体芯片的参考手册。
配置了系统定时器的时钟源后,我们可以计算定时器中断的时间间隔。
系统定时器中断的时间间隔=(计数器周期)*(重载值+1)/(时钟频率)其中,计数器周期为24位,取值范围为0~2^24-1、时钟频率为系统定时器的时钟源频率。
重载值是计数器的初始值,当计数器减到0时,会触发定时中断。
举个例子,假设系统定时器的时钟源频率为8MHz,我们希望计算系统定时器中断每100ms触发一次的重载值。
中断触发周期 = 100ms = 0.1s时钟频率=8MHz=8*10^6Hz由于重载值需要为整数,我们可以将计算结果四舍五入为最接近的整数,即重载值为477以上就是STM32F407系统定时器时钟配置和计算方法的简要介绍。
配置完系统定时器的时钟源,并计算出需要的重载值后,我们可以通过编程设置相关寄存器,来开始使用系统定时器进行定时中断的任务。
STM32时钟配置方法详解
STM32时钟配置方法详解STM32是意法半导体(STMicroelectronics)公司推出的一系列32位Flash微控制器,被广泛应用于各种嵌入式系统中。
时钟是STM32微控制器的核心部分,正确配置时钟可以确保系统正常工作并达到预期的性能。
本文将详细介绍STM32时钟配置的方法。
1.时钟源:STM32微控制器提供了多个时钟源,包括内部时钟(HSI、LSI)和外部时钟(HSE、LSE)。
其中,HSI(高速内部时钟)是一个高频率(通常为8MHz)的内部RC振荡器,适用于低功耗应用;LSI(低速内部时钟)是一个低频率(通常为40kHz)的内部RC振荡器,用于RTC(实时时钟)模块;HSE(高速外部时钟)是一个外接的高频晶振,用于提供更精确的时钟信号;LSE(低速外部时钟)是一个外接的低频晶振,适用于RTC模块。
2.主频和系统时钟:主频是指CPU的时钟频率,系统时钟是指STM32微控制器的总线时钟,包括AHB(高性能总线)、APB1(低速外设总线)和APB2(高速外设总线)。
在进行STM32时钟配置之前,需要按照以下几个步骤来完成。
1.启用对应的时钟源:根据具体需求,选择合适的时钟源并启用相应的时钟。
可以通过设置RCC_CR寄存器和RCC_APB1ENR/RCC_APB2ENR寄存器来实现。
例如,要使用HSE作为时钟源,需要首先启用HSE时钟。
2.配置时钟分频器:为了使系统时钟不超过芯片规格要求的最大频率,需要对时钟进行分频。
分频器有两个,即AHB分频器和APB分频器。
可以通过设置RCC_CFGR寄存器来实现。
例如,将AHB分频器设置为8,将APB1和APB2分频器分别设置为4,可以将主频分别分频为8MHz、32MHz和64MHz。
3.等待时钟稳定:当启用外部时钟源时,需要等待时钟稳定。
可以通过读取RCC_CR寄存器的特定标志位来判断时钟是否稳定。
4. 配置Flash存储器的延时:根据主频的不同,需要设置Flash存储器的访问延时,以确保正常读写数据。
stm32外部时钟模式1
stm32外部时钟模式1基础了解时钟选择计数器时钟可由下列时钟源提供:●内部时钟(CK_INT)●外部时钟模式1:外部输⼊脚(TIx)●外部时钟模式2:外部触发输⼊(ETR)●内部触发输⼊(ITRx):使⽤⼀个定时器作为另⼀个定时器的预分频器在平常使⽤中我们系统复位 000 默认使⽤内部时钟源外部时钟源1来⾃定时器⾃⾝输⼊通道1或通道2的输⼊信号,经过极性选择和滤波以后⽣成的触发信号,连接到从模式控制器,进⽽控制计数器的⼯作;来⾃通道1的输⼊信号经过上升沿、下降沿双沿检测⽽⽣成的脉冲信号进⾏逻辑相或以后的信号就是TI1F_ED信号,即TI1F_ED双沿脉冲信号。
//SIGNAL_COUNT(GPIO)#define SIGNAL_COUNT_ENA_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //PB0#define SIGNAL_COUNT_ENA_GPIO_Port (GPIOB)#define SIGNAL_COUNT_ENA_Pin (GPIO_PIN_0)#define SIGNAL_COUNT_DIR_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() //PA7#define SIGNAL_COUNT_DIR_GPIO_Port (GPIOA)#define SIGNAL_COUNT_DIR_Pin (GPIO_PIN_7)#define SIGNAL_COUNT_DIR_Get_IRQn (EXTI9_5_IRQn) //EXTI7中断//SIGNAL_COUNT(AFIO & TIM)#define SIGNAL_COUNT_PUL_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() //PA6#define SIGNAL_COUNT_PUL_GPIO_Port (GPIOA)#define SIGNAL_COUNT_PUL_Pin (GPIO_PIN_6)#define SIGNAL_COUNT_TIM_CLK_ENABLE() __HAL_RCC_TIM3_CLK_ENABLE() //TIM3#define SIGNAL_COUNT_Get_TIM (TIM3)#define SIGNAL_COUNT_Get_HTIM (htim3)//GPIO输⼊#define SIGNAL_COUNT_READ_DIR_IO() (SIGNAL_DIR_GPIO_Port -> IDR & SIGNAL_DIR_Pin)#define SIGNAL_COUNT_READ_ENA_IO() (SIGNAL_ENA_GPIO_Port -> IDR & SIGNAL_ENA_Pin)//TIM输⼊#define SIGNAL_COUNT_READ_COUNT() (SIGNAL_COUNT_Get_TIM -> CNT)//TIM输出#define SIGNAL_COUNT_UP() (SIGNAL_COUNT_Get_TIM -> CR1 &= ~(TIM_CR1_DIR))#define SIGNAL_COUNT_DOWN() (SIGNAL_COUNT_Get_TIM -> CR1 |= (TIM_CR1_DIR))/*** @brief TIM_SIGNAL_PUL初始化* @param NULL* @retval NULL**/void REIN_TIM_SIGNAL_COUNT_Init(void){/* GPIO初始化 */GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable*/SIGNAL_COUNT_PUL_CLK_ENABLE(); //启⽤SIGNAL_COUNT_PUL端⼝时钟/*Configure GPIO pin*/GPIO_InitStruct.Pin = SIGNAL_COUNT_PUL_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输⼊模式GPIO_InitStruct.Pull = GPIO_NOPULL; //禁⽤上下拉HAL_GPIO_Init(SIGNAL_COUNT_PUL_GPIO_Port, &GPIO_InitStruct);/* TIM初始化 */TIM_SlaveConfigTypeDef sSlaveConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};SIGNAL_COUNT_TIM_CLK_ENABLE(); //启⽤TIM时钟SIGNAL_COUNT_Get_HTIM.Instance = SIGNAL_COUNT_Get_TIM;SIGNAL_COUNT_Get_HTIM.Init.Prescaler = 0; //预分频:0SIGNAL_COUNT_Get_HTIM.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数SIGNAL_COUNT_Get_HTIM.Init.Period = 65535; //16位周期SIGNAL_COUNT_Get_HTIM.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //不分频SIGNAL_COUNT_Get_HTIM.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //禁⽤⾃动重新加载if (HAL_TIM_Base_Init(&SIGNAL_COUNT_Get_HTIM) != HAL_OK){Error_Handler();}sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; //外部时钟模式sSlaveConfig.InputTrigger = TIM_TS_TI1FP1; //TI1FP1sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING; //上升沿触发sSlaveConfig.TriggerFilter = 4; //滤波参数(FDIV2_N6)if (HAL_TIM_SlaveConfigSynchro(&SIGNAL_COUNT_Get_HTIM, &sSlaveConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; //主机模式触发复位sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; //禁⽤主机模式if (HAL_TIMEx_MasterConfigSynchronization(&SIGNAL_COUNT_Get_HTIM, &sMasterConfig) != HAL_OK){Error_Handler();}/*begin work*/HAL_TIM_Base_Start(&SIGNAL_COUNT_Get_HTIM);}static void Signal_Count_Capture_Goal(void){//SignalPort获取⽬标//读取En_Pinif(SIGNAL_COUNT_READ_ENA_IO()){if(sg_cut.en_inve)sg_cut.en_valid = true;elsesg_cut.en_valid = false;}else{if(sg_cut.en_inve)sg_cut.en_valid = false;elsesg_cut.en_valid = true;}//采样(对⽐上次的计数值)sg_cut.sampling_count_last = sg_cut.sampling_count;sg_cut.sampling_count = SIGNAL_COUNT_READ_COUNT();sg_cut.sampling_count_sub = sg_cut.sampling_count - sg_cut.sampling_count_last;//采样(缓冲输出)//(采样数/细分数)*Move_Divide_NUM = 电机输出步数sg_cut.interp_out = sg_cut.sampling_count_sub * sg_cut.subdivide_form;//输出if(sg_cut.en_valid){signal_moreio.goal_location = sg_cut.interp_out; //Count模式借⽤⽬标位置存放⽬标位置增量 signal_moreio.goal_disable = false;signal_moreio.goal_brake = false;}else{signal_moreio.goal_location = 0; //Count模式借⽤⽬标位置存放⽬标位置增量signal_moreio.goal_disable = true;signal_moreio.goal_brake = false;}}。
STM32CubeMX配置SystemTick时钟
STM32CubeMX自动生成SYSTICK配置1.SYSTICK原理及其寄存器1.1 SYSTICK原理SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。
只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。
SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基,产生一个周期性的中断。
1.2SYSTICK寄存器CTRL: Systick控制和状态寄存器LOAD: Systick重装载寄存器VAL: Systick当前值寄存器CALIB: Systick校准值寄存器CLKCOURCE-时钟源0:外部时钟源HCLK(AHB总线时钟)/8 72M/8 = 9M 1:内核时钟(HCLK) 72MCURRENT: 每经过一个Systick时钟周期,寄存器值-1 。
2.STM32CubeMX配置与代码生成如下图STM32CubeMX配置所示,图中To Cortex System timer(MHz)就是Systick的时钟频率。
自动代码生成如下:/**Configure the Systick interrupt time */HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000); // =/8/1000 :1000 is 1ms ;1000000 is 1us/**Configure the Systick */HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); /* SysTick_IRQn interrupt configuration */HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);3.相关重要的函数3.1中断处理函数void SysTick_Handler(void){/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();HAL_SYSTICK_IRQHandler();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */}__IO uint32_t uwTick;__weak void HAL_IncTick(void){uwTick += uwTickFreq;}每次SysTick异常中断后,会执行SysTick_Handler() 函数,然后HAL_IncTick()函数。
STM32时钟配置方法详解
STM32时钟配置方法详解时钟树是STM32微控制器中一系列时钟源和时钟分频器的组成部分。
时钟树包括系统时钟、外设时钟和内核时钟。
系统时钟用于驱动整个微控制器系统的核心,外设时钟用于驱动各种外设,内核时钟用于驱动CPU的运算。
在进行时钟配置之前,首先需要了解系统所需的时钟频率。
在STM32中,系统时钟可以通过多种方式进行配置,例如使用外部晶体、外部时钟、内部RC振荡器或者PLL(锁相环)等方式。
外部晶体是一种常用的时钟源,可以提供高精度的时钟频率。
在使用外部晶体时,首先需要设置PLL的时钟源为外部晶体,并设置PLL输入除频器的分频系数。
然后,再根据系统所需的时钟频率,设置PLL的倍频系数,以得到最终的系统时钟频率。
外部时钟是从外部提供的时钟信号,一般用于测试和调试。
使用外部时钟时,需要设置PLL的时钟源为外部时钟,并设置PLL的倍频系数,以得到所需的系统时钟频率。
内部RC振荡器是一种低成本的时钟源,但是其频率不如外部晶体稳定和精确。
在使用内部RC振荡器时,需要设置PLL的时钟源为内部RC振荡器,并设置PLL的倍频系数,以得到所需的系统时钟频率。
PLL是一种用于产生稳定高频时钟的电路,可以从一个低频时钟源产生一个高频时钟源。
使用PLL时,需要设置其输入时钟源和倍频系数。
系统时钟的分频系数可以通过RCC_CFGR寄存器进行设置。
RCC_CFGR寄存器的各个位域用于配置系统时钟的分频系数,包括分频因子、APB1的分频系数、APB2的分频系数等。
外设时钟是用于驱动外设的时钟,可以由系统时钟分频得到。
外设时钟的分频系数可以通过RCC_CFGR寄存器及各个外设的控制寄存器进行设置。
内核时钟是用于驱动CPU的运算的时钟。
在STM32微控制器中,CPU 时钟可以由系统时钟分频得到,分频系数可以通过RCC_CFGR寄存器和FLASH_ACR寄存器进行设置。
除了上述方法之外,STM32还可以使用时钟配置工具进行时钟配置。
STM32f407系统定时器时钟配置、计算
STM32f407系统定时器时钟配置、计算STM32f407系统定时器时钟配置、计算1. 外部晶振的选择##确定自己单片机的外部晶振系统默认配置为25M,即打开官方库文件参数HSE Frequency(Hz) 一般为25000000HSE Frequency(Hz) | 25000000----------#if !defined (HSE_VALUE)#define HSE_VALUE ((uint32_t)25000000) /*!<Value of the External oscillator in Hz */#endif /* HSE_VALUE */... ... ...我自己的单片机外部晶振为8M,将参数改为80000002. 系统时钟确定2.1 改完之后参照stm32f4时钟树2.2 首先明确自己的系统总时钟找到自己程序PLL Parameters部分(工程system_stm32f4xx.c) /************************* PLL Parameters***************************//* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ //锁相环压腔振荡器时钟//PLL_VCO =(HSE_VALUE/PLL_M)* PLL_N=8/ 8* 336 = 336MHz#define PLL_M 8#define PLL_N 336/* SYSCLK = PLL_VCO / PLL_P */// 系统时钟SYSCLK = PLL_VCO / PLL_P=336 / 2 = 168MHz #define PLL_P 2/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ //USB,SD卡时钟= PLL_VCO / PLLQ=336 / 7 = 48MHz#define PLL_Q 7/************************************************************** *****/3. 计算出自己系统时钟为168M##3.1 对应时钟线这里需要计算各个定时器分配所得的计数时钟频率3.2 找到APB1,APB2配置部分3.3 程序位置/* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;/* Configure the main PLL */RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);3.4 位置计算15:13位为 010 ----->AHB2 不分频12:10位为 101 ----->AHB1 4分频e. 原则“非1即2”明确APB1得到时钟84M,APB2计数时钟频率168M 4. 系统默认情况:4.1 定时周期、频率的计算/****************************************************默认配置:外部时钟启动失败,系统会自动使用内部时钟*HCLK = SYSCLK / 1 = 168MHz ,AHB×总线时钟*PCLK2 = HCLK / 2 = 84MHz*PCLK1 = HCLK / 4 = 42MHz* arr:自动重装载值* psc:时钟预分频树* 定时器溢出时间计算方法:T out=((arr+1)*(psc+1))/Ft us.* Ft=定时器工作频率,单位:Mhz*****************************************************/ 4.2 实例验证演示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习STM32笔记2 如何配置时钟学习STM32笔记2 如何配置时钟/*************************************************************该程序目的是用于测试核心板回来后是否能正常工作。
包括两个按键、两个LED现实。
按键为PC4、PC5,LED为PA0\PA1。
LED为低电平时点亮。
按键为低电平时触发。
************************************************************/#i nclude "stm32f10x_lib.h"void RCC_Configuration(void);//设置系统主时钟void GPIO_Configuration(void);//设置邋邋IO参数void NVIC_Configuration(void);//设置中断表地址void delay(void);//延时函数int main(void){#ifdef DEBUGdebug();#endifRCC_Configuration();NVIC_Configuration();GPIO_Configuration();while (1){delay();//设置指定的数据端口位GPIO_SetBits(GPIOA,GPIO_Pin_0);//设置指定的数据端口位delay();GPIO_ResetBits(GPIOA,GPIO_Pin_0);//清除指定的数据端口位GPIO_SetBits(GPIOA,GPIO_Pin_1);delay();GPIO_ResetBits(GPIOA,GPIO_Pin_1);delay();/*********************************************使用setbits 与resetbits 是比较简单,其实还是可以使用其它函数。
例如可以使用GPIO_WriteBitGPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);对于好像流水灯呀这些一个整段IO,可以使用GPIO_Write(GPIOA, 0x1101);*********************************************/}}/******************************************************************************* 系统时钟函数,要设置系统使用哪个晶振工作。
*******************************************************************************/ void RCC_Configuration(void){RCC_DeInit();//将外设RCC寄存器重设为缺省值RCC_HSEConfig(RCC_HSE_ON);/*设置外部高速晶振(HSE)这里是设置高速晶振打开,其实一共有三种设置RCC_HSE_OFF HSE晶振OFFRCC_HSE_ON HSE晶振ONRCC_HSE_Bypass HSE晶振使用外部时钟源。
*/ HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待 HSE 起振if(HSEStartUpStatus == SUCCESS)//等主晶振起振成功起振后执行操作{FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*预取指缓存使能FLASH_PrefetchBuffer用来选择FLASH预取指缓存的模式。
如果需关闭则使用FLASH_PrefetchBuffer_Disable*/ FLASH_SetLatency(FLASH_Latency_2);/*设置代码延时值FLASH_Latency用来设置FLASH存储器延时时钟周期数。
FLASH_Latency_2 2为延时周期可以使用以下参数FLASH_Latency_0 0延时周期FLASH_Latency_1 1延时周期FLASH_Latency_2 2延时周期*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置AHB时钟(HCLK)RCC_SYSCLK_Div1AHB时钟 = 系统时钟RCC_SYSCLK_Div2AHB时钟 = 系统时钟 / 2RCC_SYSCLK_Div4AHB时钟 = 系统时钟 / 4RCC_SYSCLK_Div8AHB时钟 = 系统时钟 / 8RCC_SYSCLK_Div16AHB时钟 = 系统时钟 / 16RCC_SYSCLK_Div64AHB时钟 = 系统时钟 / 64RCC_SYSCLK_Div128AHB时钟 = 系统时钟 / 128RCC_SYSCLK_Div256AHB时钟 = 系统时钟 / 256RCC_SYSCLK_Div512AHB时钟 = 系统时钟 / 512*/RCC_PCLK2Config(RCC_HCLK_Div2);/*设置高速AHB 时钟(PCLK2)RCC_HCLK_Div2 APB1 时钟 = HCLK / 2 RCC_HCLK_Div1APB2时钟 = HCLKRCC_HCLK_Div2APB2时钟 = HCLK / 2RCC_HCLK_Div4APB2时钟 = HCLK / 4RCC_HCLK_Div8APB2时钟 = HCLK / 8RCC_HCLK_Div16APB2时钟 = HCLK / 16*/ RCC_PCLK1Config(RCC_HCLK_Div2);/*设置低速 AHB 时钟(PCLK1)RCC_HCLK_Div2 APB1 时钟 = HCLK / 2 RCC_HCLK_Div1APB1时钟 = HCLKRCC_HCLK_Div2APB1时钟 = HCLK / 2RCC_HCLK_Div4APB1时钟 = HCLK / 4RCC_HCLK_Div8APB1时钟 = HCLK / 8RCC_HCLK_Div16APB1时钟 = HCLK / 16用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。
AHB和APB2域的最大频率是72MHZ? PB1域的最大允许频率是36MHZ。
SDIO接口的时钟频率固定为HCLK/2。
RCC通过AHB时钟8分频后供给Cortex系统定时器的(SysTick)外部时钟。
通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex AHB时钟作为SysTick时钟。
ADC时钟由高速APB2时钟经2、4、6或8分频后获得。
*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* PLLCLK = 8MHz * 9 = 72 MHz设置 PLL 时钟源及倍频系数RCC_PLLSource 描述RCC_PLLSource_HSI_Div2PLL的输入时钟 = HSI时钟频率除以2RCC_PLLSource_HSE_Div1PLL的输入时钟 = HSE 时钟频率RCC_PLLSource_HSE_Div2PLL的输入时钟 = HSE 时钟频率除以2RCC_PLLMul描述RCC_PLLMul_2 PLL输入时钟 x 2RCC_PLLMul_3 PLL输入时钟 x 3RCC_PLLMul_4 PLL输入时钟 x 4RCC_PLLMul_5 PLL输入时钟 x 5RCC_PLLMul_6 PLL输入时钟 x 6RCC_PLLMul_7 PLL输入时钟 x 7RCC_PLLMul_8 PLL输入时钟 x 8RCC_PLLMul_9 PLL输入时钟 x 9RCC_PLLMul_10 PLL输入时钟 x 10RCC_PLLMul_11 PLL输入时钟 x 11RCC_PLLMul_12 PLL输入时钟 x 12RCC_PLLMul_13 PLL输入时钟 x 13RCC_PLLMul_14 PLL输入时钟 x 14RCC_PLLMul_15 PLL输入时钟 x 15RCC_PLLMul_16 PLL输入时钟 x 16警告:必须正确设置软件,使PLL输出时钟频率不超过72 MHz当HSI被用于作为PLL时钟的输入时,系统时钟的最大频率不得超过64MHz。
*/RCC_PLLCmd(ENABLE);//使能或者失能 PLL,关闭使用DISABLEwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}//等待指定的 RCC 标志位设置成功等待PLL初始化成功/*RCC_FLAG值RCC_FLAG 描述RCC_FLAG_HSIRDY HSI晶振就绪RCC_FLAG_HSERDY HSE晶振就绪RCC_FLAG_PLLRDY PLL就绪RCC_FLAG_LSERDY LSI晶振就绪RCC_FLAG_LSIRDY LSE晶振就绪RCC_FLAG_PINRST 管脚复位RCC_FLAG_PORRST POR/PDR复位RCC_FLAG_SFTRST 软件复位RCC_FLAG_IWDGRST IWDG复位RCC_FLAG_WWDGRST WWDG复位*/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*设置系统时钟(SYSCLK)设置PLL为系统时钟?RCC_SYSCLKSource 描述RCC_SYSCLKSource_HSI 选择HSI作为系统时钟RCC_SYSCLKSource_HSE 选择HSE作为系统时钟RCC_SYSCLKSource_PLLCLK 选择PLL作为系统时钟?*/?while(RCC_GetSYSCLKSource() != 0x08)/*等待PLL成功用作于系统时钟的时钟源返回用作系统时钟的时钟源0x00:HSI作为系统时钟0x04:HSE作为系统时钟0x08:PLL作为系统时钟*/{}}else {}//如果晶振没有正常起振则输出错误。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能或者失能 APB2 外设时钟/*RCC_AHB2Periph 描述RCC_APB2Periph_AFIO 功能复用IO时钟RCC_APB2Periph_GPIOA GPIOA时钟RCC_APB2Periph_GPIOB GPIOB时钟RCC_APB2Periph_GPIOC GPIOC时钟RCC_APB2Periph_GPIOD GPIOD时钟RCC_APB2Periph_GPIOE GPIOE时钟RCC_APB2Periph_ADC1 ADC1时钟RCC_APB2Periph_ADC2 ADC2时钟RCC_APB2Periph_TIM1 TIM1时钟RCC_APB2Periph_SPI1 SPI1时钟RCC_APB2Periph_USART1 USART1时钟RCC_APB2Periph_ALL 全部APB2外设时钟*/}/*对于时钟设置的总结一共有4种时钟1、HSE振荡器时钟(外部8M时钟)2、HSI振荡器时钟(内部8M时钟)3、LSE时钟(外部32.768kHz时钟)4、LSI时钟(内部40kHz时钟)HSE振荡器时钟就是外部主要时钟就是8 M晶振。