新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32的嵌套中斷系統NVIC和RCC詳細整理

        STM32的嵌套中斷系統NVIC和RCC詳細整理

        作者: 時間:2016-11-26 來源:網絡 收藏
        voidRCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//設置系統時鐘(SYSCLK)源
        // RCC_SYSCLKSource_HSI,RCC_SYSCLKSource_HSE,RCC_SYSCLKSource_PLLCLK
        uint8_tRCC_GetSYSCLKSource(void);// 返回用作系統時鐘的時鐘源
        //返回值:0x00 HSI作為系統時鐘,0x04 HSE作為系統時鐘,0x08 PLL作為系統時鐘
        voidRCC_HCLKConfig(uint32_t RCC_SYSCLK);//設置AHB時鐘(HCLK)
        //輸入:RCC_SYSCLK_Div1,RCC_SYSCLK_Div2,RCC_SYSCLK_Div4,RCC_SYSCLK_Div8,RCC_SYSCLK_Div16,
        //RCC_SYSCLK_Div32,RCC_SYSCLK_Div64,RCC_SYSCLK_Div128,RCC_SYSCLK_Div256,RCC_SYSCLK_Div512
        voidRCC_PCLK1Config(uint32_t RCC_HCLK);// 設置低速AHB時鐘(PCLK1)
        //輸入: RCC_HCLK_Div1, RCC_HCLK_Div2, RCC_HCLK_Div4, RCC_HCLK_Div8, RCC_HCLK_Div16
        voidRCC_PCLK2Config(uint32_t RCC_HCLK);//設置高速AHB時鐘(PCLK2)
        //輸入:RCC_HCLK_Div1, RCC_HCLK_Div2, RCC_HCLK_Div4, RCC_HCLK_Div8, RCC_HCLK_Div16
        voidRCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);// 使能或者失能指定的RCC中斷
        //輸入:RCC_IT_LSIRDYLSI就緒中斷->ENABLE或者DISABLE
        //RCC_IT_LSERDYLSE就緒中斷,RCC_IT_HSIRDYHSI就緒中斷
        //RCC_IT_HSERDYHSE就緒中斷,RCC_IT_PLLRDYPLL就緒中斷
        #ifndef STM32F10X_CL
        void RCC_USBCLKConfig(uint32_tRCC_USBCLKSource);// 設置USB時鐘(USBCLK)
        //輸入:RCC_USBCLKSource_PLLCLK_1Div5,USB時鐘 = PLL時鐘除以1.5
        RCC_USBCLKSource_PLLCLK_Div1,USB時鐘 = PLL時鐘
        #else
        void RCC_OTGFSCLKConfig(uint32_tRCC_OTGFSCLKSource);//
        #endif
        voidRCC_ADCCLKConfig(uint32_t RCC_PCLK2);// 設置ADC時鐘(ADCCLK)
        //RCC_PCLK2_Div2,ADC時鐘 = PCLK / 2;RCC_PCLK2_Div4,ADC時鐘 = PCLK / 4;
        //RCC_PCLK2_Div6,ADC時鐘 = PCLK / 6;RCC_PCLK2_Div8,ADC時鐘 = PCLK / 8
        #ifdef STM32F10X_CL
        void RCC_I2S2CLKConfig(uint32_tRCC_I2S2CLKSource); //
        void RCC_I2S3CLKConfig(uint32_tRCC_I2S3CLKSource);//
        #endif
        voidRCC_LSEConfig(uint8_t RCC_LSE);// 設置外部低速晶振(LSE)
        //輸入:RCC_LSE_OFF,LSE晶振OFF;RCC_LSE_ON,LSE晶振ON;
        //RCC_LSE_Bypass,LSE晶振被外部時鐘旁路
        voidRCC_LSICmd(FunctionalState NewState);// 使能或者失能內部低速晶振(LSI)
        //輸入:ENABLE或者DISABLE(IWDG運行的話,LSI不能被失能)
        voidRCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);//設置RTC時鐘(RTCCLK)源(RTC時鐘一經選定即不能更改,除非復位后備域)
        //輸入:RCC_RTCCLKSource_LSE,選擇LSE作為RTC時鐘;RCC_RTCCLKSource_LSI,選擇LSI作為RTC時鐘;RCC_RTCCLKSource_HSE_Div128,選擇HSE時鐘頻率除以128作為RTC時鐘
        voidRCC_RTCCLKCmd(FunctionalState NewState);// 使能或者失能RTC時鐘
        //輸入:ENABLE或者DISABLE
        voidRCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks);// 返回時鐘的頻率
        //輸入:指向結構RCC_ClocksTypeDef的指針,包含了各個時鐘的頻率(單位為Hz)
        voidRCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);// 使能或者失能AHB外設時鐘
        //輸入:RCC_AHBPeriph_DMA,DMA時鐘->ENABLE或者DISABLE;
        //RCC_AHBPeriph_SRAM,SRAM時鐘;RCC_AHBPeriph_FLITF,FLITF時鐘
        //RCC_AHBPeriph_DMA1,DMA1時鐘;RCC_AHBPeriph_DMA2,DMA2時鐘
        //RCC_AHBPeriph_CRC,CRC時鐘;RCC_AHBPeriph_FSMC,FSMC時鐘
        //RCC_AHBPeriph_SDIO,SDIO時鐘
        voidRCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);// 使能或者失能APB2外設時鐘
        //輸入:RCC_APB2Periph_AFIO,功能復用IO時鐘->ENABLE或者DISABLE;
        //RCC_APB2Periph_GPIOA,GPIOA時鐘;RCC_APB2Periph_GPIOB,GPIOB時鐘;
        //RCC_APB2Periph_GPIOC,GPIOC時鐘;RCC_APB2Periph_GPIOD,GPIOD時鐘;
        //RCC_APB2Periph_GPIOE,GPIOE時鐘;RCC_APB2Periph_ADC1,ADC1時鐘;
        //RCC_APB2Periph_ADC2,ADC2時鐘;RCC_APB2Periph_TIM1,TIM1時鐘;
        //RCC_APB2Periph_SPI1,SPI1時鐘;RCC_APB2Periph_USART1,USART1時鐘;
        //RCC_APB2Periph_ALL,全部APB2外設時鐘
        voidRCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);// 使能或者失能APB1外設時鐘
        //輸入:RCC_APB1Periph_TIM2,TIM2時鐘->ENABLE或者DISABLE;
        //RCC_APB1Periph_TIM3,TIM3時鐘;RCC_APB1Periph_TIM4,TIM4時鐘
        //RCC_APB1Periph_WWDG,WWDG時鐘;RCC_APB1Periph_SPI2,SPI2時鐘
        //RCC_APB1Periph_USART2,USART2時鐘;RCC_APB1Periph_USART3,USART3時鐘
        //RCC_APB1Periph_I2C1,I2C1時鐘;RCC_APB1Periph_I2C2,I2C2時鐘
        //RCC_APB1Periph_USB,USB時鐘;RCC_APB1Periph_CAN,CAN時鐘
        //RCC_APB1Periph_BKP,BKP時鐘;RCC_APB1Periph_PWR,PWR時鐘
        //RCC_APB1Periph_ALL,全部APB1外設時鐘
        #ifdef STM32F10X_CL
        voidRCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//
        #endif
        voidRCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);// 強制或者釋放高速APB(APB2)外設復位
        //輸入:同voidRCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);函數的值
        voidRCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);// 強制或者釋放低速APB(APB1)外設復位
        //輸入:同void RCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph, FunctionalState NewState);函數的值
        //例:
        //RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);
        //RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);
        voidRCC_BackupResetCmd(FunctionalState NewState);// 強制或者釋放后備域復位
        voidRCC_ClockSecuritySystemCmd(FunctionalState NewState);//使能或者失能時鐘安全系統
        //輸入:ENABLE或者DISABLE
        voidRCC_MCOConfig(uint8_t RCC_MCO);// 選擇在MCO管腳上輸出的時鐘源
        //輸入:RCC_MCO_NoClock 無時鐘被選中 ;RCC_MCO_SYSCLK 選中系統時鐘;
        //RCC_MCO_HSI選中HSI ;RCC_MCO_HSE 選中HSE ;
        //RCC_MCO_PLLCLK_Div2選中PLL時鐘除以2
        //警告:當選中系統時鐘作為MCO管腳的輸出時,注意它的時鐘頻率不超過50MHz(最大I/O速率)。
        FlagStatusRCC_GetFlagStatus(uint8_t RCC_FLAG);// 檢查指定的RCC標志位設置與否
        //輸入:待檢查的RCC標志位

        //RCC_FLAG_HSIRDY ,HSI晶振就緒;RCC_FLAG_HSERDY,HSE晶振就緒;
        //RCC_FLAG_PLLRDY ,PLL就緒;RCC_FLAG_LSERDY ,LSI晶振就緒;
        //RCC_FLAG_LSIRDY ,LSE晶振就緒;RCC_FLAG_PINRST,管腳復位 ;
        //RCC_FLAG_PORRST ,POR/PDR復位;RCC_FLAG_SFTRST ,軟件復位 ;
        //RCC_FLAG_IWDGRST ,IWDG復位;RCC_FLAG_WWDGRST ,WWDG復位;
        //RCC_FLAG_LPWRRST,低功耗復位
        //返回值:RCC_FLAG的新狀態(SET或者RESET)
        //例:
        //FlagStatus Status;
        //Status = RCC_GetFlagStatus(RCC_FLAG_PLLRDY);
        //if(Status == RESET)
        //{
        //...
        //}
        //else
        voidRCC_ClearFlag(void);// 清除RCC的復位標志位
        //(可以清除的復位標志位有:RCC_FLAG_PINRST,RCC_FLAG_PORRST, //RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST,RCC_FLAG_LPWRRST)
        ITStatusRCC_GetITStatus(uint8_t RCC_IT);// 檢查指定的RCC中斷發生與否
        //輸入:RCC_IT_LSIRDY,LSI晶振就緒中斷;RCC_IT_LSERDY,LSE晶振就緒中斷
        //RCC_IT_HSIRDY,HSI晶振就緒中斷;RCC_IT_HSERDY,HSE晶振就緒中斷
        //RCC_IT_PLLRDY,PLL就緒中斷;RCC_IT_CSS,時鐘安全系統中斷
        //返回值:RCC_IT的新狀態
        //例:
        //ITStatus Status;
        //Status =RCC_GetITStatus(RCC_IT_PLLRDY);
        //if(Status == RESET)
        //{
        //...
        //}
        //else
        //{
        //...
        //}
        voidRCC_ClearITPendingBit(uint8_t RCC_IT);// 清除RCC的中斷待處理位
        //RCC_IT_LSIRDY,LSI晶振就緒中斷;RCC_IT_LSERDY,LSE晶振就緒中斷
        //RCC_IT_HSIRDY,HSI晶振就緒中斷;RCC_IT_HSERDY,HSE晶振就緒中斷
        //RCC_IT_PLLRDY,PLL就緒中斷;RCC_IT_CSS,時鐘安全系統中斷
        五、實例詳解
        #if defined (STM32F10X_LD_VL)|| (defined STM32F10X_MD_VL)|| (defined STM32F10X_HD_VL)//如果定義了這些系統時鐘將設為24M,如果沒有定義則為72M

        #define SYSCLK_FREQ_24MHz24000000
        #else





        #define SYSCLK_FREQ_72MHz 72000000//系統時鐘默認值的定義 ,如果沒有定義外部高速時鐘則用內部高速時鐘,為8000000

        #endif

        #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (definedSTM32F10X_HD_VL)//內外部SRAM選擇

        #endif


        #define VECT_TAB_OFFSET0x0

        #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};//AHB配方表


        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 //外部SRAM選擇后的初始化函數聲明
        static void SystemInit_ExtMemCtl(void);
        #endif

        void SystemInit (void)//系統初始化函數,設置系統的時鐘及時鐘中斷(在startup_stm32f10x_md.s中調用)(復位RCC時鐘配置為默認狀態,直到設置時鐘函數)
        {


        RCC->CR |= (uint32_t)0x00000001; //內部高速時鐘使能,內部8MHz時鐘開啟

        #ifndef STM32F10X_CL
        RCC->CFGR &= (uint32_t)0xF8FF0000;//MCO微控制器沒有時鐘輸出(對外部引腳),ADC預分頻PCLK2 2分頻后作為ADC時鐘,APB預分頻HCLK不分頻,AHB預分頻SYSCLK不分頻,HSI作為系統時鐘
        //HSI作為系統時鐘輸出(已輸出),SYSCLK=PCLK=PCLK1=PCLK2=8M,ADCCLK=1/2(PCLK2)=4M
        #else
        RCC->CFGR &= (uint32_t)0xF0FF0000;//同上;RCC->CFGR的27位為保留位始終為0 ,HSI作為系統時鐘輸出(未輸出原因為未編譯)
        #endif


        RCC->CR &= (uint32_t)0xFEF6FFFF;//時鐘監測器關閉,HSE振蕩器關閉

        RCC->CR &= (uint32_t)0xFFFBFFFF;//外部4-25MHz振蕩器沒有旁路

        RCC->CFGR &= (uint32_t)0xFF80FFFF; //PLL時鐘1.5倍分頻作為USB時鐘,PLL 2倍頻輸出,HSE不分頻,HSI時鐘2分頻后作為PLL輸入時鐘
        //PLLCLK=HSICLK=8M(還未輸出),HSECLK=HSEOSC,USBCLK=PLLCLK/1.5 ,除PLL外其他分頻系數都為0
        #ifdef STM32F10X_CL

        RCC->CR &= (uint32_t)0xEBFFFFFF;//CR中的26和28位置0

        RCC->CIR = 0x00FF0000;//清除中斷標志,關閉一些中斷

        RCC->CFGR2 = 0x00000000; //沒有此寄存器
        #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (definedSTM32F10X_HD_VL)

        RCC->CIR = 0x009F0000;//清除中斷標志,關閉一些中斷

        RCC->CFGR2 = 0x00000000; //沒有此寄存器
        #else

        RCC->CIR = 0x009F0000; //清除中斷標志,關閉一些中斷
        #endif
        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 准格尔旗| 和平县| 佛教| 滁州市| 名山县| 鄂州市| 运城市| 桐柏县| 昔阳县| 外汇| 广丰县| 额敏县| 梅河口市| 灵石县| 青冈县| 婺源县| 新余市| 监利县| 上蔡县| 岱山县| 兴化市| 晋中市| 延川县| 资兴市| 宿州市| 北辰区| 丹巴县| 浦东新区| 高尔夫| 洛扎县| 洛川县| 嵊泗县| 南丹县| 杭锦旗| 理塘县| 西城区| 集贤县| 邹城市| 北流市| 马关县| 吴堡县|