我也在使用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.我无法弄清楚那里发生了什么。
如果您有任何想法,请帮忙。 感谢