/****************************************************************************** * 向下位机烧写固件 ******************************************************************************/ private async Task UploadFile(string portName, uint baudRate, byte[] bin, uint address, uint jumpAddress) { /* 获得页的大小 */ uint psize = uint.Parse(cbPSize.SelectedItem as string); /* 初始化ST boot对象 */ using (var uc = new STBoot()) { /* 打开设备 */ uc.Open(portName, baudRate); /* 通信初始化 */ await uc.Initialize(); /* 更新状态栏信息 */ UpdateStatus(false, string.Format("Connected: Ver: {0}, PID: 0x{1:X4}", uc.Version, uc.ProductID)); /* 延时一会儿,使状态的信息可以被看见 */ await Task.Delay(500); /* 擦除信息 */ UpdateStatus(false, "Erasing..."); /* 全局擦除是否被勾选 */ if (cbxErase.Checked) { await uc.GlobalErase(); } else { /* 擦除操作 */ for (uint i = 0; i < bin.Length; i += psize) { /* 擦除页 */ await uc.ErasePage((i + address - 0x08000000) / psize); /* 更新精度条 */ UpdateProgress((int)i * 100 / bin.Length); } } /* 状态栏显示 编程 提示信息 */ UpdateStatus(false, "Programming..."); /* 创建进度报告对象 */ var p = new Progress <STBootProgress>(UpdateProgress); /* 写Flash */ await uc.WriteMemory(address, bin, 0, bin.Length, p, CancellationToken.None); /* 烧写成功 */ UpdateStatus(false, string.Format("Success: {0} bytes written", bin.Length)); /* 跳转到用户程序地址! */ await uc.Jump(jumpAddress); /* 结束通信 */ uc.Close(); } }
/* upload a binary image to uC */ private async Task UploadFile(string portName, uint baudRate, byte[] bin, uint address, uint jumpAddress) { /* get page size */ uint psize = uint.Parse(cbPSize.SelectedItem as string); /* create new programming interface object */ using (var uc = new STBoot()) { /* open device */ uc.Open(portName, baudRate); /* initialize communication */ await uc.Initialize(); /* update the status */ UpdateStatus(false, string.Format("Connected: Ver: {0}, PID: 0x{1:X4}", uc.Version, uc.ProductID)); /* give some chance see the message */ await Task.Delay(500); /* apply new message */ UpdateStatus(false, "Erasing..."); /* checked? */ if (cbxErase.Checked) { await uc.GlobalErase(); } else { /* erase operation */ for (uint i = 0; i < bin.Length; i += psize) { /* erase page */ await uc.ErasePage((i + address - 0x08000000) / psize); /* update progress bar */ UpdateProgress((int)i * 100 / bin.Length); } } /* apply new message */ UpdateStatus(false, "Programming..."); /* progress reporter */ var p = new Progress <STBootProgress>(UpdateProgress); /* write memory */ await uc.WriteMemory(address, bin, 0, bin.Length, p, CancellationToken.None); /* update the status */ UpdateStatus(false, string.Format("Success: {0} bytes written", bin.Length)); /* go! */ await uc.Jump(jumpAddress); /* end communication */ uc.Close(); } }
/****************************************************************************** * 跳转至用户代码 ******************************************************************************/ private async Task Jump(uint address) { /* 初始化ST boot对象 */ using (var uc = new STBoot()) { /* 打开设备 */ uc.Open(portName, baudRate); /* 通信初始化 */ await uc.Initialize(); /* 跳转! */ await uc.Jump(address); /* 结束通信 */ uc.Close(); } }
/* execute code */ private async Task Jump(uint address) { /* create new programming interface object */ using (var uc = new STBoot()) { /* open device */ uc.Open(portName, baudRate); /* initialize communication */ await uc.Initialize(); /* go! */ await uc.Jump(address); /* end communication */ uc.Close(); } }
/* write clicked */ private async void bWrite_Click(object sender, EventArgs e) { /* binary file */ byte[] bin; /* bootloader class instance */ STBoot stb = new STBoot(); /* disable button */ bWrite.Enabled = false; /* reset progress */ UpdateProgress(0); /* reset status bar */ UpdateStatus(false, ""); /* read file */ try { /* try to open file */ var s = new FileStream(fileName, FileMode.Open, FileAccess.Read); /* prepare buffer */ bin = new byte[s.Length]; /* read file contents */ await s.ReadAsync(bin, 0, bin.Length); /* close file */ s.Close(); /* error during read? */ } catch (Exception) { /* set message */ UpdateStatus(true, "Error: Unable to read file"); /* restore button operation */ bWrite.Enabled = true; /* not much to do next */ return; } /* perform the operation */ try { /* open the port */ stb.Open(portName, baudRate); /* initialize communication */ await stb.Initialize(); /* format message */ var s = string.Format("Connected: Ver: {0}, PID: 0x{1:X4}", stb.Version, stb.ProductID); /* prepare message */ UpdateStatus(false, s); /* accessing flash requires memory erase */ if (cbxFlash.Checked) { /* erase all necessary pages */ for (uint i = 0; i < (bin.Length + 255) / 256; i++) { await stb.ErasePage(i + page); } } /* progress reporter */ var p = new Progress <STBootProgress>(UpateProgress); /* write memory */ await stb.WriteMemory(address, bin, 0, bin.Length, p, CancellationToken.None); /* set message */ UpdateStatus(false, string.Format("Success: {0} bytes written", bin.Length)); /* go! */ await stb.Jump(address); /* catch all the exceptions here */ } catch (Exception ex) { /* set exception message */ UpdateStatus(true, "Error: " + ex.Message); /* dispose of port */ } finally { /* close port */ stb.Close(); /* re-enable button */ bWrite.Enabled = true; /* set focus */ bWrite.Focus(); } }