STM32
直播中

吴湛

11年用户 896经验值
擅长:33391
私信 关注
[问答]

调试stm8s105的时候,如何在中断向量表中设置自己的中断?

各位大大,我在调试stm8s105的时候,如何在中断向量表中设置自己的中断?我做的是一个旋转编码按键,PC4位中断输入,external_Interrupt应该放到什么位置?
我看别人的程序:tiM4对应/*irq23*/,TLI对应/*irq0*/。

typedef void @far (*interrupt_handler_t)(void);

struct interrupt_vector {
        unsigned char interrupt_instruction;
        interrupt_handler_t interrupt_handler;
};

@far @interrupt void NonHandledInterrupt (void)
{
        /* in order to detect unexpected events during development,
           it is recommended to set a breakpoint on the following instruction
        */
        return;
}

extern void _stext();     /* startup routine */

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 */
};



回帖(1)

好名字

2024-5-15 16:45:51
在STM8S105调试过程中,要在中断向量表中设置自己的中断,你需要按照以下步骤操作:

1. 首先,确定你的中断源。在你的例子中,你使用的是旋转编码按键,PC4位作为中断输入。这意味着你需要使用外部中断(external interrupt)。

2. 在STM8S105中断向量表中,外部中断的入口地址是固定的。对于STM8S105系列,外部中断0(EXTI0)的入口地址是0x0040,外部中断1(EXTI1)的入口地址是0x0043,以此类推。由于你使用的是PC4,它对应于外部中断2(EXTI2),因此它的入口地址是0x0046。

3. 接下来,你需要在程序中定义一个中断处理函数。这个函数将作为你的中断服务例程(ISR)。例如:

```c
typedef void @far (*interrupt_handler_t)(void);

@far @interrupt void EXTI2_IRQHandler(void)
{
    // 你的中断处理代码
}
```

4. 现在,你需要将这个中断处理函数的地址设置到中断向量表中对应的位置。在STM8S105中,中断向量表是固定的,所以你不能直接修改它。但是,你可以通过编写一个跳转指令来实现这一点。在你的程序的初始化部分,添加以下代码:

```c
void setup_interrupt(void)
{
    // 跳转到EXTI2_IRQHandler
    *(volatile unsigned char *)0x0046 = 0x9C;
    *(volatile unsigned char *)0x0047 = 0x00;
    *(volatile unsigned char *)0x0048 = 0x00;
    *(volatile unsigned char *)0x0049 = 0x00;
    *(volatile unsigned char *)0x004A = 0x00;
    *(volatile unsigned char *)0x004B = 0x00;
}
```

这段代码将在你的中断向量表中设置一个跳转指令,指向你的`EXTI2_IRQHandler`函数。

5. 最后,确保你的中断是使能的。在初始化代码中,使能外部中断2(EXTI2):

```c
ITC.ITC_SPRH.ITC_SPR8H = 0x02; // 设置中断优先级
EICRA = 0x01; // 配置PC4为上升沿触发
```

现在,当你的程序运行时,如果PC4接收到上升沿信号,它将触发外部中断2,并且你的`EXTI2_IRQHandler`函数将被调用。

总结一下,你已经在中断向量表中设置了自己的中断,并且定义了一个中断处理函数。通过使能中断和配置触发条件,你的程序现在应该能够正确地处理旋转编码按键的中断。
举报

更多回帖

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