请选择 进入手机版 | 继续访问电脑版

DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5065|回复: 15

[UUProg] uuprog开发教程:Bootloader应用讲解3

[复制链接]
发表于 2014-11-17 06:26:48 | 显示全部楼层 |阅读模式
         这次我们就讲讲怎么实现我们要的功能,需要上位机来控制单片机中的固件工作在需要的状态。其实就是上位机对下位机设备发送相关的命令,以及操作内容,然后下位机需要返回一个工作状态给上位机来确认是否成功。整个流程就是这样的。这里为了讲解方便我们使用专用的固件操作程序,其实这部分已经移植到了我们的编程器上位机软件里了,这里是为了大家避开干扰,更容易找到需要的内容,方便理解。
QQ图片20141115183907.png
      这里的功能按钮就是针对固件的处理函数设置的,每个功能对应一个处理函数。有人会问我怎么看懂啊,那说明你只会用还不会看,这里教个最简单的方法,就是从界面功能找实现代码,然后看相关代码来理解整个程序的运作。要是你还看不懂代码的话,那你就得下米了,赶紧攻下c++了。(你要是懂c的话就按c的原理理解,出入不是很大的,看多了你就会转到c++了)
QQ图片20141115185237.png
用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++的特色)
QQ图片20141115191144.png
这部分需要一定的理解能力,需要的自己下载代码看看吧
LoadSe_V001.rar (1.57 MB, 下载次数: 5, 售价: 20 两银子)
发表于 2014-11-17 10:50:15 | 显示全部楼层
楼主多面手, 软件, 固件, 硬件一起抓啊
 楼主| 发表于 2014-11-17 11:40:46 | 显示全部楼层
shangdawei 发表于 2014-11-17 10:50
楼主多面手, 软件, 固件, 硬件一起抓啊

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

一个工程项目不容易的 厉害的  厉害的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2021-11-29 01:32 , 耗时 0.215776 秒, 34 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器
DIY编程器群1:3044634 DIY编程器1

Email:libyoufer@sina.com

QQ:28000622

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表