IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F103之时钟配置 -> 正文阅读

[嵌入式]STM32F103之时钟配置

sysclock.h文件:

#ifndef __SYSCLOCK_H
#define __SYSCLOCK_H

#include "stm32f10x.h"

void My_HSE_SetSysClock(void);

#endif

sysclock.c文件:

#include "sysclock.h"

/*
 * RCC相关寄存器初始化
 */
static void My_RCC_DeInit()
{
	/* 内部高速时钟使能 */
	RCC->CR |= (uint32_t)0x00000001;
	
	/* 复位 SW SWS HPRE PPRE1 PPRE2 ADCPRE MCO*/
	RCC->CFGR &= (uint32_t)0xF8FF0000;
	
	/* HSE振荡器关闭 时钟监测器关闭 PLL关闭 */
	RCC->CR &= (uint32_t)0xFEF6FFFF; 
	
	/* 外部4-25MHz振荡器没有旁路 */
	RCC->CR &= (uint32_t)0xFFFBFFFF;
	
	/* HSI时钟2分频后作为PLL输入时钟 HSE不分频 PLL 2倍频输出 PLL时钟1.5倍分频作为USB时钟*/
	RCC->CFGR &= (uint32_t)0xFF80FFFF; 
	
	/* 关闭所有中断 */
	RCC->CIR &= 0x009F0000;
}

/*
 * 检查高速外部时钟是否就绪
 * 返回值 SUCCESS:已经就绪 ERROR:未就绪
 */
static ErrorStatus My_RCC_WaitForHSEStartUp(void)
{
	__IO uint32_t StartUpCounter = 0;
	uint32_t tmpreg = 0;	
	
	do
	{
		tmpreg = RCC->CR ;
		tmpreg &= ((uint32_t)0x01)<<17;
		StartUpCounter++;
	}while((StartUpCounter != HSE_STARTUP_TIMEOUT) && (tmpreg == RESET));
	
	if((RCC->CR  & (((uint32_t)0x01)<<17)) != RESET) return SUCCESS;
	else return ERROR;
}

/**
 * 简介:外部高速晶振配置为系统时钟
 */
void My_HSE_SetSysClock(void)
{
	__IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;
	__IO uint32_t tmpreg = 0;
	
	My_RCC_DeInit();
	
	/* HSE振荡器开启 */
	RCC->CR |= ((uint32_t)0x00010000); 

	/* 检查外部高速时钟是否就绪 */
	if(My_RCC_WaitForHSEStartUp()) HSEStartUpStatus = 0x01;
	else HSEStartUpStatus = 0x00;
	
	if(HSEStartUpStatus == 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; 
		
		/* HCLK = SYSCLK */
		RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
		  
		/* PCLK2 = HCLK */
		RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

		/* PCLK1 = HCLK */
		RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
		
		/* HSE时钟作为PLL输入时钟 HSE不分频作为PLL输入 PLL倍频系数 = 9 */
		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);
   
		/* 使能PLL */
		RCC->CR |= (0x01)<<24;
		
		/* 等待PLL稳定 */	
		while((RCC->CR & RCC_CR_PLLRDY) == 0)
		{
		}
		
		 /* 系统时钟切换 PLL作为系统时钟 */
		RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
		RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

		/* 等待PLL配置为系统时钟*/
		while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
		{
		}
	}else while(1);
}

启动文件调用:

; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  My_HSE_SetSysClock
                LDR     R0, =My_HSE_SetSysClock
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

亲测可用:
参考资料:STM32库函数源码;

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:56:09  更:2021-09-09 11:58:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:56:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码