接着我之前的引导程序升级,之前的是简单的设计,并不是通过USB上位机进行下载固件
区域划分:
应用区:为0x8000000~0x000020000
引导程序区:0x8020000~0x060000
- 开发板预先下载引导加载程序,这里由于我的开发板上没有按键,这里我是直接就进入等待USB上位机程序下载固件,将 收到的数据通过 iap_write_appbin(DataBuf,len),(参考正点原子的iap _ write _ appbin,这里如果直接用原子哥的这个肯定不行,必须加以修改,不然无法将完整的数据写入到闪存中)通过写入到内部闪存0x8020000~0x060000这块区域中,下载完成后,即收到了数据USB_Received_Flag置为1,启动iap_load_app(这里USB_SendData(“update stm32 bin ok”,20),有时候没去执行,不知道啥原因,但是应用固件确实是写入到了内部flash)。
2. 看效果图:
3. 上位机这块,参考我前面的blog中HID上位机部分,主要上位机固件下载函数修改:
private BinaryReader br;
/// <summary>
/// 下载二进制文件
/// </summary>
private void DownloadBinFile()
{
int length = 0;
string str = "";
long lSize = 0;
Byte[] data = new Byte[64];
progressBar.Value = progressBar.Minimum;//设置进度条的当前位置为0
string fileName = textBox1.Text.Trim();
if (myHid.Opened == false)
{
MessageBox.Show("未检测到设备接入,请重新插拔设备再试!!!"
, "温馨提示:", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (File.Exists(fileName))
{
lSize = new FileInfo(fileName).Length;
}
progressBar.Maximum = (int)lSize;
try
{
br = new BinaryReader(new FileStream(fileName,FileMode.Open,FileAccess.Read));
do
{
if (myHid.Opened == false)
{
MessageBox.Show("未检测到设备接入,请重新插拔设备再试!!!"
, "温馨提示:", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Array.Clear(data, 0, data.Length);
data = br.ReadBytes(64);
length = str.Length;
progressBar.Value += data.Length;
str = Encoding.Default.GetString(data);
Report r = new Report(0, data);
myHid.Write(r);
}
while (data.Length != 0);
}
catch (Exception)
{
//MessageBox.Show(" 发送文件为空!", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
}
progressBar.Value = progressBar.Maximum;
br.Close();
}
4 .下位机,其他的参考我之前的下位机部分,具体怎样修改的,有兴趣的私聊我!至此,可以启动bootloader,通过自定义HID设备,实现usb固件升级告一段落了。
usb固件升级小助手:点击下载