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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > stm32快速學習6——SysTick 定時1s控制LED

          stm32快速學習6——SysTick 定時1s控制LED

          作者: 時間:2016-11-17 來源:網(wǎng)絡 收藏
          設置使用外部8M晶振

          設置引腳功能

          本文引用地址:http://www.ex-cimer.com/article/201611/315447.htm

          設置systick為1s中斷

          利用systick中斷就可以得到1s時間

          //////////////////////////////////////////////////////////////////////////前言/////////////////////////////////////////////////////////////////////////////////////////

          stm32的systick通過少數(shù)的程序設置,當使用systick_config()函數(shù)之后,其載入值就是你的參數(shù),并且自動打開中斷,并將中斷設為最低的優(yōu)先級,將其時鐘設為HCLK即系統(tǒng)時鐘72mhz,并重置計數(shù)寄存器開始計數(shù)。也可以將時鐘設置為HCKL的八分頻,通過使用SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) 緊跟在systick_config()之后,而改變優(yōu)先級則使用NVIC_SetPriority(SysTick_IRQn,...) 函數(shù),而時基單元的設置使用如下公式,Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) Reload Value 就是傳遞進去的參數(shù)。但參數(shù)不能超過0xFFFFFF。
          systick的時鐘,systick的時鐘包括內(nèi)部時鐘和外部時鐘,對于stm32 其內(nèi)部時鐘FCLK就是AHB的時鐘,72MHz,外部時鐘STCLK就是8分頻后的時鐘,9MHz。因此使用systick_config()函數(shù)時其默認時鐘為72MHz。

          使用systick延時的時候也可以不開啟中斷,而直接對其寄存器進行讀寫

          SysTick_Config(uint32_tticks):設置系統(tǒng)嘀嗒時鐘并使能中斷

          STM32中與CM3內(nèi)核描述不太一樣,這個時鐘源有兩個選擇:AHB/8和AHB,在該函數(shù)中是選擇了HCLK.

          (SysTick_CTRL_CLKSOURCE_Msk),所以定時時間=ticks/HCLK,當要定時10ms,而HCLK為24MHz時,ticks=10000*24=240000。

          如果需要選擇HCLK/8,可以直接修改這個函數(shù),或在這個函數(shù)后跟隨misc中的SysTick_CLKSourceConfig(uint32_tSysTick_CLKSource)來設置

          ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

          這里使用3.4的庫,注意是SystemCoreClock,3.0那些版本是用SystemFrequency這個單詞,其他2.x版本的方法是不同的。

          注: 全局變量 TimingDelay , 必須定義為 volatile 類型 , 延遲時間將不隨系統(tǒng)時鐘頻率改變。

          Main文件

          #include"stm32f10x.h"

          voidRCC_Configuration(void);

          voidGPIO_Configuration(void);

          voidSysTick_Configuration(void);

          voidDelay(volatileuint32_tnTime);

          staticvolatileuint32_tTimingDelay;

          intmain(void)

          {

          RCC_Configuration();

          GPIO_Configuration();

          SysTick_Configuration();

          while(1)

          {

          GPIO_SetBits(GPIOA,GPIO_Pin_0);

          Delay(1000);

          GPIO_SetBits(GPIOA,GPIO_Pin_1);

          Delay(1000);

          GPIO_ResetBits(GPIOA,GPIO_Pin_0);

          Delay(1000);

          GPIO_ResetBits(GPIOA,GPIO_Pin_1);

          Delay(1000);

          }

          }

          voidRCC_Configuration(void) /*使用外部8M*/

          {

          ErrorStatusHSEStartUpStatus;

          /*RCCsystemreset(fordebugpurpose)*/

          RCC_DeInit();

          /*EnableHSE*/

          RCC_HSEConfig(RCC_HSE_ON);

          /*WaittillHSEisready*/

          HSEStartUpStatus=RCC_WaitForHSEStartUp();

          if(HSEStartUpStatus==SUCCESS)

          {

          /*EnablePrefetchBuffer預取指緩存使能*/

          FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

          /*Flash2waitstate,F(xiàn)LASH存儲器延時時鐘周期數(shù)*/

          FLASH_SetLatency(FLASH_Latency_2);

          /*HCLK=SYSCLK*/

          RCC_HCLKConfig(RCC_SYSCLK_Div1);

          /*PCLK2=HCLK*/

          RCC_PCLK2Config(RCC_HCLK_Div1);

          /*PCLK1=HCLK/2*/

          RCC_PCLK1Config(RCC_HCLK_Div2);

          /*PLLCLK=8MHz*9=72MHz*/

          RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

          /*EnablePLL*/

          RCC_PLLCmd(ENABLE);

          /*WaittillPLLisready*/

          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

          {

          }

          /*SelectPLLassystemclocksource*/

          RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

          /*WaittillPLLisusedassystemclocksource*/

          while(RCC_GetSYSCLKSource()!=0x08)

          {

          }

          }

          /*EnableGPIOCclock*/

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

          }

          voidGPIO_Configuration(void)

          {

          GPIO_InitTypeDefGPIO_InitStructure;

          GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;

          GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

          GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

          GPIO_Init(GPIOA,&GPIO_InitStructure);

          }

          voidSysTick_Configuration()

          {

          if(SysTick_Config(SystemCoreClock/1000))

          {

          /*Captureerror*/

          while(1);

          }

          }

          voidDelay(volatileuint32_tnTime)

          {

          TimingDelay=nTime;

          while(TimingDelay!=0);

          }

          voidTimingDelay_Decrement(void)

          {

          if(TimingDelay!=0x00)

          {

          TimingDelay--;

          }

          }

          Stm32f10x_it.c加入

          voidTimingDelay_Decrement(void);

          voidSysTick_Handler(void)

          {

          TimingDelay_Decrement();

          }



          關(guān)鍵詞: stm32SysTick定時控制LE

          評論


          技術(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); })();