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
用户1203741 2012-9-4 12:36
用户1579445 2012-8-31 14:33