原创 STM32L开发经验之一

2012-4-24 12:00 3957 18 20 分类: MCU/ 嵌入式

STM32L开发经验之一

 

这2天在调试单位的一个电路板,电路板的核心芯片是ST公司的STM32L152,在进行系统时钟源切换时发现一个问题:当选择系统时钟源为外接振荡器HSE时,有时对的,有时错的,尤其是看上去单条调试时都对的情况下,关机重新上电后还是有问题。

具体的程序代码如下:

int main(void)

{

  // 备注:系统复位后,在启动代码中调用了SystemInit()函数后

  //       就转入main()函数

  //       SyetemInit()在system_stm32l1xx.c中

 

  int i;

  RCC_ClocksTypeDef  RCC_Clocks;

 

  SystemInit();                         // 将该函数放到此处,是为了方便调试该函数

 

  // 选择系统时钟源

  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

 

  RCC_GetClocksFreq(&RCC_Clocks);

 

  LED_Init();

 

  for(;;)

  {

    LED_On();

    for(i=0;i<100000;i++);

    LED_Off();

    for(i=0;i<100000;i++);

  }

}

项目中的其它代码都取自ST提供的外设库中的例子。项目经过编译下载到目标板后,运行后可以看到LED在闪烁。

问题是如果没有RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE) 这条语句,LED闪烁频率还是一样的。

为了找到这个问题,将SystemInit()函数放在main()中进行调试。然后在IAR环境下进行单条语句(输入F11)跟踪,发现当执行完RCC_GetClockFreq()函数后,RCC_Clocks中的数值都是8MHZ。但如果是单步跟踪(输入F10),RCC_Clocks中的数值就是2.1MHZ左右。通过读SystemInit()中的代码,怀疑是HSE没有稳定工作就超时了。在system_stm32l1xx.c中的SystemInit()函数中,调用了SetSysClock(),而在SetSysClock()中有一段代码如下:

  /* 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));

 

这段代码就是等待HSE稳定,直到超时。

在stm32l1xx.h中定义HSE_STARTUP_TIMEOUT的值为0x0500,将该值改成0x0fff后,再重新编译下载,发现可以正常工作了。

也不知是ST提供的这个数值不对,还是实际的板子存在什么问题?总之算做经验吧,写出来供大家参考。

 

 

 

    2012-4-24

文章评论2条评论)

登录后参与讨论

用户1203741 2012-9-4 12:36

我用的是IAR 5.50

用户1579445 2012-8-31 14:33

你用的是IAR哪个版本啊,我的5.3的怎没有STM32L系列可选啊
相关推荐阅读
用户1203741 2011-09-01 22:32
液晶显示器FP71G+不亮的维修
液晶显示器FP71不亮的维修 有一台液晶显示器,型号是FP71G+,开机后不亮。上网查找了一些信息,据说此款显示器出现这种现象多半都是高压有问题,而且还指出了大部分问题都出现那对三极管上(型号为570...
用户1203741 2010-09-19 16:06
算法优化的重要性
                    算法优化的重要性 前些日子,在开发一个单片机的产品时,遇到这么一个问题,就是要将一个无符号的16位数,乘以1.2288后,再赋给另一个无符号的16位数。用C语言...
用户1203741 2010-08-19 16:56
STM8的C语言编程(14)-- PWM
                STM8的C语言编程(14)-- PWM 在单片机应用系统中,也常常会用到PWM信号输出,例如电机转速的控制。现在很多高档的单片机也都集成了PWM功能模块,方便用户的应...
用户1203741 2010-08-16 10:02
STM8的C语言编程(13)-- 蜂鸣器
                 STM8的C语言编程(13)-- 蜂鸣器 蜂鸣器是现在单片机应用系统中很常见的,常用于实现报警功能。为此STM8特别集成了蜂鸣器模块,应用起来非常方便。在应用蜂鸣器模...
用户1203741 2010-08-13 09:10
STM8的C语言编程(12)-- AD转换
                                       STM8的C语言编程(12)-- AD转换 在许多的单片机应用系统中,都需要A/D转换器,将模拟量转换成数字量。在STM8...
我要评论
2
18
关闭 站长推荐上一条 /2 下一条