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
- 跳转程序 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);
3. LWIP UDP 发送
struct udp_pcb *pUdp = udp_new();
//udp_bind(pUdp, IP_ANY_TYPE, 8888); //本地端口绑定
/*设置服务器地址和端口*/
ip_addr_t serverIP;
serverIP.addr = (192)+(168<<8)+(3<<16)+(246<<24);
u16 serverPort = 7888;
//udp_connect(pUdp, &serverIP,7888);
int cnt = 0;
char sendbuf[32];
for(;;){
sprintf(sendbuf,"hello %05d\n",cnt++);
int len = strlen(sendbuf);
osDelay(1000);
struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT,len,PBUF_POOL);
if(p!=NULL){
pbuf_take(p,sendbuf,len);
//udp_send(pUdp,p);
udp_sendto(pUdp,p,&serverIP,serverPort);
pbuf_free(p);
mprintf("send %s\n",sendbuf);
}
}