[STM32F0] 请教香主,systick初始化问题,找不到解决办法

[复制链接]
2863|12
 楼主| sfesdm 发表于 2015-11-3 19:56 | 显示全部楼层 |阅读模式
本帖最后由 sfesdm 于 2015-11-3 19:59 编辑

@香水城
用的芯片型号是STM32F030F4P6,TSSOP20的,烧了几十个样,出现这个问题一直耽搁着。
现在做了个测试程序,很简单,就是初始化systick,产生100ms的中断,中断里面设置一个变量,main函数里判断这个变量,然后设置一个灯闪。

一个比较明显的问题在下图中说明了,具体的LED异常效果就是不闪,一直亮着,抓波形看到的是固定的电平,就是说systick没有产生中断。  还有别的异常三言两语也描述不了,比如在线跟踪调试,有问题的时候,进入到RCC_GetClocksFreq,程序跑飞各种问题。总结遇到的这些问题,觉得问题还是出现在systick这里。
排查经过:1、晶振用的是外部8M晶振,倍频成16M,因为没示波器,在线调试看到能一步步执行过去,晶振应该没问题,并且内部晶振也试过了,结果一样。
                  2、因为是16M,把FLASH->ACR的等待周期设置成匹配的值,这步也试过了,跟这个应该没关系。
11031.png
11032.png



我查了几天的资料,看到也有不少人遇到过systick初始化异常的问题,但是不知道最后是在怎么解决的。
请求香主支援,不胜感激!

diweo 发表于 2015-11-3 21:54 | 显示全部楼层
本帖最后由 diweo 于 2015-11-3 21:56 编辑

默认情况下(8M晶振倍频到48MHz),只要一句就初始化好systick了。要16M的话,修改一下应该也不难。

试试看这段代码:

#include "stm32f0xx.h"

volatile uint32_t SystickCount = 0;
volatile uint8_t Flag_5ms = 0;

int main(void)
{
        if( SysTick_Config(SystemCoreClock / 1000) )   //SystemCoreClock 在库文件里已定义为48000000
        {
                while(1)
                        ;
        }

        while(1)
        {
                if( Flag_5ms )
                {
                        Flag_5ms = 0;
                        user_func();
                }
        }
        return 0;
}

void SysTick_Handler(void)
{
        SystickCount++;
        if( SystickCount % 5 == 0 )
        {
                Flag_5ms = 1;
        }
}
 楼主| sfesdm 发表于 2015-11-3 22:02 | 显示全部楼层
diweo 发表于 2015-11-3 21:54
默认情况下(8M晶振倍频到48MHz),只要一句就初始化好systick了。要16M的话,修改一下应该也不难。

试试 ...

if( SysTick_Config(SystemCoreClock / 1000) )这个方法我也试过了,返回完全正常
 楼主| sfesdm 发表于 2015-11-3 22:09 | 显示全部楼层
https://bbs.21ic.com/icview-1194210-1-1.html
这是同样问题的另一个帖,因为这个问题不知道具体怎么描述了,所以就发了两次帖
fanxsd 发表于 2015-11-3 22:10 | 显示全部楼层
你为什么要倍频成16m  呢,用原厂的 库文件 倍频48m  多好,没有遇到问题过。
dwq175 发表于 2015-11-3 23:21 | 显示全部楼层
应该是没有打开中断吧!
NVIC_EnableIRQ(SysTick_IRQn);
diweo 发表于 2015-11-4 08:30 | 显示全部楼层
sfesdm 发表于 2015-11-3 22:02
if( SysTick_Config(SystemCoreClock / 1000) )这个方法我也试过了,返回完全正常

那你把库函数SetSysClock()里面的
    /* PLL configuration = HSE * 6 = 48 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
改成
    /* PLL configuration = HSE * 6 = 48 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL2);
然后把uint32_t SystemCoreClock    = 48000000;改成uint32_t SystemCoreClock    = 16000000;试试看
zhaoyu2005 发表于 2015-11-4 08:59 | 显示全部楼层
不闪烁和不进中断是不等价的,进不进中断,用jlink或者其他调试工具能看到,或者直接在中断里闪灯。volatile这个有时必须有
 楼主| sfesdm 发表于 2015-11-4 18:36 | 显示全部楼层
fanxsd 发表于 2015-11-3 22:10
你为什么要倍频成16m  呢,用原厂的 库文件 倍频48m  多好,没有遇到问题过。 ...

没改过的一样结果
 楼主| sfesdm 发表于 2015-11-4 18:38 | 显示全部楼层
diweo 发表于 2015-11-4 08:30
那你把库函数SetSysClock()里面的
    /* PLL configuration = HSE * 6 = 48 MHz */
    RCC->CFGR &= (u ...

一样的结果
 楼主| sfesdm 发表于 2015-11-4 19:42 | 显示全部楼层
save.gif

大家看一下吧,这是在线运行的结果,不敢直视了。
gmm2015 发表于 2015-11-4 20:48 | 显示全部楼层
都没调用SystemInit
zchong 发表于 2015-11-4 21:31 | 显示全部楼层
一行一行看,尤其是宏定义,比如8M的宏定义,外部时钟的宏定义
一般时钟配置出现问题都是宏定义没有改过来造成的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

346

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部