完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大大,我在调试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个回答
|
|
在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`函数将被调用。 总结一下,你已经在中断向量表中设置了自己的中断,并且定义了一个中断处理函数。通过使能中断和配置触发条件,你的程序现在应该能够正确地处理旋转编码按键的中断。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1537 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1490 浏览 1 评论
909 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
653 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1537 浏览 2 评论
1843浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
593浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
496浏览 3评论
494浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
475浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 01:53 , Processed in 0.817052 second(s), Total 80, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号