打印
[STM8]

TIM1使用普通重载定时器功能,程序卡死了

[复制链接]
3131|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如题,程序卡在TIM1_Cmd(ENABLE);这个函数里,我的函数如下,请大神看看哪里有问题,新人表示TIM1搞了好久,连中断函数都进不去,帮帮忙啊

这是主函数
main()
{
        //u8 k,j;
        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
        GPIO_Init(GPIOB,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);

        TIM1_DeInit();//CLEAN
        TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1000,0);//INIT
        TIM1_ARRPreloadConfig(ENABLE);//ENABLE AUTOMATIC RELOAD REGISTER
        TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE);//ENABLE UPDATE INTERRUPT
        TIM1_Cmd(ENABLE);//START THE TIMER
        //enableInterrupts();//ENABLE ALL INTERRUPT
        while (1)
{
//        GPIO_WriteReverse(GPIOB,GPIO_PIN_5);
//        for(k=1000;k>0;k--)
//                for(j=1000;j>0;j--);
}
}

这是中断函数
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
        static u16 i=0;

        if(i<1000)
{
        i++;
}
else
{
        i=0;
        GPIO_WriteReverse(GPIOB,GPIO_PIN_5);
        TIM1_ClearFlag(TIM1_IT_UPDATE);
}
}
沙发
wangyinhuai|  楼主 | 2017-2-13 15:28 | 只看该作者
功能就是实现一个led的一秒定时闪烁。

使用特权

评论回复
板凳
wangyinhuai|  楼主 | 2017-2-13 15:28 | 只看该作者
这是debug图片

无标题.png (487.41 KB )

无标题.png

使用特权

评论回复
地板
wangyinhuai|  楼主 | 2017-2-13 15:30 | 只看该作者
用的是从st官网下的最新的库函数。

使用特权

评论回复
5
wangyinhuai|  楼主 | 2017-2-13 15:30 | 只看该作者
来个大神点拨一下

使用特权

评论回复
6
windows100| | 2017-2-13 16:02 | 只看该作者
  /* TIM1 counter enable */
           TIM1_Cmd(ENABLE);
  /* TIM1 Main Output Enable */
  TIM1_CtrlPWMOutputs(ENABLE);
使能中断要有,中断里if里要清标志

使用特权

评论回复
7
wangyinhuai|  楼主 | 2017-2-13 16:15 | 只看该作者
windows100 发表于 2017-2-13 16:02
/* TIM1 counter enable */
           TIM1_Cmd(ENABLE);
  /* TIM1 Main Output Enable */
        TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1000,0);//INIT
        TIM1_ARRPreloadConfig(ENABLE);//ENABLE AUTOMATIC RELOAD REGISTER
        TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE);//ENABLE UPDATE INTERRUPT
  TIM1_Cmd(ENABLE);//START THE TIMER
        //enableInterrupts();//ENABLE ALL INTERRUPT
         TIM1_CtrlPWMOutputs(ENABLE);
TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{
//                static u16 i=0;
GPIO_WriteLow(GPIOB,GPIO_PIN_5);
/*        if(i<1000)
{
        i++;
}
else
{
        i=0;
        //GPIO_WriteReverse(GPIOB,GPIO_PIN_5);
       
}*/
TIM1_ClearFlag(TIM1_IT_UPDATE);
}

我做了修改。但是还是进不了中断

使用特权

评论回复
8
windows100| | 2017-2-13 16:21 | 只看该作者
使能中断要有,!!!!!!
enableInterrupts();//ENABLE ALL INTERRUPT 不要屏蔽,这一句要,放在调用函数后

使用特权

评论回复
9
wangyinhuai|  楼主 | 2017-2-13 16:34 | 只看该作者
windows100 发表于 2017-2-13 16:21
使能中断要有,!!!!!!
enableInterrupts();//ENABLE ALL INTERRUPT 不要屏蔽,这一句要,放在调用函数后 ...

好的!我好像也没有注册那个中断向量表,那个需要弄吗
struct interrupt_vector const _vectab[] = {
        {0x82, (interrupt_handler_t)_stext}, /* reset */
        {0x82, NonHandledInterrupt}, /* trap  */
        {0x82, NonHandledInterrupt}, /* irq0  */
        {0x82, NonHandledInterrupt}, /* irq1  */
        {0x82, NonHandledInterrupt}, /* irq2  */
        {0x82, NonHandledInterrupt}, /* irq3  */
        {0x82, NonHandledInterrupt}, /* irq4  */
        {0x82, NonHandledInterrupt}, /* irq5  */
        {0x82, NonHandledInterrupt}, /* irq6  */
        {0x82, NonHandledInterrupt}, /* irq7  */
        {0x82, NonHandledInterrupt}, /* irq8  */
        {0x82, NonHandledInterrupt}, /* irq9  */
        {0x82, NonHandledInterrupt}, /* irq10 */
        {0x82, NonHandledInterrupt}, /* irq11 */
        {0x82, NonHandledInterrupt}, /* irq12 */
        {0x82, NonHandledInterrupt}, /* irq13 */
        {0x82, NonHandledInterrupt}, /* irq14 */
        {0x82, NonHandledInterrupt}, /* irq15 */
        {0x82, NonHandledInterrupt}, /* irq16 */
        {0x82, NonHandledInterrupt}, /* irq17 */
        {0x82, NonHandledInterrupt}, /* irq18 */
        {0x82, NonHandledInterrupt}, /* irq19 */
        {0x82, NonHandledInterrupt}, /* irq20 */
        {0x82, NonHandledInterrupt}, /* irq21 */
        {0x82, NonHandledInterrupt}, /* irq22 */
        {0x82, NonHandledInterrupt}, /* irq23 */
        {0x82, NonHandledInterrupt}, /* irq24 */
        {0x82, NonHandledInterrupt}, /* irq25 */
        {0x82, NonHandledInterrupt}, /* irq26 */
        {0x82, NonHandledInterrupt}, /* irq27 */
        {0x82, NonHandledInterrupt}, /* irq28 */
        {0x82, NonHandledInterrupt}, /* irq29 */
};

使用特权

评论回复
10
windows100| | 2017-2-13 16:57 | 只看该作者
哥们,这个帮不到你了,我这是IAR的软件。我没弄过你这个。
我的中断服务函数是INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)

使用特权

评论回复
11
mmuuss586| | 2017-2-13 17:08 | 只看该作者
TIM1_ClearFlag(TIM1_IT_UPDATE);
这句放在进入中断程序里面,或退出地方;

另外中断初始化程序没看到啊

使用特权

评论回复
12
biechedan| | 2017-2-13 17:12 | 只看该作者
没有设置周期吗?

使用特权

评论回复
13
biechedan| | 2017-2-13 17:13 | 只看该作者
没有映射中断的时钟信号变量吧。

使用特权

评论回复
14
wangyinhuai|  楼主 | 2017-2-13 17:23 | 只看该作者
windows100 发表于 2017-2-13 16:57
哥们,这个帮不到你了,我这是IAR的软件。我没弄过你这个。
我的中断服务函数是INTERRUPT_HANDLER(TIM1_UPD ...

谢谢啦,我用的stvd。。

使用特权

评论回复
15
wangyinhuai|  楼主 | 2017-2-13 17:38 | 只看该作者
biechedan 发表于 2017-2-13 17:13
没有映射中断的时钟信号变量吧。
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
        //static u8 i=0;
        //GPIO_WriteLow(GPIOB,GPIO_PIN_5);
        static u8 i=0;
        if(i<1000)
{
        i++;
}
        else
{
        i=0;
        GPIO_WriteLow(GPIOB,GPIO_PIN_5);
}
        TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}

刚刚注册了中断向量,填了向量表,刚刚测试过,现在可以进入中断函数了,但是,你看我在记满1000的地方,把led点亮,但是运行的时候并不亮。。是不是,标志位清除有问题?还是之前设置有问题

使用特权

评论回复
16
wangyinhuai|  楼主 | 2017-2-13 19:18 | 只看该作者
解决啦,static u8 i=0;这个变量只够计数到256,所以是行不通的,我改为int就没问题啦!多谢大家的指点

使用特权

评论回复
17
huangcunxiake| | 2017-2-13 19:21 | 只看该作者
wangyinhuai 发表于 2017-2-13 19:18
解决啦,static u8 i=0;这个变量只够计数到256,所以是行不通的,我改为int就没问题啦!多谢大家的指点{:lo ...

楼主厉害,这么 隐蔽的问题都查到了。

使用特权

评论回复
18
huangcunxiake| | 2017-2-13 19:22 | 只看该作者
static u8 i=0;
        if(i<1000)

话说,这里也太明显了,
不过还是为楼主点赞,知道这种错误会死机。。

使用特权

评论回复
19
huangcunxiake| | 2017-2-13 19:23 | 只看该作者
u8的数据只能在0到255范围波动,所以永远跳不出去。。。。确实有一套,

使用特权

评论回复
20
wangyinhuai|  楼主 | 2017-2-14 10:36 | 只看该作者
huangcunxiake 发表于 2017-2-13 19:23
u8的数据只能在0到255范围波动,所以永远跳不出去。。。。确实有一套,

哈哈哈

使用特权

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

本版积分规则

6

主题

28

帖子

0

粉丝