学习STM32

1 .Bootloader 编写 

Startup  _stm32f103xb.s
        MODULE  ?cstartup
        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)
        SECTION .intvec:CODE:NOROOT(2)
        EXTERN  __iar_program_start
        EXTERN  SystemInit       
        PUBLIC  __vector_table
        DATA
__vector_table
        DCD     sfe(CSTACK)
        DCD     Reset_Handler             ; Reset Handler
        DCD     Reset_Handler               ; NMI Handler
        DCD     Reset_Handler         ; Hard Fault Handler
        DCD     Reset_Handler         ; MPU Fault Handler
        DCD     Reset_Handler          ; Bus Fault Handler
        DCD     Reset_Handler        ; Usage Fault Handler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
        THUMB
        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start
        BX      R0 
        END

  1. 跳转程序  system_stm32xxx.c
#define CODE_ADDR 0x08001000
void SystemInit(void)
{   
   void (*p)(void) = (void (*)(void))(*((uint32_t*)(CODE_ADDR+4)) );
   // set up stack
   __set_MSP(*(__IO uint32_t*) CODE_ADDR);
   // jump to start
   p();
}

应用程序配置  ICF文件

define symbol __ICFEDIT_intvec_start__ = 0x08001000;
define symbol __ICFEDIT_region_ROM_start__   = 0x08001000 ;
System_stm32f1xx.c
#define VECT_TAB_OFFSET  0x00001000U

 

通过一个汇编程序搞定bootload

        MODULE  ?cstartup
        SECTION CSTACK:DATA:NOROOT(3)
        SECTION .intvec:CODE:NOROOT(2)
        EXTERN  SystemInit
        PUBLIC  __vector_table
        DATA
__vector_table
        DCD     sfe(CSTACK)
        DCD     Reset_Handler             ; Reset Handler
        THUMB
        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
/*        LDR     R0, =SystemInit
        BLX     R0
        END*/
        LDR.N R0,[PC,#0x8]  ;PC值 设置为DC32位置的数值
        LDR R1,[R0,#0x4]    ;SP 值
        LDR R0,[R0]
        MSR MSP,R0
        BX R1
        DCD (0x8040000)
        END

2. 看门狗导致flash异常

  踢狗VDD电压下降导致 FLASH->SR标志位异常。

 解决办法,在擦除或者操作FLASH前 ,  在flash unlock情况下清除FLASH标志位

__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR|FLASH_FLAG_PGPERR| FLASH_FLAG_PGSERR);

 

 

 

 

你可能感兴趣的:(学习STM32)