2015-11-23 68 views
1

我必須對我的STM32F4探索板上配置系統時鐘,我無法得到它的權利。我使用STM網站的「系統時鐘配置」程序(http://www.st.com/web/en/catalog/tools/PF257927#)。我已經設置HCKL 168和生成與PPL(HSI)選擇源文件,並將其粘貼到我的項目,調用生成SystemInit()功能。在其頂部評論生成的源文件表明ABP1分頻器設置爲4,我創建了一個定時器,它應該打斷我的程序,一旦第二:STM32F4 Discovery中的系統時鐘配置

NVIC_InitTypeDef NVIC_InitStructure; 
TIM_TimeBaseInitTypeDef TIM_InitStructure; 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); 

NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; 
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure); 

TIM_InitStructure.TIM_Period = 168000000/4; // clockspeed/prescaler 
TIM_InitStructure.TIM_Prescaler = 0; 
TIM_InitStructure.TIM_ClockDivision = 0; 
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; 
TIM_TimeBaseInit(TIM5, &TIM_InitStructure); 
TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE); 
TIM_Cmd(TIM5, ENABLE); 

但是我TIM5_IRQHandler好像是叫每個0, 5秒。這是爲什麼?我做錯了什麼或者我誤解了什麼?

回答

1

下面是一些代碼,我寫了一個使用在168Mhz的PLL和定時器和中斷(等等),其董事會。看看它是如何/比較你的,我不使用他們的庫

我強烈建議你先開始輪詢,獲取系統時鐘和定時器配置一個東西在一次然後獲取中斷接近核心,清除正確等,最後一步是做一箇中斷和處理程序。

//------------------------------------------------------------------- 
void PUT32 (unsigned int, unsigned int); 
void PUT16 (unsigned int, unsigned int); 
unsigned int GET32 (unsigned int); 
unsigned int GET16 (unsigned int); 
//------------------------------------------------------------------- 
#define RCCBASE 0x40023800 
#define RCC_CR (RCCBASE+0x00) 
#define RCC_PLLCFGR (RCCBASE+0x04) 
#define RCC_CFGR (RCCBASE+0x08) 
#define GPIODBASE 0x40020C00 
#define TIM5BASE 0x40000C00 
#define FLASH_ACR 0x40023C00 
//------------------------------------------------------------------- 
volatile unsigned int intcounter; 
//------------------------------------------------------------------- 
// CAREFUL, THIS IS AN INTERRUPT HANDLER 
void tim5_handler (void) 
{ 
    intcounter++; 
    PUT32(TIM5BASE+0x10,0x00000000); 
} 
// CAREFUL, THIS IS AN INTERRUPT HANDLER 
//------------------------------------------------------------------- 
void ClockInit (void) 
{ 
    unsigned int ra; 

    //enable HSE 
    ra=GET32(RCC_CR); 
    ra&=~(0xF<<16); 
    PUT32(RCC_CR,ra); 
    ra|=1<<16; 
    PUT32(RCC_CR,ra); 
    while(1) 
    { 
     if(GET32(RCC_CR)&(1<<17)) break; 
    } 
    PUT32(RCC_CFGR,0x00009401); //PPRE2 /2 PPRE1 /4 sw=hse 

    //slow flash accesses down otherwise it will crash 
    PUT32(FLASH_ACR,0x00000105); 

    //8MHz HSE, 168MHz pllgen 48MHz pll usb 
    //Q 7 P 2 N 210 M 5 vcoin 1 pllvco 336 pllgen 168 pllusb 48 
    ra=(7<<24)|(1<<22)|(((2>>1)-1)<<16)|(210<<6)|(5<<0); 
    PUT32(RCC_PLLCFGR,ra); 

    // enable pll 
    ra=GET32(RCC_CR); 
    ra|=(1<<24); 
    PUT32(RCC_CR,ra); 

    //wait for pll lock 
    while(1) 
    { 
     if(GET32(RCC_CR)&(1<<25)) break; 
    } 

    //select pll 
    PUT32(RCC_CFGR,0x00009402); //PPRE2 /2 PPRE1 /4 sw=pllclk 

    //if you didnt set the flash wait states you may crash here 

    //wait for it to use the pll 
    while(1) 
    { 
     if((GET32(RCC_CFGR)&0xC)==0x8) break; 
    } 
} 
//------------------------------------------------------------------- 
int notmain (void) 
{ 
    unsigned int ra; 
    unsigned int lastcount; 
    unsigned int newcount; 

    ClockInit(); 

    ra=GET32(RCCBASE+0x30); 
    ra|=1<<3; //enable port D 
    PUT32(RCCBASE+0x30,ra); 

    ra=GET32(RCCBASE+0x40); 
    ra|=1<<3; //enable TIM5 
    PUT32(RCCBASE+0x40,ra); 

    //d12 = d15 led outputs 
    ra=GET32(GPIODBASE+0x00); 
    ra&=0x00FFFFFF; 
    ra|=0x55000000; 
    PUT32(GPIODBASE+0x00,ra); 
    //push pull 
    ra=GET32(GPIODBASE+0x04); 
    ra&=0xFFFF0FFF; 
    PUT32(GPIODBASE+0x04,ra); 

    //start with green led 
    PUT32(GPIODBASE+0x18,0xE0001000); 

    //setup timer 
    PUT32(TIM5BASE+0x00,0x00000000); 
    PUT32(TIM5BASE+0x2C,168000000/4); //auto reload 
    PUT32(TIM5BASE+0x0C,0x00000001); //interrupt enable 
    PUT32(TIM5BASE+0x10,0x00000000); //clear interrupt 
    PUT32(TIM5BASE+0x00,0x00000001); 

    intcounter = 0; 
    //enable interrupt 50 TIM5 
    PUT32(0xE000E104,0x00040000); 

    lastcount = intcounter; 
    while(1) 
    { 
     newcount=intcounter; 
     if(lastcount!=newcount) 
     { 
      switch(lastcount&0x3) 
      { 
       case 0: PUT32(GPIODBASE+0x18,0xE0001000); break; 
       case 1: PUT32(GPIODBASE+0x18,0xD0002000); break; 
       case 2: PUT32(GPIODBASE+0x18,0xB0004000); break; 
       case 3: PUT32(GPIODBASE+0x18,0x70008000); break; 
      } 
      lastcount=newcount; 
     } 
    } 
    return(0); 
} 
//------------------------------------------------------------------- 
//------------------------------------------------------------------- 

的一些注意事項,我寫什麼我當時看到:

TIM5實際上是一個32位計數器不能像16多的人的。如果 我們數到168,000,000 * 4個蜱,應該是4秒吧? 那麼我們每眨眼8秒。我認爲發生了什麼 是兩個具有不同速度限制的AHB除數PPRE1和PPRE2。到 保持PPRE2在或低於84Mhz它想除以2,保持PPRE1在 42MHz它想要除以4.時鐘樹圖並不真正顯示 這兩個除數(我可以看到),但它有一個東西爲定時器 其中如果除數是非零然後乘以2。我假定這是什麼所有 裝置是PPRE1其是由4分頻乘以2喂 定時器。而這似乎符合,如果你改變PPRE1 8 劃分和它需要16秒的領導改變。

所以我看到它太長,你看到它是由2的冪是否過短?我正在使用內部使用的外部源?