要求前置技能:
需了解系统时钟源相关知识:STM32时钟系统
本文以HSE外接8MHz晶振,PLL倍频9倍得到72MHz的系统时钟为讲解背景
一,系统初始化函数SystemInit:
文件路径:USER->system_stm32f10x.c->头文件system_stm32f10x.h中SystemInit(void)
在system_stm32f10x.c文件中找到SystemInit(void)源码:
/**
* @brief Setup the microcontroller system
* Initialize the Embedded Flash Interface, the PLL and update the
* SystemCoreClock variable.
* @note This function should be used only after reset.
* @param None
* @retval None
*/
void SystemInit (void)
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001; //RCC_CR寄存器最低位置1:打开HSI(内部高速时钟8M)
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
RCC->CFGR &= (uint32_t)0xF8FF0000;
#else //stm32f103ZET6为大容量芯片HD
RCC->CFGR &= (uint32_t)0xF0FF0000; //RCC_CFGR寄存器初始化
#endif /* STM32F10X_CL */
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF; //将RCC_CR寄存器HSEON,CSSON,PLLON位置0
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF; //将RCC_CR寄存器HSEBYP位置0
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF; //将RCC_CFGR寄存器PLLSRC, PLLXTPRE, //PLLMUL,USBPRE/OTGFSPRE位置0
#ifdef STM32F10X_CL
/* Reset PLL2ON and PLL3ON bits */
RCC->CR &= (uint32_t)0xEBFFFFFF;
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x00FF0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#else //stm32f103ZET6为大容量芯片HD
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000; //关闭所有的中断和对应的位(初始化中断)
#endif /* STM32F10X_CL */
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
#endif
/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
/* Configure the Flash Latency cycles and enable prefetch buffer */
SetSysClock();
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
}
二,默认定义系统时钟:
#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 //默认定义系统是中文为72MHz
#endif
在这里可以修改系统时钟值
三,SetSysClock(Void)
/**
* @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.
* @param None
* @retval None
*/
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz //默认定义的系统时钟是72MHz
SetSysClockTo72();
#endif
四,SetSysClockTo72(Void)
/**
* @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2
* and PCLK1 prescalers.
* @note This function should be used only after reset.
* @param None
* @retval None
*/
static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON); //使能HSE:RCC_CR_HSEON=0x00010000(修改的是第16位HSEON)
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY; //开启并就绪:RCC_CR_HSERDY=0x00020000(第17位HSERDY置1)
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); //循环直到HSE稳定
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01; //就绪后赋值标志位HSEStatus
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01) //判断就绪
{
/* Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_PRFTBE;
/* Flash 2 wait state */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; //cpu的速度比芯片速度快的多 设置FLASH等待:两个等待状态
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;//配置AHB预分频器分频系数为1,使HCLK = SYSCLK=72M
//RCC_CFGR_HPRE_DIV1=0x00000000(见手册)
/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;//配置PCLK2预分频器分频系数为1,使PCLK2 = HCLK=72M
//RCC_CFGR_PPRE2_DIV1=0x00000000(见手册)
/* PCLK1 = HCLK/2 */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;//设置PCLK1预分频器分频系数为2,使PCLK1 = HCLK/2=36M
//RCC_CFGR_PPRE1_DIV2=0x00000400(见手册)
//RCC->CFGR第10,9,8位设置为100 (设置为2分频)
#ifdef STM32F10X_CL
/* Configure PLLs ------------------------------------------------------*/
/* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
/* Enable PLL2 */
RCC->CR |= RCC_CR_PLL2ON;
/* Wait till PLL2 is ready */
while((RCC->CR & RCC_CR_PLL2RDY) == 0)
{
}
/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
RCC_CFGR_PLLMULL9);
#else //stm32f103ZET6为大容量芯片HD
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//HSE为时钟源且PLL倍频系数为9(8*9=72兆)
#endif /* STM32F10X_CL */
/* Enable PLL */
RCC->CR |= RCC_CR_PLLON; //使能PLL时钟,RCC->CR寄存器第24位置1
//RCC_CR_PLLON=0x01000000
/* Wait till PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0) //等待PLL时钟源就绪
//RCC_CR_PLLRDYRCC->CR寄存器第25位
{
}
/* Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));//配置PLL作为系统时钟来源
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; //RCC_CFGR_SW_PLL=0x00000002(RCC->CFGR第1,0位设置为10,见手册)
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock
上一篇:STM32 LED跑马灯-位操作
下一篇:STM32 串口通信实验
推荐阅读最新更新时间:2024-11-08 12:32
推荐帖子
- Windows CE下做导航器,用什么电子地图比较好
- WindowsCE下做导航器,用什么电子地图比较好???想知道各种电子地图的性价比啊??谢谢了!WindowsCE下做导航器,用什么电子地图比较好这个好像不是技术问题,是个商务问题。想知道性价比,就打电话,一个一个地图供应商去问。呵呵,up~灵图,城际通,凯立德免费的最好诶。。。。lz最好根据自己的情况去问下貌似有的地图做二次开发不太方便去专门的GIS网站问问吧,几年前做过这方面。都是很好的建议!值得学习lz要干嘛?我想做做GPS车导!地图不知道哪一种比较好一点
- topone654 嵌入式系统
- WinCE+CDMA拨10000号成功,连接网络失败:no carrier
- 拨打10000号成功,在用wince网络和拨号连接时,返回没有载波信息(nocarrier)错误这会是什么原因?WinCE+CDMA拨10000号成功,连接网络失败:nocarrier没有载波信息(nocarrier)错误???没遇到过,帮顶下。你的MODEM是那个型号?用CE的RIL实现的?很有才啊!网络注册成功了吗?学习学习,呵呵。引用2楼xqhrs232的回复:你的MODEM是那个型号?用CE的RIL实现的?很有才啊! 型号还没搞清楚引用2
- shanghai WindowsCE
- 关于单片机串口方式3的发送问题
- 各位大佬好,现在学单片机做到第五个双机通讯串口实验,发现一个问题,51单片机串口方式3,发送0xaa后,用protues仿真看,会看到AAFF成对出现,如果发0x11,0x22等小数据,则不会有ff附带产生,我百度查了好多资料,还是不能解决,以下是我的简单程序,以及protues仿真,小白真心坐等解答 //甲机发送程序 #include sbitp=PSW^0;//P位为PSW寄存器的第0位,即奇偶校验位 #defineucharunsigned
- woaidpj 51单片机
- 球形六足机器人宠物——SensorTile模块使用说明
- 详细说明见作品说明书!!!!正常情况下,由于六足机器人各个关节机械结构存在加工误差、安装误差,机器人爬行时表现出极强的各向异性特征,即机器人前进爬行时的运动轨迹是椭圆弧而不是直线。本次设计借鉴四轴飞行器导航原理,利用惯性导航模块为机器人爬行加入矫正反馈环节。惯性导航模块由三轴陀螺仪、三轴加速度计、三轴磁力计三个部分组成。三轴陀螺仪和三轴加速度计可通过数据融合算法合成得到YZ平面、XZ平面的欧拉角位移,XY平面欧拉角位移通过三轴磁力计补偿获取。本次设计选用SensorTil
- liren1979 MEMS传感器
- 有关lm3s6911中的systick的疑问
- 小弟我有个疑问,在配置systick的时候,如果像下面代码配置systick重载值为系统时钟频率除以1000。是不是就代表1ms进一次systick中断?SysTickPeriodSet(SysCtlClockGet()/1000)复制代码有关lm3s6911中的systick的疑问Tim3停产了,还要学吗这个无关学不学的问题,公司用到了。而且我只是对SysTick延时时间怎么算有疑问回复沙发tangguanglun的帖子查了点资料,自己回答下时钟周期等于时钟频率的倒数
- wwwming0329 微控制器 MCU
- # STM32H7S78-DK 开发套件三周目评测:简单声音采集保存之使用 SD 卡读写的实现与分析
- 该项目包括了保存录音、按键控制、串口控制、频率成分分析与分类等功能,逐步进行完成。首先进行sd读写的开。在嵌入式开发中,尤其在无操作系统的裸机环境下,SD卡是实现大容量数据存储的重要组件。##1.硬件连接在开始CubeMX配置前,需要先了解引脚的配置。###1.1数据引脚连接-**D0-D3**:将SD卡的数据引脚D0-D3分别连接到STM32的PC8、PC9、PC10、PC11。-**CMD**:将SD卡的CMD引脚连接到STM32的PD2,用于命令传输。-
- ccccccc@ stm32/stm8
设计资源 培训 开发板 精华推荐
- KSZ8462HLI-EVAL,评估板为支持 KSZ8462HL IEEE 1588 精确时间协议 (PTP) 的交换机产品提供平台
- DC1455A,用于 LTC5598IUF、5MHz 至 1.6GHz I-Q 调制器的演示板
- AD8075-EVAL,AD8074评估板,双电源运算放大器
- 具有电源排序功能的 LTC3589EUJ-2 8 输出降压稳压器的典型应用电路
- LTC2992HMS 双路 12V 高功率监视器和一个负电压监视器的典型应用
- AI红外语音助手
- LF18ABDT-TR 1.8V 低压降稳压器的典型应用
- 具有高调光比和 LED 开路报告的 LT3756IMSE-1 降压模式 1A LED 驱动器的典型应用电路
- 使用 NXP Semiconductors 的 MC9328MX21VK 的参考设计
- ZXSC310EV3,ZXSC310 评估板,采用 SOT23-5 封装的单节或多节 LED 驱动器