STM32
直播中

goodmbby

9年用户 1259经验值
擅长:处理器/DSP
私信 关注
[问答]

STM8S103F3P6捕获中断进不去的原因?

以下为测试代码,但是捕获中断进不去,不知道什么原因,求助大神,看看哪里设置有问题
#include
void timer1Init(void)
{
//     asm("sim");  // 关全局中断
     TIM1_CR1=0x00;    //关闭定时器
     TIM1_IER=0x00;    //关闭中断
     TIM1_PSCRH = 0;
     TIM1_PSCRL = 15;    //(fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1)。
     TIM1_CCER1 = 0x00;        //         
     TIM1_CCMR1 = 0x01;        //配置为输入,IC1映射在TI1FP1上
     TIM1_SR2   = 0X00;    //清中断标志
     TIM1_CCER1 = 0x03;        //cc1配置为输入 低电平或下降沿触发
     TIM1_IER = 0x02;    //允许捕获1中断
     TIM1_CR1 |= 0x01;    //         
//     asm("rim");  // 开全局中断
}

#pragma vector=TIM1_CAPCOM_CC1IF_vector
__interrupt void TIM1_CAP_COM_IRQHandler(void)
{
      TIM1_SR1 =~0x02;//清除中断标志
      PB_ODR^=0x20;
}

void main( void )
{
//    int i,j;
    CLK_CKDIVR = (unsigned char)(~0x18);/*时钟复位*/
    CLK_CKDIVR|= (unsigned char)0x00;/*设置时钟为内部16M高速时钟*/
    PB_DDR|=0x20;
    PB_CR1|=0x20;
    PB_CR2|=0x00;

    PC_DDR  = ~0x40;   //PC6设置为输入
    PC_CR1  =  0x40;   //带上拉电阻输入
    PC_CR2  = ~0x40;   //禁止外部中断         

    Timer1Init();
    asm("rim");//开全局中断
    while(1);
}



回帖(1)

杨平

2024-5-13 17:50:53
STM8S103F3P6捕获中断进不去的原因可能有以下几点:

1. 中断使能位未设置:确保你已经使能了捕获中断。在STM8S103F3P6中,捕获中断使能位位于TIM1_IER寄存器的CC1IE位。你需要将其设置为1以使能捕获中断。

2. 中断优先级设置不当:STM8S103F3P6的中断优先级需要正确设置。请检查你的代码中是否设置了正确的中断优先级。

3. 中断服务程序未正确配置:确保你的捕获中断服务程序(Capture Interrupt Service Routine, CISR)已经正确配置。在STM8中,CISR的入口地址是固定的,你需要在代码中跳转到相应的CISR。

4. 定时器配置问题:检查你的定时器配置是否正确。例如,确保你已经设置了正确的时钟源、分频器、自动重载寄存器等。

5. 全局中断使能位未设置:确保你已经使能了全局中断。在STM8S103F3P6中,全局中断使能位位于ITC_SPR3寄存器的CG3位。你需要将其设置为1以使能全局中断。

以下是修改后的代码示例,仅供参考:

```c
#include

void Timer1Init(void)
{
    asm("sim"); // 关全局中断
    TIM1_CR1 = 0x00; // 关闭定时器
    TIM1_IER = 0x00; // 关闭中断
    TIM1_PSCRH = 0;
    TIM1_PSCRL = 15; // (fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1)。

    // 设置捕获模式和输入信号
    TIM1_CCMR1 = 0x70; // 捕获模式,输入信号
    TIM1_CCER = 0x00; // 清除捕获/比较使能位

    // 设置中断优先级
    ITC_SPR3 = 0x03; // 设置TIM1捕获中断优先级为3

    // 使能捕获中断
    TIM1_IER |= TIM1_IER_CC1IE;

    // 使能定时器
    TIM1_CR1 |= TIM1_CR1_CEN;
}

void Capture_ISR(void) interrupt 7
{
    // 捕获中断服务程序
    // 清除中断标志位
    TIM1_SR1 &= ~TIM1_SR1_CC1IF;
    // 重使能全局中断
    asm("rim");
}
```

请检查你的代码,确保以上几点都已正确设置。如果问题仍然存在,请检查硬件连接和外部信号是否正常。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分