- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 7 von 7

Thema: Bootloader != Flash??

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Code:
    #include <avr/io.h>
    #include <avr/boot.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include <string.h>
    #include "uart.h"
    
    
    #define PAGE_SIZE 64 + 3 // Bytes +1 PageNo +2 CRC16
    
    
    unsigned int mask = 0xA001;
    
    
    
    
    //-- Protoypes -----------
    void boot_program_page(uint32_t page, uint8_t *buf);
    unsigned int calcCRC16r(unsigned int crc, unsigned char c, unsigned int mask);
    
    
    
    
    int main(void) {
        unsigned char temp;
        char buffer[PAGE_SIZE];
        uint16_t page_cnt = 0;
        //uint8_t cnt = 0;
        
        void (*start)(void) = 0x0000;        /* Funktionspointer auf 0x0000 */
        
        // Init
        DDRD |= (1<<PD2) | (1<<PD0); //StatusLED RED Ausgang/ IR-Empfänger Eingang
        DDRB |= (1<<PB0) | (1<<PB3); //StatusLED GREEN Ausgang / IR-LED Ausgang
    
    
        //IR-Schnittstelle
        // fast PWM, set OC2A on compare match, clear OC2A at bottom, clk/1
        TCCR2 = _BV(WGM20) | _BV(WGM21) | _BV(COM20) | _BV(COM21) | _BV(CS20);
        // interrupt on timer overflow
        TIMSK |= _BV(TOIE2);
        
        OCR2  = 0x91;
        
        PORTD |= (1<<PD2); //StatusLED RED
        PORTB |= (1<<PB0); //StatusLED GREEN
        PORTB |= (1<<PB3); //IRTX = 1
        PORTD |= (1<<PD1); //IRTX = 0
        
        // Interrupt vektoren verbiegen
        char sregtemp = SREG;
        cli();
        temp = GICR;
        GICR = temp | (1<<IVCE);
        GICR = temp | (1<<IVSEL);
        SREG = sregtemp;
        
        // UART
        UartInit();
        
        sei();    //Interrupt Ein
        
        _delay_ms(10);
        
        //while(cnt < 16) {
        memset(buffer, 0, sizeof(buffer));
        //SerRead(buffer, 18, 65000);
        SerRead(buffer, 18, 0);
        
        if(strstr(buffer, "Flash")) {
            memset(buffer, 0, sizeof(buffer));
            unsigned int crc = 0, i = 0, h_crc = 0;
            
            //cnt = 20;
            
            _delay_ms(1);
            SerWrite("ASURO\0\0\0\0\0\0\0\0\0");
            _delay_ms(1);
            
            while(1) {
                // receive
                memset(buffer, 0, sizeof(buffer));
                
                SerRead(buffer, PAGE_SIZE, 0);
                
                crc = 0;
                for(i = 0; i < (PAGE_SIZE - 2); i++) {
                    crc = calcCRC16r(crc, buffer[i], mask);
                }
                
                memcpy(&h_crc, &buffer[i], 2);
                
                // Last page
                if(buffer[0] == 0xFF) {
                    _delay_ms(16);
                    SerWrite("OK");
                    break;
                }
                
                if(buffer[0] == 1) {
                    _delay_ms(16);
                    SerWrite("ER");
                }
                
                if(crc == h_crc) {
                    // transmission OK
                    // flash page
                    _delay_ms(16);
                    //boot_program_page(page_cnt, (uint8_t*)&buffer[1]);
                    //if(last_page != buffer[0])
                    page_cnt += 64;
                    
                    SerWrite("OK");
                } else {
                    _delay_ms(16);
                    SerWrite("CK");
                }
            }
        }
        //}
        
        PORTD &= ~(1<<PD2);
        
        // Interrupt Vektoren wieder gerade biegen
        cli();
        sregtemp = GICR;
        GICR = sregtemp | (1<<IVCE);
        GICR = sregtemp & ~(1<<IVSEL);
        
        // Rücksprung zur Adresse 0x0000
        start();
        
        return 0;
    }

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Soltau - Niedersachsen
    Alter
    46
    Beiträge
    1.369
    merkwürdig, sieht irgendwie so ganz anders aus als z.B. der hier: bootloader für atmega88 schreiben
    ...nur so lernt man auch was...
    Na, wenn Du meinst.
    Also nochmal, über UART kannst Du das normlerweise nicht installieren. Falls es da Tricks gibt kenne ich sie nicht.
    Ich selbst habe bischer alles direkt über ISP geflasht und damit einen Bootloader bisher nicht benötigt.

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 30.03.2013, 21:17
  2. LCD Flash
    Von markusikarus im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 3
    Letzter Beitrag: 25.11.2012, 17:30
  3. Antworten: 18
    Letzter Beitrag: 06.05.2012, 18:40
  4. bootloader um Daten in Flash zu packen
    Von vajk im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 19.09.2006, 14:25
  5. Flash-Wandler
    Von CodeX im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 12.01.2006, 05:12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test