你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32代码优化后的问题

[复制链接]
pttangpt 提问时间:2010-12-7 11:26 /
刚接触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-&gtSC值为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);
}
收藏 评论1 发布时间:2010-12-7 11:26

举报

1个回答
瘦猪呆兔 回答时间:2011-4-20 11:31:34

RE:STM32代码优化后的问题

看上去是void TIM2_IRQHandler(void)是这个函数写的有问题哦~

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版