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

查看: 4703|回复: 1

STM32代码优化后的问题

[复制链接]

1

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-12-7 11:26:02 | 显示全部楼层 |阅读模式
刚接触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);
}
回复

使用道具 举报

7

主题

62

回帖

0

蝴蝶豆

新手上路

最后登录
2020-6-1
发表于 2011-4-20 11:31:34 | 显示全部楼层

RE:STM32代码优化后的问题

看上去是void TIM2_IRQHandler(void)是这个函数写的有问题哦~
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版