完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
用STM8S105实现程序升级,想在bootloader里可以使用中断,参考网上写的资料,中断表放在RAM中实现bootloader和APP都可以中断,RAM区域0x0780~0x07FF 放中断向量表(128字节);但bootloader里卡住,中断函数不正常;定义了tiM1和TIM4中断,只有TIM1会中断,TIM4不进中断,或者只定义一个TIM4,TIM4中断正常,只要定义了两个以上中断就只有前面一个中断正常,后面的中断都进不了中断函数。不知道是什么原因?
一、main.c函数 #if 1 typedef void (*isr_type_t)(void); typedef struct { uint16_t interrupt_instruction; isr_type_t interrupt_handler; }interrupt_vector; #pragma location=0x0780 interrupt_vector vector_table_[32]={0}; #endif #pragma vector=25 __interrupt void TIM1_UPD_OVF_TRG_BRK_IRQ(void) { if(TIM1_GetFlagStatus(TIM1_FLAG_UPDATE)==SET) { TIM1_ClearITPendingBit(TIM1_IT_UPDATE); //清除中断标志 Time1_Cnt.x1msFlag=1; if(++Time1_Cnt.x1msCnt>500) { Time1_Cnt.x1msCnt=0; LED_RUN=!LED_RUN; } } } #pragma vector=26 __interrupt void TIM4_UPD_OVF_IRQ(void) { if(TIM4_GetFlagStatus(TIM4_FLAG_UPDATE)==SET) { TIM4_ClearITPendingBit(TIM4_IT_UPDATE); if(++Time4_Cnt.x1msCnt>1500) { Time4_Cnt.x1msCnt=0; LED2=!LED2; } } } int main(void) { vector_table_[25].interrupt_instruction=0x8200; vector_table_[25].interrupt_handler=(isr_type_t) TIM1_UPD_OVF_TRG_BRK_IRQ; vector_table_[26].interrupt_instruction=0x8200; vector_table_[26].interrupt_handler=(isr_type_t) TIM4_UPD_OVF_IRQ; SystemClock_Init(HSE_Clock); LED_Init(); Timer1_Init(16-1,1000); Timer4_Init(); 。。。 } 二、ICF文件修改 define memory with size = 16M; define region TinyData = [from 0x00 to 0xFF]; //define region NearData = [from 0x0000 to 0x07FF]; define region NearData = [from 0x0000 to 0x077F]; define region Eeprom = [from 0x4000 to 0x43FF]; define region BootROM = [from 0x6000 to 0x67FF]; define region NearFuncCode = [from 0x8000 to 0xFFFF]; define region FarFuncCode = [from 0x8000 to 0xFFFF]; define region HugeFuncCode = [from 0x8000 to 0xFFFF] 三、stm8s_interrupt.s文件修改 __intvec: DC8 0x82 DC24 __iar_program_start ;; RESET 0x8000 DC8 0x82 DC24 0x0784 DC8 0x82 DC24 0x0788 DC8 0x82 DC24 0x078C DC8 0x82 DC24 0x0790 DC8 0x82 DC24 0x0794 DC8 0x82 DC24 0x0798 DC8 0x82 DC24 0x079C DC8 0x82 DC24 0x07A0 DC8 0x82 DC24 0x07A4 DC8 0x82 DC24 0x07A8 DC8 0x82 DC24 0x07AC DC8 0x82 DC24 0x07B0 DC8 0x82 DC24 0x07B4 DC8 0x82 DC24 0x07B8 DC8 0x82 DC24 0x07BC DC8 0x82 DC24 0x07C0 DC8 0x82 DC24 0x07C4 DC8 0x82 DC24 0x07C8 DC8 0x82 DC24 0x07CC DC8 0x82 DC24 0x07D0 DC8 0x82 DC24 0x07D4 DC8 0x82 DC24 0x07D8 DC8 0x82 DC24 0x07DC DC8 0x82 DC24 0x07E0 DC8 0x82 DC24 0x07E4 DC8 0x82 DC24 0x07E8 DC8 0x82 DC24 0x07EC DC8 0x82 DC24 0x07F0 DC8 0x82 DC24 0x07F4 DC8 0x82 DC24 0x07F8 DC8 0x82 DC24 0x07FC |
|
相关推荐
1个回答
|
|
STM8手册上应该没有提到向量重映射的功能,也就是基于ARM的STM32那种通过寄存器配置使得中断向量映射到其他区域。所以STM8产生中断时一定是先到0x08000那个区域(程序存贮区)去服务程序地址。所以这个是硬件必然的行为,通过软件在这个入口重新跳转到其他地址是可以的(就如同官方IAP的例程,但这是跳转到程序区,非RAM区)。RAM区提前拷贝好中断服务程序也是可以的。但是这就失去了bootloader的意义了,发生中断还是要经过程序存贮区。 因此,bootloader在RAM中执行程序使用查询方式就可以了,也是最方便的。并且BOOTLOADER本身目标就是通讯+烧录程序, 程序都要改变了,没有必要执行其他功能了。所以做中断重映射到RAM中意义不大了。
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1718 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1600 浏览 1 评论
1040 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
716 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1654 浏览 2 评论
1906浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
699浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
548浏览 3评论
570浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
535浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-13 12:09 , Processed in 1.006386 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号