📄 initfunc.c
字号:
//**********************************************************************************************
//* 文 件 名 : initFunc.c
//*
//* 文件描述 : 初始化代码
//*
//* 作 者 : knight
//* 版 本 : V0.01
//* 编 译 器 : IAR EWARM 5.30
//* 日 期 : 2009-10-18
//* 所需支持代码:
//**************************************************************************************************
#include "initFunc.h"
#ifndef OS_TICKS_PER_SEC
#define OS_TICKS_PER_SEC 1000
#endif
//*
//********************************************************************************************************
//* 函 数 名 : OS_CPU_SysTickInit()
//* 描 述 : 初始化系统Tick
//* 输入参数 : None.
//* 输出参数 : None.
//* 返 回 : None.
//********************************************************************************************************
void OS_CPU_SysTickInit (void)
{
RCC_ClocksTypeDef rcc_clocks;
/* Disable SysTick Counter */
SysTick_CounterCmd(SysTick_Counter_Disable);
/* Disable the SysTick Interrupt */
SysTick_ITConfig(DISABLE);
// 获取系统频率
RCC_GetClocksFreq(&rcc_clocks);
// 配置HCLK作为SysTick时钟
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
// 配置自动加载数值
SysTick_SetReload((rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC) - 1);
// 使能SysTick
SysTick_CounterCmd(SysTick_Counter_Enable);
// 使能SysTick中断
SysTick_ITConfig(ENABLE);
}
/*******************************************************************************
* Function Name : RCC_Configuration
* Description : Configures the different system clocks.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
//将外设 RCC寄存器重设为缺省值
RCC_DeInit();
//设置外部高速晶振(HSE)
RCC_HSEConfig(RCC_HSE_ON);
//等待 HSE 起振
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
//预取指缓存使能
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//设置代码延时值
//FLASH_Latency_2 2 延时周期
FLASH_SetLatency(FLASH_Latency_2);
//设置 AHB 时钟(HCLK)
//RCC_SYSCLK_Div1 AHB 时钟 = 系统时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//设置高速 AHB 时钟(PCLK2)
//RCC_HCLK_Div2 APB1 时钟 = HCLK / 2
RCC_PCLK2Config(RCC_HCLK_Div1);
//设置低速 AHB 时钟(PCLK1)
//RCC_HCLK_Div2 APB1 时钟 = HCLK / 2
RCC_PCLK1Config(RCC_HCLK_Div2);
/* ADCCLK = PCLK2/4 */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
// PLLCLK = 8MHz * 9 = 72 MHz
//设置 PLL 时钟源及倍频系数
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//使能或者失能 PLL
RCC_PLLCmd(ENABLE);
//等待指定的 RCC 标志位设置成功 等待PLL初始化成功
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//设置系统时钟(SYSCLK) 设置PLL为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//等待PLL成功用作于系统时钟的时钟源
// 0x00:HSI 作为系统时钟
// 0x04:HSE作为系统时钟
// 0x08:PLL作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
//使能或者失能 APB2 外设时钟
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);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}
/*******************************************************************************
* Function Name : NVIC_Configuration
* Description : Configures NVIC and Vector Table base location.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_DeInit();
NVIC_SCBDeInit();
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* Function Name : GetUniqueDeviceID
* Description : 获取芯片唯一ID(96BIT)
* Input : 无
* Output : ID --ID存放首地址
* Return : 无
*******************************************************************************/
void GetUniqueDeviceID(u8* ID)
{
u32 Dev_Serial;
u8 i;
Dev_Serial = *(vu32*)(0x1FFFF7E8);
for (i=0;i<4;i++)
{
ID[i]=(u8)((Dev_Serial>>(3-i)*8)&0xff);
}
Dev_Serial = *(vu32*)(0x1FFFF7EC);
for (i=0;i<4;i++)
{
ID[i+4]=(u8)((Dev_Serial>>(3-i)*8)&0xff);
}
Dev_Serial = *(vu32*)(0x1FFFF7F0);
for (i=0;i<4;i++)
{
ID[i+8]=(u8)((Dev_Serial>>(3-i)*8)&0xff);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -