首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PSoC定时器中断

PSoC定时器中断
EN

Stack Overflow用户
提问于 2014-03-30 10:58:38
回答 2查看 3.2K关注 0票数 1

在我看来,我的计时器中断不能正常工作。问题是,中断函数内部的计数器只增加一次。这里是我的主要和定时器设置的代码。

代码语言:javascript
复制
#include <m8c.h>
#include "PSoCAPI.h"
#include <stdio.h>
#include <stdlib.h>

char theStr[] = "PSoC LCD";
static char tmp[3];
static int counter = 0;

void main(void){

    LCD_Start();
    LCD_Position(0,5);
    LCD_PrString(theStr);
    M8C_EnableGInt;
    Timer8_EnableInt();
    Timer8_Start();
    while (1);
}

#pragma interrupt_handler myTimerInt
void myTimerInt(void){
    counter ++;
    LCD_Position(1,0);
    itoa(tmp, counter, 10);
    LCD_PrString(tmp);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-02 00:29:58

大多数中断服务例程都需要重新启动调用它的中断(有时称为“确认中断”)。否则,ISR只被调用一次。通常,这是在ISR的关键部分完成后完成的。

在503418的情况下,我认为重新启用是通过读取计数器寄存器完成的。请参阅底部的代码。

票数 1
EN

Stack Overflow用户

发布于 2014-04-02 21:48:00

您可能遇到的一个可能的问题是Timer8INT.asm中的中断服务例程配置错误。在使用指令#pragma interrupt_handler时,需要确保使用正确的指令调用Timer8INT.asm ISR中的C中断服务例程。

如果定义了此指令,将在该函数的末尾添加一个reti指令,如果使用lcall从Timer8INT.asm调用该C函数,则这是不正确的。在这种情况下,您实际上需要对这个C函数执行一个简单的ljmp指令。

在使用指令时,#pragma interrupt_handler Timer8INT.asm应该有

代码语言:javascript
复制
_Timer8_ISR:

    ljmp _myTimerInt

    reti

如果没有指令,#pragma interrupt_handler Timer8INT.asm应该有

代码语言:javascript
复制
_Timer8_ISR:

    PRESERVE_CPU_CONTEXT
    lcall _myTimerInt
    RESTORE_CPU_CONTEXT

    reti
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22743142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档