/**
******************************************************************************
* Copyright (c) 2014 Chongqing MySHworks Technology Co., Ltd.
* All rights reserved.
*
* File $RCSfile: system.c,v $
* Author $Author: arthuryang $
* Version $Revision: 1.9.4.1 $
* Date $Date: 2015/01/08 01:47:02 $
* Description
在main()之前的硬件设置
******************************************************************************
*/
#include "system.h"
/*
* DESCRIPTION
* 设置引脚
* ARGUMENTS
*
* RETURN
*
* NOTES
*
*/
void pin_setup(void)
{
}
/*
* DESCRIPTION
* 在进入main()之前的系统初始化操作。
* ARGUMENTS
*
* RETURN
*
* NOTES
* 设置时钟、FSMC等用户无需提供参数来进行初始化的设备。
* 对于定时器、UART等初始化依赖于用户参数的设备,只需初始化基本的寄存器。
*/
void SystemInit(void)
{
// 设置FPU
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
// 关闭全部中断
RCC->CIR = 0x00000000;
// -------------------- 设置HSE时钟 --------------------
// 设置时钟
// 使用外部时钟源作为HSE,禁止内部振荡器
// 使用有源晶振
CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);
// 启用HSE
SET_BIT(RCC->CR, RCC_CR_HSEON);
// 等待HSE准备好
while(!(RCC->CR&RCC_CR_HSERDY)){
;
}
// -------------------- 设置PLL系数 --------------------
// 外部时钟源8MHz,系统时钟168MHz
#define PLL_M 8
#define PLL_N 336
#define PLL_P 2
#define PLL_Q 7
MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLL_M <<0);
MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLN, PLL_N <<6);
MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLP, (PLL_P/2-1) <<16);
MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ, PLL_Q <<24);
// 将HSE作为PLL的输入
SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC_HSE);
// 使能PLL
SET_BIT(RCC->CR, RCC_CR_PLLON);
// 等待PLL稳定
while(!(RCC->CR&RCC_CR_PLLRDY)){
;
}
// -------------------- 设置预分频 --------------------
// 设置AHB分频 1
MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_CFGR_HPRE_DIV1);
// 设置APB1分频 4
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_CFGR_PPRE1_DIV4);
// 设置APB2分频 2
MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, RCC_CFGR_PPRE2_DIV2);
// -------------------- 设置FLASH读延迟时间 --------------------
// 正确设置FLASH延迟时间
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
// 检查设置是否成功
if((FLASH->ACR & FLASH_ACR_LATENCY) != FLASH_ACR_LATENCY_5WS){
// 失败后将无处可去
return;
}
// -------------------- 选择时钟源 --------------------
// 选择PLL为时钟源
MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_CFGR_SW_PLL);
// 等待设置成功
while((RCC->CFGR & RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL){
;
}
// Setup SysTick Timer for 1 msec interrupts.
// ------------------------------------------
// The SysTick_Config() function is a CMSIS function which configure:
// - The SysTick Reload register with value passed as function parameter.
// - Configure the SysTick IRQ priority to the lowest value (0x0F).
// - Reset the SysTick Counter register.
// - Configure the SysTick Counter clock source to be Core Clock Source (HCLK).
// - Enable the SysTick Interrupt.
// - Start the SysTick Counter.
// 注意:SysTick_Config()将会使能SysTick中断
//SysTick_Config(8000000/PLL_M*PLL_N/PLL_P / 1000);
// 关闭全部中断
RCC->CIR = 0x00000000;
// 打开外设时钟,从而使能这些设备
RCC->AHB1ENR |= \
RCC_AHB1ENR_GPIOAEN |\
RCC_AHB1ENR_GPIOBEN |\
RCC_AHB1ENR_GPIOCEN |\
RCC_AHB1ENR_GPIODEN |\
RCC_AHB1ENR_GPIOEEN |\
RCC_AHB1ENR_GPIOFEN |\
RCC_AHB1ENR_GPIOGEN |\
RCC_AHB1ENR_GPIOHEN |\
RCC_AHB1ENR_GPIOIEN |\
RCC_AHB1ENR_CRCEN |\
RCC_AHB1ENR_BKPSRAMEN |\
RCC_AHB1ENR_CCMDATARAMEN |\
RCC_AHB1ENR_DMA1EN |\
RCC_AHB1ENR_DMA2EN |\
RCC_AHB1ENR_ETHMACEN |\
RCC_AHB1ENR_ETHMACTXEN |\
RCC_AHB1ENR_ETHMACRXEN |\
RCC_AHB1ENR_ETHMACPTPEN |\
RCC_AHB1ENR_OTGHSULPIEN |\
RCC_AHB1ENR_OTGHSEN;
RCC->AHB2ENR |= \
RCC_AHB2ENR_DCMIEN |\
RCC_AHB2ENR_RNGEN |\
RCC_AHB2ENR_OTGFSEN;
RCC->AHB3ENR |= RCC_AHB3ENR_FSMCEN;
RCC->APB1ENR |= \
RCC_APB1ENR_PWREN |\
RCC_APB1ENR_TIM2EN |\
RCC_APB1ENR_TIM3EN |\
RCC_APB1ENR_TIM4EN |\
RCC_APB1ENR_TIM5EN |\
RCC_APB1ENR_TIM6EN |\
RCC_APB1ENR_TIM7EN |\
RCC_APB1ENR_TIM12EN |\
RCC_APB1ENR_TIM13EN |\
RCC_APB1ENR_TIM14EN |\
RCC_APB1ENR_WWDGEN |\
RCC_APB1ENR_SPI2EN |\
RCC_APB1ENR_SPI3EN |\
RCC_APB1ENR_USART2EN |\
RCC_APB1ENR_USART3EN |\
RCC_APB1ENR_UART4EN |\
RCC_APB1ENR_UART5EN |\
RCC_APB1ENR_I2C1EN |\
RCC_APB1ENR_I2C2EN |\
RCC_APB1ENR_I2C3EN |\
RCC_APB1ENR_CAN1EN |\
RCC_APB1ENR_CAN2EN |\
RCC_APB1ENR_DACEN;
RCC->APB2ENR |= \
RCC_APB2ENR_TIM1EN |\
RCC_APB2ENR_TIM8EN |\
RCC_APB2ENR_TIM9EN |\
RCC_APB2ENR_TIM10EN |\
RCC_APB2ENR_TIM11EN |\
RCC_APB2ENR_USART1EN |\
RCC_APB2ENR_USART6EN |\
RCC_APB2ENR_ADC1EN |\
RCC_APB2ENR_ADC2EN |\
RCC_APB2ENR_ADC3EN |\
RCC_APB2ENR_SDIOEN |\
RCC_APB2ENR_SPI1EN |\
RCC_APB2ENR_SYSCFGEN |\
RCC_APB2ENR_SPI5EN |\
RCC_APB2ENR_SPI6EN;
// -------------------- 设置引脚 --------------------
pin_setup();
}