STM32f105怎么用USB升级程序

\u5982\u4f55\u64cd\u4f5cSTM32F105\u7684\u4eceCAN

#include "can.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
//\u672c\u7a0b\u5e8f\u53ea\u4f9b\u5b66\u4e60\u4f7f\u7528\uff0c\u672a\u7ecf\u4f5c\u8005\u8bb8\u53ef\uff0c\u4e0d\u5f97\u7528\u4e8e\u5176\u5b83\u4efb\u4f55\u7528\u9014
//ALIENTEK\u6218\u8230STM32\u5f00\u53d1\u677f
//CAN\u9a71\u52a8 \u4ee3\u7801
//\u6b63\u70b9\u539f\u5b50@ALIENTEK
//\u6280\u672f\u8bba\u575b:www.openedv.com
//\u4fee\u6539\u65e5\u671f:2012/9/11
//\u7248\u672c\uff1aV1.0
//\u7248\u6743\u6240\u6709\uff0c\u76d7\u7248\u5fc5\u7a76\u3002
//Copyright(C) \u5e7f\u5dde\u5e02\u661f\u7ffc\u7535\u5b50\u79d1\u6280\u6709\u9650\u516c\u53f8 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//CAN\u521d\u59cb\u5316
//tsjw:\u91cd\u65b0\u540c\u6b65\u8df3\u8dc3\u65f6\u95f4\u5355\u5143.\u8303\u56f4:1~3; CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
//tbs2:\u65f6\u95f4\u6bb52\u7684\u65f6\u95f4\u5355\u5143.\u8303\u56f4:1~8;
//tbs1:\u65f6\u95f4\u6bb51\u7684\u65f6\u95f4\u5355\u5143.\u8303\u56f4:1~16; CAN_BS1_1tq ~CAN_BS1_16tq
//brp :\u6ce2\u7279\u7387\u5206\u9891\u5668.\u8303\u56f4:1~1024;(\u5b9e\u9645\u8981\u52a01,\u4e5f\u5c31\u662f1~1024) tq=(brp)*tpclk1
//\u6ce8\u610f\u4ee5\u4e0a\u53c2\u6570\u4efb\u4f55\u4e00\u4e2a\u90fd\u4e0d\u80fd\u8bbe\u4e3a0,\u5426\u5219\u4f1a\u4e71.
//\u6ce2\u7279\u7387=Fpclk1/((tsjw+tbs1+tbs2)*brp);
//mode:0,\u666e\u901a\u6a21\u5f0f;1,\u56de\u73af\u6a21\u5f0f;
//Fpclk1\u7684\u65f6\u949f\u5728\u521d\u59cb\u5316\u7684\u65f6\u5019\u8bbe\u7f6e\u4e3a36M,\u5982\u679c\u8bbe\u7f6eCAN_Normal_Init(1,8,7,5,1);
//\u5219\u6ce2\u7279\u7387\u4e3a:36M/((1+8+7)*5)=450Kbps
//\u8fd4\u56de\u503c:0,\u521d\u59cb\u5316OK;
// \u5176\u4ed6,\u521d\u59cb\u5316\u5931\u8d25;


///////////////////////////////////////////////////CAN1////////////////////////////////////////////////////
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{

GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE
NVIC_InitTypeDef NVIC_InitStructure;
#endif

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//\u4f7f\u80fdPORTD\u65f6\u949f,\u4f7f\u80fd\u529f\u80fd\u590d\u7528\u65f6\u949f

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//\u4f7f\u80fdCAN1\u65f6\u949f


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //\u590d\u7528\u63a8\u633d
GPIO_Init(GPIOA, &GPIO_InitStructure); //\u521d\u59cb\u5316IO

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//\u4e0a\u62c9\u8f93\u5165
GPIO_Init(GPIOA, &GPIO_InitStructure);//\u521d\u59cb\u5316IO

//GPIO_PinRemapConfig(GPIO_Remap2_CAN1,ENABLE);

//CAN\u5355\u5143\u8bbe\u7f6e
CAN_InitStructure.CAN_TTCM=DISABLE; //\u975e\u65f6\u95f4\u89e6\u53d1\u901a\u4fe1\u6a21\u5f0f //
CAN_InitStructure.CAN_ABOM=DISABLE; //\u8f6f\u4ef6\u81ea\u52a8\u79bb\u7ebf\u7ba1\u7406 //
CAN_InitStructure.CAN_AWUM=DISABLE; //\u7761\u7720\u6a21\u5f0f\u901a\u8fc7\u8f6f\u4ef6\u5524\u9192(\u6e05\u9664CAN->MCR\u7684SLEEP\u4f4d)//
CAN_InitStructure.CAN_NART=ENABLE; //\u7981\u6b62\u62a5\u6587\u81ea\u52a8\u4f20\u9001 //
CAN_InitStructure.CAN_RFLM=DISABLE; //\u62a5\u6587\u4e0d\u9501\u5b9a,\u65b0\u7684\u8986\u76d6\u65e7\u7684 //
CAN_InitStructure.CAN_TXFP=DISABLE; //\u4f18\u5148\u7ea7\u7531\u62a5\u6587\u6807\u8bc6\u7b26\u51b3\u5b9a //
CAN_InitStructure.CAN_Mode= mode; //\u6a21\u5f0f\u8bbe\u7f6e\uff1a mode:0,\u666e\u901a\u6a21\u5f0f;1,\u56de\u73af\u6a21\u5f0f; //
//\u8bbe\u7f6e\u6ce2\u7279\u7387
CAN_InitStructure.CAN_SJW=tsjw; //\u91cd\u65b0\u540c\u6b65\u8df3\u8dc3\u5bbd\u5ea6(Tsjw)\u4e3atsjw+1\u4e2a\u65f6\u95f4\u5355\u4f4d CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1\u4e2a\u65f6\u95f4\u5355\u4f4dCAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1\u4e2a\u65f6\u95f4\u5355\u4f4dCAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=brp; //\u5206\u9891\u7cfb\u6570(Fdiv)\u4e3abrp+1 //
CAN_Init(CAN1, &CAN_InitStructure); // \u521d\u59cb\u5316CAN1

CAN_FilterInitStructure.CAN_FilterNumber=0; //\u8fc7\u6ee4\u56680
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32\u4f4d
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32\u4f4dID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32\u4f4dMASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//\u8fc7\u6ee4\u56680\u5173\u8054\u5230FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //\u6fc0\u6d3b\u8fc7\u6ee4\u56680

CAN_FilterInit(&CAN_FilterInitStructure);//\u6ee4\u6ce2\u5668\u521d\u59cb\u5316
#if CAN_RX0_INT_ENABLE

CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0\u6d88\u606f\u6302\u53f7\u4e2d\u65ad\u5141\u8bb8.

NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // \u4e3b\u4f18\u5148\u7ea7\u4e3a1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // \u6b21\u4f18\u5148\u7ea7\u4e3a0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
return 0;
}

#if CAN_RX0_INT_ENABLE //\u4f7f\u80fdRX0\u4e2d\u65ad
//\u4e2d\u65ad\u670d\u52a1\u51fd\u6570
void CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
int i=0;
CAN_Receive(CAN1, 0, &RxMessage);
Can_Send_Msg(RxMessage.Data,8);
}
#endif

//can\u53d1\u9001\u4e00\u7ec4\u6570\u636e(\u56fa\u5b9a\u683c\u5f0f:ID\u4e3a0X12,\u6807\u51c6\u5e27,\u6570\u636e\u5e27)
//len:\u6570\u636e\u957f\u5ea6(\u6700\u5927\u4e3a8)
//msg:\u6570\u636e\u6307\u9488,\u6700\u5927\u4e3a8\u4e2a\u5b57\u8282.
//\u8fd4\u56de\u503c:0,\u6210\u529f;
// \u5176\u4ed6,\u5931\u8d25;
u8 Can_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x12; // \u6807\u51c6\u6807\u8bc6\u7b26\u4e3a0
TxMessage.ExtId=0x12; // \u8bbe\u7f6e\u6269\u5c55\u6807\u793a\u7b26\uff0829\u4f4d\uff09
TxMessage.IDE=0; // \u4f7f\u7528\u6269\u5c55\u6807\u8bc6\u7b26
TxMessage.RTR=0; // \u6d88\u606f\u7c7b\u578b\u4e3a\u6570\u636e\u5e27\uff0c\u4e00\u5e278\u4f4d
TxMessage.DLC=len; // \u53d1\u9001\u4e24\u5e27\u4fe1\u606f
for(i=0;i<8;i++)
TxMessage.Data[i]=msg[i]; // \u7b2c\u4e00\u5e27\u4fe1\u606f
mbox= CAN_Transmit(CAN1, &TxMessage);
i=0;
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //\u7b49\u5f85\u53d1\u9001\u7ed3\u675f
if(i>=0XFFF)return 1;
return 0;

}
//can\u53e3\u63a5\u6536\u6570\u636e\u67e5\u8be2
//buf:\u6570\u636e\u7f13\u5b58\u533a;
//\u8fd4\u56de\u503c:0,\u65e0\u6570\u636e\u88ab\u6536\u5230;
// \u5176\u4ed6,\u63a5\u6536\u7684\u6570\u636e\u957f\u5ea6;
u8 Can_Receive_Msg(u8 *buf)
{
u32 i;
CanRxMsg RxMessage;
if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0; //\u6ca1\u6709\u63a5\u6536\u5230\u6570\u636e,\u76f4\u63a5\u9000\u51fa
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//\u8bfb\u53d6\u6570\u636e
for(i=0;i<8;i++)
buf[i]=RxMessage.Data[i];
return RxMessage.DLC;
}


///////////////////////////////////////////////////CAN2////////////////////////////////////////////////////

u8 CAN2_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{

GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
#if CAN_RX2_INT_ENABLE
NVIC_InitTypeDef NVIC_InitStructure;
#endif

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//\u4f7f\u80fdPORTB\u65f6\u949f

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);//\u4f7f\u80fdCAN2\u65f6\u949f


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //\u590d\u7528\u63a8\u633d
GPIO_Init(GPIOB, &GPIO_InitStructure); //\u521d\u59cb\u5316IO

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//\u4e0a\u62c9\u8f93\u5165
GPIO_Init(GPIOB, &GPIO_InitStructure);//\u521d\u59cb\u5316IO

//GPIO_PinRemapConfig(GPIO_Remap_CAN2,ENABLE);

//CAN\u5355\u5143\u8bbe\u7f6e
CAN_InitStructure.CAN_TTCM=DISABLE; //\u975e\u65f6\u95f4\u89e6\u53d1\u901a\u4fe1\u6a21\u5f0f //
CAN_InitStructure.CAN_ABOM=DISABLE; //\u8f6f\u4ef6\u81ea\u52a8\u79bb\u7ebf\u7ba1\u7406 //
CAN_InitStructure.CAN_AWUM=DISABLE; //\u7761\u7720\u6a21\u5f0f\u901a\u8fc7\u8f6f\u4ef6\u5524\u9192(\u6e05\u9664CAN->MCR\u7684SLEEP\u4f4d)//
CAN_InitStructure.CAN_NART=ENABLE; //\u7981\u6b62\u62a5\u6587\u81ea\u52a8\u4f20\u9001 //
CAN_InitStructure.CAN_RFLM=DISABLE; //\u62a5\u6587\u4e0d\u9501\u5b9a,\u65b0\u7684\u8986\u76d6\u65e7\u7684 //
CAN_InitStructure.CAN_TXFP=DISABLE; //\u4f18\u5148\u7ea7\u7531\u62a5\u6587\u6807\u8bc6\u7b26\u51b3\u5b9a //
CAN_InitStructure.CAN_Mode= CAN_Mode_Normal; //\u6a21\u5f0f\u8bbe\u7f6e\uff1a mode:0,\u666e\u901a\u6a21\u5f0f;1,\u56de\u73af\u6a21\u5f0f; //
//\u8bbe\u7f6e\u6ce2\u7279\u7387
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //\u91cd\u65b0\u540c\u6b65\u8df3\u8dc3\u5bbd\u5ea6(Tsjw)\u4e3atsjw+1\u4e2a\u65f6\u95f4\u5355\u4f4d CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; //Tbs1=tbs1+1\u4e2a\u65f6\u95f4\u5355\u4f4dCAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//Tbs2=tbs2+1\u4e2a\u65f6\u95f4\u5355\u4f4dCAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=9; //\u5206\u9891\u7cfb\u6570(Fdiv)\u4e3abrp+1 //
CAN_Init(CAN2, &CAN_InitStructure); // \u521d\u59cb\u5316CAN2

CAN_FilterInitStructure.CAN_FilterNumber=14; //\u8fc7\u6ee4\u56680
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32\u4f4d
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32\u4f4dID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32\u4f4dMASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//\u8fc7\u6ee4\u56680\u5173\u8054\u5230FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //\u6fc0\u6d3b\u8fc7\u6ee4\u56680

CAN_FilterInit(&CAN_FilterInitStructure);//\u6ee4\u6ce2\u5668\u521d\u59cb\u5316
#if CAN_RX2_INT_ENABLE

CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);//FIFO0\u6d88\u606f\u6302\u53f7\u4e2d\u65ad\u5141\u8bb8.

NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // \u4e3b\u4f18\u5148\u7ea7\u4e3a1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // \u6b21\u4f18\u5148\u7ea7\u4e3a0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
return 0;
}

#if CAN_RX2_INT_ENABLE //\u4f7f\u80fdRX2\u4e2d\u65ad
//\u4e2d\u65ad\u670d\u52a1\u51fd\u6570
void CAN2_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
int i=0;
CAN_Receive(CAN2, 0, &RxMessage);
Can2_Send_Msg(RxMessage.Data,8);
}
#endif

//can\u53d1\u9001\u4e00\u7ec4\u6570\u636e(\u56fa\u5b9a\u683c\u5f0f:ID\u4e3a0X12,\u6807\u51c6\u5e27,\u6570\u636e\u5e27)
//len:\u6570\u636e\u957f\u5ea6(\u6700\u5927\u4e3a8)
//msg:\u6570\u636e\u6307\u9488,\u6700\u5927\u4e3a8\u4e2a\u5b57\u8282.
//\u8fd4\u56de\u503c:0,\u6210\u529f;
// \u5176\u4ed6,\u5931\u8d25;
u8 Can2_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x12; // \u6807\u51c6\u6807\u8bc6\u7b26\u4e3a0
TxMessage.ExtId=0x12; // \u8bbe\u7f6e\u6269\u5c55\u6807\u793a\u7b26\uff0829\u4f4d\uff09
TxMessage.IDE=0; // \u4f7f\u7528\u6269\u5c55\u6807\u8bc6\u7b26
TxMessage.RTR=0; // \u6d88\u606f\u7c7b\u578b\u4e3a\u6570\u636e\u5e27\uff0c\u4e00\u5e278\u4f4d
TxMessage.DLC=len; // \u53d1\u9001\u4e24\u5e27\u4fe1\u606f
for(i=0;i<8;i++)
TxMessage.Data[i]=msg[i]; // \u7b2c\u4e00\u5e27\u4fe1\u606f
mbox= CAN_Transmit(CAN2, &TxMessage);
i=0;
while((CAN_TransmitStatus(CAN2, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //\u7b49\u5f85\u53d1\u9001\u7ed3\u675f
if(i>=0XFFF)return 1;
return 0;

}
//can\u53e3\u63a5\u6536\u6570\u636e\u67e5\u8be2
//buf:\u6570\u636e\u7f13\u5b58\u533a;
//\u8fd4\u56de\u503c:0,\u65e0\u6570\u636e\u88ab\u6536\u5230;
// \u5176\u4ed6,\u63a5\u6536\u7684\u6570\u636e\u957f\u5ea6;
u8 Can2_Receive_Msg(u8 *buf)
{
u32 i;
CanRxMsg RxMessage;
if( CAN_MessagePending(CAN2,CAN_FIFO0)==0)return 0; //\u6ca1\u6709\u63a5\u6536\u5230\u6570\u636e,\u76f4\u63a5\u9000\u51fa
CAN_Receive(CAN2, CAN_FIFO0, &RxMessage);//\u8bfb\u53d6\u6570\u636e
for(i=0;i<8;i++)
buf[i]=RxMessage.Data[i];
return RxMessage.DLC;
}

\u53ef\u4ee5\u7684\uff0c\u4f46\u662f\u7a0b\u5e8f\u9700\u8981\u7531\u4e24\u90e8\u5206\u7ec4\u6210\uff1a1.bootloader\uff1b2.\u5e94\u7528\u7a0b\u5e8f
bootloader\uff1a\u8d1f\u8d23\u66f4\u65b0\u7a0b\u5e8f\u7684\u62f7\u8d1d\u548c\u8df3\u8f6c\u5230\u5e94\u7528\u7a0b\u5e8f\uff1b
\u5e94\u7528\u7a0b\u5e8f\uff1a\u8fd0\u884c\u7a0b\u5e8f\u8981\u5b9e\u73b0\u7684\u529f\u80fd\u548c\u66f4\u65b0\u7a0b\u5e8f\u7684\u4e0b\u8f7d\u3001\u4fdd\u5b58\u3002
\u9996\u5148\uff0c\u5f00\u673a\u65f6\u8fd0\u884cbootloader\uff0cbootloader\u68c0\u6d4b\u7247\u5185Flash\uff08\u6216\u8005\u7247\u5916Flash\u6216\u8005FRAM\uff09\u201c\u7a0b\u5e8f\u66f4\u65b0\u6807\u5fd7\u201d\u662f\u5426\u7f6e\u4f4d\uff0c\u5982\u679c\u6ca1\u6709\uff0c\u5219\u76f4\u63a5\u8df3\u8f6c\u5230\u5e94\u7528\u7a0b\u5e8f\u3002\u5e94\u7528\u7a0b\u5e8f\u8fd0\u884c\u65f6\u68c0\u6d4b\u65e0\u7ebf\u6a21\u5757\u6536\u5230\u7684\u6570\u636e\u547d\u4ee4\uff0c\u5982\u679c\u6709updata\u547d\u4ee4\uff0c\u5219\u63a5\u6536\u7a0b\u5e8f\uff0c\u5e76\u4fdd\u5b58\u5230\u7247\u5185Flash\u7684\u9760\u540e\u7684\u4ee3\u7801\u6bb5\uff08\u6216\u8005\u7247\u5916Flash\uff09\uff0c\u63a5\u6536\u4fdd\u5b58\u5b8c\u6570\u636e\u540e\uff0c\u7247\u5185Flash\uff08\u6216\u8005\u7247\u5916Flash\u6216\u8005FRAM\uff09\u201c\u7a0b\u5e8f\u66f4\u65b0\u6807\u5fd7\u201d\u7f6e\u4f4d\uff0c\u7136\u540e\u91cd\u542fMCU\u3002MCU\u91cd\u65b0\u8fd0\u884cbootloader\uff0c\u6b64\u65f6bootloader\u68c0\u6d4b\u5230\u6709\u7a0b\u5e8f\u66f4\u65b0\u6807\u5fd7\uff0c\u5219\u5c06\u7247\u5185Flash\u7684\u9760\u540e\u7684\u4ee3\u7801\u6bb5\uff08\u6216\u8005\u7247\u5916Flash\uff09\u7684\u66f4\u65b0\u4ee3\u7801\u62f7\u8d1d\u56de\u5e94\u7528\u7a0b\u5e8f\u4ee3\u7801\u6bb5\uff0c\u5e76\u590d\u4f4d\u66f4\u65b0\u7a0b\u5e8f\u6807\u5fd7\uff0c\u7136\u540e\u8df3\u8f6c\u5230\u5e94\u7528\u7a0b\u5e8f\uff0c\u81f3\u6b64\u7a0b\u5e8f\u66f4\u65b0\u5b8c\u6bd5\u3002
ps\uff1a\u7f51\u4e0a\u6709\u5df2\u7ecf\u5b9e\u73b0\u7684\u4ee3\u7801\uff0c\u4f60\u53ef\u4ee5\u641c\u7d22\u201cSTM32 IAP\u201d\u3002

1. 扫描U盘寻找特定的固件升级文件;
2. 打开文件读入固件到Flash未使用的区间B;
3.构造一个IAP函数,其功能是将区间B的内容Copy到工作空间;
IAP函数仅仅是Flash操作,且不能有任何函数调用.
4. 将IAR函数拷贝到RAM中.
5. 调用RAM中的IAP函数。
6. MCU自复位

  • 姹傛暀STM32F105鍏抽棴涓插彛鍚庣▼搴忔寰幆鍦usb涓柇鍘熷洜
    绛旓細if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */ { gintr_status.d32 = USB_OTG_ReadCoreItr(pdev);if (!gintr_status.d32) /* avoid spurious interrupt */ { return 0;} if (gintr_status.b.outepintr){ retval |= DCD_HandleOutEP_ISR(pdev);}...
  • stm32浜у搧浠嬬粛
    绛旓細STM32鏄竴娆剧敱鎰忔硶鍗婂浣撴帹鍑虹殑楂樻ц兘寰帶鍒跺櫒绯诲垪锛屽畠鍦STM32F105鍜孲TM32F107绯诲垪涔嬪墠宸茬粡鍖呭惈浜嗗熀鏈瀷銆佸寮哄瀷銆USB鍩烘湰鍨嬪拰澧炲己鍨嬬瓑澶氫釜鍨嬪彿銆傛柊鎺ㄥ嚭鐨勭郴鍒楀欢缁簡澧炲己鍨嬬郴鍒楃殑72MHz澶勭悊棰戠巼锛屽唴瀛橀厤缃寖鍥翠粠64KB鍒256KB鐨勯棯瀛樺拰20KB鍒64KB鐨勫祵鍏ュ紡SRAM銆係TM32浜у搧绾块噰鐢ㄤ簡LQFP64銆丩QFP100鍜孡FBGA100涓夌...
  • stm32鐨鏂扮郴鍒
    绛旓細STM32F105鍏锋湁USB OTG 鍜孋AN2.0B鎺ュ彛銆係TM32F107鍦║SB OTG 鍜孋AN2.0B鎺ュ彛鍩虹涓婂鍔犱簡浠ュお缃10/100 MAC妯″潡 銆傜墖涓婇泦鎴愮殑浠ュお缃慚AC鏀寔MII鍜孯MII锛屽洜姝わ紝瀹炵幇涓涓畬鏁寸殑浠ュお缃戞敹鍙戝櫒鍙渶涓涓閮≒HY鑺墖銆傚彧浣跨敤涓涓25MHz鏅舵尟鍗冲彲缁欐暣涓井鎺у埗鍣ㄦ彁渚涙椂閽熼鐜囷紝鍖呮嫭浠ュお缃戝拰USB OTG澶栬鎺ュ彛銆傚井鎺у埗...
  • 鍗曠墖鏈鸿U鐩,浠涔堟柟妗堟渶渚垮疁鏈鏂逛究,姹傛帹鑽
    绛旓細姣旇緝瀹规槗鐨勬柟娉曟槸鐢–H376銆侰H376鏄枃浠剁鐞嗘帶鍒惰姱鐗囷紝鐢ㄤ簬鍗曠墖鏈虹郴缁熻鍐橴鐩樻垨鑰匰D鍗′腑鐨勬枃浠躲侰H376鏀寔USB璁惧鏂瑰紡鍜孶SB 涓绘満鏂瑰紡锛屽苟涓斿唴缃簡USB閫氳鍗忚鐨勫熀鏈浐浠讹紝鍐呯疆浜嗗鐞哅ass-Storage娴烽噺瀛樺偍璁惧鐨勪笓鐢ㄩ氳鍗忚鐨勫浐浠讹紝鍐呯疆浜哠D鍗$殑閫氳鎺ュ彛鍥轰欢锛屽唴缃簡FAT16鍜孎AT32浠ュ強FAT12鏂囦欢绯荤粺鐨勭鐞嗗浐浠讹紝...
  • STM32涓婄殑USART2_CTS鍜孶SART2_RTS鏄粈涔,鎬庝箞鐢?
    绛旓細浜嗚В涓涓嬩節閽堟帴鍙g殑寮曡剼瀹氫箟灏辩煡閬撲簡锛屼互渚涘弬鑰冿紝甯屾湜鏈夊府鍔╋紙鍥惧氨鍏嶄簡鍚...锛夛細1 CD 鈫 Carrier Detect 杞芥尝妫娴 2 RXD 鈫 Receive Data 鎺ユ敹鏁版嵁 3 TXD 鈫 Transmit Data 鍙戦佹暟鎹 4 DTR 鈫 Data Terminal Ready鏁版嵁缁堢灏辩华 5 GND 鈥 System Ground 绯荤粺鎺ュ湴 6 DSR 鈫 D...
  • stm32鐨浜掕仈鍨
    绛旓細濡傜梾鎮g洃瑙嗐侀攢鍞粓绔満銆佽嚜鍔ㄥ敭璐ф満鍜屼繚瀹夌郴缁熴傚寘鎷柊鐨勪簰鑱斿瀷绯诲垪鍦ㄥ唴鐨凷TM32绯诲垪寰帶鍒跺櫒鍏锋湁澶氱閰嶅杞欢鍜屽紑鍙戝伐鍏凤紝鍏朵腑鍖呮嫭鎰忔硶鍗婂浣撳厤璐规彁渚涚殑杞欢搴撲互鍙婄涓夋柟宸ュ叿鍘傚晢鐨勫箍娉涙敮鎸併傛剰娉曞崐瀵间綋杩樺皢鎺ㄥ嚭涓涓柊鐨勮瘎浼版澘锛岀洰鍓嶆鍦ㄥ悜澶у鎴锋彁渚STM32F105鍜孲TM32F107浜掕仈鍨嬬郴鍒楃殑鏍风墖銆
  • stm32鍗曠墖鏈虹敤浠涔堢紪绋
    绛旓細stm32鍗曠墖鏈哄彲浠ョ敤Keil5銆丆璇█鎴栬呮眹缂栬瑷绛夎瑷杩涜缂栫▼銆傚湪STM32F105鍜孲TM32F107浜掕繛鍨嬬郴鍒楀井鎺у埗鍣ㄤ箣鍓嶏紝鎰忔硶鍗婂浣撳凡缁忔帹鍑篠TM32鍩烘湰鍨嬬郴鍒椼佸寮哄瀷绯诲垪銆USB鍩烘湰鍨嬬郴鍒椼佷簰琛ュ瀷绯诲垪锛涙柊绯诲垪浜у搧娌跨敤澧炲己鍨嬬郴鍒楃殑72MHz澶勭悊棰戠巼銆傚唴瀛樺寘鎷64KB鍒256KB闂瓨鍜20KB鍒64KB宓屽叆寮廠RAM銆傛柊绯诲垪閲囩敤LQFP64銆丩QFP...
  • stm32绯诲垪鍗曠墖鏈烘湁鍝簺澶栬鎺ュ彛妯″潡
    绛旓細涓绘祦浜у搧锛圫TM32F0銆丼TM32F1銆丼TM32F3锛夈佽秴浣庡姛鑰椾骇鍝侊紙STM32L0銆丼TM32L1銆丼TM32L4銆丼TM32L4+锛夈侀珮鎬ц兘浜у搧锛圫TM32F2銆丼TM32F4銆丼TM32F7銆丼TM32H7锛夈備骇鍝佷粙缁 鍦STM32F105鍜孲TM32F107浜掕繛鍨嬬郴鍒楀井鎺у埗鍣ㄤ箣鍓嶏紝鎰忔硶鍗婂浣撳凡缁忔帹鍑篠TM32鍩烘湰鍨嬬郴鍒椼佸寮哄瀷绯诲垪銆USB鍩烘湰鍨嬬郴鍒椼佷簰琛ュ瀷绯诲垪锛涙柊...
  • stm32绯诲垪鍗曠墖鏈烘湁鍝簺澶栬鎺ュ彛妯″潡
    绛旓細涓绘祦浜у搧锛圫TM32F0銆丼TM32F1銆丼TM32F3锛夈佽秴浣庡姛鑰椾骇鍝侊紙STM32L0銆丼TM32L1銆丼TM32L4銆丼TM32L4+锛夈侀珮鎬ц兘浜у搧锛圫TM32F2銆丼TM32F4銆丼TM32F7銆丼TM32H7锛夈備骇鍝佷粙缁 鍦STM32F105鍜孲TM32F107浜掕繛鍨嬬郴鍒楀井鎺у埗鍣ㄤ箣鍓嶏紝鎰忔硶鍗婂浣撳凡缁忔帹鍑篠TM32鍩烘湰鍨嬬郴鍒椼佸寮哄瀷绯诲垪銆USB鍩烘湰鍨嬬郴鍒椼佷簰琛ュ瀷绯诲垪锛涙柊...
  • stm32boot1鎺ユ寜閿槸璧峰埌鍚姩鐨勪綔鐢ㄥ悧
    绛旓細鏄侭OOT1鎺ュ彛鎺ュ湪VCC涓娿傚湪STM32F105鍜孲TM32F107浜掕繛鍨嬬郴鍒楀井鎺у埗鍣ㄤ箣鍓嶏紝鎰忔硶鍗婂浣撳凡缁忔帹鍑篠TM32鍩烘湰鍨嬬郴鍒椼佸寮哄瀷绯诲垪銆USB鍩烘湰鍨嬬郴鍒椼佷簰琛ュ瀷绯诲垪锛涙柊绯诲垪浜у搧娌跨敤澧炲己鍨嬬郴鍒楃殑72MHz澶勭悊棰戠巼銆傚唴瀛樺寘鎷64KB鍒256KB闂瓨鍜20KB鍒64KB宓屽叆寮廠RAM銆
  • 扩展阅读:24-105stm镜头怎么样 ... stm8s105有48脚 ... stm32价格暴涨 ... rf 24-105stm ... 佳能24-105stm与usm ... stm32f4型号详解 ... jlink识别不了stm32f105 ... 24-105usm和stm的区别 ... stm32型号表 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网