|
項目中正在使用的 STM32系列單片機(jī) 的遠(yuǎn)程IAP使用方式,從此刷機(jī)不用再拆機(jī)!
0.png (4.74 KB, 下載次數(shù): 20)
下載附件
2019-4-30 02:14 上傳
單片機(jī)源程序如下:
- /*******************************************************************************
- ** 功能: 遠(yuǎn)程燒寫程序的啟動文件
- *******************************************************************************/
- #include "stm32boot.h"
- #include "EEPROM.h"
- /* 類型聲明 -----------------------------------------------------------------*/
- typedef void (*pFunction)(void);
- /* 變量 ----------------------------------------------------------------------*/
- pFunction Jump_To_Application ;
- uint32_t JumpAddress;
- #define ApplicationAddress 0x8003000
- void NVIC_Configuration(void);
- /*******************************************************************************
- * @函數(shù)名稱 main
- * @函數(shù)說明 主函數(shù)
- * @輸入?yún)?shù) 無
- * @輸出參數(shù) 無
- * @返回參數(shù) 無
- *******************************************************************************/
- extern __IO unsigned long time32_incr;
- unsigned long portGetTickCnt(void)
- {
- // time32_incr = SysTick->VAL;
- return time32_incr;
- }
- void Sleep(unsigned int time_ms)
- {
- unsigned long end = portGetTickCnt() + time_ms;
- while ((signed long)(portGetTickCnt() - end) <= 0)
- ;
- }
- void CloseIrq(void)
- {
- SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//關(guān)閉SYSTICK中斷
- DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, DISABLE); //使能DMA通道4傳輸完成中斷
- DMA_ITConfig(DMA1_Channel7, DMA_IT_TE, DISABLE);
- USART_ITConfig(USART2, USART_IT_IDLE, DISABLE);
- USART_DeInit(USART2);
- DMA_DeInit(DMA1_Channel7);
- DMA_DeInit(DMA1_Channel6);
- }
- int main(void)
- {
- int i=1200;
- u16 FLAG = 0;
- /* Enable PWR and BKP clocks */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- /* Allow access to BKP Domain */
- PWR_BackupAccessCmd(ENABLE);
- FLASH_Unlock();
- UART2_Configuration();
- SysTick_Init();
- NVIC_Configuration();
- Sleep(20);
- printf("bootv2.0-20181210\r\n");
- while (i--)
- {
- Communication();
- Sleep(20);
- }
- eeprom_read_block(&FLAG, PROGRAMS_ADDR, 2);
-
- if (FLAG == 0xE0E0)
- {
- // DevAddr = 1;
- // NVIC_Configuration();
- // FLASH_Unlock() ;
- // //串口初始化
- // UART2_Configuration();0
- // //系統(tǒng)時基啟動
- // // SysTick_Init();
- //
- // led_on();
- while (1)
- {
- Communication();
- }
- }
- //否則執(zhí)行用戶程序
- else
- {
- //判斷用戶是否已經(jīng)下載程序,因為正常情況下此地址是棧地址。
- //若沒有這一句的話,即使沒有下載程序也會進(jìn)入而導(dǎo)致跑飛。
- FLASH_Lock();
-
- if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
- {
- JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
- Jump_To_Application = (pFunction) JumpAddress;
- //初始化用戶程序的堆棧指針
- __set_MSP(*(__IO uint32_t*) ApplicationAddress);
- printf("jump to app\r\n");
- CloseIrq();
- Jump_To_Application();
- }
- else
- {
- u16 data = 0xE0E0;
- eeprom_write_block(&data, PROGRAMS_ADDR, 2);
- printf("no app wait program\r\n");
- SoftReset();
- }
- }
- while (1)
- {
- }
- }
- #define Set_NVIC(Channel,Preemption,Sub,Cmd) { NVIC_InitStructure.NVIC_IRQChannel = Channel; \
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = Preemption; \
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = Sub; \
- NVIC_InitStructure.NVIC_IRQChannelCmd = Cmd; \
- NVIC_Init(&NVIC_InitStructure); }
-
-
-
-
- //************************************************************************************************
- //**名 稱:NVIC_Init
- //**說 明:中斷優(yōu)先級初始化
- //**形 參:無
- //**返 回 值:無
- //************************************************************************************************
- void NVIC_Configuration (void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //4個搶占優(yōu)先級,4個從優(yōu)先級
- /* Configure the SysTick handler priority */
- NVIC_SetPriority(SysTick_IRQn, 0);//SysTick中斷優(yōu)先級設(shè)置 //非實時任務(wù)優(yōu)先級最低 3,0
- Set_NVIC(USART2_IRQn , 2, 0,ENABLE) ;
- }
- /*******************************文件結(jié)束***************************************/
復(fù)制代碼
所有資料51hei提供下載:
STM32遠(yuǎn)程升級.7z
(1.08 MB, 下載次數(shù): 33)
2019-4-30 02:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|