打印

IAR搞啥玩意!

[复制链接]
3866|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyql008|  楼主 | 2013-1-8 08:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yyql008 于 2013-1-8 08:58 编辑

     以前用的是STM32F103,用的是IAR 6.3固件3.5,使用一切正常.
后来公司改了用STM32107XB,一切问题都来了.程序有一半几率进入hard fault异常(有时一切正常).
在网上查了同类问题,他们多半是软件问题.但我可以确定我的软件没问题.因为跳入main函数,运行第一句指令都可能进入异常!硬件也没问题,烧别人写的程序,一切OK.
  而且只要我把单片机信号设为STM32107XC,就完全正常了.
但这样解决问题,不甘心,只好用改用IAR 5.5,这下没问题了,不进入hard fault故障,新问题又来了,
定时器不准,怀疑是总线不准,IAR搞毛,以前用AVR单片机,感觉IAR挺好的,但 IAR for ARM 真不行.
沙发
uet_cache| | 2013-1-8 09:05 | 只看该作者
是不是你有的些配置没配置到点上。或者你的程序空间,C系列的才够?

使用特权

评论回复
板凳
江枫渔火| | 2013-1-8 09:53 | 只看该作者
不是代码的兼容性问题,就是软件的设置问题。

使用特权

评论回复
地板
IJK| | 2013-1-8 11:09 | 只看该作者
既然型号STM32107XC没有问题,可以先用它。

如果想弄清楚,可以用ST的例子 型号STM32107XB试试。

使用特权

评论回复
5
yyql008|  楼主 | 2013-1-8 13:36 | 只看该作者
本帖最后由 yyql008 于 2013-1-8 13:52 编辑

用了MDK V4.22跑程序,时钟也不对,我也怀疑系统总线时钟都不对,
最后发现还是V3.5的固件库有问题.
是复位后会调用这个函数
static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;   


    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
   
   
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL9);
#else   
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }
}
#endif



原因是如果我定义宏STM32F10X_CL,定时器就不准,
如果定义别的宏,比如STM32F10X_HD,定时器是准的
应该是系统时钟都不对,所有那个函数改成这样就行了:

去掉了,定义STM32F10X_CL执行的部分,都执行STM32F10X_HD的部分 改成了
static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;   


    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
   
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;


    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(((uint32_t)0x00010000) | RCC_CFGR_PLLMULL9);


    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
   
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }
}

不是编译器有问题(老进入hard fault,必须把STM32F107B的单片机选成STM32F107C才行),
要么就是固件库有问题.
而且在IAR 5.5和6.3这里运行是不一样的

if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

用的都是V3.5的库,5.5好像进入else,6.3进入前面的.keil选STM32F10XB时钟也不准的
#if !defined  HSE_VALUE
#ifdef STM32F10X_CL   
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */

宏改了,时钟都不对,必须不定义 STM32F10X_CL才行.

使用特权

评论回复
6
dandantcb| | 2013-1-8 14:30 | 只看该作者
MDK好用些。我同事也是,一个星期搞不定IAR,就赶紧换MDK了,很顺利。

使用特权

评论回复
7
jxmzzr| | 2013-1-8 15:16 | 只看该作者
一般arm7这个级别的编程才用iar

使用特权

评论回复
8
xiaoniu341| | 2013-1-15 13:47 | 只看该作者
105\107系统默认的晶振是25M的,如果你是8M晶振肯定不行

使用特权

评论回复
9
xiaoniu341| | 2013-1-15 13:49 | 只看该作者
如果一定要用8M晶振,还要改一个地方才行,可以QQ联系我,835432215

使用特权

评论回复
10
xiaoerge| | 2013-1-15 16:27 | 只看该作者
我是开始MDK搞得烦了,就用了IAR。MDK一星期搞不定,IAR一天就好了。
IAR的一个好处是各种MCU编译器都有,相似的界面,换平台很简单。
按照我的经验,一般是软件设置或程序的问题,这种编译器出低级问题的几率太小了。

使用特权

评论回复
11
yyql008|  楼主 | 2013-1-17 19:12 | 只看该作者
回楼上,我改了HSE_VALUE定义为8M,还需要改一个地方???

使用特权

评论回复
12
yyql008|  楼主 | 2013-1-17 19:13 | 只看该作者
但是我用IAR6.3,总线时钟是准的.现在我就那样了.
不折腾了....
我就用5.5,IAR6.3需要JLINK升级固件,很烦人.5.5还行

使用特权

评论回复
13
ilovezeno| | 2013-1-18 03:39 | 只看该作者
stm32有专门的官方出的时钟设置软件(一个带程序的excel文件),如果用的时钟和固件库里默认的不同,那就请用软件生成新的时钟初始化文件,那样就不会有问题了......
出问题半天,结果连官方提供了什么都不知道,那实在是很无语的事情....

使用特权

评论回复
14
ppenppen| | 2013-1-18 19:33 | 只看该作者
我等菜鸟级别的,看了后怕,对IAR只可敬而远之了。

使用特权

评论回复
15
bear1| | 2014-9-14 12:22 | 只看该作者
IAR躺着中枪哈。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我们必须知道,我们必将知道

18

主题

111

帖子

1

粉丝