打印
[STM32F0]

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

[复制链接]
2475|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的等待周期设置成匹配的值,这步也试过了,跟这个应该没关系。





我查了几天的资料,看到也有不少人遇到过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
这是同样问题的另一个帖,因为这个问题不知道具体怎么描述了,所以就发了两次帖

使用特权

评论回复
5
fanxsd| | 2015-11-3 22:10 | 只看该作者
你为什么要倍频成16m  呢,用原厂的 库文件 倍频48m  多好,没有遇到问题过。

使用特权

评论回复
6
dwq175| | 2015-11-3 23:21 | 只看该作者
应该是没有打开中断吧!
NVIC_EnableIRQ(SysTick_IRQn);

使用特权

评论回复
7
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;试试看

使用特权

评论回复
8
zhaoyu2005| | 2015-11-4 08:59 | 只看该作者
不闪烁和不进中断是不等价的,进不进中断,用jlink或者其他调试工具能看到,或者直接在中断里闪灯。volatile这个有时必须有

使用特权

评论回复
9
sfesdm|  楼主 | 2015-11-4 18:36 | 只看该作者
fanxsd 发表于 2015-11-3 22:10
你为什么要倍频成16m  呢,用原厂的 库文件 倍频48m  多好,没有遇到问题过。 ...

没改过的一样结果

使用特权

评论回复
10
sfesdm|  楼主 | 2015-11-4 18:38 | 只看该作者
diweo 发表于 2015-11-4 08:30
那你把库函数SetSysClock()里面的
    /* PLL configuration = HSE * 6 = 48 MHz */
    RCC->CFGR &= (u ...

一样的结果

使用特权

评论回复
11
sfesdm|  楼主 | 2015-11-4 19:42 | 只看该作者


大家看一下吧,这是在线运行的结果,不敢直视了。

使用特权

评论回复
12
gmm2015| | 2015-11-4 20:48 | 只看该作者
都没调用SystemInit

使用特权

评论回复
13
zchong| | 2015-11-4 21:31 | 只看该作者
一行一行看,尤其是宏定义,比如8M的宏定义,外部时钟的宏定义
一般时钟配置出现问题都是宏定义没有改过来造成的

使用特权

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

本版积分规则

49

主题

346

帖子

3

粉丝