刚接触STM32,还只看了时钟系统、中断、GPIO和通用定时器的普通定时功能。
编译器MDK4.0,借固件库写个了用TIM2控制灯闪的程序。不优化时正常,优化后(优化等级1~3都试过)闪烁频率翻倍了!本来一秒一次,现在一秒两次。
使用RCC_GetClocksFreq(&RCC_clock_value)函数读出来的时钟值如下:f[SYSCLK]=8MHz,f[HCLK]=8MHz,f[PCLK1]=8MHz,f[PCLK2]=8MHz,f[ADCCLK]=4MHz。读出的TIM2->PSC值为99(即TIM2分频系数为100)
这个问题找得我头大了。各位帮忙看看。下面是相关部分程序:
void RCC_config(void)
{
RCC_HSEConfig(RCC_HSE_ON); //HES开启;
if(SUCCESS==RCC_WaitForHSEStartUp()); //等待时钟准备好;
{
// while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); //使用HSE时钟;
while(RCC_GetSYSCLKSource()!= 0x04); //检查时钟源是否已是HSE;
RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB时钟分频系数为1;
RCC_PCLK2Config(RCC_HCLK_Div1); //APB2时钟分频系数为1;
RCC_PCLK1Config(RCC_HCLK_Div1); //APB1时钟分频系数为1;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //开启GPIOB时钟;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //开启TIM2时钟;
}
}
void TIM2_config(void)
{
TIM_InternalClockConfig(TIM2); //TIM2使用内部时钟;
TIM_SetAutoreload(TIM2,4000); //设置自动重装载寄存器,定时50ms;
TIM_CounterModeConfig(TIM2,TIM_CounterMode_Up); //TIM2向上计数,
即从0到TIM2_ARR;
TIM_PrescalerConfig(TIM2,99,TIM_PSCReloadMode_Immediate); //f[TIM2]=
f[CLK_APB1]/(99+1),即100分频,并立即产生更新;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //此次更新不产生中断;
TIM_Cmd(TIM2,ENABLE); //开启计数器;
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //开启TIM2的更新中断;
}
//中断配置;
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
//开TIM2全局中断;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //选择TIM2通道;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void device_init(void)
{
RCC_config();
GPIO_config();
TIM2_config();
NVIC_Configuration();
}
//TIM2 50ms中断函数;
void TIM2_IRQHandler(void)
{
static vu8 t500ms_for_PCB_shine=0;
if(++t500ms_for_PCB_shine>=10)
{
LED1_SHINE();
t500ms_for_PCB_shine=0;
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志;
}
int main(void)
{
device_init();
while(1);
} |