bootloader avr atmega128RFA1

时间:2016-07-06 19:32:37

标签: avr bootloader uart

我也在使用bootloader。

我遇到了以下问题:

一旦cmd' B'收到,后来,' F'收到,然后我会开始调用块加载。

static void start_block_flash_load(uint16_t size, uint32_t *addr) {
  uint16_t data_word;
  uint8_t sreg = SREG;
  uint16_t temp;
  int i;
  uint8_t my_size;

  fprintf(lcdout, "B");
  cli();
// Disable interrupts

  (*addr) <<= 1;

  if (size <= SPM_PAGESIZE) {
      boot_page_erase(*addr);
      boot_spm_busy_wait();
      fprintf(lcdout, "%"PRIu16, size);
      uint16_t i;
//store all values.  PROBLEM here!!!
      my_size = 208;
      uint8_t buf[SPM_PAGESIZE] = { 0 };
      for (i = 0; i < my_size; i++) {
      //for (i=0; i<size; i++){
          buf[i] = uart_getc();
//        lcd_clear();
//        lcd_setCursor(0, 2);
//        fprintf(lcdout, "%3d", i);
//        _delay_ms(500);
      }

      for (i = 0; i < my_size; i += 2) { //if size is odd, then use do-while

        uint16_t w = buf[i];
        w += buf[i + 1] << 8;  //first one is low byte, second is high???
        boot_page_fill((*addr)+i, w);

      }

      boot_page_write(*addr);
      boot_spm_busy_wait();

      (*addr) >>= 1;

      uart_putc('\r');
  } else
      uart_putc('?');

  boot_rww_enable ();
  SREG = sreg;
}

我可以在lcd上看到块的大小是256.但是,当进入循环来收集数据时,它会卡住。 我用my_size测试过,我发现只有当my_size = 208时,程序才会运行得更远。 奇怪的是,如果我在循环中放入一些语句,例如

lcd_clear();
lcd_setCursor(0, 2);
然后&#39;我&#39;我在液晶显示器上打印的内容不会达到140。我提出了不同的陈述,“我&#39;会给出不同的价值。这很奇怪,因为uart_getc()不会丢失数据。 我期待的是循环将达到256.我无法弄清楚那里发生了什么。

如果您有任何想法,请帮忙。 感谢

0 个答案:

没有答案