uuprog开发教程:Bootloader应用讲解3
这次我们就讲讲怎么实现我们要的功能,需要上位机来控制单片机中的固件工作在需要的状态。其实就是上位机对下位机设备发送相关的命令,以及操作内容,然后下位机需要返回一个工作状态给上位机来确认是否成功。整个流程就是这样的。这里为了讲解方便我们使用专用的固件操作程序,其实这部分已经移植到了我们的编程器上位机软件里了,这里是为了大家避开干扰,更容易找到需要的内容,方便理解。这里的功能按钮就是针对固件的处理函数设置的,每个功能对应一个处理函数。有人会问我怎么看懂啊,那说明你只会用还不会看,这里教个最简单的方法,就是从界面功能找实现代码,然后看相关代码来理解整个程序的运作。要是你还看不懂代码的话,那你就得下米了,赶紧攻下c++了。(你要是懂c的话就按c的原理理解,出入不是很大的,看多了你就会转到c++了)
用vc6打开附件中的工程文件,这就是个对话框工程,双击对应的按钮就能进对应的处理函数。(没理解,那麻烦你多试试)
连接
就是连接你要升级的hid设备。这里会用到vid和pid,要和bootloader里设置的一致。
void CLoadSeDlg::OnLink()
{
// TODO: Add your control notification handler code here
CString sVersion;
if(mUsbhid.Open(0))
{
m_Information = "打开设备成功!\r\n";
mUsbhid.GetVersion(&sVersion);
m_Information += "Fireware Version is ";
m_Information += sVersion;
m_Information += "\r\n";
bIsLinked = TRUE;
if(pFlash != NULL)
{
if(pFlash->GetFirstpage() != NULL)
{
GetDlgItem(IDC_ERASE)->EnableWindow(TRUE);
GetDlgItem(IDC_DOWNLOAD)->EnableWindow(TRUE);
GetDlgItem(IDC_RUN)->EnableWindow(TRUE);
GetDlgItem(IDC_VERIFY)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_ERASE)->EnableWindow(FALSE);
GetDlgItem(IDC_DOWNLOAD)->EnableWindow(FALSE);
GetDlgItem(IDC_RUN)->EnableWindow(FALSE);
GetDlgItem(IDC_VERIFY)->EnableWindow(FALSE);
}
}
else
{
GetDlgItem(IDC_ERASE)->EnableWindow(FALSE);
GetDlgItem(IDC_DOWNLOAD)->EnableWindow(FALSE);
GetDlgItem(IDC_RUN)->EnableWindow(FALSE);
GetDlgItem(IDC_VERIFY)->EnableWindow(FALSE);
}
}
else
{
bIsLinked = FALSE;
m_Information = "打开设备失败!\r\n";
GetDlgItem(IDC_ERASE)->EnableWindow(FALSE);
GetDlgItem(IDC_DOWNLOAD)->EnableWindow(FALSE);
GetDlgItem(IDC_RUN)->EnableWindow(FALSE);
GetDlgItem(IDC_VERIFY)->EnableWindow(FALSE);
}
UpdateData(FALSE);
}
擦除
就是将用户区的代码全部清除掉,这样做还是有好处的。
void CLoadSeDlg::OnErase()
{
// TODO: Add your control notification handler code here
CString str;
if(pFlash == NULL)
return;
CPage* pPage = pFlash->GetFirstpage();
m_Information = "";
while (pPage != NULL) {
if(mUsbhid.EraseSector(pPage->GetPageaddress()))
{
str.Format("%.4X ",pPage->GetPageaddress());
m_Information +=str +"Erase is OK!\r\n";
}
else
{
str.Format("%.4X ",pPage->GetPageaddress());
m_Information += str + "Erase is Fault!\r\n";
UpdateData(FALSE);
return;
}
UpdateData(FALSE);
pPage = pPage->GetNext();
}
}下载
就是将你打开的文件烧写到用户区,这个代码必须是0x2800h开始的,不对的话肯定不给下载的,这是最基本的校验功能。
void CLoadSeDlg::OnDownload()
{
// TODO: Add your control notification handler code here
CString str;
if(pFlash == NULL)
return;
CPage* pPage = pFlash->GetFirstpage();
m_Information = "";
while (pPage != NULL) {
if(mUsbhid.Write(pPage->GetPageaddress(),pPage->GetData(),pPage->GetPagesize()))
{
str.Format("%.4X ",pPage->GetPageaddress());
m_Information += str + "Write is OK!\r\n";
}
else
{
str.Format("%.4X ",pPage->GetPageaddress());
m_Information += str + "Write is Fault!\r\n";
return;
}
UpdateData(FALSE);
pPage = pPage->GetNext();
}
}
校验
就是将你打开的代码和下载的代码比较一下,看是否都一样,不同会返回校验失败。
void CLoadSeDlg::OnVerify()
{
// TODO: Add your control notification handler code here
if(pFlash == NULL)
return;
m_Information = "";
CPage* pPage = pFlash->GetFirstpage();
while (pPage != NULL) {
if(mUsbhid.Verify(pPage->GetPageaddress(),pPage->GetData(),pPage->GetPagesize()))
{
m_Information += "Write is OK!\r\n";
}
else
{
m_Information += "Write is Fault!\r\n";
UpdateData(FALSE);
return;
}
UpdateData(FALSE);
pPage = pPage->GetNext();
}
}这里实现的就是几个基本的调用功能,具体操作函数还需要看CHIDIntface派生类。(c++的特色)
这部分需要一定的理解能力,需要的自己下载代码看看吧
楼主多面手, 软件, 固件, 硬件一起抓啊 shangdawei 发表于 2014-11-17 10:50
楼主多面手, 软件, 固件, 硬件一起抓啊
一个工程项目不容易的,只知道唧唧叨叨的肯定不知其中的道理:lol 版主,讲的比较清楚,很好。注解,也挺好,说明了出处。 楼主,我的哥啊!又要奋战几个月去补齐这些知识了。做程序人真难! 这个 应该 有用,呵呵。 软件, 固件, 硬件一起抓啊 赞啊:lol 这个microchip 的mla库里面有类似的代码 一个工程项目不容易的 厉害的
一个工程项目不容易的 厉害的厉害的