From 2e3b853fa1b8045f1c86249cb2426e2d928e2fb1 Mon Sep 17 00:00:00 2001 From: Stone Date: Sat, 23 Aug 2014 09:15:20 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=B1=87=E7=BC=96=E5=AE=8F?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E5=88=A4=E6=96=ADGD32=E5=B9=B6=E4=BD=BF?= =?UTF-8?q?=E7=94=A8Flash=E4=B8=AD=E6=96=AD=E5=90=91=E9=87=8F=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debug.cpp | 113 +++++++++++++++++- Interrupt.cpp | 159 +------------------------ Interrupt.h | 7 ++ Platform/Boot_F0.cpp | 40 +++++++ Platform/Boot_F1.cpp | 42 +++++++ Platform/Boot_F4.cpp | 40 +++++++ Platform/startup_stm32f10x.s | 135 +++++++++++++++++++++ Platform/startup_stm32f10x_gd.s | 200 +------------------------------- Platform/startup_stm32f10x_hd.s | 87 +++++++++++++- Sys.h | 1 - 10 files changed, 466 insertions(+), 358 deletions(-) create mode 100644 Platform/startup_stm32f10x.s diff --git a/Debug.cpp b/Debug.cpp index 360f3adc..1394f87b 100644 --- a/Debug.cpp +++ b/Debug.cpp @@ -1,4 +1,4 @@ -#include "Sys.h" +#include "Sys.h" // 仅用于调试使用的一些函数实现,RTM不需要 #if DEBUG @@ -79,5 +79,116 @@ void assert_failed(uint8_t* file, uint32_t line) } #endif +void ShowFault(uint exception) +{ + // 显示异常详细信息 + int i; + if(exception==3) + { + // 0xE000ED2C + uint n = *(uint*)(SCB_BASE + 0x2C); + debug_printf("\r\n硬件错误 %d ", n); + if(n & (1<<1)) + { + debug_printf("在取向量时发生\r\n"); + } + else if(n & (1u<<30)) + { + debug_printf("是总线fault,存储器管理fault 或是用法fault 上访的结果\r\n"); + } + else if(n & (1u<<31)) + { + debug_printf("因调试事件而产生\r\n"); + } + } + else if(exception==5) + { + i = *(byte*)(SCB_BASE + 0x29); +#ifdef STM32F10X + debug_printf("\r\nBus Fault %d 0x%08x: \r\n", i, SCB->BFAR); +#endif + if(i & (1<<0)) + { + debug_printf("IBUSERR 取指访问违例 1. 内存访问保护违例。常常是用户应用程序企图访问特权级region。在这种情况下,入栈的PC给出的地址,就是产生问题的代码之所在 2. 跳转到不可执行指令的 regions 3. 异常返回时,使用了无效的EXC_RETURN值 4. 向量表中有无效的向量。 5. 在异常处理期间,入栈的PC值被破坏了\r\n"); // 取指访问违例 1. 内存访问保护违例。常常是用户应用程序企图访问特权级region。在这种情况下,入栈的PC给出的地址,就是产生问题的代码之所在 2. 跳转到不可执行指令的 regions 3. 异常返回时,使用了无效的EXC_RETURN值 4. 向量表中有无效的向量。例如,异常在向量建立之前就发生了,或者加载的是用于传统ARM内核的可执行映像 5. 在异常处理期间,入栈的PC值被破坏了 + } + else if(i & (1<<1)) + { + debug_printf("PRECISERR 在数据访问期间的总线错误。通过BFAR可以获取具体的地址。发生fault的原因同上。\r\n"); // 在数据访问期间的总线错误。通过BFAR可以获取具体的地址。发生fault的原因同上。 + } + else if(i & (1<<2)) + { + debug_printf("IMPRECISERR 与设备之间传送数据的过程中发生总线错误。可能是因为设备未经初始化而引起;或者在用户级访问了特权级的设备,或者传送的数据单位尺寸不能为设备所接受。此时,有可能是LDM/STM指令造成了非精确总线fault。\r\n"); // 与设备之间传送数据的过程中发生总线错误。可能是因为设备未经初始化而引起;或者在用户级访问了特权级的设备,或者传送的数据单位尺寸不能为设备所接受。此时,有可能是LDM/STM指令造成了非精确总线fault。 + } + else if(i & (1<<3)) + { + debug_printf("UNSTKERR (自动)出栈期间出错。如果没有发生过STKERR,则最可能的就是在异常处理期间把SP的值破坏了\r\n"); // (自动)出栈期间出错。如果没有发生过STKERR,则最可能的就是在异常处理期间把SP的值破坏了 + } + else if(i & (1<<4)) + { + debug_printf("STKERR (自动)入栈期间出错 1. 堆栈指针的值被破坏 2. 堆栈用量太大,到达了未定义存储器的区域 3. PSP未经初始化就使用\r\n"); // (自动)入栈期间出错 1. 堆栈指针的值被破坏 2. 堆栈用量太大,到达了未定义存储器的区域 3. PSP未经初始化就使用 + } + else if(i & (1<<5)) + { + debug_printf("BFARVALID 表示BFAR有效\r\n"); // 表示BFAR有效 + } + //debug_printf("\r\n"); + } + else if(exception==4) + { + i = *(byte*)(SCB_BASE + 0x28); +#ifdef STM32F10X + debug_printf("\r\nMemManage Fault %d 0x%08x: \r\n", i, SCB->MMFAR); +#endif + if(i & (1<<0)) + { + debug_printf("IACCVIOL 取指访问违例 1. 内存访问保护违例。常常是用户应用程序企图访问特权级region。在这种情况下,入栈的PC给出的地址,就是产生问题的代码之所在 2. 跳转到不可执行指令的 regions 3. 异常返回时,使用了无效的EXC_RETURN值 4. 向量表中有无效的向量。 5. 在异常处理期间,入栈的PC值被破坏了\r\n"); // 取指访问违例 1. 内存访问保护违例。常常是用户应用程序企图访问特权级region。在这种情况下,入栈的PC给出的地址,就是产生问题的代码之所在 2. 跳转到不可执行指令的 regions 3. 异常返回时,使用了无效的EXC_RETURN值 4. 向量表中有无效的向量。例如,异常在向量建立之前就发生了,或者加载的是用于传统ARM内核的可执行映像 5. 在异常处理期间,入栈的PC值被破坏了 + } + else if(i & (1<<1)) + { + debug_printf("DACCVIOL 数据内存访问保护违例。一般是访问非法内存位置所致。可以注意筛查野指针问题。\r\n"); // 内存访问保护违例。这是MPU发挥作用的体现。常常是用户应用程序企图访问特权级region所致 + } + else if(i & (1<<3)) + { + debug_printf("MUNSTKERR 出栈时发生错误 1. 异常服务例程破坏了堆栈指针 2. 异常服务例程更改了MPU配置\r\n"); // 出栈时发生错误 1. 异常服务例程破坏了堆栈指针 2. 异常服务例程更改了MPU配置 + } + else if(i & (1<<4)) + { + debug_printf("MSTKERR 入栈时发生错误 1. 堆栈指针的值被破坏 2. 堆栈容易过大,已经超出MPU允许的region范围\r\n"); // 入栈时发生错误 1. 堆栈指针的值被破坏 2. 堆栈容易过大,已经超出MPU允许的region范围 + } + else if(i & (1<<7)) + { + debug_printf("MMARVALID 表示MMAR有效\r\n"); // 表示MMAR有效 + } + } + else if(exception==6) + { + i = *(byte*)(SCB_BASE + 0x2A); + debug_printf("\r\nUsage Fault %d: \r\n", i); + if(i & (1<<0)) + { + debug_printf("UNDEFINSTR 执行的指令其编码是未定义的——解码不能\r\n"); // 执行的指令其编码是未定义的——解码不能 + } + else if(i & (1<<1)) + { + debug_printf("INVSTATE 试图切入ARM状态\r\n"); // 试图切入ARM状态 + } + else if(i & (1<<2)) + { + debug_printf("INVPC 在异常返回时试图非法地加载EXC_RETURN到PC\r\n"); // 在异常返回时试图非法地加载EXC_RETURN到PC。包括非法的指令,非法的上下文以及非法的EXC_RETURN值。The return PC指向的指令试图设置PC的值 + } + else if(i & (1<<3)) + { + debug_printf("NOCP 企图执行一个协处理器指令。引发此fault的指令可以从入栈的PC读取\r\n"); // 企图执行一个协处理器指令。引发此fault的指令可以从入栈的PC读取 + } + else if(i & (1<<4)) + { + debug_printf("UNALIGNED 当UNALIGN_TRP置位时发生未对齐访问。引发此fault的指令可以从入栈的PC读取\r\n"); // 当UNALIGN_TRP置位时发生未对齐访问。引发此fault的指令可以从入栈的PC读取 + } + else if(i & (1<<5)) + { + debug_printf("DIVBYZERO 表示除法运算时除数为零。引发此fault的指令可以从入栈的PC读取\r\n"); // 表示除法运算时除数为零(只有在DIV_0_TRP置位时才会发生)。引发此fault的指令可以从入栈的PC读取 + } + } +} #endif diff --git a/Interrupt.cpp b/Interrupt.cpp index 799382b7..3d6dd212 100644 --- a/Interrupt.cpp +++ b/Interrupt.cpp @@ -16,9 +16,6 @@ */ TInterrupt Interrupt; -void OnHandler(); -void FaultHandler(); // 错误处理程序 - // 真正的向量表 64k=0x10000 #if VEC_TABLE_ON_RAM #ifdef STM32F0 @@ -108,7 +105,7 @@ bool TInterrupt::Activate(short irq, InterruptCallback isr, void* param) short irq2 = irq + 16; // exception = irq + 16 #if VEC_TABLE_ON_RAM - _Vectors[irq2] = OnHandler; + _Vectors[irq2] = UserHandler; #endif Vectors[irq2] = isr; Params[irq2] = param; @@ -218,7 +215,7 @@ __asm uint GetIPSR() bx lr } -void OnHandler() +void UserHandler() { uint num = GetIPSR(); //if(num >= VectorySize) return; @@ -242,158 +239,8 @@ void FaultHandler() } #if DEBUG - // 显示异常详细信息 - int i; - if(exception==3) - { - // 0xE000ED2C - uint n = *(uint*)(SCB_BASE + 0x2C); - debug_printf("\r\n硬件错误 %d ", n); - if(n & (1<<1)) - { - debug_printf("在取向量时发生\r\n"); - } - else if(n & (1u<<30)) - { - debug_printf("是总线fault,存储器管理fault 或是用法fault 上访的结果\r\n"); - } - else if(n & (1u<<31)) - { - debug_printf("因调试事件而产生\r\n"); - } - } - else if(exception==5) - { - i = *(byte*)(SCB_BASE + 0x29); -#ifdef STM32F10X - debug_printf("\r\nBus Fault %d 0x%08x: \r\n", i, SCB->BFAR); -#endif - if(i & (1<<0)) - { - debug_printf("IBUSERR 取指访问违例 1. 内存访问保护违例。常常是用户应用程序企图访问特权级region。在这种情况下,入栈的PC给出的地址,就是产生问题的代码之所在 2. 跳转到不可执行指令的 regions 3. 异常返回时,使用了无效的EXC_RETURN值 4. 向量表中有无效的向量。 5. 在异常处理期间,入栈的PC值被破坏了\r\n"); // 取指访问违例 1. 内存访问保护违例。常常是用户应用程序企图访问特权级region。在这种情况下,入栈的PC给出的地址,就是产生问题的代码之所在 2. 跳转到不可执行指令的 regions 3. 异常返回时,使用了无效的EXC_RETURN值 4. 向量表中有无效的向量。例如,异常在向量建立之前就发生了,或者加载的是用于传统ARM内核的可执行映像 5. 在异常处理期间,入栈的PC值被破坏了 - } - else if(i & (1<<1)) - { - debug_printf("PRECISERR 在数据访问期间的总线错误。通过BFAR可以获取具体的地址。发生fault的原因同上。\r\n"); // 在数据访问期间的总线错误。通过BFAR可以获取具体的地址。发生fault的原因同上。 - } - else if(i & (1<<2)) - { - debug_printf("IMPRECISERR 与设备之间传送数据的过程中发生总线错误。可能是因为设备未经初始化而引起;或者在用户级访问了特权级的设备,或者传送的数据单位尺寸不能为设备所接受。此时,有可能是LDM/STM指令造成了非精确总线fault。\r\n"); // 与设备之间传送数据的过程中发生总线错误。可能是因为设备未经初始化而引起;或者在用户级访问了特权级的设备,或者传送的数据单位尺寸不能为设备所接受。此时,有可能是LDM/STM指令造成了非精确总线fault。 - } - else if(i & (1<<3)) - { - debug_printf("UNSTKERR (自动)出栈期间出错。如果没有发生过STKERR,则最可能的就是在异常处理期间把SP的值破坏了\r\n"); // (自动)出栈期间出错。如果没有发生过STKERR,则最可能的就是在异常处理期间把SP的值破坏了 - } - else if(i & (1<<4)) - { - debug_printf("STKERR (自动)入栈期间出错 1. 堆栈指针的值被破坏 2. 堆栈用量太大,到达了未定义存储器的区域 3. PSP未经初始化就使用\r\n"); // (自动)入栈期间出错 1. 堆栈指针的值被破坏 2. 堆栈用量太大,到达了未定义存储器的区域 3. PSP未经初始化就使用 - } - else if(i & (1<<5)) - { - debug_printf("BFARVALID 表示BFAR有效\r\n"); // 表示BFAR有效 - } - //debug_printf("\r\n"); - } - else if(exception==4) - { - i = *(byte*)(SCB_BASE + 0x28); -#ifdef STM32F10X - debug_printf("\r\nMemManage Fault %d 0x%08x: \r\n", i, SCB->MMFAR); -#endif - if(i & (1<<0)) - { - debug_printf("IACCVIOL 取指访问违例 1. 内存访问保护违例。常常是用户应用程序企图访问特权级region。在这种情况下,入栈的PC给出的地址,就是产生问题的代码之所在 2. 跳转到不可执行指令的 regions 3. 异常返回时,使用了无效的EXC_RETURN值 4. 向量表中有无效的向量。 5. 在异常处理期间,入栈的PC值被破坏了\r\n"); // 取指访问违例 1. 内存访问保护违例。常常是用户应用程序企图访问特权级region。在这种情况下,入栈的PC给出的地址,就是产生问题的代码之所在 2. 跳转到不可执行指令的 regions 3. 异常返回时,使用了无效的EXC_RETURN值 4. 向量表中有无效的向量。例如,异常在向量建立之前就发生了,或者加载的是用于传统ARM内核的可执行映像 5. 在异常处理期间,入栈的PC值被破坏了 - } - else if(i & (1<<1)) - { - debug_printf("DACCVIOL 数据内存访问保护违例。一般是访问非法内存位置所致。可以注意筛查野指针问题。\r\n"); // 内存访问保护违例。这是MPU发挥作用的体现。常常是用户应用程序企图访问特权级region所致 - } - else if(i & (1<<3)) - { - debug_printf("MUNSTKERR 出栈时发生错误 1. 异常服务例程破坏了堆栈指针 2. 异常服务例程更改了MPU配置\r\n"); // 出栈时发生错误 1. 异常服务例程破坏了堆栈指针 2. 异常服务例程更改了MPU配置 - } - else if(i & (1<<4)) - { - debug_printf("MSTKERR 入栈时发生错误 1. 堆栈指针的值被破坏 2. 堆栈容易过大,已经超出MPU允许的region范围\r\n"); // 入栈时发生错误 1. 堆栈指针的值被破坏 2. 堆栈容易过大,已经超出MPU允许的region范围 - } - else if(i & (1<<7)) - { - debug_printf("MMARVALID 表示MMAR有效\r\n"); // 表示MMAR有效 - } - } - else if(exception==6) - { - i = *(byte*)(SCB_BASE + 0x2A); - debug_printf("\r\nUsage Fault %d: \r\n", i); - if(i & (1<<0)) - { - debug_printf("UNDEFINSTR 执行的指令其编码是未定义的——解码不能\r\n"); // 执行的指令其编码是未定义的——解码不能 - } - else if(i & (1<<1)) - { - debug_printf("INVSTATE 试图切入ARM状态\r\n"); // 试图切入ARM状态 - } - else if(i & (1<<2)) - { - debug_printf("INVPC 在异常返回时试图非法地加载EXC_RETURN到PC\r\n"); // 在异常返回时试图非法地加载EXC_RETURN到PC。包括非法的指令,非法的上下文以及非法的EXC_RETURN值。The return PC指向的指令试图设置PC的值 - } - else if(i & (1<<3)) - { - debug_printf("NOCP 企图执行一个协处理器指令。引发此fault的指令可以从入栈的PC读取\r\n"); // 企图执行一个协处理器指令。引发此fault的指令可以从入栈的PC读取 - } - else if(i & (1<<4)) - { - debug_printf("UNALIGNED 当UNALIGN_TRP置位时发生未对齐访问。引发此fault的指令可以从入栈的PC读取\r\n"); // 当UNALIGN_TRP置位时发生未对齐访问。引发此fault的指令可以从入栈的PC读取 - } - else if(i & (1<<5)) - { - debug_printf("DIVBYZERO 表示除法运算时除数为零。引发此fault的指令可以从入栈的PC读取\r\n"); // 表示除法运算时除数为零(只有在DIV_0_TRP置位时才会发生)。引发此fault的指令可以从入栈的PC读取 - } - } + ShowFault(exception); #endif while(true); } - -#if !VEC_TABLE_ON_RAM -extern "C" -{ - void NMI_Handler() { FaultHandler(); } - void HardFault_Handler() { FaultHandler(); } - void MemManage_Handler() { FaultHandler(); } - void BusFault_Handler() { FaultHandler(); } - void UsageFault_Handler() { FaultHandler(); } - void SVC_Handler() { OnHandler(); } - void PendSV_Handler() { OnHandler(); } - void SysTick_Handler() { OnHandler(); } - void WWDG_IRQHandler() { OnHandler(); } - void PVD_IRQHandler() { OnHandler(); } - void RTC_IRQHandler() { OnHandler(); } - void FLASH_IRQHandler() { OnHandler(); } - void RCC_IRQHandler() { OnHandler(); } - void EXTI0_1_IRQHandler() { OnHandler(); } - void EXTI2_3_IRQHandler() { OnHandler(); } - void EXTI4_15_IRQHandler() { OnHandler(); } - void TS_IRQHandler() { OnHandler(); } - void DMA1_Channel1_IRQHandler() { OnHandler(); } - void DMA1_Channel2_3_IRQHandler() { OnHandler(); } - void DMA1_Channel4_5_IRQHandler() { OnHandler(); } - void ADC1_COMP_IRQHandler() { OnHandler(); } - void TIM1_BRK_UP_TRG_COM_IRQHandler() { OnHandler(); } - void TIM1_CC_IRQHandler() { OnHandler(); } - void TIM2_IRQHandler() { OnHandler(); } - void TIM3_IRQHandler() { OnHandler(); } - void TIM6_DAC_IRQHandler() { OnHandler(); } - void TIM14_IRQHandler() { OnHandler(); } - void TIM15_IRQHandler() { OnHandler(); } - void TIM16_IRQHandler() { OnHandler(); } - void TIM17_IRQHandler() { OnHandler(); } - void I2C1_IRQHandler() { OnHandler(); } - void I2C2_IRQHandler() { OnHandler(); } - void SPI1_IRQHandler() { OnHandler(); } - void SPI2_IRQHandler() { OnHandler(); } - void USART1_IRQHandler() { OnHandler(); } - void USART2_IRQHandler() { OnHandler(); } - void CEC_IRQHandler() { OnHandler(); } -} -#endif diff --git a/Interrupt.h b/Interrupt.h index efa5888a..c8251795 100644 --- a/Interrupt.h +++ b/Interrupt.h @@ -87,4 +87,11 @@ private: uint _state; }; +extern "C" +{ + void FaultHandler(void); + void UserHandler(void); + void ShowFault(uint exception); +} + #endif diff --git a/Platform/Boot_F0.cpp b/Platform/Boot_F0.cpp index 7fcfb032..2cf31369 100644 --- a/Platform/Boot_F0.cpp +++ b/Platform/Boot_F0.cpp @@ -98,4 +98,44 @@ extern "C" /* Wait till PLL is used as system clock source */ while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL) { } } + +#if !VEC_TABLE_ON_RAM + void NMI_Handler() { FaultHandler(); } + void HardFault_Handler() { FaultHandler(); } + void MemManage_Handler() { FaultHandler(); } + void BusFault_Handler() { FaultHandler(); } + void UsageFault_Handler() { FaultHandler(); } + void SVC_Handler() { UserHandler(); } + void PendSV_Handler() { UserHandler(); } + void SysTick_Handler() { UserHandler(); } + void WWDG_IRQHandler() { UserHandler(); } + void PVD_IRQHandler() { UserHandler(); } + void RTC_IRQHandler() { UserHandler(); } + void FLASH_IRQHandler() { UserHandler(); } + void RCC_IRQHandler() { UserHandler(); } + void EXTI0_1_IRQHandler() { UserHandler(); } + void EXTI2_3_IRQHandler() { UserHandler(); } + void EXTI4_15_IRQHandler() { UserHandler(); } + void TS_IRQHandler() { UserHandler(); } + void DMA1_Channel1_IRQHandler() { UserHandler(); } + void DMA1_Channel2_3_IRQHandler() { UserHandler(); } + void DMA1_Channel4_5_IRQHandler() { UserHandler(); } + void ADC1_COMP_IRQHandler() { UserHandler(); } + void TIM1_BRK_UP_TRG_COM_IRQHandler() { UserHandler(); } + void TIM1_CC_IRQHandler() { UserHandler(); } + void TIM2_IRQHandler() { UserHandler(); } + void TIM3_IRQHandler() { UserHandler(); } + void TIM6_DAC_IRQHandler() { UserHandler(); } + void TIM14_IRQHandler() { UserHandler(); } + void TIM15_IRQHandler() { UserHandler(); } + void TIM16_IRQHandler() { UserHandler(); } + void TIM17_IRQHandler() { UserHandler(); } + void I2C1_IRQHandler() { UserHandler(); } + void I2C2_IRQHandler() { UserHandler(); } + void SPI1_IRQHandler() { UserHandler(); } + void SPI2_IRQHandler() { UserHandler(); } + void USART1_IRQHandler() { UserHandler(); } + void USART2_IRQHandler() { UserHandler(); } + void CEC_IRQHandler() { UserHandler(); } +#endif } diff --git a/Platform/Boot_F1.cpp b/Platform/Boot_F1.cpp index 8f7f660b..997738e0 100644 --- a/Platform/Boot_F1.cpp +++ b/Platform/Boot_F1.cpp @@ -165,4 +165,46 @@ extern "C" SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ #endif } + +#if !VEC_TABLE_ON_RAM + /*void NMI_Handler() { FaultHandler(); } + void HardFault_Handler() { FaultHandler(); } + void MemManage_Handler() { FaultHandler(); } + void BusFault_Handler() { FaultHandler(); } + void UsageFault_Handler() { FaultHandler(); }*/ + /*void SVC_Handler() { UserHandler(); } + void DebugMon_Handler() { UserHandler(); } + void PendSV_Handler() { UserHandler(); } + void SysTick_Handler() { UserHandler(); } + + void WWDG_IRQHandler() { UserHandler(); } + void PVD_IRQHandler() { UserHandler(); } + void RTC_IRQHandler() { UserHandler(); } + void FLASH_IRQHandler() { UserHandler(); } + void RCC_IRQHandler() { UserHandler(); } + void EXTI0_1_IRQHandler() { UserHandler(); } + void EXTI2_3_IRQHandler() { UserHandler(); } + void EXTI4_15_IRQHandler() { UserHandler(); } + void TS_IRQHandler() { UserHandler(); } + void DMA1_Channel1_IRQHandler() { UserHandler(); } + void DMA1_Channel2_3_IRQHandler() { UserHandler(); } + void DMA1_Channel4_5_IRQHandler() { UserHandler(); } + void ADC1_COMP_IRQHandler() { UserHandler(); } + void TIM1_BRK_UP_TRG_COM_IRQHandler() { UserHandler(); } + void TIM1_CC_IRQHandler() { UserHandler(); } + void TIM2_IRQHandler() { UserHandler(); } + void TIM3_IRQHandler() { UserHandler(); } + void TIM6_DAC_IRQHandler() { UserHandler(); } + void TIM14_IRQHandler() { UserHandler(); } + void TIM15_IRQHandler() { UserHandler(); } + void TIM16_IRQHandler() { UserHandler(); } + void TIM17_IRQHandler() { UserHandler(); } + void I2C1_IRQHandler() { UserHandler(); } + void I2C2_IRQHandler() { UserHandler(); } + void SPI1_IRQHandler() { UserHandler(); } + void SPI2_IRQHandler() { UserHandler(); } + void USART1_IRQHandler() { UserHandler(); } + void USART2_IRQHandler() { UserHandler(); } + void CEC_IRQHandler() { UserHandler(); }*/ +#endif } diff --git a/Platform/Boot_F4.cpp b/Platform/Boot_F4.cpp index 2423d1c9..0a5425b7 100644 --- a/Platform/Boot_F4.cpp +++ b/Platform/Boot_F4.cpp @@ -131,4 +131,44 @@ extern "C" SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ #endif } + +#if !VEC_TABLE_ON_RAM + void NMI_Handler() { FaultHandler(); } + void HardFault_Handler() { FaultHandler(); } + void MemManage_Handler() { FaultHandler(); } + void BusFault_Handler() { FaultHandler(); } + void UsageFault_Handler() { FaultHandler(); } + void SVC_Handler() { UserHandler(); } + void PendSV_Handler() { UserHandler(); } + void SysTick_Handler() { UserHandler(); } + void WWDG_IRQHandler() { UserHandler(); } + void PVD_IRQHandler() { UserHandler(); } + void RTC_IRQHandler() { UserHandler(); } + void FLASH_IRQHandler() { UserHandler(); } + void RCC_IRQHandler() { UserHandler(); } + void EXTI0_1_IRQHandler() { UserHandler(); } + void EXTI2_3_IRQHandler() { UserHandler(); } + void EXTI4_15_IRQHandler() { UserHandler(); } + void TS_IRQHandler() { UserHandler(); } + void DMA1_Channel1_IRQHandler() { UserHandler(); } + void DMA1_Channel2_3_IRQHandler() { UserHandler(); } + void DMA1_Channel4_5_IRQHandler() { UserHandler(); } + void ADC1_COMP_IRQHandler() { UserHandler(); } + void TIM1_BRK_UP_TRG_COM_IRQHandler() { UserHandler(); } + void TIM1_CC_IRQHandler() { UserHandler(); } + void TIM2_IRQHandler() { UserHandler(); } + void TIM3_IRQHandler() { UserHandler(); } + void TIM6_DAC_IRQHandler() { UserHandler(); } + void TIM14_IRQHandler() { UserHandler(); } + void TIM15_IRQHandler() { UserHandler(); } + void TIM16_IRQHandler() { UserHandler(); } + void TIM17_IRQHandler() { UserHandler(); } + void I2C1_IRQHandler() { UserHandler(); } + void I2C2_IRQHandler() { UserHandler(); } + void SPI1_IRQHandler() { UserHandler(); } + void SPI2_IRQHandler() { UserHandler(); } + void USART1_IRQHandler() { UserHandler(); } + void USART2_IRQHandler() { UserHandler(); } + void CEC_IRQHandler() { UserHandler(); } +#endif } diff --git a/Platform/startup_stm32f10x.s b/Platform/startup_stm32f10x.s new file mode 100644 index 00000000..bb47d3c4 --- /dev/null +++ b/Platform/startup_stm32f10x.s @@ -0,0 +1,135 @@ +; 栈空间意义不大,SmartOS将会重新设定到RAM最大值,这里分配的栈空间仅用于TSys构造函数重新指定栈之前 +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + +; 因为SmartOS需要大量分配内存,这里设定一个较大的值,在内存充足时尽可能分配到最大 。堆空间不足时malloc将引发异常 +Heap_Size EQU 0x00004000 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + + IF :DEF:GD32 + IMPORT FaultHandler + IMPORT UserHandler + DCD FaultHandler ; NMI Handler + DCD FaultHandler ; Hard Fault Handler + DCD FaultHandler ; MPU Fault Handler + DCD FaultHandler ; Bus Fault Handler + DCD FaultHandler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD UserHandler ; SVCall Handler + DCD UserHandler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD UserHandler ; PendSV Handler + DCD UserHandler ; SysTick Handler + + ; External Interrupts + DCD UserHandler ; Window Watchdog + DCD UserHandler ; PVD through EXTI Line detect + DCD UserHandler ; Tamper + DCD UserHandler ; RTC + DCD UserHandler ; Flash + DCD UserHandler ; RCC + DCD UserHandler ; EXTI Line 0 + DCD UserHandler ; EXTI Line 1 + DCD UserHandler ; EXTI Line 2 + DCD UserHandler ; EXTI Line 3 + DCD UserHandler ; EXTI Line 4 + DCD UserHandler ; DMA1 Channel 1 + DCD UserHandler ; DMA1 Channel 2 + DCD UserHandler ; DMA1 Channel 3 + DCD UserHandler ; DMA1 Channel 4 + DCD UserHandler ; DMA1 Channel 5 + DCD UserHandler ; DMA1 Channel 6 + DCD UserHandler ; DMA1 Channel 7 + DCD UserHandler ; ADC1 & ADC2 + DCD UserHandler ; USB High Priority or CAN1 TX + DCD UserHandler ; USB Low Priority or CAN1 RX0 + DCD UserHandler ; CAN1 RX1 + DCD UserHandler ; CAN1 SCE + DCD UserHandler ; EXTI Line 9..5 + DCD UserHandler ; TIM1 Break + DCD UserHandler ; TIM1 Update + DCD UserHandler ; TIM1 Trigger and Commutation + DCD UserHandler ; TIM1 Capture Compare + DCD UserHandler ; TIM2 + DCD UserHandler ; TIM3 + DCD UserHandler ; TIM4 + DCD UserHandler ; I2C1 Event + DCD UserHandler ; I2C1 Error + DCD UserHandler ; I2C2 Event + DCD UserHandler ; I2C2 Error + DCD UserHandler ; SPI1 + DCD UserHandler ; SPI2 + DCD UserHandler ; USART1 + DCD UserHandler ; USART2 + DCD UserHandler ; USART3 + DCD UserHandler ; EXTI Line 15..10 + DCD UserHandler ; RTC Alarm through EXTI Line + DCD UserHandler ; USB Wakeup from suspend + DCD UserHandler ; TIM8 Break + DCD UserHandler ; TIM8 Update + DCD UserHandler ; TIM8 Trigger and Commutation + DCD UserHandler ; TIM8 Capture Compare + DCD UserHandler ; ADC3 + DCD UserHandler ; FSMC + DCD UserHandler ; SDIO + DCD UserHandler ; TIM5 + DCD UserHandler ; SPI3 + DCD UserHandler ; UART4 + DCD UserHandler ; UART5 + DCD UserHandler ; TIM6 + DCD UserHandler ; TIM7 + DCD UserHandler ; DMA2 Channel1 + DCD UserHandler ; DMA2 Channel2 + DCD UserHandler ; DMA2 Channel3 + DCD UserHandler ; DMA2 Channel4 & Channel5 + ENDIF +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + IMPORT SystemInit + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + END diff --git a/Platform/startup_stm32f10x_gd.s b/Platform/startup_stm32f10x_gd.s index a243aa27..106eb369 100644 --- a/Platform/startup_stm32f10x_gd.s +++ b/Platform/startup_stm32f10x_gd.s @@ -25,11 +25,11 @@ __heap_limit __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler + DCD FaultHandler ; NMI Handler + DCD FaultHandler ; Hard Fault Handler + DCD FaultHandler ; MPU Fault Handler + DCD FaultHandler ; Bus Fault Handler + DCD FaultHandler ; Usage Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved @@ -117,204 +117,14 @@ Reset_Handler PROC LDR R0, =__main BX R0 ENDP - -; Dummy Exception Handlers (infinite loops which can be modified) - -NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP -HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP -MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP -BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP -UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP -SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP -DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP -PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP -SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP - -Default_Handler PROC - - EXPORT WWDG_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMPER_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FLASH_IRQHandler [WEAK] - EXPORT RCC_IRQHandler [WEAK] - EXPORT EXTI0_IRQHandler [WEAK] - EXPORT EXTI1_IRQHandler [WEAK] - EXPORT EXTI2_IRQHandler [WEAK] - EXPORT EXTI3_IRQHandler [WEAK] - EXPORT EXTI4_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_IRQHandler [WEAK] - EXPORT DMA1_Channel3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_IRQHandler [WEAK] - EXPORT DMA1_Channel5_IRQHandler [WEAK] - EXPORT DMA1_Channel6_IRQHandler [WEAK] - EXPORT DMA1_Channel7_IRQHandler [WEAK] - EXPORT ADC1_2_IRQHandler [WEAK] - EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK] - EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK] - EXPORT CAN1_RX1_IRQHandler [WEAK] - EXPORT CAN1_SCE_IRQHandler [WEAK] - EXPORT EXTI9_5_IRQHandler [WEAK] - EXPORT TIM1_BRK_IRQHandler [WEAK] - EXPORT TIM1_UP_IRQHandler [WEAK] - EXPORT TIM1_TRG_COM_IRQHandler [WEAK] - EXPORT TIM1_CC_IRQHandler [WEAK] - EXPORT TIM2_IRQHandler [WEAK] - EXPORT TIM3_IRQHandler [WEAK] - EXPORT TIM4_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT I2C2_EV_IRQHandler [WEAK] - EXPORT I2C2_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT USART3_IRQHandler [WEAK] - EXPORT EXTI15_10_IRQHandler [WEAK] - EXPORT RTCAlarm_IRQHandler [WEAK] - EXPORT USBWakeUp_IRQHandler [WEAK] - EXPORT TIM8_BRK_IRQHandler [WEAK] - EXPORT TIM8_UP_IRQHandler [WEAK] - EXPORT TIM8_TRG_COM_IRQHandler [WEAK] - EXPORT TIM8_CC_IRQHandler [WEAK] - EXPORT ADC3_IRQHandler [WEAK] - EXPORT FSMC_IRQHandler [WEAK] - EXPORT SDIO_IRQHandler [WEAK] - EXPORT TIM5_IRQHandler [WEAK] - EXPORT SPI3_IRQHandler [WEAK] - EXPORT UART4_IRQHandler [WEAK] - EXPORT UART5_IRQHandler [WEAK] - EXPORT TIM6_IRQHandler [WEAK] - EXPORT TIM7_IRQHandler [WEAK] - EXPORT DMA2_Channel1_IRQHandler [WEAK] - EXPORT DMA2_Channel2_IRQHandler [WEAK] - EXPORT DMA2_Channel3_IRQHandler [WEAK] - EXPORT DMA2_Channel4_5_IRQHandler [WEAK] - -WWDG_IRQHandler -PVD_IRQHandler -TAMPER_IRQHandler -RTC_IRQHandler -FLASH_IRQHandler -RCC_IRQHandler -EXTI0_IRQHandler -EXTI1_IRQHandler -EXTI2_IRQHandler -EXTI3_IRQHandler -EXTI4_IRQHandler -DMA1_Channel1_IRQHandler -DMA1_Channel2_IRQHandler -DMA1_Channel3_IRQHandler -DMA1_Channel4_IRQHandler -DMA1_Channel5_IRQHandler -DMA1_Channel6_IRQHandler -DMA1_Channel7_IRQHandler -ADC1_2_IRQHandler -USB_HP_CAN1_TX_IRQHandler -USB_LP_CAN1_RX0_IRQHandler -CAN1_RX1_IRQHandler -CAN1_SCE_IRQHandler -EXTI9_5_IRQHandler -TIM1_BRK_IRQHandler -TIM1_UP_IRQHandler -TIM1_TRG_COM_IRQHandler -TIM1_CC_IRQHandler -TIM2_IRQHandler -TIM3_IRQHandler -TIM4_IRQHandler -I2C1_EV_IRQHandler -I2C1_ER_IRQHandler -I2C2_EV_IRQHandler -I2C2_ER_IRQHandler -SPI1_IRQHandler -SPI2_IRQHandler -USART1_IRQHandler -USART2_IRQHandler -USART3_IRQHandler -EXTI15_10_IRQHandler -RTCAlarm_IRQHandler -USBWakeUp_IRQHandler -TIM8_BRK_IRQHandler -TIM8_UP_IRQHandler -TIM8_TRG_COM_IRQHandler -TIM8_CC_IRQHandler -ADC3_IRQHandler -FSMC_IRQHandler -SDIO_IRQHandler -TIM5_IRQHandler -SPI3_IRQHandler -UART4_IRQHandler -UART5_IRQHandler -TIM6_IRQHandler -TIM7_IRQHandler -DMA2_Channel1_IRQHandler -DMA2_Channel2_IRQHandler -DMA2_Channel3_IRQHandler -DMA2_Channel4_5_IRQHandler - B . - - ENDP ALIGN ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* - IF :DEF:__MICROLIB - EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit - - ELSE - - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap - -__user_initial_stackheap - - LDR R0, = Heap_Mem - LDR R1, =(Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR - - ALIGN - - ENDIF END diff --git a/Platform/startup_stm32f10x_hd.s b/Platform/startup_stm32f10x_hd.s index 8778cdf4..1781e2d8 100644 --- a/Platform/startup_stm32f10x_hd.s +++ b/Platform/startup_stm32f10x_hd.s @@ -23,21 +23,99 @@ __heap_limit EXPORT __Vectors_End EXPORT __Vectors_Size -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler +IF GD32 = "1" + DCD FaultHandler ; NMI Handler + DCD FaultHandler ; Hard Fault Handler + DCD FaultHandler ; MPU Fault Handler + DCD FaultHandler ; Bus Fault Handler + DCD FaultHandler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD UserHandler ; SVCall Handler + DCD UserHandler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD UserHandler ; PendSV Handler + DCD UserHandler ; SysTick Handler + + ; External Interrupts + DCD UserHandler ; Window Watchdog + DCD UserHandler ; PVD through EXTI Line detect + DCD UserHandler ; Tamper + DCD UserHandler ; RTC + DCD UserHandler ; Flash + DCD UserHandler ; RCC + DCD UserHandler ; EXTI Line 0 + DCD UserHandler ; EXTI Line 1 + DCD UserHandler ; EXTI Line 2 + DCD UserHandler ; EXTI Line 3 + DCD UserHandler ; EXTI Line 4 + DCD UserHandler ; DMA1 Channel 1 + DCD UserHandler ; DMA1 Channel 2 + DCD UserHandler ; DMA1 Channel 3 + DCD UserHandler ; DMA1 Channel 4 + DCD UserHandler ; DMA1 Channel 5 + DCD UserHandler ; DMA1 Channel 6 + DCD UserHandler ; DMA1 Channel 7 + DCD UserHandler ; ADC1 & ADC2 + DCD UserHandler ; USB High Priority or CAN1 TX + DCD UserHandler ; USB Low Priority or CAN1 RX0 + DCD UserHandler ; CAN1 RX1 + DCD UserHandler ; CAN1 SCE + DCD UserHandler ; EXTI Line 9..5 + DCD UserHandler ; TIM1 Break + DCD UserHandler ; TIM1 Update + DCD UserHandler ; TIM1 Trigger and Commutation + DCD UserHandler ; TIM1 Capture Compare + DCD UserHandler ; TIM2 + DCD UserHandler ; TIM3 + DCD UserHandler ; TIM4 + DCD UserHandler ; I2C1 Event + DCD UserHandler ; I2C1 Error + DCD UserHandler ; I2C2 Event + DCD UserHandler ; I2C2 Error + DCD UserHandler ; SPI1 + DCD UserHandler ; SPI2 + DCD UserHandler ; USART1 + DCD UserHandler ; USART2 + DCD UserHandler ; USART3 + DCD UserHandler ; EXTI Line 15..10 + DCD UserHandler ; RTC Alarm through EXTI Line + DCD UserHandler ; USB Wakeup from suspend + DCD UserHandler ; TIM8 Break + DCD UserHandler ; TIM8 Update + DCD UserHandler ; TIM8 Trigger and Commutation + DCD UserHandler ; TIM8 Capture Compare + DCD UserHandler ; ADC3 + DCD UserHandler ; FSMC + DCD UserHandler ; SDIO + DCD UserHandler ; TIM5 + DCD UserHandler ; SPI3 + DCD UserHandler ; UART4 + DCD UserHandler ; UART5 + DCD UserHandler ; TIM6 + DCD UserHandler ; TIM7 + DCD UserHandler ; DMA2 Channel1 + DCD UserHandler ; DMA2 Channel2 + DCD UserHandler ; DMA2 Channel3 + DCD UserHandler ; DMA2 Channel4 & Channel5 +ENDIF __Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors AREA |.text|, CODE, READONLY - + ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit - BLX R0 + BLX R0 LDR R0, =__main BX R0 ENDP @@ -51,5 +129,4 @@ Reset_Handler PROC EXPORT __heap_base EXPORT __heap_limit - END diff --git a/Sys.h b/Sys.h index 57145274..33496a70 100644 --- a/Sys.h +++ b/Sys.h @@ -141,7 +141,6 @@ __inline void debug_printf( const char *format, ... ) {} #include "Time.h" #include "Interrupt.h" - #endif //_Sys_H_ /*