下面是一些代碼,我寫了一個使用在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的冪是否過短?我正在使用內部使用的外部源?