STM32f103程序模块5-------RCC


/**********************************************************************************
* 文件名 :SysTick.c
* 描述 :通过系统滴答时钟SysTick中断实现nMs(n毫秒)、nS(n秒)的延时
* 实验平台:
* 硬件连接:无须外接电路
* 库版本 :ST_v3.5
**********************************************************************************/

#include "SysTick.h"
#include "stm32f10x_flash.h"
static u32 SysTickDelayTime;
static u8 fac_us=0; //us延时倍乘数
static u16 fac_ms=0; //ms延时倍乘数,在ucos下,代表每个节拍的ms数
/*******************************************************************************
* 函数名 : delay_init
* 描述 : 初始化系统滴答时钟SysTick
* 输入 : 无
* 输出 : 无
* 返回 : 无
* 说明 : 1)、SystemFrequency / 1000 1ms中断一次
* 2)、SystemFrequency / 100000 10us中断一次
* 3)、SystemFrequency / 1000000 1us中断一次
* 计算方法:(SystemFrequency / Value)个系统时钟节拍中断一次
*******************************************************************************/
void delay_init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8,0xFFFFFFFB B:1011 将控制位3清零
fac_us=SYSCLK/8; //SYSCLK为72,这里得到1us精确定时
fac_ms=(u16)fac_us*1000;

// fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
}
/*******************************************************************************
* 函数名 : delay_us
* 描述 : 延时程序(n微秒)
* 输入 : nus:延时时间(n微秒)
* 输出 : 无
* 返回 : 无
* 说明 : 无
*******************************************************************************/
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}


/*******************************************************************************
* 函数名 : SysTickDelayTime_Counter
* 描述 : 获取节拍程序
* 输入 : 无
* 输出 : 无
* 返回 : 无
* 说明 : 在SysTick中断程序SysTick_Handler()调用(stm32f10x_it.c)
*******************************************************************************/
void SysTickDelayTime_Counter(void)
{
if (SysTickDelayTime > 0)
{
SysTickDelayTime--;
}
}

 

void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量

RCC_DeInit(); //复位RCC外部设备寄存器到默认值
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好
if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时

RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟等于==SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟==AHB1/2时钟

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz
RCC_PLLCmd(ENABLE); //使能PLL时钟

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟 = PLL时钟
while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
{
}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);//
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//只关闭JTAG而保留SWD
}

void NVIC_Configuration(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
}

 

posted on 2020-08-24 10:08  寒星日光  阅读(342)  评论(0编辑  收藏  举报

导航