娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月15日(星期日)

2018年06月15日 | STM32啟動后系統初始化SystemInit()

發布者:beta12 來源: eefocus關鍵字:STM32  啟動  系統初始化  SystemInit() 手機看文章 掃描二維碼
隨時隨地手機看文章

啟動文件中復位異常相應函數如下:


; Reset handler  

Reset_Handler   PROC  

                EXPORT  Reset_Handler             [WEAK]  

                IMPORT  __main  

                IMPORT  SystemInit  

                LDR     R0, =SystemInit  

                BLX     R0                 

                LDR     R0, =__main  

                BX      R0  

                ENDP  


SystemInit()這個函數出現在main()函數的第一行,可以看出它的重要性。以前關于SystemInit()這個函數從來沒有關心過,只知道這是進行STM32系統初始化的一個函數。今天決定仔細看看,重新開始STM32的學習。這個函數在system_stm32f10x.c中,此C文件主要就是干具體硬件配置相關的工作。


 

/** @addtogroup STM32F10x_System_Private_Functions 

  * @{ 

  */  

  

/** 

  * @brief  Setup the microcontroller system 

  *         Initialize the Embedded Flash Interface, the PLL and update the  

  *         SystemCoreClock variable. 

  * @note   This function should be used only after reset. 

  * @param  None 

  * @retval None 

  */  

void SystemInit (void)  

{  

  /* Reset the RCC clock configuration to the default reset state(for debug purpose) */  

  /* Set HSION bit */  

  RCC->CR |= (uint32_t)0x00000001;  

  

  /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */  

#ifndef STM32F10X_CL  

  RCC->CFGR &= (uint32_t)0xF8FF0000;  

#else  

  RCC->CFGR &= (uint32_t)0xF0FF0000;  

#endif /* STM32F10X_CL */     

    

  /* Reset HSEON, CSSON and PLLON bits */  

  RCC->CR &= (uint32_t)0xFEF6FFFF;  

  

  /* Reset HSEBYP bit */  

  RCC->CR &= (uint32_t)0xFFFBFFFF;  

  

  /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */  

  RCC->CFGR &= (uint32_t)0xFF80FFFF;  

  

#ifdef STM32F10X_CL  

  /* Reset PLL2ON and PLL3ON bits */  

  RCC->CR &= (uint32_t)0xEBFFFFFF;  

  

  /* Disable all interrupts and clear pending bits  */  

  RCC->CIR = 0x00FF0000;  

  

  /* Reset CFGR2 register */  

  RCC->CFGR2 = 0x00000000;  

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)  

  /* Disable all interrupts and clear pending bits  */  

  RCC->CIR = 0x009F0000;  

  

  /* Reset CFGR2 register */  

  RCC->CFGR2 = 0x00000000;        

#else  

  /* Disable all interrupts and clear pending bits  */  

  RCC->CIR = 0x009F0000;  

#endif /* STM32F10X_CL */  

      

#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)  

  #ifdef DATA_IN_ExtSRAM  

    SystemInit_ExtMemCtl();   

  #endif /* DATA_IN_ExtSRAM */  

#endif   

  

  /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */  

  /* Configure the Flash Latency cycles and enable prefetch buffer */  

  SetSysClock();  

  

#ifdef VECT_TAB_SRAM  

  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */  

#else  

  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */  

#endif   

}  


從函數說明來看,此函數功能就是初始化內部FALSH,PLL并且更新系統時鐘。此函數需在復位啟動后調用。

[cpp] view plain copy  

RCC->CR |= (uint32_t)0x00000001;  


第一行代碼操作時鐘控制寄存器,將內部8M高速時鐘使能,從這里可以看出系統啟動后是首先依靠內部時鐘源而工作的。

 

#ifndef STM32F10X_CL  

  RCC->CFGR &= (uint32_t)0xF8FF0000;  

#else  

  RCC->CFGR &= (uint32_t)0xF0FF0000;  


這兩行代碼則是操作時鐘配置寄存器。其主要設置了MCO(微控制器時鐘輸出)PLL相關(PLL倍頻系數,PLL輸入時鐘源),ADCPRE(ADC時鐘),PPRE2(高速APB分頻系數),PPRE1(低速APB分頻系數),HPRE(AHB預分頻系數),SW(系統時鐘切換),開始時,系統時鐘切換到HSI,由它作為系統初始時鐘。宏STM32F10X_CL是跟具體STM32芯片相關的一個宏。


/* Reset HSEON, CSSON and PLLON bits */  

RCC->CR &= (uint32_t)0xFEF6FFFF;  

  

/* Reset HSEBYP bit */  

RCC->CR &= (uint32_t)0xFFFBFFFF;  

  

/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */  

RCC->CFGR &= (uint32_t)0xFF80FFFF;  


這幾句話則是先在關閉HSE,CSS,,PLL等的情況下配置好與之相關參數然后開啟,達到生效的目的。

 

#ifdef STM32F10X_CL  

  /* Reset PLL2ON and PLL3ON bits */  

  RCC->CR &= (uint32_t)0xEBFFFFFF;  

  

  /* Disable all interrupts and clear pending bits  */  

  RCC->CIR = 0x00FF0000;  

  

  /* Reset CFGR2 register */  

  RCC->CFGR2 = 0x00000000;  

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)  

  /* Disable all interrupts and clear pending bits  */  

  RCC->CIR = 0x009F0000;  

  

  /* Reset CFGR2 register */  

  RCC->CFGR2 = 0x00000000;        

#else  

  /* Disable all interrupts and clear pending bits  */  

  RCC->CIR = 0x009F0000;  

#endif /* STM32F10X_CL */  


這一段主要是跟中斷設置有關。開始時,我們需要禁止所有中斷并且清除所有中斷標志位。不同硬件有不同之處。


#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)  

  #ifdef DATA_IN_ExtSRAM  

    SystemInit_ExtMemCtl();   

  #endif /* DATA_IN_ExtSRAM */  

#endif  


這段跟設置外部RAM有關吧,我用到的STM32F103RBT與此無關。

[cpp] view plain copy  

SetSysClock();  


此又是一個函數,主要是配置系統時鐘頻率。HCLK,PCLK2,PCLK1的分頻值,分別代表AHB,APB2,和APB1。當然還干了其它的事情,配置FLASH延時周期和使能預取緩沖期。后面的這個配置具體還不了解。


#ifdef VECT_TAB_SRAM  

  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */  

#else  

  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */  

#endif   


這段代碼主要是實現向量表的重定位。依據你想要將向量表定位在內部SRAM中還是內部FLASH中。這個SCB開始沒在STM32參考手冊中發現,原來它是跟Cortex-M3內核相關的東西。所以ST公司就沒有把它包含進來吧。內核的東西后面再了解,這里給自己提個醒。


然后再看看SystemInit()中的那個函數SetClock()又做了什么吧。


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  

   

 /* If none of the define above is enabled, the HSI is used as System clock 

    source (default after reset) */   

}  


從中可以看出就是根據不同的宏來設置不同的系統時鐘,這些宏就在跟此函數在同一個源文件里。官方很是考慮周到,我們只需要選擇相應宏就能達到快速配置系統時鐘的目的。

 

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)  

/* #define SYSCLK_FREQ_HSE    HSE_VALUE */  

 #define SYSCLK_FREQ_24MHz  24000000  

#else  

/* #define SYSCLK_FREQ_HSE    HSE_VALUE */  

/* #define SYSCLK_FREQ_24MHz  24000000 */   

/* #define SYSCLK_FREQ_36MHz  36000000 */  

/* #define SYSCLK_FREQ_48MHz  48000000 */  

/* #define SYSCLK_FREQ_56MHz  56000000 */  

#define SYSCLK_FREQ_72MHz  72000000  

#endif  


比如這里我需要配置系統時鐘為72MHZ,則只需要將#define SYSCLK_FREQ_72MHz  72000000兩邊的注釋符去掉。

這個函數里面又有SetSysClockTo72()函數,這個函數就是具體操作寄存器進行配置了。


#elif defined SYSCLK_FREQ_72MHz  

/** 

  * @brief  Sets System clock frequency to 72MHz and configure HCLK, PCLK2  

  *         and PCLK1 prescalers.  

  * @note   This function should be used only after reset. 

  * @param  None 

  * @retval None 

  */  

static void SetSysClockTo72(void)  

{  

  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;  

    

  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/      

  /* Enable HSE */      

  RCC->CR |= ((uint32_t)RCC_CR_HSEON);  

   

  /* Wait till HSE is ready and if Time out is reached exit */  

  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)  

  {  

    /* Enable Prefetch Buffer */  

    FLASH->ACR |= FLASH_ACR_PRFTBE;  

  

    /* Flash 2 wait state */  

    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);  

    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;      

  

   

    /* HCLK = SYSCLK */  

    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;  

        

    /* PCLK2 = HCLK */  

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;  

      

    /* PCLK1 = HCLK */  

    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;  

  

#ifdef STM32F10X_CL  

    /* Configure PLLs ------------------------------------------------------*/  

    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */  

    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */  

          

    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |  

                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);  

    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |  

                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);  

    

    /* Enable PLL2 */  

    RCC->CR |= RCC_CR_PLL2ON;  

    /* Wait till PLL2 is ready */  

    while((RCC->CR & RCC_CR_PLL2RDY) == 0)  

    {  

    }  

      

     

    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */   

    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);  

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |   

                            RCC_CFGR_PLLMULL9);   

#else      

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */  

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |  

                                        RCC_CFGR_PLLMULL));  

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);  

#endif /* STM32F10X_CL */  

  

    /* Enable PLL */  

    RCC->CR |= RCC_CR_PLLON;  

  

    /* Wait till PLL is ready */  

    while((RCC->CR & RCC_CR_PLLRDY) == 0)  

    {  

    }  

      

    /* Select PLL as system clock source */  

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));  

    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;      

  

    /* Wait till PLL is used as system clock source */  

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)  

    {  

    }  

  }  

  else  

  { /* If HSE fails to start-up, the application will have wrong clock  

         configuration. User can add here some code to deal with this error */  

  }  

}  

#endif  


關鍵字:STM32  啟動  系統初始化  SystemInit() 引用地址:STM32啟動后系統初始化SystemInit()

上一篇:STM32F4外部中斷入口和外部中斷線
下一篇:stm32初始化三個串口

推薦閱讀

一、IO基本結構: 針對STM32F407有7組IO,分別為GPIOA~GPIOG,每組IO有16個IO口,則有112個IO口。其中IO口的基本結構如下: 二、工作方式: STM32F4工作模式有8種,其中4中輸入模式,4種輸出模式,分別為:輸入浮空、輸入上拉、輸入下拉、模擬模式、開漏輸出、開漏復用輸出、推挽輸出、推挽復用輸出。 1、輸入模式: 在輸入浮空模式下...
芯片:STM32F103C8T6應用管腳:輸出:PA0、PA1配置界面 /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(GPIOA,LED0_Pin,(GPIO_PinState)!HAL_GPIO_ReadPin(GPIOA,LED0_Pin)); HAL_GPIO_WritePin(GPIOA,LED1_Pin,GPIO_PIN_SET); HAL_Delay(500); HAL_GPIO_...
專注于引入新品并提供海量庫存的電子元器件分銷商貿澤電子 (Mouser Electronics) 即日起開始備貨Analog Devices的ADMV4530雙模Ka頻段上變頻器。這款高度集成的ADMV4530上變頻器支持下一代高吞吐量衛星通信,將較低的輸入頻率轉換為27 GHz至31 GHz的Ka頻段。此芯片集成了混頻器、倍頻器、帶自動增益控制 (AGC) 的增益控制模塊、帶合成器的壓控振蕩器 (V...
6月15日,精測電子在投資者互動平臺表示,公司目前是華為的供應商,且已有少量訂單。另外,關于電子束檢測設備,精測電子表示公司首臺半導體電子束檢測設備eViewTM全自動晶圓缺陷復查設備已正式交付國內客戶。不久前,其回復投資者提問時指出,上海精測以橢圓偏振技術為核心開發的適用于半導體工業級應用的膜厚量測設備以及光學關鍵尺寸量測系統,已經取得...

史海拾趣

問答坊 | AI 解惑

誰能傳個 單容水箱液位控制系統 謝謝

單容水箱液位控制系統就行! 有原理圖,原理和程序,謝謝!…

查看全部問答∨

用單片機控制手機收發短信息

摘要:介紹用MCS-51系列單片機控制手機收發短信息的原理、硬件電路、PDU數據格式和符合GSM07.05協議要求的短信息發送/接收程序,同時給出了一個應用實例。     關鍵詞:單片機 短信息 PDU GSM 接口 GSM(Global System for Mobile comm ...…

查看全部問答∨

那位高手能幫忙解決一下s3c2410的spi口讀寫無線模塊cc2420的問題??

我的問題主要是spi口到底是用查詢方式還是中斷方式。由于水平有限本人用了查詢方式。 下面是主要的程序: /************************************************* SPI low lever fuctions **********************************************/ void ...…

查看全部問答∨

關于spi的一個問題

我用的是三星的2440,在用spi對外設進行配置時,用示波器觀察輸出波形,發現nSS信號始終是高電平,數據信號和始終信號的波形都是對的。 問下大家,這個nSS我們怎么控制?還是說2440配置位master后,nSS是cpu自動控制的? PS:我現在的做法是將nSS ...…

查看全部問答∨

WCE驅動調試

各位英雄:      我的目標板已經固化了內核,但調試發現其中有一個驅動有問題,需要修改,但不想修改后重新編譯內核并下載固化;能不能在PB中編譯驅動后,把新的驅動dll文件直接替換目標機中的同名dll?如果可以,同名dll在何 ...…

查看全部問答∨

困擾我很久的問題~~~定散分

假設我現在有一個基于Arm核的單片機,并且有了一個基于這款單片機的開發平臺?,F在想增加一塊多媒體芯片(比如中芯微968或者簡單些的芯片)來擴展一些功能,接線配置方面的事情我已經做好了,假設我用CS3作為片選。我不解的是:我用什么方法來讀寫多 ...…

查看全部問答∨

老師的IIC 程序 拿來看看

先把老師的程序寫到這里,慢慢研讀,#include <string.h>#include \"..\\inc\\44b.h\"#include \"..\\inc\\44blib.h\"#include \"..\\inc\\iic.h\"volatile int f_nGetACK;//獲取中斷響應標志//初始化IIC接口void Iic_init(void){ rIICCON=(1 ...…

查看全部問答∨

關于msp430g2553的硬件串口問題

有誰有沒有硬件串口寄存器的詳細解釋呀,手冊上說的不一樣呀。寫過的給個程序例子吧,看了手冊,在看頭文件我就迷茫了。。。?!?

查看全部問答∨

哪位前輩給小弟簡單系統的介紹一下STM32啊。

它跟51有什么區別啊。跟AVR又有什么區別啊。謝謝了?!?

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 宝丰县| 诏安县| 安阳市| 故城县| 体育| 商南县| 昭苏县| 菏泽市| 泾川县| 锡林郭勒盟| 旌德县| 曲麻莱县| 东阳市| 天门市| 白朗县| 汾西县| 当阳市| 丹棱县| 靖安县| 墨竹工卡县| 衡阳县| 黎平县| 环江| 内丘县| 东乌珠穆沁旗| 扬州市| 鹤山市| 个旧市| 吉木乃县| 玉树县| 潼关县| 永城市| 韶山市| 社旗县| 龙南县| 伊川县| 永和县| 垫江县| 祁东县| 襄垣县| 青海省|