/** * @brief Main routine for MSC class application * @param None * @retval int */ int main(void) { NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0xC000);//初始化启动项 gpio_init();//初始化所有定义的gpio寄存器 cpu_run(); flash_stop(); // rs485_recv();//使能485接受数据 FLASH_ON(); remote_init(); LOOP_ON();//使能环流 // uart_init(9600);//设置波特率为9600 串口初始化 delay_ms(1);//定时器 SPI_Flash_Init();//初始化spi flash外围驱动 get_cfg_from_flash();//得到配置信息 (获取cfg文件的配置) get_line_from_flash(); message_state |= MESSAGE_LINE_NEW; message_state |= MESSAGE_LEFT_NEW; message_state |= MESSAGE_RIGHT_NEW; message_state |= MESSAGE_BRAKE_NEW; alloc_memory(); //初始化缓存 wwdg_init(0x7F, 0x5F, WWDG_Prescaler_8); //计数器值为7f,窗口寄存器为5f,分频数为8 (使用窗口看门狗的原因是他可以被中断) while (1) { if(uart_get_flag) { uart_get_flag = 0; data_process(); LED_OK = 1; } get_disp_state(); //左转右转还有刹车的判断报站; if(bflag) { LED_DispString(1, 1, disp_buff); //固定显示 } else { LED_ScrollDispHZ(1, 1, disp_buff);//滚动显示 } } }
int sslbp_flash(char *fname){ const struct rtapi_firmware *fw; struct rtapi_device dev; int r; int write_sz, erase_sz; if (strstr("8i20", remote->name)){ if (hm2->sserial.version < 37){ rtapi_print("SSLBP Version must be at least v37 to flash the 8i20" "This firmware has v%i. Sorry about that\n" ,hm2->sserial.version); return -1; } } else if (hm2->sserial.version < 34){ rtapi_print("SSLBP Version must be at least v34. This firmware has v%i" "\n",hm2->sserial.version); return -1; } if (hm2->sserial.baudrate != 115200){ rtapi_print("To flash firmware the baud rate of the board must be set " "to 115200 by jumper, and in Hostmot2 using the " "sserial_baudrate modparam\n"); return -1; } //Copied direct from hostmot2.c. A bit of a faff, but seems to be necessary. memset(&dev, '\0', sizeof(dev)); rtapi_dev_set_name(&dev, hm2->llio->name); dev.release = setsserial_release; r = rtapi_device_register(&dev); if (r != 0) { HM2_ERR("error with device_register\n"); return -1; } r = rtapi_request_firmware(&fw, fname, &dev); rtapi_device_unregister(&dev); if (r == -ENOENT) { HM2_ERR("firmware %s not found\n",fname); return -1; } if (r != 0) { HM2_ERR("request for firmware %s failed, aborting\n", fname); return -1; } rtapi_print("Firmware size 0x%zx\n", fw->size); if (setup_start() < 0) goto fail0; flash_start(); write_sz = 1 << sslbp_read_byte(LBPFLASHWRITESIZELOC); erase_sz = 1 << sslbp_read_byte(LBPFLASHERASESIZELOC); HM2_PRINT("Write Size = %x, Erase Size = %x\n", write_sz, erase_sz); flash_stop(); //Programming Loop { int ReservedBlock = 0; int StartBlock = ReservedBlock + 1; int blocknum = StartBlock; int block_start; int i, j, t; while (blocknum * erase_sz < fw->size){ block_start = blocknum * erase_sz; for (t = 0; t < erase_sz && fw->data[block_start + t] == 0 ; t++){ } if (t < erase_sz){ // found a non-zero byte flash_start(); sslbp_write_long(LBPFLASHOFFSETLOC, block_start); sslbp_write_byte(LBPFLASHCOMMITLOC, FLASHERASE_CMD); if (sslbp_read_cookie() != LBPCOOKIE){ HM2_ERR("Synch failed during block erase: aborting\n"); goto fail0; } flash_stop(); HM2_PRINT("Erased block %i\n", blocknum); flash_start(); for (i = 0; i < erase_sz ; i += write_sz){ sslbp_write_long(LBPFLASHOFFSETLOC, block_start + i); for (j = 0 ; j < write_sz ; j += 8){ rtapi_u32 data0, data1, m; m = block_start + i + j; data0 = (fw->data[m] + (fw->data[m + 1] << 8) + (fw->data[m + 2] << 16) + (fw->data[m + 3] << 24)); data1 = (fw->data[m + 4] + (fw->data[m + 5] << 8) + (fw->data[m + 6] << 16) + (fw->data[m + 7] << 24)); sslbp_write_double(j, data0, data1); } sslbp_write_byte(LBPFLASHCOMMITLOC, FLASHWRITE_CMD); if (sslbp_read_cookie() != LBPCOOKIE){ HM2_ERR("Synch failed during block write: aborting\n"); goto fail0; } } flash_stop(); HM2_PRINT("Wrote block %i\n", blocknum); } else // Looks like an all-zeros block { HM2_PRINT("Skipped Block %i\n", blocknum); } blocknum++; } } rtapi_release_firmware(fw); return 0; fail0: flash_stop(); return -1; }