学习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);

 

 

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);
		}		
	}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值