|
这次我们就讲讲怎么实现我们要的功能,需要上位机来控制单片机中的固件工作在需要的状态。其实就是上位机对下位机设备发送相关的命令,以及操作内容,然后下位机需要返回一个工作状态给上位机来确认是否成功。整个流程就是这样的。这里为了讲解方便我们使用专用的固件操作程序,其实这部分已经移植到了我们的编程器上位机软件里了,这里是为了大家避开干扰,更容易找到需要的内容,方便理解。
这里的功能按钮就是针对固件的处理函数设置的,每个功能对应一个处理函数。有人会问我怎么看懂啊,那说明你只会用还不会看,这里教个最简单的方法,就是从界面功能找实现代码,然后看相关代码来理解整个程序的运作。要是你还看不懂代码的话,那你就得下米了,赶紧攻下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++的特色)
这部分需要一定的理解能力,需要的自己下载代码看看吧
LoadSe_V001.rar
(1.57 MB, 下载次数: 6, 售价: 20 两银子)
|
|