[应用相关] 在ram中调试stm32程序

[复制链接]
1751|13
 楼主| 欢乐家园 发表于 2021-7-21 22:49 | 显示全部楼层 |阅读模式
在ram中调试stm32程序,好处有3个:
其一:**烧写速度快,
其二:再也不用担心会把flash给擦写到坏掉,如果碰到一个比较大一点嵌入式项目,烧写调试上千次是有可能的。但是不清楚芯片内部的flash是norflash还是slc类型的nandflash,总之,闪存芯片的擦写次数是有寿命限制的。
其三:可以更深入的理解芯片存储模型和启动机制。

 楼主| 欢乐家园 发表于 2021-7-21 22:50 | 显示全部楼层
同时,在ram中调试stm32程序,方式也有3个:
第一:在mdk开发环境中进入调试模式,通过载入一个初始化文件,内容如下:
 楼主| 欢乐家园 发表于 2021-7-21 22:51 | 显示全部楼层
  1. /*----------------------------------------------------------------------------
  2.   Setup()  configure PC & SP for RAM Debug
  3. *----------------------------------------------------------------------------*/
  4. FUNC void Setup (void) {
  5.   SP = _RDWORD(0x20000000);          // Setup Stack Pointer
  6.   PC = _RDWORD(0x20000004);          // Setup Program Counter
  7.   _WDWORD(0xE000ED08, 0x20000000);   // Setup Vector Table Offset Register
  8. }

  9. LOAD %L INCREMENTAL                  // load the application

  10. Setup();                             // Setup for Running

  11. g, main
 楼主| 欢乐家园 发表于 2021-7-21 22:52 | 显示全部楼层
第二:通过芯片内置的bootloader程序和相关烧写工具(mcuisp),烧写完成后bootloader程序自动跳转dao相关内存地址开始执行新程序。但是bootloader烧写算法本身会消耗一定数量deram,需要根据不同芯片做出处理,主要是code烧写和中断向量表必须加上固定大小的偏移。
 楼主| 欢乐家园 发表于 2021-7-21 22:53 | 显示全部楼层
第三:自己编写一个引导程序烧写到flash中,每次重启芯片后固定从0x8000000地址处开始执行,然后再跳转到ram中的程序代码处执行。
 楼主| 欢乐家园 发表于 2021-7-21 22:55 | 显示全部楼层
主要有两个步骤,设置堆栈顶指针sp,然后再跳转到ResetHandler处执行。
 楼主| 欢乐家园 发表于 2021-7-21 22:56 | 显示全部楼层
因为cortexM3芯片的中断向量表示放在执行程序的最前面的,如下所示
 楼主| 欢乐家园 发表于 2021-7-21 22:56 | 显示全部楼层
  1. __Vectors       DCD     __initial_sp                      ; Top of Stack
  2.                 DCD     Reset_Handler                     ; Reset Handler
  3.                 DCD     NMI_Handler                       ; NMI Handler
  4.                 DCD     HardFault_Handler                 ; Hard Fault Handler
  5.                 DCD     MemManage_Handler                 ; MPU Fault Handler
  6.                 DCD     BusFault_Handler                  ; Bus Fault Handler
  7.                 DCD     UsageFault_Handler                ; Usage Fault Handler
  8.                 DCD     0                                 ; Reserved
  9.                 DCD     0                                 ; Reserved
  10.                 DCD     0                                 ; Reserved
  11.                 DCD     0                                 ; Reserved
  12.                 DCD     SVC_Handler                       ; SVCall Handler
  13.                 DCD     DebugMon_Handler                  ; Debug Monitor Handler
  14.                 DCD     0                                 ; Reserved
  15.                 DCD     PendSV_Handler                    ; PendSV Handler
  16.                 DCD     SysTick_Handler                   ; SysTick Handler

  17.                 ; External Interrupts
  18.                 DCD     WWDG_IRQHandler                   ; Window WatchDog interrupt ( wwdg1_it)                                         
  19.                 DCD     PVD_AVD_IRQHandler                ; PVD/AVD through EXTI Line detection                        
  20.                 DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line            
  21.                 DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line                       
  22.                 DCD     FLASH_IRQHandler                  ; FLASH                                          
  23.                 DCD     RCC_IRQHandler                    ; RCC                                             
  24.                 DCD     EXTI0_IRQHandler                  ; EXTI Line0                                             
  25.                 DCD     EXTI1_IRQHandler                  ; EXTI Line1                                             
  26.                 DCD     EXTI2_IRQHandler                  ; EXTI Line2                                             
  27.                 DCD     EXTI3_IRQHandler                  ; EXTI Line3                                             
  28.                 DCD     EXTI4_IRQHandler                  ; EXTI Line4
  29.                 DCD     DMA1_Stream0_IRQHandler           ; DMA1 Stream 0
  30.                 DCD     DMA1_Stream1_IRQHandler           ; DMA1 Stream 1                                   
  31.                 DCD     DMA1_Stream2_IRQHandler           ; DMA1 Stream 2                                   
  32.                 DCD     DMA1_Stream3_IRQHandler           ; DMA1 Stream 3                                   
  33.                 DCD     DMA1_Stream4_IRQHandler           ; DMA1 Stream 4                                   
  34.                 DCD     DMA1_Stream5_IRQHandler           ; DMA1 Stream 5                                   
  35.                 DCD     DMA1_Stream6_IRQHandler           ; DMA1 Stream 6  
  36.                 DCD     ADC_IRQHandler                    ; ADC1, ADC2                             
  37.                 DCD     FDCAN1_IT0_IRQHandler             ; FDCAN1 interrupt line 0                        
  38.                 DCD     FDCAN2_IT0_IRQHandler             ; FDCAN2 interrupt line 0                              
  39.                 DCD     FDCAN1_IT1_IRQHandler             ; FDCAN1 interrupt line 1                        
  40.                 DCD     FDCAN2_IT1_IRQHandler             ; FDCAN2 interrupt line 1                                               
  41.                 DCD     EXTI9_5_IRQHandler                ; External Line[9:5]s                                    
  42.                 DCD     TIM1_BRK_IRQHandler               ; TIM1 Break interrupt                  
  43.                 DCD     TIM1_UP_IRQHandler                ; TIM1 Update Interrupt                 
  44.                 DCD     TIM1_TRG_COM_IRQHandler           ; TIM1 Trigger and Commutation Interrupt
  45.                 DCD     TIM1_CC_IRQHandler                ; TIM1 Capture Compare                                   
  46.                 DCD     TIM2_IRQHandler                   ; TIM2                                            
  47.                 DCD     TIM3_IRQHandler                   ; TIM3                                            
  48.                 DCD     TIM4_IRQHandler                   ; TIM4                                            
  49.                 DCD     I2C1_EV_IRQHandler                ; I2C1 Event                                             
  50.                 DCD     I2C1_ER_IRQHandler                ; I2C1 Error                                             
  51.                 DCD     I2C2_EV_IRQHandler                ; I2C2 Event                                             
  52.                 DCD     I2C2_ER_IRQHandler                ; I2C2 Error                                               
  53.                 DCD     SPI1_IRQHandler                   ; SPI1                                            
  54.                 DCD     SPI2_IRQHandler                   ; SPI2                                            
  55.                 DCD     USART1_IRQHandler                 ; USART1                                          
  56.                 DCD     USART2_IRQHandler                 ; USART2                                          
  57.                 DCD     USART3_IRQHandler                 ; USART3                                          
  58.                 DCD     EXTI15_10_IRQHandler              ; External Line[15:10]  
  59.                 DCD     RTC_Alarm_IRQHandler              ; RTC Alarm (A and B) through EXTI Line
  60.                 DCD     0                                 ; Reserved                                          
  61.                 DCD     TIM8_BRK_TIM12_IRQHandler         ; TIM8 Break Interrupt and TIM12 global interrupt                 
  62.                 DCD     TIM8_UP_TIM13_IRQHandler          ; TIM8 Update Interrupt and TIM13 global interrupt
  63.                 DCD     TIM8_TRG_COM_TIM14_IRQHandler     ; TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt
  64.                 DCD     TIM8_CC_IRQHandler                ; TIM8 Capture Compare Interrupt
  65.                 DCD     DMA1_Stream7_IRQHandler           ; DMA1 Stream7                                          
  66.                 DCD     FMC_IRQHandler                    ; FMC                             
  67.                 DCD     SDMMC1_IRQHandler                 ; SDMMC1                           
  68.                 DCD     TIM5_IRQHandler                   ; TIM5                           
  69.                 DCD     SPI3_IRQHandler                   ; SPI3                           
  70.                 DCD     UART4_IRQHandler                  ; UART4                           
  71.                 DCD     UART5_IRQHandler                  ; UART5                           
  72.                 DCD     TIM6_DAC_IRQHandler               ; TIM6 and DAC1&2 underrun errors           
  73.                 DCD     TIM7_IRQHandler                   ; TIM7           
  74.                 DCD     DMA2_Stream0_IRQHandler           ; DMA2 Stream 0                  
  75.                 DCD     DMA2_Stream1_IRQHandler           ; DMA2 Stream 1                  
  76.                 DCD     DMA2_Stream2_IRQHandler           ; DMA2 Stream 2                  
  77.                 DCD     DMA2_Stream3_IRQHandler           ; DMA2 Stream 3                  
  78.                 DCD     DMA2_Stream4_IRQHandler           ; DMA2 Stream 4                  
  79.                 DCD     ETH_IRQHandler                    ; Ethernet                        
  80.                 DCD     ETH_WKUP_IRQHandler               ; Ethernet Wakeup through EXTI line              
  81.                 DCD     FDCAN_CAL_IRQHandler              ; FDCAN calibration unit interrupt                        
  82.                 DCD     0                                 ; Reserved                              
  83.                 DCD     0                                 ; Reserved
  84.                 DCD     0                                 ; Reserved
  85.                 DCD     0                                 ; Reserved                     
  86.                 DCD     DMA2_Stream5_IRQHandler           ; DMA2 Stream 5                  
  87.                 DCD     DMA2_Stream6_IRQHandler           ; DMA2 Stream 6                  
  88.                 DCD     DMA2_Stream7_IRQHandler           ; DMA2 Stream 7                  
  89.                 DCD     USART6_IRQHandler                 ; USART6                           
  90.                 DCD     I2C3_EV_IRQHandler                ; I2C3 event                             
  91.                 DCD     I2C3_ER_IRQHandler                ; I2C3 error                             
  92.                 DCD     OTG_HS_EP1_OUT_IRQHandler         ; USB OTG HS End Point 1 Out                     
  93.                 DCD     OTG_HS_EP1_IN_IRQHandler          ; USB OTG HS End Point 1 In                       
  94.                 DCD     OTG_HS_WKUP_IRQHandler            ; USB OTG HS Wakeup through EXTI                        
  95.                 DCD     OTG_HS_IRQHandler                 ; USB OTG HS                    
  96.                 DCD     DCMI_IRQHandler                   ; DCMI                           
  97.                 DCD     0                                 ; Reserved                                    
  98.                 DCD     RNG_IRQHandler                    ; Rng
  99.                 DCD     FPU_IRQHandler                    ; FPU
  100.                 DCD     UART7_IRQHandler                  ; UART7
  101.                 DCD     UART8_IRQHandler                  ; UART8
  102.                 DCD     SPI4_IRQHandler                   ; SPI4
  103.                 DCD     SPI5_IRQHandler                   ; SPI5
  104.                 DCD     SPI6_IRQHandler                   ; SPI6
  105.                 DCD     SAI1_IRQHandler                   ; SAI1
  106.                 DCD     LTDC_IRQHandler                   ; LTDC
  107.                 DCD     LTDC_ER_IRQHandler                ; LTDC error
  108.                 DCD     DMA2D_IRQHandler                  ; DMA2D
  109.                 DCD     SAI2_IRQHandler                   ; SAI2
  110.                 DCD     QUADSPI_IRQHandler                ; QUADSPI
  111.                 DCD     LPTIM1_IRQHandler                 ; LPTIM1
  112.                 DCD     CEC_IRQHandler                    ; HDMI_CEC
  113.                 DCD     I2C4_EV_IRQHandler                ; I2C4 Event                             
  114.                 DCD     I2C4_ER_IRQHandler                ; I2C4 Error
  115.                 DCD     SPDIF_RX_IRQHandler               ; SPDIF_RX
  116.                 DCD     OTG_FS_EP1_OUT_IRQHandler         ; USB OTG FS End Point 1 Out                     
  117.                 DCD     OTG_FS_EP1_IN_IRQHandler          ; USB OTG FS End Point 1 In                       
  118.                 DCD     OTG_FS_WKUP_IRQHandler            ; USB OTG FS Wakeup through EXTI                        
  119.                 DCD     OTG_FS_IRQHandler                 ; USB OTG FS                 
  120.                 DCD     DMAMUX1_OVR_IRQHandler            ; DMAMUX1 Overrun interrupt  
  121.                 DCD     HRTIM1_Master_IRQHandler          ; HRTIM Master Timer global Interrupts                              
  122.                 DCD     HRTIM1_TIMA_IRQHandler            ; HRTIM Timer A global Interrupt                                    
  123.                 DCD     HRTIM1_TIMB_IRQHandler            ; HRTIM Timer B global Interrupt                                    
  124.                 DCD     HRTIM1_TIMC_IRQHandler            ; HRTIM Timer C global Interrupt                                    
  125.                 DCD     HRTIM1_TIMD_IRQHandler            ; HRTIM Timer D global Interrupt                                    
  126.                 DCD     HRTIM1_TIME_IRQHandler            ; HRTIM Timer E global Interrupt                                    
  127.                 DCD     HRTIM1_FLT_IRQHandler             ; HRTIM Fault global Interrupt
  128.                 DCD     DFSDM1_FLT0_IRQHandler            ; DFSDM Filter0 Interrupt   
  129.                 DCD     DFSDM1_FLT1_IRQHandler            ; DFSDM Filter1 Interrupt                                            
  130.                 DCD     DFSDM1_FLT2_IRQHandler            ; DFSDM Filter2 Interrupt                                            
  131.                 DCD     DFSDM1_FLT3_IRQHandler            ; DFSDM Filter3 Interrupt                                                                                    
  132.                 DCD     SAI3_IRQHandler                   ; SAI3 global Interrupt                                             
  133.                 DCD     SWPMI1_IRQHandler                 ; Serial Wire Interface 1 global interrupt                          
  134.                 DCD     TIM15_IRQHandler                  ; TIM15 global Interrupt                                            
  135.                 DCD     TIM16_IRQHandler                  ; TIM16 global Interrupt                                            
  136.                 DCD     TIM17_IRQHandler                  ; TIM17 global Interrupt                                            
  137.                 DCD     MDIOS_WKUP_IRQHandler             ; MDIOS Wakeup  Interrupt                                          
  138.                 DCD     MDIOS_IRQHandler                  ; MDIOS global Interrupt                                            
  139.                 DCD     JPEG_IRQHandler                   ; JPEG global Interrupt                                             
  140.                 DCD     MDMA_IRQHandler                   ; MDMA global Interrupt                                             
  141.                 DCD     0                                 ; Reserved                                               
  142.                 DCD     SDMMC2_IRQHandler                 ; SDMMC2 global Interrupt                                          
  143.                 DCD     HSEM1_IRQHandler                  ; HSEM1 global Interrupt                                             
  144.                 DCD     0                                 ; Reserved                                             
  145.                 DCD     ADC3_IRQHandler                   ; ADC3 global Interrupt                                             
  146.                 DCD     DMAMUX2_OVR_IRQHandler            ; DMAMUX Overrun interrupt                                          
  147.                 DCD     BDMA_Channel0_IRQHandler          ; BDMA Channel 0 global Interrupt                                    
  148.                 DCD     BDMA_Channel1_IRQHandler          ; BDMA Channel 1 global Interrupt                                    
  149.                 DCD     BDMA_Channel2_IRQHandler          ; BDMA Channel 2 global Interrupt                                    
  150.                 DCD     BDMA_Channel3_IRQHandler          ; BDMA Channel 3 global Interrupt                                    
  151.                 DCD     BDMA_Channel4_IRQHandler          ; BDMA Channel 4 global Interrupt                                    
  152.                 DCD     BDMA_Channel5_IRQHandler          ; BDMA Channel 5 global Interrupt                                    
  153.                 DCD     BDMA_Channel6_IRQHandler          ; BDMA Channel 6 global Interrupt                                    
  154.                 DCD     BDMA_Channel7_IRQHandler          ; BDMA Channel 7 global Interrupt                                    
  155.                 DCD     COMP1_IRQHandler                  ; COMP1 global Interrupt                                            
  156.                 DCD     LPTIM2_IRQHandler                 ; LP TIM2 global interrupt                                          
  157.                 DCD     LPTIM3_IRQHandler                 ; LP TIM3 global interrupt                                          
  158.                 DCD     LPTIM4_IRQHandler                 ; LP TIM4 global interrupt                                          
  159.                 DCD     LPTIM5_IRQHandler                 ; LP TIM5 global interrupt                                          
  160.                 DCD     LPUART1_IRQHandler                ; LP UART1 interrupt                                                
  161.                 DCD     0                                 ; Reserved                                                                              
  162.                 DCD     CRS_IRQHandler                    ; Clock Recovery Global Interrupt                                   
  163.                 DCD     0                                 ; Reserved                                             
  164.                 DCD     SAI4_IRQHandler                   ; SAI4 global interrupt                                                
  165.                 DCD     0                                 ; Reserved                                 
  166.                 DCD     0                                 ; Reserved                                    
  167.                 DCD     WAKEUP_PIN_IRQHandler             ; Interrupt for all 6 wake-up pins
  168.                

  169. __Vectors_End
 楼主| 欢乐家园 发表于 2021-7-21 23:04 | 显示全部楼层
主要需要注意第一行第二行,
 楼主| 欢乐家园 发表于 2021-7-21 23:07 | 显示全部楼层
  1. __Vectors       DCD     __initial_sp                      ; Top of Stack
  2.                 DCD     Reset_Handler                     ; Reset Handler
 楼主| 欢乐家园 发表于 2021-7-21 23:07 | 显示全部楼层
每次芯片复位后,就从中断向量表的第一个位置处取出栈顶指针,然后设置到SP。
然后从第二个位置也就是Reset Handler中断向量里取出复位后PC的值,也就是下一步就跳转到Reset Handler所指示的地址处执行。
 楼主| 欢乐家园 发表于 2021-7-21 23:08 | 显示全部楼层
原理搞清楚了,程序代码就很简单了,如下所示:
 楼主| 欢乐家园 发表于 2021-7-21 23:13 | 显示全部楼层
  1. #define RAM_BOOT_ADDR 0X24000000

  2. __asm void set_sp(unsigned int SP_addr)
  3.        {
  4. mov  R13, r0
  5. BX  LR
  6. ALIGN
  7.        }


  8. Reset_Handler_addr=*((unsigned int*)(RAM_BOOT_ADDR+4));

  9. set_sp(*((unsigned int*)RAM_BOOT_ADDR));

  10. ((void(*)(void))Reset_Handler_addr)();//(*(void(*)(void))RAM_BOOT_ADDR)();
 楼主| 欢乐家园 发表于 2021-7-21 23:13 | 显示全部楼层
是不是感觉跟前面mdk调试模式中的初始化文件机制很相似啊?他们根本就是一样的,因为这本来就是由cortexM3的存储模型和启动机制决定的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

114

主题

1067

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部