查看完整版本: uuprog开发教程:Bootloader应用讲解3

liyf 发表于 2014-11-17 06:26:48

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:15

楼主多面手, 软件, 固件, 硬件一起抓啊

liyf 发表于 2014-11-17 11:40:46

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

一个工程项目不容易的,只知道唧唧叨叨的肯定不知其中的道理:lol

jy11 发表于 2014-11-17 12:52:54

版主,讲的比较清楚,很好。注解,也挺好,说明了出处。

dwl65 发表于 2014-11-18 22:22:48

楼主,我的哥啊!又要奋战几个月去补齐这些知识了。做程序人真难!

jy11 发表于 2014-11-24 17:37:07

这个 应该 有用,呵呵。

bywqdq 发表于 2015-1-11 21:34:44

软件, 固件, 硬件一起抓啊 赞啊:lol

wlecust06 发表于 2021-1-24 13:47:29

这个microchip 的mla库里面有类似的代码

wlecust06 发表于 2021-1-24 15:25:02

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

wlecust06 发表于 2021-1-24 15:25:53


一个工程项目不容易的 厉害的厉害的
页: [1] 2 3
查看完整版本: uuprog开发教程:Bootloader应用讲解3