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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

自制AVR脫機下載機(量產神器)帶pc上位機和stm32下位機源碼

  [復制鏈接]
跳轉到指定樓層
樓主
自制的AVR離線下載器,使用的STM32F103C8T6單片機,通過上位機,發送hex文件,然后存在SD卡中,下位機帶有文件系統,也可以通過電腦,按一定的格式,直接復制在SD當中。
上位機界面:


上位機源碼:




stm32單片機下位機源程序如下:
  1. /*******************************************************************
  2. *
  3. *        模塊名稱 :         程序腳本
  4. *        文件名稱 :  main.c
  5. *        版    本 :  V1.0
  6. *        說    明 :  硬件底層驅動程序集合
  7. *   芯    片 : STM32F103C8T6(48個外圍引腳,64K Flash,LQFP封裝,20K SRAM)

  8. *----------------修改記錄------------------
  9. *   版 本 號 :  
  10. *   修改日期 :   
  11. *   作    者 :   ChenLin
  12. *        說    明 :   
  13. *
  14. ********************************************************************/
  15. #include "main.h"
  16. #include "spi.h"
  17. #include "AVR_Download.h"
  18. #include "sd.h"
  19. #include "HMI_Display.h"

  20. #define BOARD_TEST    //打開板子測試
  21. #define BEEP   PAout(9)

  22. /* 文件系統相關定義 ---------------------------------------------------------*/
  23. ///////////////////////////////////////////////////
  24. #define READ_TEST

  25.         FATFS fs;// Work area (file system object) for logical drive
  26.         FRESULT res;// FatFs function common result code
  27.         FIL fsrc, fdst;      // file objects
  28.         BYTE buffer[512]; // file copy buffer
  29.         UINT br, bw;         // File R/W count
  30.         DIR Folder;
  31.         unsigned char w_buffer[]={"test\r\n"};//演示寫入文件
  32.         const char folder_name[] = {"/system"}; //文件夾名字
  33.         char file_path[FILE_LONG];//文件路徑
  34.         char newfile_path[FILE_LONG];//新文件路徑,改文件名用
  35. #ifdef READ_TEST
  36.         unsigned char r_buffer[512];//演示讀入文件
  37. #endif
  38. ////////////////////////////////////////////////////

  39. int T1,T2,T3;
  40. /***************************************************************************
  41. ;** 函數名稱: void RCC_Configuration(void)
  42. ;** 功能描述: RCC時針配置
  43. ;** 輸入參數:
  44. ;** 返 回 值:
  45. ;** 全局變量:
  46. ;** 調用模塊:
  47. ;** 作   者:   ChenLin
  48. ;** 日   期:   2017-1-13
  49. ;** 修改原因:
  50. ;** 說    明:
  51. ;***************************************************************************/
  52. void RCC_Configuration(void)
  53. {
  54.           RCC_DeInit();                                                                                 //初始化為缺省值
  55.         RCC_HSEConfig(RCC_HSE_ON);                                                         //使能外部的高速時鐘
  56.         while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET);         //等待外部高速時鐘就緒

  57.         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//Enable Prefetch Buffer
  58.         FLASH_SetLatency(FLASH_Latency_2);                                         //Flash 2 wait state

  59.         RCC_HCLKConfig(RCC_SYSCLK_Div1);
  60.         RCC_PCLK2Config(RCC_HCLK_Div1);                                  //PCLK2=HCLK
  61.         RCC_PCLK1Config(RCC_HCLK_Div2);                                  //PCLK2=HCLK/2
  62.         RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //PLLCLK=8MHZ*9=72MH
  63.         RCC_PLLCmd(ENABLE);                                   //ENABLE PLLCLK
  64.         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);          //Wait till PLLCLK is ready
  65.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);                          //Set PLL as system clock
  66.         while(RCC_GetSYSCLKSource() != 0x08);                 //等待直到PLLCLK為系統時鐘

  67.         RCC->CR |= (uint32_t)0x00080000;                                          //打開CSS(時鐘監視系統)
  68.         //***********打開相應的外設************//

  69.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  70.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  71.         //SystemInit();  //全部外部時鐘;        固件庫默認

  72. }
  73. /***************************************************************************
  74. ;** 函數名稱: void testProgram()
  75. ;** 功能描述: 用來測試板子的好壞,一輸入對應一輸出
  76. ;** 輸入參數:
  77. ;** 返 回 值:
  78. ;** 全局變量:
  79. ;** 調用模塊:
  80. ;** 作   者:   ChenLin
  81. ;** 日   期:   2017-1-13
  82. ;** 修改原因:
  83. ;** 說    明:
  84. ;***************************************************************************/
  85. void testProgram()
  86. {
  87.          if(!S1)
  88.         OUT1 = ON;
  89.     else
  90.         OUT1 = OFF;

  91.     if(!S2)
  92.         OUT2 = ON;
  93.     else
  94.         OUT2 = OFF;

  95.     if(!S3)
  96.         OUT3 = ON;
  97.     else
  98.         OUT3 = OFF;

  99.     if(!S4)
  100.         OUT4 = ON;
  101.     else
  102.         OUT4 = OFF;

  103.     if(!S5)
  104.         OUT5 = ON;
  105.     else
  106.         OUT5 = OFF;

  107.     if(!S6)
  108.         OUT6 = ON;
  109.     else
  110.         OUT6 = OFF;

  111.     if(!S7)
  112.         OUT7 = ON;
  113.     else
  114.         OUT7 = OFF;

  115.     if(!S8)
  116.         OUT8 = ON;
  117.     else
  118.         OUT8 = OFF;

  119.     if(!S9)
  120.         OUT9 = ON;
  121.     else
  122.         OUT9 = OFF;
  123.     if(!S10)
  124.         OUT10 = ON;
  125.     else
  126.         OUT10 = OFF;

  127.     if(!S11)
  128.         OUT11 = ON;
  129.     else
  130.         OUT11 = OFF;

  131.     if(!S12)
  132.         OUT12 = ON;
  133.     else
  134.         OUT12 = OFF;

  135.     if(!S13)
  136.         OUT13 = ON;
  137.     else
  138.         OUT13 = OFF;

  139.     if(!S14)
  140.         OUT14 = ON;
  141.     else
  142.         OUT14 = OFF;

  143.     if(!S15)
  144.         OUT15 = ON;
  145.     else
  146.         OUT15 = OFF;

  147.     if(!S16)
  148.         OUT16 = ON;
  149.     else
  150.         OUT16 = OFF;
  151.                
  152. }

  153. /***************************************************************************
  154. ;** 函數名稱: void Get_File_Path(char *pp)
  155. ;** 輸入參數: 得到文件路么,把文件名和文件夾名合成一個路徑
  156. ;** 返 回 值:
  157. ;** 全局變量:
  158. ;** 調用模塊:
  159. ;** 作   者:   ChenLin
  160. ;** 日   期:   2017-7-26
  161. ;** 修改原因:
  162. ;** 說    明:
  163. ;***************************************************************************/
  164. void Get_File_Path(char *path,char *pp)
  165. {
  166.         u8 i = 0;
  167.         char file_att[] = ".txt";//文件屬性
  168.         //清空數組
  169.         for(i = 0;path[i] != 0;i++)
  170.         {
  171.                 path[i] = 0;
  172.         }
  173.         
  174.         //加入文件夾名字
  175.         for(i = 0;folder_name[i] != 0;i++)
  176.         {
  177.                 *path++ = folder_name[i];
  178.         }
  179.         *path++ = '/';
  180.         
  181.         //加入文件名字
  182.         while((*pp != '\r') && (*pp != '\n') && (*pp != '\0'))
  183.         {
  184.                 *path++ = *pp++;
  185.         }
  186.         //加入文件屬性
  187.         for(i = 0;file_att[i] != 0;i++)
  188.         {
  189.                 *path++ = file_att[i];
  190.         }
  191.         *path = 0;
  192. }

  193. /***************************************************************************
  194. ;** 函數名稱: void FATFS_Init(void)
  195. ;** 輸入參數: FATFS文件系統相關初始化
  196. ;** 返 回 值:
  197. ;** 全局變量:
  198. ;** 調用模塊:
  199. ;** 作   者:   ChenLin
  200. ;** 日   期:   2017-7-22
  201. ;** 修改原因:
  202. ;** 說    明:
  203. ;***************************************************************************/
  204. void FATFS_Init()
  205. {
  206.         DIR Folder;
  207.         char file_name[] = "test1";
  208.         FIL *file = &fsrc;
  209.         u32 offset = 0;
  210.         disk_initialize(0);
  211.         res = f_mount(&fs,"0:",1);
  212.         res = f_mkdir(folder_name);//創建一個文件夾        
  213.         res = f_opendir(&Folder,folder_name);
  214.         Get_File_Path(file_path,file_name);        //得到文件路徑
  215.         
  216.         res=f_open(&fsrc,file_path,FA_CREATE_ALWAYS | FA_WRITE |FA_READ);
  217.         if(res == FR_OK)
  218.         {
  219.                 printfU3("打開文件成功\r\n");
  220.         }
  221.         else if(res == FR_NO_FILE)
  222.         {
  223.                 printfU3("找不到該文件\r\n");
  224.         }
  225.         else if(res == FR_NO_PATH)
  226.         {
  227.                 printfU3("找不到該路徑\r\n");
  228.         }
  229.         else if(res == FR_INVALID_NAME)
  230.         {
  231.                 printfU3("文件名無效\r\n");
  232.         }
  233.         else if(res == FR_INVALID_DRIVE)
  234.         {
  235.                 printfU3("驅動器號無效\r\n");
  236.         }
  237.         else if(res == FR_NOT_READY )
  238.         {
  239.                 printfU3("驅動器中沒有存儲介質\r\n");
  240.         }
  241.         else if(res == FR_NO_FILESYSTEM )
  242.         {
  243.             printfU3("磁盤上沒有有效地FAT卷。\r\n");
  244.         }
  245.         
  246.         res = f_write(file, &w_buffer, strlen((char*)w_buffer), &bw);
  247.         offset+=bw;
  248.     f_lseek(file,offset);
  249.         res = f_write(file, "chenlin\r\n", 10, &bw);
  250.         if(res == FR_OK )
  251.         {
  252.                 printfU3("寫入成功!\r\n");
  253.         }
  254.         else
  255.         {
  256.                 printfU3("寫入失敗!\r\n");
  257.         }
  258.         
  259.         res=f_close(&fsrc);
  260.         
  261.         if(res == FR_OK )
  262.         {
  263.                 printfU3("關閉成功!\r\n");
  264.         }
  265.         else
  266.         {
  267.                 printfU3("關閉失敗!\r\n");
  268.         }
  269.         
  270. #ifdef READ_TEST        
  271. //        f_unlink(file_path);//刪除文件
  272.         res = f_opendir(&Folder,folder_name);
  273.         res=f_open(&fsrc,file_path,FA_READ);
  274.         f_gets((char*)r_buffer,32,&fsrc);
  275.         sprintfU3("r=%s\r\n",r_buffer);        
  276.         offset = strlen((char*)r_buffer);
  277.         f_gets((char*)r_buffer,32,&fsrc);
  278.         sprintfU3("r=%s\r\n",r_buffer);        
  279.         res=f_close(&fsrc);
  280. #endif
  281.         
  282. }

  283. /***************************************************************************
  284. ;** 函數名稱: void buttonFunction()
  285. ;** 功能描述: 三個獨立按鈕功能程序,按鈕實現上下翻頁
  286. ;** 輸入參數:
  287. ;** 返 回 值:
  288. ;** 全局變量:
  289. ;** 調用模塊:
  290. ;** 作   者:   ChenLin
  291. ;** 日   期:   2017-7-27
  292. ;** 修改原因:
  293. ;** 說    明:
  294. ;***************************************************************************/
  295. void buttonFunction()
  296. {
  297.         
  298.         if(S5 && S9)
  299.                 p->flag[2] = false;
  300.         if(p->flag[2] == false)
  301.         if(!S5 && !S9) //同時按下S5和S9開關蜂鳴器
  302.         {
  303.                 p->flag[2] = true;
  304.                 p->LockBeep = ~(p->LockBeep);
  305.                 if(p->LockBeep == true)
  306.                 {
  307.                         HMISends("t9.txt=\"蜂鳴器失效\"");
  308.                         HMISendb(0xff,3);
  309.                         HMISends("t9.bco=65504");//控件顏色為黃色
  310.                         HMISendb(0xff,3);
  311.                         HMISends("vis t9,1");
  312.                         HMISendb(0xff,3);
  313.                         delay_Nms(1000);
  314.                         HMISends("vis t9,0");
  315.                         HMISendb(0xff,3);
  316.                 }
  317.                 else
  318.                 {
  319.                         HMISends("t9.txt=\"蜂鳴器已打開\"");
  320.                         HMISendb(0xff,3);
  321.                         HMISends("t9.bco=2024");//控件顏色為亮綠色
  322.                         HMISendb(0xff,3);
  323.                         HMISends("vis t9,1");
  324.                         HMISendb(0xff,3);
  325.                         delay_Nms(1000);
  326.                         HMISends("vis t9,0");
  327.                         HMISendb(0xff,3);
  328.                 }
  329.                 return;
  330.         }
  331.         
  332.         if(p->flag[1] == false)
  333.         if(p->LastPage)  //上一頁
  334.         {
  335.                 p->flag[1] = true;
  336.                 Read_Num = Read_Num - 1;
  337.                 if(Read_Num <= 0)
  338.                 {
  339.                         Read_Num = 100;
  340.                 }
  341.                 AVR.flag1 = true;  //加標志
  342.                 AVR.flashUpdate = false; //刷新flash標志
  343.                 return;
  344.         }
  345.         
  346.         if(p->NextPage)  //下一頁
  347.         {
  348.                 while(!S5)
  349.                 {
  350.                         keyScan();        
  351.                         if(p->ProgramStatus == true) //是長按
  352.                         {
  353.                                 return;
  354.                         }
  355.                 }
  356.                 Read_Num = Read_Num + 1;
  357.                 if(Read_Num > 100)
  358.                 {
  359.                         Read_Num = 1;
  360.                 }
  361.                 AVR.flag1 = false;
  362.                 AVR.flashUpdate = false; //刷新flash標志,fasle有效
  363.         }
  364.         
  365. }

  366. void BeepControl(u8 n)
  367. {
  368.         if((p->LockBeep == false)&&(n == ON))
  369.         {
  370.                 BEEP = ON;
  371.                 delay_Nms(400);
  372.                 BEEP = OFF;
  373.         }
  374.         else
  375.                 BEEP = OFF;
  376. }

  377. int main()                                                   
  378. {               
  379.     RXstructure *p3 = &usart3_buf;
  380.         RXstructure *p2 = &usart2_buf;
  381.         uint32_t sdCapacity;
  382.         u8 i = 0;
  383.     delay_Nms(500);  //上電延時
  384.         RCC_Configuration();
  385.         GPIO_Configuration();
  386.         IIC_Configuration();
  387.         TIM3_Configuration(35999, 10, 5);    //定時5ms  
  388.         TIM4_Configuration(35999, 10, 5);    //定時5ms  
  389.         USART3_Configuration(115200);
  390.         USART2_Configuration(9600);

  391.         SPI1_Config();  //與AVR通信
  392.         SPI2_Config();  //SD卡通信
  393.         
  394.         printfU3("communication finish\r\n");
  395.         while(SD_Init())  //SD卡初始化
  396.         {
  397.                 i++;
  398.                 if(i>10)
  399.                 {
  400.                         HMISends("page no SD Card");   
  401.                         HMISendb(0xff,3);
  402.                         while(SD_Init());  //SD卡初始化
  403.                 }
  404.         }
  405.         
  406.         printfU3("SD卡初始化成功\r\n");
  407.         SD_ReadCapacity(&sdCapacity);
  408.         sprintfU3("SD卡扇區數:%d ",sdCapacity);
  409.         if(SD_TYPE == SD_TYPE_V2HC)
  410.                 printfU3("This is High Capacity SD Memory Card\r\n");
  411.         else if(SD_TYPE == SD_TYPE_V2)
  412.                 printfU3("This is Standard Capacity SD Memory Card\r\n");
  413.         
  414.         HMI_Init();
  415.         
  416.         FATFS_Init();   //FATFS文件系統初始化

  417.         while(1)
  418.         {        
  419.                 keyScan();
  420.                 buttonFunction();//按鍵功能
  421.                 if(p->ProgramStatus)
  422.                 {
  423.                         AVR.programFlag = ~AVR.programFlag;   
  424.                         
  425.                         if(AVR.programFlag==true)
  426.                         {
  427.                                 printfU3("enter program status\r\n");
  428.                                 HMISends("page program");
  429.                                 HMISendb(0xff,3);
  430.                         
  431.                         }
  432.                         else
  433.                         {
  434.                                 printfU3("quit program status\r\n");
  435.                                 HMISends("page main");
  436.                                 HMISendb(0xff,3);
  437.                                 Read_Num=IIC_Read_Data(num_Addr); //讀保存的鏡像號
  438.                                 AVR.flashUpdate = false;
  439.                         }
  440.                         AVR.flag2 = false; //如果沒找到flash,再進入一次HMI顯示no flash操作
  441.                         BeepControl(ON);
  442.                         while(!S5);
  443.                         delay_Nms(10);
  444.                 }           
  445.                
  446.                 //編程狀態
  447.                 if(AVR.programFlag == true)
  448.                 {
  449.                         
  450.                         if(p3->flagRec)
  451.                         {
  452.                                 if(p3->data[0] == ':')       //接收到的是hex文件
  453.                                         Save_Data_To_Flash();
  454.                                 else                         //接收到的是命令
  455.                                 {
  456.                                         usart3Function();
  457. ……………………

  458. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
AVR離線下載器-上位機.zip (100.88 KB, 下載次數: 186)
AVR離線下載器 - SD卡-帶文件系統.rar (2.44 MB, 下載次數: 169)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

來自 2#
ID:311665 發表于 2018-4-19 15:51 | 只看該作者
樓主,我想自制這個編程器,請問有電路圖嗎?共享一下可以嗎?
還有就是這個上位機是用什么平臺寫的?看文件不是VB6寫的,是VC嗎?還是PHP?
硬件做好后直接燒錄里面那個HEX文件即可使用了對吧?還要做其它設置嗎?
回復

使用道具 舉報

板凳
ID:38212 發表于 2017-9-9 18:41 | 只看該作者
東西不錯,學習了,  謝謝分享!
回復

使用道具 舉報

地板
ID:38212 發表于 2017-9-9 18:42 | 只看該作者
東西不錯!學習了。 謝謝分享!
回復

使用道具 舉報

5#
ID:43554 發表于 2017-9-13 11:19 | 只看該作者
很好的設計,幫頂了!
回復

使用道具 舉報

6#
ID:224923 發表于 2017-9-18 14:37 | 只看該作者
很好的設計,值得研究。謝謝樓主共享。
回復

使用道具 舉報

7#
ID:272158 發表于 2018-1-6 13:46 | 只看該作者
有沒有圖紙呀,提供一下學習學習。
回復

使用道具 舉報

8#
ID:108964 發表于 2018-5-1 22:45 | 只看該作者
基于STM32的AVR單片機下載機!!!
回復

使用道具 舉報

9#
ID:277202 發表于 2018-5-11 08:28 | 只看該作者
mark 學習
回復

使用道具 舉報

10#
ID:48413 發表于 2018-5-15 08:02 | 只看該作者
正需要那,謝謝你
回復

使用道具 舉報

11#
ID:282291 發表于 2018-6-8 15:53 | 只看該作者
不錯
回復

使用道具 舉報

12#
ID:380992 發表于 2018-7-30 18:30 | 只看該作者
正有需要,謝謝你
回復

使用道具 舉報

13#
ID:420316 發表于 2018-11-3 23:35 | 只看該作者
這個厲害了,我就是因為搜這個資料找到這里的,感謝,想學著做一款離線燒錄
回復

使用道具 舉報

14#
ID:399144 發表于 2019-1-22 14:22 | 只看該作者
有沒有電路圖呀,想學習一下
回復

使用道具 舉報

15#
ID:161616 發表于 2019-1-23 09:16 | 只看該作者
謝謝,學習了
回復

使用道具 舉報

16#
ID:471573 發表于 2019-1-23 15:45 | 只看該作者
好東西!!!
回復

使用道具 舉報

17#
ID:357775 發表于 2019-11-4 10:18 | 只看該作者
下位機源碼沒上傳啊
回復

使用道具 舉報

18#
ID:517951 發表于 2019-12-12 17:44 | 只看該作者
樓主,好文章,學習啦
回復

使用道具 舉報

19#
ID:824599 發表于 2020-9-29 15:14 | 只看該作者
請問適用于STM脫機下載機嗎?
回復

使用道具 舉報

20#
ID:517951 發表于 2020-11-15 17:45 | 只看該作者
不錯,值得學習。51hei有你更精彩!!
回復

使用道具 舉報

21#
ID:271449 發表于 2021-5-1 14:12 | 只看該作者
上位機看不懂,只能看看下位機的了
回復

使用道具 舉報

22#
ID:87000 發表于 2021-11-10 13:39 | 只看該作者
沒有原理圖,不能仿制
回復

使用道具 舉報

23#
ID:23303 發表于 2023-4-18 10:13 | 只看該作者
我就是因為搜這個資料找到這里的,感謝,想學著做一款離線燒錄
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品免费 | 国产成人免费在线观看 | 亚洲精品国产成人 | 国产激情福利 | 亚洲一区二区中文字幕 | 亭亭五月激情 | 国内91在线 | 99精品一级欧美片免费播放 | 99精品久久久久久中文字幕 | 久久在视频 | 国产目拍亚洲精品99久久精品 | 91成人在线 | 久久精品国产一区二区电影 | 精品美女在线观看视频在线观看 | 欧美中文字幕在线观看 | 久久一区二 | 9999国产精品欧美久久久久久 | 午夜视频精品 | 麻豆久久精品 | 人人做人人澡人人爽欧美 | 日日操夜夜操视频 | 97国产精品视频 | 亚洲狠狠爱一区二区三区 | 久久久国产精品 | 色资源站 | 亚洲伊人精品酒店 | 国产精品国产成人国产三级 | 男女污网站 | 伊大人久久 | 久久亚洲国产精品日日av夜夜 | 九七午夜剧场福利写真 | 免费视频一区二区 | 亚洲一区二区三区免费视频 | 亚洲欧美日韩国产综合 | 宅男伊人 | 亚洲一区二区av | 久久精品91 | 日韩精品1区2区 | 成人一区二区三区 | 欧美一级在线免费 | 蜜桃免费一区二区三区 |