項目中正在使用的 STM32系列單片機 的遠程IAP使用方式,從此刷機不用再拆機!
0.png (4.74 KB, 下載次數: 20)
下載附件
2019-4-30 02:14 上傳
單片機源程序如下:
- /*******************************************************************************
- ** 功能: 遠程燒寫程序的啟動文件
- *******************************************************************************/
- #include "stm32boot.h"
- #include "EEPROM.h"
- /* 類型聲明 -----------------------------------------------------------------*/
- typedef void (*pFunction)(void);
- /* 變量 ----------------------------------------------------------------------*/
- pFunction Jump_To_Application ;
- uint32_t JumpAddress;
- #define ApplicationAddress 0x8003000
- void NVIC_Configuration(void);
- /*******************************************************************************
- * @函數名稱 main
- * @函數說明 主函數
- * @輸入參數 無
- * @輸出參數 無
- * @返回參數 無
- *******************************************************************************/
- 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;//關閉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
- // //系統時基啟動
- // // SysTick_Init();
- //
- // led_on();
- while (1)
- {
- Communication();
- }
- }
- //否則執行用戶程序
- else
- {
- //判斷用戶是否已經下載程序,因為正常情況下此地址是棧地址。
- //若沒有這一句的話,即使沒有下載程序也會進入而導致跑飛。
- 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
- //**說 明:中斷優先級初始化
- //**形 參:無
- //**返 回 值:無
- //************************************************************************************************
- void NVIC_Configuration (void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //4個搶占優先級,4個從優先級
- /* Configure the SysTick handler priority */
- NVIC_SetPriority(SysTick_IRQn, 0);//SysTick中斷優先級設置 //非實時任務優先級最低 3,0
- Set_NVIC(USART2_IRQn , 2, 0,ENABLE) ;
- }
- /*******************************文件結束***************************************/
復制代碼
所有資料51hei提供下載:
STM32遠程升級.7z
(1.08 MB, 下載次數: 33)
2019-4-30 02:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|