DIY编程器网

标题: uuprog开发教程:Bootloader应用讲解3 [打印本页]

作者: liyf    时间: 2014-11-17 06:26
标题: uuprog开发教程:Bootloader应用讲解3
         这次我们就讲讲怎么实现我们要的功能,需要上位机来控制单片机中的固件工作在需要的状态。其实就是上位机对下位机设备发送相关的命令,以及操作内容,然后下位机需要返回一个工作状态给上位机来确认是否成功。整个流程就是这样的。这里为了讲解方便我们使用专用的固件操作程序,其实这部分已经移植到了我们的编程器上位机软件里了,这里是为了大家避开干扰,更容易找到需要的内容,方便理解。

      这里的功能按钮就是针对固件的处理函数设置的,每个功能对应一个处理函数。有人会问我怎么看懂啊,那说明你只会用还不会看,这里教个最简单的方法,就是从界面功能找实现代码,然后看相关代码来理解整个程序的运作。要是你还看不懂代码的话,那你就得下米了,赶紧攻下c++了。(你要是懂c的话就按c的原理理解,出入不是很大的,看多了你就会转到c++了)

用vc6打开附件中的工程文件,这就是个对话框工程,双击对应的按钮就能进对应的处理函数。(没理解,那麻烦你多试试)
连接
就是连接你要升级的hid设备。这里会用到vid和pid,要和bootloader里设置的一致。
  1. void CLoadSeDlg::OnLink()
  2. {
  3.     // TODO: Add your control notification handler code here
  4.     CString sVersion;
  5.     if(mUsbhid.Open(0))
  6.     {
  7.         m_Information = "打开设备成功!\r\n";
  8.         mUsbhid.GetVersion(&sVersion);
  9.         m_Information += "Fireware Version is ";
  10.         m_Information += sVersion;
  11.         m_Information += "\r\n";
  12.         bIsLinked = TRUE;
  13.         if(pFlash != NULL)
  14.         {
  15.             if(pFlash->GetFirstpage() != NULL)
  16.             {
  17.                 GetDlgItem(IDC_ERASE)->EnableWindow(TRUE);
  18.                 GetDlgItem(IDC_DOWNLOAD)->EnableWindow(TRUE);
  19.                 GetDlgItem(IDC_RUN)->EnableWindow(TRUE);
  20.                 GetDlgItem(IDC_VERIFY)->EnableWindow(TRUE);
  21.             }
  22.             else
  23.             {
  24.                 GetDlgItem(IDC_ERASE)->EnableWindow(FALSE);
  25.                 GetDlgItem(IDC_DOWNLOAD)->EnableWindow(FALSE);
  26.                 GetDlgItem(IDC_RUN)->EnableWindow(FALSE);
  27.                 GetDlgItem(IDC_VERIFY)->EnableWindow(FALSE);
  28.             }
  29.         }
  30.         else
  31.         {
  32.             GetDlgItem(IDC_ERASE)->EnableWindow(FALSE);
  33.             GetDlgItem(IDC_DOWNLOAD)->EnableWindow(FALSE);
  34.             GetDlgItem(IDC_RUN)->EnableWindow(FALSE);
  35.             GetDlgItem(IDC_VERIFY)->EnableWindow(FALSE);

  36.         }
  37.     }
  38.     else
  39.     {
  40.         bIsLinked = FALSE;
  41.         m_Information = "打开设备失败!\r\n";
  42.         GetDlgItem(IDC_ERASE)->EnableWindow(FALSE);
  43.         GetDlgItem(IDC_DOWNLOAD)->EnableWindow(FALSE);
  44.         GetDlgItem(IDC_RUN)->EnableWindow(FALSE);
  45.         GetDlgItem(IDC_VERIFY)->EnableWindow(FALSE);

  46.     }
  47.     UpdateData(FALSE);
  48. }

复制代码
擦除
就是将用户区的代码全部清除掉,这样做还是有好处的。
  1. void CLoadSeDlg::OnErase()
  2. {
  3.         // TODO: Add your control notification handler code here
  4.         CString str;
  5.         if(pFlash == NULL)
  6.                 return;
  7.         
  8.         CPage* pPage = pFlash->GetFirstpage();
  9.         m_Information = "";
  10.         while (pPage != NULL) {
  11.                 if(mUsbhid.EraseSector(pPage->GetPageaddress()))
  12.                 {
  13.                         str.Format("%.4X ",pPage->GetPageaddress());
  14.                         m_Information +=str +  "Erase is OK!\r\n";
  15.                 }
  16.                 else
  17.                 {
  18.                         str.Format("%.4X ",pPage->GetPageaddress());
  19.                         m_Information += str + "Erase is Fault!\r\n";
  20.                         UpdateData(FALSE);
  21.                         return;
  22.                 }
  23.                 UpdateData(FALSE);
  24.                 pPage = pPage->GetNext();
  25.         }
  26.         
  27. }
复制代码
下载
就是将你打开的文件烧写到用户区,这个代码必须是0x2800h开始的,不对的话肯定不给下载的,这是最基本的校验功能。
  1. void CLoadSeDlg::OnDownload()
  2. {
  3.         // TODO: Add your control notification handler code here
  4.         CString str;
  5.         if(pFlash == NULL)
  6.                 return;
  7.         
  8.         CPage* pPage = pFlash->GetFirstpage();
  9.         m_Information = "";
  10.         while (pPage != NULL) {
  11.                 if(mUsbhid.Write(pPage->GetPageaddress(),pPage->GetData(),pPage->GetPagesize()))
  12.                 {
  13.                         str.Format("%.4X ",pPage->GetPageaddress());
  14.                         m_Information += str + "Write is OK!\r\n";
  15.                 }
  16.                 else
  17.                 {
  18.                         str.Format("%.4X ",pPage->GetPageaddress());
  19.                         m_Information += str + "Write is Fault!\r\n";
  20.                         return;
  21.                 }
  22.                 UpdateData(FALSE);
  23.                 pPage = pPage->GetNext();
  24.         }
  25. }
复制代码
校验
就是将你打开的代码和下载的代码比较一下,看是否都一样,不同会返回校验失败。
  1. void CLoadSeDlg::OnVerify()
  2. {
  3.         // TODO: Add your control notification handler code here
  4.         if(pFlash == NULL)
  5.                 return;
  6.         
  7.         m_Information = "";
  8.         CPage* pPage = pFlash->GetFirstpage();
  9.         while (pPage != NULL) {
  10.                 if(mUsbhid.Verify(pPage->GetPageaddress(),pPage->GetData(),pPage->GetPagesize()))
  11.                 {
  12.                         m_Information += "Write is OK!\r\n";
  13.                 }
  14.                 else
  15.                 {
  16.                         m_Information += "Write is Fault!\r\n";
  17.                         UpdateData(FALSE);
  18.                         return;
  19.                 }
  20.                 UpdateData(FALSE);
  21.                 pPage = pPage->GetNext();
  22.         }         
  23.         
  24. }
复制代码
这里实现的就是几个基本的调用功能,具体操作函数还需要看CHIDIntface派生类。(c++的特色)

这部分需要一定的理解能力,需要的自己下载代码看看吧
LoadSe_V001.rar (1.57 MB, 下载次数: 6, 售价: 20 两银子)




作者: shangdawei    时间: 2014-11-17 10:50
楼主多面手, 软件, 固件, 硬件一起抓啊
作者: liyf    时间: 2014-11-17 11:40
shangdawei 发表于 2014-11-17 10:50
楼主多面手, 软件, 固件, 硬件一起抓啊

一个工程项目不容易的,只知道唧唧叨叨的肯定不知其中的道理
作者: jy11    时间: 2014-11-17 12:52
版主,讲的比较清楚,很好。注解,也挺好,说明了出处。
作者: dwl65    时间: 2014-11-18 22:22
楼主,我的哥啊!又要奋战几个月去补齐这些知识了。做程序人真难!
作者: jy11    时间: 2014-11-24 17:37
这个 应该 有用,呵呵。
作者: bywqdq    时间: 2015-1-11 21:34
软件, 固件, 硬件一起抓啊 赞啊
作者: wlecust06    时间: 2021-1-24 13:47
这个microchip 的mla库里面有类似的代码
作者: wlecust06    时间: 2021-1-24 15:25
一个工程项目不容易的 厉害的
作者: wlecust06    时间: 2021-1-24 15:25

一个工程项目不容易的 厉害的  厉害的
作者: wlecust06    时间: 2021-1-24 15:26
软件, 固件, 硬件一起抓啊 不容易啊
作者: wlecust06    时间: 2021-1-24 15:27
你自定义驱动稳定的话 没必要换winusb,搞个签名就好了啊
作者: wlecust06    时间: 2021-1-24 15:28
显得高大上 专业 和别家不一样啊
作者: wlecust06    时间: 2021-1-24 15:54
winusb示例固件源代码 灌水
作者: wlecust06    时间: 2021-1-24 15:54
再次 灌水
作者: wlecust06    时间: 2021-1-24 15:55
支持支持
作者: lzz8031    时间: 2023-4-3 01:51

软件, 固件, 硬件一起抓啊 不容易啊
作者: lzz8031    时间: 2023-4-3 01:52
winusb示例固件源代码 灌水
作者: lzz8031    时间: 2023-4-3 01:52
显得高大上 专业 和别家不一样啊
作者: lzz8031    时间: 2023-4-3 01:53
你自定义驱动稳定的话 没必要换winusb,搞个签名就好了啊
作者: lzz8031    时间: 2023-4-3 01:54
楼主辛苦啦!!
向楼主学习!!
向楼主致敬!!
作者: lzz8031    时间: 2023-4-3 01:54
GOOD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
作者: lzz8031    时间: 2023-4-3 01:55
楼主辛苦啦。谢谢你为我们撑起了片学习,交流的空间。
作者: lzz8031    时间: 2023-4-3 01:56

非常感谢楼主的分享!谢谢!
作者: lzz8031    时间: 2023-4-3 01:56
银子不够 灌下水
作者: lzz8031    时间: 2023-4-3 01:57
飞利浦的N82S123N(和74S288一样〉用哪种型号编程器读写。
作者: lzz8031    时间: 2023-4-3 01:58
向楼主学习,感谢楼主的好资料
作者: lzz8031    时间: 2023-4-3 01:59


一个工程项目不容易的 厉害的  厉害的




欢迎光临 DIY编程器网 (http://diybcq.com/) Powered by Discuz! X3.2