<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32的嵌套中斷系統(tǒng)NVIC和RCC詳細(xì)整理

          STM32的嵌套中斷系統(tǒng)NVIC和RCC詳細(xì)整理

          作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
          voidRCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);//設(shè)置系統(tǒng)時鐘(SYSCLK)源
          // RCC_SYSCLKSource_HSI,RCC_SYSCLKSource_HSE,RCC_SYSCLKSource_PLLCLK
          uint8_tRCC_GetSYSCLKSource(void);// 返回用作系統(tǒng)時鐘的時鐘源
          //返回值:0x00 HSI作為系統(tǒng)時鐘,0x04 HSE作為系統(tǒng)時鐘,0x08 PLL作為系統(tǒng)時鐘
          voidRCC_HCLKConfig(uint32_t RCC_SYSCLK);//設(shè)置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);// 設(shè)置低速AHB時鐘(PCLK1)
          //輸入: RCC_HCLK_Div1, RCC_HCLK_Div2, RCC_HCLK_Div4, RCC_HCLK_Div8, RCC_HCLK_Div16
          voidRCC_PCLK2Config(uint32_t RCC_HCLK);//設(shè)置高速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);// 設(shè)置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);// 設(shè)置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);// 設(shè)置外部低速晶振(LSE)
          //輸入:RCC_LSE_OFF,LSE晶振OFF;RCC_LSE_ON,LSE晶振ON;
          //RCC_LSE_Bypass,LSE晶振被外部時鐘旁路
          voidRCC_LSICmd(FunctionalState NewState);// 使能或者失能內(nèi)部低速晶振(LSI)
          //輸入:ENABLE或者DISABLE(IWDG運行的話,LSI不能被失能)
          voidRCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);//設(shè)置RTC時鐘(RTCCLK)源(RTC時鐘一經(jīng)選定即不能更改,除非復(fù)位后備域)
          //輸入: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);// 返回時鐘的頻率
          //輸入:指向結(jié)構(gòu)RCC_ClocksTypeDef的指針,包含了各個時鐘的頻率(單位為Hz)
          voidRCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);// 使能或者失能AHB外設(shè)時鐘
          //輸入:RCC_AHBPeriph_DMA,DMA時鐘->ENABLE或者DISABLE;
          //RCC_AHBPeriph_SRAM,SRAM時鐘;RCC_AHBPeriph_FLITF,F(xiàn)LITF時鐘
          //RCC_AHBPeriph_DMA1,DMA1時鐘;RCC_AHBPeriph_DMA2,DMA2時鐘
          //RCC_AHBPeriph_CRC,CRC時鐘;RCC_AHBPeriph_FSMC,F(xiàn)SMC時鐘
          //RCC_AHBPeriph_SDIO,SDIO時鐘
          voidRCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);// 使能或者失能APB2外設(shè)時鐘
          //輸入:RCC_APB2Periph_AFIO,功能復(fù)用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外設(shè)時鐘
          voidRCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);// 使能或者失能APB1外設(shè)時鐘
          //輸入: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外設(shè)時鐘
          #ifdef STM32F10X_CL
          voidRCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//
          #endif
          voidRCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);// 強制或者釋放高速APB(APB2)外設(shè)復(fù)位
          //輸入:同voidRCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);函數(shù)的值
          voidRCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);// 強制或者釋放低速APB(APB1)外設(shè)復(fù)位
          //輸入:同void RCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph, FunctionalState NewState);函數(shù)的值
          //例:
          //RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);
          //RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);
          voidRCC_BackupResetCmd(FunctionalState NewState);// 強制或者釋放后備域復(fù)位
          voidRCC_ClockSecuritySystemCmd(FunctionalState NewState);//使能或者失能時鐘安全系統(tǒng)
          //輸入:ENABLE或者DISABLE
          voidRCC_MCOConfig(uint8_t RCC_MCO);// 選擇在MCO管腳上輸出的時鐘源
          //輸入:RCC_MCO_NoClock 無時鐘被選中 ;RCC_MCO_SYSCLK 選中系統(tǒng)時鐘;
          //RCC_MCO_HSI選中HSI ;RCC_MCO_HSE 選中HSE ;
          //RCC_MCO_PLLCLK_Div2選中PLL時鐘除以2
          //警告:當(dāng)選中系統(tǒng)時鐘作為MCO管腳的輸出時,注意它的時鐘頻率不超過50MHz(最大I/O速率)。
          FlagStatusRCC_GetFlagStatus(uint8_t RCC_FLAG);// 檢查指定的RCC標(biāo)志位設(shè)置與否
          //輸入:待檢查的RCC標(biāo)志位

          //RCC_FLAG_HSIRDY ,HSI晶振就緒;RCC_FLAG_HSERDY,HSE晶振就緒;
          //RCC_FLAG_PLLRDY ,PLL就緒;RCC_FLAG_LSERDY ,LSI晶振就緒;
          //RCC_FLAG_LSIRDY ,LSE晶振就緒;RCC_FLAG_PINRST,管腳復(fù)位 ;
          //RCC_FLAG_PORRST ,POR/PDR復(fù)位;RCC_FLAG_SFTRST ,軟件復(fù)位 ;
          //RCC_FLAG_IWDGRST ,IWDG復(fù)位;RCC_FLAG_WWDGRST ,WWDG復(fù)位;
          //RCC_FLAG_LPWRRST,低功耗復(fù)位
          //返回值:RCC_FLAG的新狀態(tài)(SET或者RESET)
          //例:
          //FlagStatus Status;
          //Status = RCC_GetFlagStatus(RCC_FLAG_PLLRDY);
          //if(Status == RESET)
          //{
          //...
          //}
          //else
          voidRCC_ClearFlag(void);// 清除RCC的復(fù)位標(biāo)志位
          //(可以清除的復(fù)位標(biāo)志位有: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中斷發(fā)生與否
          //輸入:RCC_IT_LSIRDY,LSI晶振就緒中斷;RCC_IT_LSERDY,LSE晶振就緒中斷
          //RCC_IT_HSIRDY,HSI晶振就緒中斷;RCC_IT_HSERDY,HSE晶振就緒中斷
          //RCC_IT_PLLRDY,PLL就緒中斷;RCC_IT_CSS,時鐘安全系統(tǒng)中斷
          //返回值:RCC_IT的新狀態(tài)
          //例:
          //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,時鐘安全系統(tǒng)中斷
          五、實例詳解
          #if defined (STM32F10X_LD_VL)|| (defined STM32F10X_MD_VL)|| (defined STM32F10X_HD_VL)//如果定義了這些系統(tǒng)時鐘將設(shè)為24M,如果沒有定義則為72M

          #define SYSCLK_FREQ_24MHz24000000
          #else





          #define SYSCLK_FREQ_72MHz 72000000//系統(tǒng)時鐘默認(rèn)值的定義 ,如果沒有定義外部高速時鐘則用內(nèi)部高速時鐘,為8000000

          #endif

          #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (definedSTM32F10X_HD_VL)//內(nèi)外部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); //設(shè)置系統(tǒng)時鐘的函數(shù)聲明
          //以下為根據(jù)不同的系統(tǒng)時鐘的定義來聲明用到的相應(yīng)的函數(shù),為后面的函數(shù)調(diào)用做好準(zhǔn)備
          #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選擇后的初始化函數(shù)聲明
          static void SystemInit_ExtMemCtl(void);
          #endif

          void SystemInit (void)//系統(tǒng)初始化函數(shù),設(shè)置系統(tǒng)的時鐘及時鐘中斷(在startup_stm32f10x_md.s中調(diào)用)(復(fù)位RCC時鐘配置為默認(rèn)狀態(tài),直到設(shè)置時鐘函數(shù))
          {


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

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


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

          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外其他分頻系數(shù)都為0
          #ifdef STM32F10X_CL

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

          RCC->CIR = 0x00FF0000;//清除中斷標(biāo)志,關(guān)閉一些中斷

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

          RCC->CIR = 0x009F0000;//清除中斷標(biāo)志,關(guān)閉一些中斷

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

          RCC->CIR = 0x009F0000; //清除中斷標(biāo)志,關(guān)閉一些中斷
          #endif
          上一頁 1 2 下一頁

          關(guān)鍵詞: STM32中斷系統(tǒng)NVICRC

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();