Advertisement
Guest User

Arduino upload over serial

a guest
Apr 8th, 2017
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.31 KB | None | 0 0
  1. #include <SoftwareSerial.h>
  2.  
  3. ///Promenne potrebne pro funkci
  4. byte prichozi[64];
  5. long podpisProcesoru = 0;
  6.  
  7. //piny virtualniho UARTu
  8. SoftwareSerial programator = SoftwareSerial(10, 11);
  9. int baud = 57600;
  10.  
  11. //Pin ktery pripojite na RESET hosta, tedy arduina ktere bude progamovano
  12. int rst = 2;
  13.  
  14. void setup() {
  15.  
  16.  Serial.begin(9600);
  17.  
  18. }
  19.  
  20. void loop() {
  21.  
  22.    
  23.     if(beginProgramming()){
  24.       Serial.println("Synchronizovan s cipem");
  25.       if(getParams()){
  26.         Serial.println("Parametry ziskany");
  27.         Serial.print("\nPodpis procesoru: ");
  28.         Serial.print(podpisProcesoru, HEX);
  29.        
  30.         }else Serial.println("Chyba ziskavani parametru!");
  31.        
  32.      
  33.       }else Serial.println("Chyba synchronizace s cipem!");
  34.    
  35.  delay(5000);
  36.  
  37. }
  38.  
  39. int beginProgramming(){
  40.  
  41.   vynulujBuffer();
  42.  
  43.   //Nastavi rychlost UARTu a rst jako vystup
  44.   programator.begin(baud);
  45.   pinMode(rst, OUTPUT);
  46.   //Posle pulz pro reset procesoru
  47.   pinMode(rst, LOW);
  48.   delay(100);
  49.   pinMode(7, HIGH);
  50.   //Polse 2 prikazy na ktere ma Arduino odpovedet - STK_GET_SYNC, Sync_CRC_EOP
  51.   programator.write(0x30);
  52.   programator.write(0x20);
  53.  
  54.   //Pocka dokud neodpovi na prikazy a nacte je do bufferu
  55.   while(!programator.available()){;}
  56.   delay(50);
  57.   for(int i = 0; i <= programator.available(); i++){
  58.       prichozi[i] = programator.read();
  59.   }
  60.  
  61.  
  62.   //vyhodnoti jestli jsme dostali OK odpoved
  63.   if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  64.       return 1;
  65.   }else return 0;
  66.  
  67.  
  68. }
  69.  
  70. int getParams(){
  71.  
  72.     vynulujBuffer();
  73.    
  74.    //Programovaci mod
  75.    programator.write(0x50);
  76.    programator.write(0x20);
  77.  
  78.    //Vycisti softwareSerial buffer, zapise ho do prichozi
  79.    while(!programator.available()){;}
  80.    delay(50);
  81.    for(int j = 0; j <= programator.available(); j++){
  82.       prichozi[j] = programator.read();
  83.    }
  84.  
  85.    
  86.     //vyhodnoti jestli jsme dostali OK odpoved
  87.  if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  88.  
  89.       vynulujBuffer();
  90.      
  91.      //Precti podpis procesoru
  92.      programator.write(0x75);
  93.      programator.write(0x20);
  94.  
  95.      //Vycisti softwareSerial buffer, zapise ho do prichozi
  96.      while(!programator.available()){;}
  97.      delay(50);
  98.      //programator.available() se zde nechtela obnovit primo ve for(), nevim proc ale musi se to udelat takto
  99.      int byty = programator.available();
  100.      for(int k = 0; k <= byty; k++){
  101.         prichozi[k] = programator.read();
  102.      }
  103.    
  104.      
  105.      //Vyzjisti z bufferu device signature
  106.       if(prichozi[0] == 0x14 && prichozi[4] == 0x10){
  107.         podpisProcesoru = ((unsigned long)prichozi[1] << 16) | ((unsigned long)prichozi[2] << 8) | ((unsigned long)prichozi[3]);
  108.  
  109.         quitProgramM();
  110.        
  111.         return 1;
  112.       }else return 0;
  113.   }else return 0;
  114.   }
  115.  
  116.  
  117. int programFlash(uint8_t pocatecniAdresaA, uint8_t pocatecniAdresaB, uint8_t velikostStrankyA, uint8_t velikostStrankyB){
  118.  
  119.     vynulujBuffer();
  120.    
  121.    //Programovaci mod
  122.    programator.write(0x50);
  123.    programator.write(0x20);
  124.  
  125.    //Vycisti softwareSerial buffer, zapise ho do prichozi
  126.    while(!programator.available()){;}
  127.    delay(50);
  128.    for(int j = 0; j <= programator.available(); j++){
  129.       prichozi[j] = programator.read();
  130.    }
  131.  
  132.    
  133.     //vyhodnoti jestli jsme dostali OK odpoved
  134.  if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  135.  
  136.       vynulujBuffer();
  137.      
  138.      //Precti podpis procesoru
  139.      programator.write(0x75);
  140.      programator.write(0x20);
  141.  
  142.      //Vycisti softwareSerial buffer, zapise ho do prichozi
  143.      while(!programator.available()){;}
  144.      delay(50);
  145.      //programator.available() se zde nechtela obnovit primo ve for(), nevim proc ale musi se to udelat takto
  146.      int byty2 = programator.available();
  147.      for(int k = 0; k <= byty2; k++){
  148.         prichozi[k] = programator.read();
  149.      }
  150.    
  151.      
  152.      //Vyzjisti z bufferu device signature
  153.       if(prichozi[0] == 0x14 && prichozi[4] == 0x10){
  154.        
  155.         vynulujBuffer();
  156.  
  157.         programator.write(0x55);
  158.  
  159.         /////////// TYTO DVA BYTY NASTAVUJI POCATECNI POZICI NA KTERE ZACNE BOOTLOADER ZAPISOVAT ///////////
  160.         programator.write(pocatecniAdresaA);
  161.         programator.write(pocatecniAdresaB);
  162.         ///////////////////////////////////////////////////////////////////////////////////////////////////
  163.      
  164.         programator.write(0x20);
  165.  
  166.         //Vycisti softwareSerial buffer, zapise ho do prichozi
  167.         while(!programator.available()){;}
  168.             delay(50);
  169.             //programator.available() se zde nechtela obnovit primo ve for(), nevim proc ale musi se to udelat takto
  170.             int byty3 = programator.available();
  171.             for(int k = 0; k <= byty3; k++){
  172.             prichozi[k] = programator.read();
  173.         }
  174.  
  175.         if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  176.  
  177.           vynulujBuffer();
  178.          
  179.           //Programuj stranku
  180.           programator.write(0x64);
  181.          
  182.           /////////// TYTO DVA BYTY NASTAVUJI VELIKOST STRANKY ///////////
  183.           programator.write(velikostStrankyA);
  184.           programator.write(velikostStrankyB);
  185.           ///////////////////////////////////////////////////////////////////////////////////////////////////
  186.          
  187.           programator.write(0x46);
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.           ///////////////////////////////////////////////////////////////////////////////////////////////////
  195.           ///////////////////////////////////////////////////////////////////////////////////////////////////
  196.           ///// ZDE SI DOPLNTE KOD PRO ZAPISOVANI DAT, DATA JSOU POSILANA PRES programator.write() A    /////
  197.           /////               NASLEDUJI HNED PO PRIKAZECH KTERE JSEM JIZ ZAPSAL                         /////
  198.           ///////////////////////////////////////////////////////////////////////////////////////////////////
  199.           ///////////////////////////////////////////////////////////////////////////////////////////////////
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.           //Vycisti softwareSerial buffer, zapise ho do prichozi
  207.         while(!programator.available()){;}
  208.             delay(50);
  209.             //programator.available() se zde nechtela obnovit primo ve for(), nevim proc ale musi se to udelat takto
  210.             int byty3 = programator.available();
  211.             for(int k = 0; k <= byty3; k++){
  212.             prichozi[k] = programator.read();
  213.         }
  214.  
  215.         //Zjisti zda bylo programovani uspesne
  216.         if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  217.           return 1;  
  218.         }else return 0;
  219.        
  220.         }
  221.  
  222.       }else return 0;
  223.   }else return 0;
  224.   }
  225.  
  226.  
  227. int quitProgramM(){
  228.  
  229.   vynulujBuffer();
  230.  
  231.   //Opustime programovaci mod
  232.   programator.write(0x51);
  233.   programator.write(0x20);
  234.  
  235.   while(!programator.available()){;}
  236.             delay(50);
  237.             //programator.available() se zde nechtela obnovit primo ve for(), nevim proc ale musi se to udelat takto
  238.             int byty4 = programator.available();
  239.             for(int k = 0; k <= byty4; k++){
  240.             prichozi[k] = programator.read();
  241.         }
  242.  
  243.         //Zjisti zda bylo programovani uspesne
  244.         if(prichozi[0] == 0x14 && prichozi[1] == 0x10){
  245.           return 1;  
  246.         }else return 0;
  247.        
  248.   }
  249.  
  250.  
  251.  
  252.  void vynulujBuffer(){
  253.   for(int i = 0; i < 64; i++){
  254.       prichozi[i] = 0x00;
  255.     }
  256.  
  257.    while(programator.available()){
  258.     char c = programator.read();
  259.     }  
  260.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement