⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 initfunc.c

📁 SD卡调试所用的资料
💻 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 + -