久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8477|回復: 13
打印 上一主題 下一主題
收起左側

stm32f103單片機的串口IAP升級程序

  [復制鏈接]
跳轉到指定樓層
樓主
使用stm32f103r8t6 實現IAP升級代碼精簡但是很實用
可以用來制作遠程升級

單片機源程序如下:
  1. /*******************************************************************************
  2. ** 文件名:                 mian.c
  3. ** 版本:                  1.0
  4. ** 工作環境:         RealView MDK-ARM 4.14
  5. ** 作者:                 wuguoyana
  6. ** 生成日期:         2011-04-28
  7. ** 功能:                USART初始化和RCC設置,然后從common.c中執行主菜單
  8. ** 相關文件:        stm32f10x.h

  9. *******************************************************************************/
  10. /* 包含頭文件 *****************************************************************/
  11. #include "common.h"
  12. #define USART1_IRQChannel            ((u8)0x25)  /* USART1 global Interrupt */
  13. /* 類型聲明 ------------------------------------------------------------------*/
  14. /* 宏 ------------------------------------------------------------------------*/
  15. #define LED2   GPIO_Pin_6
  16. #define LED3   GPIO_Pin_7
  17. #define LED4   GPIO_Pin_8
  18. #define LED5   GPIO_Pin_9

  19. #define TRUE        0xff
  20. #define FALSE        0x00

  21. /* 變量 ----------------------------------------------------------------------*/
  22. extern pFunction Jump_To_Application;
  23. extern uint32_t JumpAddress;

  24. /* 函數聲明 ------------------------------------------------------------------*/
  25. void Delay(__IO uint32_t nCount);
  26. void LED_Configuration(void);
  27. static void IAP_Init(void);
  28. void KEY_Configuration(void);
  29. void GPIO_Configuration(void);
  30. void USART_Configuration(void);
  31. unsigned char RCC_Configuration(void);
  32. void NVIC_Configuration(void);
  33. /* 函數功能 ------------------------------------------------------------------*/

  34. /*******************************************************************************
  35.   * @函數名稱        main
  36.   * @函數說明   主函數
  37.   * @輸入參數   無
  38.   * @輸出參數   無
  39.   * @返回參數   無
  40. *******************************************************************************/
  41. int main(void)
  42. {
  43.         //Flash 解鎖
  44.         FLASH_Unlock();
  45.         NVIC_Configuration();
  46.     LED_Configuration();
  47.     //配置按鍵
  48.     KEY_Configuration() ;
  49.     IAP_Init();
  50.     //按鍵是否按下
  51.     //if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)  == 0x00)
  52.     if (1)
  53.     {
  54.         //假如按鍵按下
  55.         //執行IAP驅動程序更新Flash程序

  56.         SerialPutString("\r\n======================================================================");
  57.         SerialPutString("\r\n=                                                                    =");
  58.         SerialPutString("\r\n=     In-Application Programming Application  (Version 1.0.0)        =");
  59.         SerialPutString("\r\n=                                                                    =");
  60.         SerialPutString("\r\n======================================================================");
  61.         SerialPutString("\r\n\r\n");
  62.         Main_Menu ();
  63.     }
  64.     //否則執行用戶程序
  65.     else
  66.     {
  67.         //判斷用戶是否已經下載程序,因為正常情況下此地址是棧地址。
  68.         //若沒有這一句的話,即使沒有下載程序也會進入而導致跑飛。
  69.         if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
  70.         {
  71.             SerialPutString("Execute user Program\r\n\n");
  72.             //跳轉至用戶代碼
  73.             JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
  74.             Jump_To_Application = (pFunction) JumpAddress;

  75.             //初始化用戶程序的堆棧指針
  76.             __set_MSP(*(__IO uint32_t*) ApplicationAddress);
  77.             Jump_To_Application();
  78.         }
  79.         else
  80.         {
  81.             SerialPutString("no user Program\r\n\n");
  82.         }
  83.     }

  84.     while (1)
  85.     {

  86.     }
  87. }


  88. /*******************************************************************************
  89.   * @函數名稱        LED_Configuration
  90.   * @函數說明   配置使用LED
  91.   * @輸入參數   無
  92.   * @輸出參數   無
  93.   * @返回參數   無
  94. *******************************************************************************/
  95. void LED_Configuration(void)
  96. {
  97.     GPIO_InitTypeDef GPIO_InitStructure;
  98.     //使能LED所在GPIO的時鐘
  99.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
  100.     //初始化LED的GPIO
  101.     GPIO_InitStructure.GPIO_Pin = LED4 | LED5;
  102.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  103.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  104.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  105.     GPIO_SetBits(GPIOB,LED4 | LED5);  //熄滅LED2-5
  106. }

  107. void NVIC_Configuration(void)
  108. {
  109.   NVIC_InitTypeDef NVIC_InitStructure;

  110.   /* Set the Vector Table base location at 0x08000000 */
  111.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);   

  112.   /* Configure one bit for preemption priority */
  113.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  114.   
  115.   /* Enable the EXTI8 Interrupt */
  116.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  117.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  118.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  119.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  120.   NVIC_Init(&NVIC_InitStructure);
  121. }

  122. /*******************************************************************************
  123.   * @函數名稱        KEY_Configuration
  124.   * @函數說明   按鍵初始化
  125.   * @輸入參數   無
  126.   * @輸出參數   無
  127.   * @返回參數   無
  128. *******************************************************************************/
  129. void KEY_Configuration(void)
  130. {
  131.     GPIO_InitTypeDef GPIO_InitStructure;
  132.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  133.     //配置按鍵
  134.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  135.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  136.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  137. }

  138. /*******************************************************************************
  139.   * @函數名稱        GPIO_Configuration
  140.   * @函數說明   配置使用USART1的相關IO管腳
  141.   * @輸入參數   無
  142.   * @輸出參數   無
  143.   * @返回參數   無
  144. *******************************************************************************/
  145. void GPIO_Configuration(void)
  146. {
  147.     GPIO_InitTypeDef GPIO_InitStructure;
  148.         
  149.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
  150.     // 配置 USART1 Tx (PA.09) 作為功能引腳并上拉輸出模式
  151.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  152.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  153.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  154.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  155.     //配置 USART1 Tx (PA.10) 作為功能引腳并是浮空輸入模式
  156.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  157.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  158.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  159. }

  160. /*******************************************************************************
  161.   * @函數名稱        IAP_Init
  162.   * @函數說明   配置使用IAP
  163.   * @輸入參數   無
  164.   * @輸出參數   無
  165.   * @返回參數   無
  166. *******************************************************************************/
  167. void IAP_Init(void)
  168. {
  169.     USART_InitTypeDef USART_InitStructure;
  170.         GPIO_Configuration();

  171.     /* USART1 配置 ------------------------------------------------------------
  172.          USART1 配置如下:
  173.           - 波特率      = 115200 baud
  174.           - 字長        = 8 Bits
  175.           - 一個停止位
  176.           - 無校驗
  177.           - 無硬件流控制
  178.           - 接受和發送使能
  179.     --------------------------------------------------------------------------*/
  180.     USART_InitStructure.USART_BaudRate = 115200;
  181.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  182.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  183.     USART_InitStructure.USART_Parity = USART_Parity_No;
  184.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  185.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;


  186.     USART_Init(USART1, &USART_InitStructure);
  187.     // 使能 USART1
  188.     USART_Cmd(USART1, ENABLE);
  189.         
  190. }

  191. /*******************************************************************************
  192.   * @函數名稱        Delay
  193.   * @函數說明   插入一段延時時間
  194.   * @輸入參數   nCount: 指定延時時間長度
  195.   * @輸出參數   無
  196.   * @返回參數   無
  197. *******************************************************************************/
  198. void Delay(__IO uint32_t nCount)
  199. {
  200.     for (; nCount != 0; nCount--);
  201. }

  202. #ifdef  USE_FULL_ASSERT

  203. /*******************************************************************************
  204.   * @函數名稱        assert_failed
  205.   * @函數說明   報告在檢查參數發生錯誤時的源文件名和錯誤行數
  206.   * @輸入參數   file: 源文件名
  207.                                   line: 錯誤所在行數
  208.   * @輸出參數   無
  209.   * @返回參數   無
  210. *******************************************************************************/
  211. void assert_failed(uint8_t* file, uint32_t line)
  212. {
  213.     /* 用戶可以增加自己的代碼用于報告錯誤的文件名和所在行數,
  214.        例如:printf("錯誤參數值: 文件名 %s 在 %d行\r\n", file, line) */

  215.     //死循環
  216.     while (1)
  217.     {
  218.     }
  219. }
  220. #endif



  221. /*******************************文件結束***************************************/
復制代碼

所有資料51hei提供下載:
STM32 IAP源碼和測試代碼.7z (248.23 KB, 下載次數: 241)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:110257 發表于 2019-4-5 06:48 | 只看該作者
IAP 空間最少能做到多少?
回復

使用道具 舉報

板凳
ID:285194 發表于 2019-4-11 14:42 | 只看該作者
你好樓主,有個問題想請問一下,你給的例程我能夠運行成功,但是換了我自己本身的程序后,能夠燒寫進去,但是不能夠運行,好像卡死一樣,這是我的一些基本程序

1.png (9.99 KB, 下載次數: 130)

1.png

2.png (19.68 KB, 下載次數: 131)

2.png

3.png (24.61 KB, 下載次數: 122)

3.png
回復

使用道具 舉報

地板
ID:285194 發表于 2019-4-11 14:43 | 只看該作者
你那邊的程序我也已經改成 0x8010000的了
回復

使用道具 舉報

5#
ID:285194 發表于 2019-4-12 10:30 | 只看該作者
已經改好了,我是部分和樓主不符合的相關.c和.h文件替換掉,再在APP函數前面加了個__set_PRIMASK(0);全局中斷開啟,終于調通了?希望樓主看到信息能夠回復一下,是不是你的文件里面,某些固件庫有改動某些信息,謝謝樓主的教程。
回復

使用道具 舉報

6#
ID:56855 發表于 2019-5-23 21:27 | 只看該作者
還不錯
回復

使用道具 舉報

7#
ID:445069 發表于 2019-6-11 09:57 | 只看該作者
stm32f103串口IAP升級程序,這個必須頂!
回復

使用道具 舉報

8#
ID:371270 發表于 2019-9-9 15:00 | 只看該作者
好東西但是我編譯出來一堆錯誤www
回復

使用道具 舉報

9#
ID:68585 發表于 2019-9-16 14:26 | 只看該作者
這個很好,做個標記
回復

使用道具 舉報

10#
ID:334749 發表于 2020-7-3 16:01 | 只看該作者
Main_Menu ();函數定義那里去啦?
回復

使用道具 舉報

11#
ID:390701 發表于 2021-8-6 16:18 | 只看該作者
nice,可以運行
回復

使用道具 舉報

12#
ID:390701 發表于 2021-8-6 16:19 | 只看該作者
老農要進城 發表于 2020-7-3 16:01
Main_Menu ();函數定義那里去啦?

if(1)打印輸出下面
回復

使用道具 舉報

13#
ID:584195 發表于 2021-8-6 18:12 | 只看該作者
學習了,希望以后可以用得上!
回復

使用道具 舉報

14#
ID:390701 發表于 2021-8-9 09:45 | 只看該作者
但是為什么只能更新一次,第二次后更新無效呢
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99国产精品99久久久久久粉嫩 | 国产欧美精品 | 国产精品三级 | 亚洲精品自拍 | 久久一| 91精品久久久久久久久中文字幕 | 欧美一级二级在线观看 | 久久久久国产精品一区 | 久草中文在线 | 亚洲成人综合在线 | 91综合网 | 免费一看一级毛片 | 一区二区三区av夏目彩春 | 亚州成人 | 欧美日一区| 日韩欧美中文字幕在线观看 | 日韩一区二区三区精品 | 亚洲毛片在线 | 日韩成人在线播放 | 国产在线小视频 | 亚洲精品一区二区在线观看 | 亚洲一级视频在线 | 一区二区三区亚洲 | 拍戏被cao翻了h承欢 | 国产精品一区二区三 | 国产精品美女久久久久久免费 | 中文字幕成人网 | 日本电影免费完整观看 | 午夜二区 | 欧美专区在线 | 在线观看亚洲专区 | 欧美成人精品一区二区三区 | 欧美三级电影在线播放 | 成人精品视频99在线观看免费 | 电影91久久久 | 欧美三级在线 | 国产亚洲精品91 | 国产高清精品一区 | h视频免费在线观看 | 欧美乱码精品一区二区三区 | 欧区一欧区二欧区三免费 |