新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 啟動過程都在這個文件的開頭描述了system_stm32f10x.c

        啟動過程都在這個文件的開頭描述了system_stm32f10x.c

        作者: 時間:2016-11-27 來源:網絡 收藏
        #include "stm32f10x.h"
        #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
        #define SYSCLK_FREQ_24MHz 24000000
        #else
        #define SYSCLK_FREQ_72MHz 72000000
        #endif
        #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
        #endif
        #define VECT_TAB_OFFSET 0x0
        #ifdef SYSCLK_FREQ_HSE
        uint32_t SystemCoreClock = SYSCLK_FREQ_HSE;
        #elif defined SYSCLK_FREQ_24MHz
        uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz;
        #elif defined SYSCLK_FREQ_36MHz
        uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz;
        #elif defined SYSCLK_FREQ_48MHz
        uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz;
        #elif defined SYSCLK_FREQ_56MHz
        uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz;
        #elif defined SYSCLK_FREQ_72MHz
        uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz;
        #else
        uint32_t SystemCoreClock = HSI_VALUE;
        #endif
        __I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
        static void SetSysClock(void);
        #ifdef SYSCLK_FREQ_HSE
        static void SetSysClockToHSE(void);
        #elif defined SYSCLK_FREQ_24MHz
        static void SetSysClockTo24(void);
        #elif defined SYSCLK_FREQ_36MHz
        static void SetSysClockTo36(void);
        #elif defined SYSCLK_FREQ_48MHz
        static void SetSysClockTo48(void);
        #elif defined SYSCLK_FREQ_56MHz
        static void SetSysClockTo56(void);
        #elif defined SYSCLK_FREQ_72MHz
        static void SetSysClockTo72(void);
        #endif
        #ifdef DATA_IN_ExtSRAM
        static void SystemInit_ExtMemCtl(void);
        #endif
        void SystemInit (void)
        {
        RCC->CR |= (uint32_t)0x00000001;
        #ifndef STM32F10X_CL
        RCC->CFGR &= (uint32_t)0xF8FF0000;
        #else
        RCC->CFGR &= (uint32_t)0xF0FF0000;
        #endif
        RCC->CR &= (uint32_t)0xFEF6FFFF;
        RCC->CR &= (uint32_t)0xFFFBFFFF;
        RCC->CFGR &= (uint32_t)0xFF80FFFF;
        #ifdef STM32F10X_CL
        RCC->CR &= (uint32_t)0xEBFFFFFF;
        RCC->CIR = 0x00FF0000;
        RCC->CFGR2 = 0x00000000;
        #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
        RCC->CIR = 0x009F0000;
        RCC->CFGR2 = 0x00000000;
        #else
        RCC->CIR = 0x009F0000;
        #endif
        #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
        #ifdef DATA_IN_ExtSRAM
        SystemInit_ExtMemCtl();
        #endif
        #endif
        SetSysClock();
        #ifdef VECT_TAB_SRAM
        SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET;
        #else
        SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
        #endif
        }
        void SystemCoreClockUpdate (void)
        {
        uint32_t tmp = 0, pllmull = 0, pllsource = 0;
        #ifdef STM32F10X_CL
        uint32_t prediv1source = 0, prediv1factor = 0, prediv2factor = 0, pll2mull = 0;
        #endif
        #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
        uint32_t prediv1factor = 0;
        #endif
        tmp = RCC->CFGR & RCC_CFGR_SWS;
        switch (tmp)
        {
        case 0x00:
        SystemCoreClock = HSI_VALUE;
        break;
        case 0x04:
        SystemCoreClock = HSE_VALUE;
        break;
        case 0x08:
        pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;
        pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
        #ifndef STM32F10X_CL
        pllmull = ( pllmull >> 18) + 2;
        if (pllsource == 0x00)
        {
        SystemCoreClock = (HSI_VALUE >> 1) * pllmull;
        }
        else
        {
        #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
        prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1;
        SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull;
        #else
        if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET)
        {
        SystemCoreClock = (HSE_VALUE >> 1) * pllmull;
        }
        else
        {
        SystemCoreClock = HSE_VALUE * pllmull;
        }
        #endif
        }
        #else
        pllmull = pllmull >> 18;
        if (pllmull != 0x0D)
        {
        pllmull += 2;
        }
        else
        {
        pllmull = 13 / 2;
        }
        if (pllsource == 0x00)
        {
        SystemCoreClock = (HSI_VALUE >> 1) * pllmull;
        }
        else
        {
        prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC;
        prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1;
        if (prediv1source == 0)
        {
        SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull;
        }
        else
        {
        prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4) + 1;
        pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8 ) + 2;
        SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull;
        }
        }
        #endif
        break;
        default:
        SystemCoreClock = HSI_VALUE;
        break;
        }
        tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
        SystemCoreClock >>= tmp;
        }
        static void SetSysClock(void)
        {
        #ifdef SYSCLK_FREQ_HSE
        SetSysClockToHSE();
        #elif defined SYSCLK_FREQ_24MHz
        SetSysClockTo24();
        #elif defined SYSCLK_FREQ_36MHz
        SetSysClockTo36();
        #elif defined SYSCLK_FREQ_48MHz
        SetSysClockTo48();
        #elif defined SYSCLK_FREQ_56MHz
        SetSysClockTo56();
        #elif defined SYSCLK_FREQ_72MHz
        SetSysClockTo72();
        #endif
        }
        #ifdef DATA_IN_ExtSRAM
        void SystemInit_ExtMemCtl(void)
        {
        RCC->AHBENR = 0x00000114;
        RCC->APB2ENR = 0x000001E0;
        GPIOD->CRL = 0x44BB44BB;
        GPIOD->CRH = 0xBBBBBBBB;
        GPIOE->CRL = 0xB44444BB;
        GPIOE->CRH = 0xBBBBBBBB;
        GPIOF->CRL = 0x44BBBBBB;
        GPIOF->CRH = 0xBBBB4444;
        GPIOG->CRL = 0x44BBBBBB;
        GPIOG->CRH = 0x44444B44;
        FSMC_Bank1->BTCR[4] = 0x00001011;
        FSMC_Bank1->BTCR[5] = 0x00000200;
        }
        #endif
        #ifdef SYSCLK_FREQ_HSE
        static void SetSysClockToHSE(void)
        {
        __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
        RCC->CR |= ((uint32_t)RCC_CR_HSEON);
        do
        {
        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;
        } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
        if ((RCC->CR & RCC_CR_HSERDY) != RESET)
        {
        HSEStatus = (uint32_t)0x01;
        }
        else
        {
        HSEStatus = (uint32_t)0x00;
        }
        if (HSEStatus == (uint32_t)0x01)
        {
        #if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL
        FLASH->ACR |= FLASH_ACR_PRFTBE;
        FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
        #ifndef STM32F10X_CL
        FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0;
        #else
        if (HSE_VALUE <= 24000000)
        {
        FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0;
        }
        else
        {
        FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1;
        }
        #endif
        #endif
        RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
        RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE;
        while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x04)
        {
        }
        }
        else
        {
        }
        }
        #elif defined SYSCLK_FREQ_24MHz
        static void SetSysClockTo24(void)
        {
        __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
        RCC->CR |= ((uint32_t)RCC_CR_HSEON);
        do
        {
        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;
        } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
        if ((RCC->CR & RCC_CR_HSERDY) != RESET)
        {
        HSEStatus = (uint32_t)0x01;
        }
        else
        {
        HSEStatus = (uint32_t)0x00;
        }
        if (HSEStatus == (uint32_t)0x01)
        {
        #if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL
        FLASH->ACR |= FLASH_ACR_PRFTBE;
        FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
        FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_0;
        #endif

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 常德市| 凤台县| 夏邑县| 武胜县| 瑞金市| 泰和县| 香格里拉县| 五峰| 盐津县| 宣恩县| 阜康市| 读书| 乌兰察布市| 南郑县| 临泽县| 东台市| 刚察县| 台南市| 鄂托克前旗| 阜宁县| 广西| 格尔木市| 岳池县| 沈丘县| 桐乡市| 商都县| 普安县| 神木县| 闽清县| 通道| 伊川县| 河北省| 仪陇县| 建湖县| 屯昌县| 长顺县| 综艺| 武川县| 广丰县| 枣阳市| 神木县|