精华内容
下载资源
问答
  • c语言 pic
    2021-05-21 12:28:48

    235d28df1517afa126e5aad79f7a3abd.png

    PIC单片机与PIC单片机C语言编程简介

    时间:2018-03-29      来源:未知

    一、PIC单片机简介

    对于计算机学院与电子学院相关的同学来说,单片机一定不是一个陌生的概念。在大学的学习生涯中,经常用于教学的是MCS-51系列单片机。其实,除了MCS-51单片机外,还有一类单片机——PIC单片机。

    PIC单片机,英文名为Peripheral Interface Controller,翻译为“开发和控制外围设备用集成电路”,可以看作是一种高度集成化的小型计算机,拥有CPU、寄存器、内存单元、串口并口等一系列计算机运行时需要依赖的硬件设备。

    二、PIC单片机与MCS-51单片机的区别

    相较于51系列单片机,PIC单片机的区别主要有3点:

    1.总线结构。51系列单片机采用的是经典的“冯诺依曼体系结构”,而PIC单片机则是采用“哈佛体系结构”。这里简单介绍一下两种体系结构的不同:冯诺依曼体系结构是单总线结构,即数据传输与指令传输共用一条总线;而哈佛体系结构则是双总线结构,即数据传输与指令传输分别使用一条总线。由于采用哈佛体系结构,所以PIC单片机的数据总线和指令总线位数(宽度)可能不同。

    2.流水线结构。51系列单片机采用的是单流水线结构,即在一条指令完全执行完毕后才会执行。而PIC单片机则有二级流水结构,可以在一定程度上实现指令并发(虽然不如x86/64系列CPU或者ARM系列CPU)。

    3.汇编指令。51系列单片机大约有一百多条汇编指令,基本包含了在程序运行中需要用到的绝大多数汇编指令。而PIC的汇编只有35条,功能较少(例如没有常用的乘除功能,需要使用循环加/减实现乘除功能)。但是PIC的指令执行较快,PIC单片机一个指令的执行只需一个指令周期,而51系列单片机则需要2至4个指令周期。

    除了以上区别,在保密性方面,PIC单片机不如51系列单片机,PIC单片机比较不能抗干扰,也很容易被解密。

    三、PIC单片机环境C语言编程简介(pic单片机c语言)

    相较于其他编程语言,使用C语言开发PIC单片机程序有许多优点:

    1.相较于汇编语言来说,使用C语言这类高级编程语言进行编程比较简单方便。使用汇编语言编程需要掌握一定的CPU运行知识,而且对寄存器、运算器、指令集等都需要有一定的了解,编程时也需要时刻思考汇编指令的运行流程。而使用C语言编程时则只需将精力放在程序运行逻辑即可。

    2.相较于C++、Java等面向对象编程语言来说,C语言更加贴近底层运行逻辑,没有封装、继承等更加高级的语法,更加纯粹地关注程序的执行流程。

    PIC单片机环境下的C语言编程与我们平时使用的C语言在语法上大致类似,不过仍有些许不同。下面对PIC单片机的C语言编程做简要介绍。

    1.编译器配置。由于PIC单片机有独特的CPU架构,因此不同于传统的gcc或者vc++编译器进行编译,PIC单片机环境下的C语言有专门的C语言编译器PICC Compiler。

    2.PIC单片机C语言同样支持常见的short、int、long、float等基本数据类型。不过需要注意的是,PIC单片机C语言的int类型为16位存储,long类型为32位存储,float类型为24位存储。

    3.除了基本数据类型外,PIC单片机C语言也同样支持数组、结构体和联合体等复合数据类型。

    4.PIC单片机C语言有一个特殊的数据寄存器bank,该寄存器由程序员管理,在定义变量时必须指定变量存储位置,若不指定则默认存储在bank0中。

    若定义存储于其他bank寄存器的变量,则需要在定义变量时指定bank寄存器编号。例如:

    bank1 unsigned char buffer[32];

    bank2 int flag1, flag2;

    5.PIC单片机C语言保留volatile关键字,用于告知某些特殊的值可能会发生改变。(pic单片机c语言)

    6.使用PIC单片机C语言编程时,虽然也可调用标准库函数,不过由于PIC单片机性能有限,由于诸如scanf()/printf()等库函数的代码比较繁杂,因此在调用这些库函数时需要额外谨慎,可能会造成程序运行时间大幅度增加甚至宕机。

    7.PIC单片机C语言支持C语言与汇编语言混合编程。若在C语言内插入汇编语言代码,则需要使用asm关键字标识。

    更多相关内容
  • PIC单片机 LED动态显示2 C语言编程
  • 温度PIC控制C语言

    2017-11-06 17:46:07
    有很高的参考价值,2个积分绝对物有所值。赶紧来下载了。
  • PhsBoot_v1.0 位置 PhsBoot_v1.0放置在程序存储器的底部,大小为0x100程序字,编译时需设置Code offset参数为ROM_SIZE - 0x100, 例如ROM SIZE为0x2000 PIC16单片机,Code offset需设置为0x1F00 (0x2000 - 0x100)。...

    PhsLoader_v1.0 用户界面

    1be4ae89afa6959520673d194f65dc27.png

    PhsBoot_v1.0 功能

    在PhsLoader_v1.0完成后,接着就是完成PhsBoot_v1.0。 PhsBoot_v1.0主要功能就是接收PhsLoader_v1.0传送过来的Hex记录。解读Hex记录中的启始位,命名,地址,数据和结束位,将数据烧录到指定的程序存储器的位置上,然后通过串口返回Response消息给PC端PhsLoader_v1.0。

    PhsBoot_v1.0 位置

    PhsBoot_v1.0放置在程序存储器的底部,大小为0x100程序字,编译时需设置Code offset参数为ROM_SIZE - 0x100, 例如ROM SIZE为0x2000 PIC16单片机,Code offset需设置为0x1F00 (0x2000 - 0x100)。

    bee319b4c5fc6e252c2afec3cf072370.png

    PhsBoot_v1.0 主要代码段

    PhsBoot_v1.0 是用C语言写的,Microchip 8-bit C Compiler--XC8编译的。

    while (1)

    {        if (PIR1bits.RCIF == 1)

    {

    RecivedByte = RCREG;

    PIR1bits.RCIF == 0;

    m_buffer[m_buffer_Index++] = RecivedByte; //receive data

    if (m_buffer_Index >= BUFFER_MAX)

    {                if (m_buffer[0] == STX && RecivedByte == ETX)

    { //get complete cmd

    switch (m_buffer[CMD_INDEX])

    {                    case WR_MEM:

    EECON1 = PGM_WRITE;

    WriteMem();                        break;                    case RUN_APP:

    sendResponse();                        //TXSTA = 0x02;           // reset TXSTA RCSTA before jumping to application                        //RCSTA = 0x00;                        #asm

    ljmp BOOT_START

    #endasm                        break;                    default:                        //sendResponse();

    break;

    }

    }                else

    { //Send data error back

    TXREG = '?';                    while (TXSTAbits.TRMT == 0); //wait empty                }

    m_buffer_Index=0;

    }

    }

    }

    如何使用

    1. 使用XC8编译PhsBoot_v1.0, 由于PhsBoot_v1.0将放在程序存储器底部,占0x100程序字,编译前需将Code Offset编译参数设到正确值。例如,某PIC16 单片机的程序存储器空间为0x2000程序字,Code Offset = 0x2000 - 0x100 = 0x1F00, 所以只需设置Code offset为1F00, 然后编译。

    2. 使用pickit3烧录PhsBoot_v1.0的Hex文件到目标板中。

    3. 拔除pickit3烧录器

    4. 连接目标板与PC的串口,打开PhsLoader_v1.0用户界面,选择COM端口,BAUD RATE。

    5. 点击PhsLoader_v1.0用户界面上的“.."按钮加载需要烧录的应用程序Hex文件。

    6. 重启目标板,接着立刻在PhsLoader_v1.0界面上点击Download按钮。如果超时未点击Download按钮,目标板会自动跳转到上次烧录的应用程序中去。

    7. 烧录完毕,再次重启目标板, 2秒后目标板开始正常运行应用程序。

    之后每次更新应用程序,只需重复步骤 4 ~ 7 就可以了。

    主要特性

    新的PIC16 serial bootloader有以下主要特性

    1. C语言写的,XC8 编译(只有一点汇编在里面)。

    2. 非常容易移植。

    3. 支持FLASH烧写, 快速,占用空间小。

    4. 可支持EEPROM烧写。

    5. 不支持CONFIG BITS/IDLOC 烧写,保持应用程序的Configuration Bits和Bootloader的一致。

    c2c9ed493cd281aa86d8a6f5178c4c01.gif [1] [2] 610626052e95c7fbe3d254abc769d9ad.gif

    本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

    展开全文
  • C语言PIC编程资料

    2009-10-29 17:22:53
    C语言PIC编程资料都是一些很好的学习资料,保证对大家学习PIC单片机有很大的帮助。
  • 6.C语言程序清单PIC16F84A单片机PORTB口外接8只LED间亮和位1、2、6外接的LED分别点亮的程序清单如下(源文件名PIC01.C):说明:以上是一个完整的,可执行图1 LED点灯的C程序,主要由端口寄存器PORTB 1:3的位定义,...

    6.C语言程序清单

    PIC16F84A单片机PORTB口外接8只LED间亮和位1、2、6外接的LED分别点亮的程序清单如下(源文件名PIC01.C):

    7b01b51badd1e96384dc6cac55d7d776.png

    40a211320f6dc4a2f30c7d6e91c47c3a.png

    说明:以上是一个完整的,可执行图1 LED点灯的C程序,主要由端口寄存器PORTB 1:3的位定义,延时函数delay ()定义; 主函数main()、延时函数void delay( )及各种语句等组成。

    该C程序第三行以符号“∥”开头的说明文是一个注释,它可在一行内写完,亦可分多行写完。注释可写在程序的任何位置,用于帮助阅读和理解程序。说明程序的相关功能、注意事项,以及说明有关算法等。注释应尽可能简捷。在编译时,注释不产生代码。C程序还可用“ ”开头到“ ”结尾之间的内容作注释,与符号“∥”开头的注释是等效的。

    上述程序的第一行,是引导程序开始的用#in—clude语句的头文件。

    第二行是

    第三行是第二行端口寄存器PORTB的位定义的注释。

    第四行~第六行是端口寄存器PORTB口的RBO、RB1、RB6三位的定义,以便在后续程序中对其赋值之用。

    第七行是RBO、RB1、RB6三位的定义注释。

    第八行是延时函数的定义第九行到结尾的功能(参看相关注释)。

    关于端口寄存器的位表达方式。在用C语言编写PIC单片机源文件时,一旦端口的位被定义,即(以端口PORTB为例);#daefine PORTBIT (ddd,bit)((unsigned)(&ddd) 8+(bie)),在该条件下,端口PORTB的位有两种表达方式,在C程序中均是等效的。以PORTB的0位为例:

    13e8279a03549be2d33012c761f3f3c9.png

    它们都是等效的。但一旦位定义中用了PORTB_ O.则在赋值时也应用PORTB—O: 或位定义用了PORT_O,对应赋值时也应用PORT_O。

    (待续)

    展开全文
  • PIC单片机C语言简记

    2020-08-18 07:42:02
    PIC单片机单片机C语言简记语言简记 PICC编译器可以直接挂接在MPLAB-IDE集成开发平台下,实现一体化的编译连接和原代码调试。使用MPLAB-IDE内的调试工具ICE2000 、ICD2 和软件模拟器都可以实现原代码级的程序调试,...
  •  一个完整的PIC单片机C语言程序,通常由包含文件(即头文件1,变量定义、变量说明、函数定义、函数体和注释等六部分等组成。  1.C语言的标识符  所谓标识符,实际上是一些由程序编写者自定义的名称,类似于PIC...
  • pic C语言设计,编程格式,及几个注意点,适合初学者学习
  • PIC单片机C语言编程入门.pdf
  • PIC单片机C语言编程

    2020-07-17 09:24:16
    这是一篇PIC单片机采用C语言编程,说明C编译器的特点之一。一点亮LED为例说明。
  • 3.pic07.C源程序的编译  在《PIC 单片机C 语言程序(8)》一文中,我们已在MPLAB IDE7.40 集成开发环境中编辑了pic07.C 源程序(0~99 秒脉冲发生器)。对于PIC 单片机来说,所有的C 语言源程序,都要在进行编译并...
  • 编者按:为了帮助具有PIC单片机汇编语言知识的技术人员或工程师,快速掌握利用C语言编写PIC单片机程序的方法,本刊特推出《PIC单片机C语言程序设计》系列连载文章。丈中给出的C语言程序实例,均是可执行的,读者可以...
  • PIC16F639单片机C语言代码,带3D天线可低频唤醒,高频端数据已加密,数据加密用的滚码方式,PIC内部硬件加密没用,软件已测并用于实际项目,MPLAB IDE可直接打开
  • 单片机C语言编程 详细介绍了单片机编写程序的技术问题
  • 在前文中,我们介绍了C 语言的一些基本特点和主要内容,并用C 语言编写了一些学习PIC 单片机的基本程序和实用程序。上述源程序,需要生成目标码.hex 文件,并将其烧写到PIC 单片机的芯片中,进行实际运行,方能验证...
  • 轻松玩转PIC单片机C语言,自己花了两天的零散时间整理了书签,书很清楚也很实用
  • C语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高、便于跨平台的代码移植等等,因此C语言编程在单片机系统设计中已得到越来越广泛的运用。
  • C语言使用PIC10F202单片机用IO口模拟PWM功能
  • PIC单片机的学习应用资料,全套应用资料,包括AD、内部资源、狗等各种应用例子,C语言编写
  • PIC18系列单片机原理及C语言开发.rar
  • pic单片机实验c语言例子,基于乾龙开发板,共32个子程序
  • pic的时钟芯片程序,ds1302,c语言版的
  • 为了帮助具有PIC单片机汇编语言知识的技术人员或工程师,快速掌握利用C语言编写PI C 单片机程序的方法,本刊特推出《PIC单片机C语言程序设计》系列连载文章。文中给出的C语言程序实 例,均是可执行的,读者可以放心...
  • 单片机C语言编译器及其应用:基于PIC18F系列pdf-附件资源
  • PIC单片机C语言程序设计实例精粹,刘向宇编著,PIC学习资料
  • C语言源码仿真实例5 PIC16F873的声音仿真电路(程序+仿真)C语言源码仿真实例5 PIC16F873的声音仿真电路(程序+仿真)C语言源码仿真实例5 PIC16F873的声音仿真电路(程序+仿真)C语言源码仿真实例5 PIC16F873的声音...
  • PIC单片机C语言程序设计实例精粹源代码: 单片机实验29个 第10章 I2C总线通信 第11章 USB数据传输 第12章 软件模拟2262编码 第13章 软件模拟2272解码 第14章 红外通讯系统 第15章 投影仪面板 第16章 语音录放系统 第4...
  • 许多人说PIC单片机一大的优势就是低功耗,那我们就来讨论,讨论低功耗的实现。
  • C语言PIC18 serial bootloader和C#语言bootloader PC端串口通信程序  了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级...

             了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。

      新PIC18 Bootloader

      PhsBoot_v3.0是我最新用C语言实现的PIC bootloader, 采用串口通信,适用于PIC18, 并为其用C#写了PC端通信程序PhsLoader_v3.0。PhsLoader_v3.0通过串口按照自定义的通信协定发送数据PhsBoot_v3.0, PhsBoot_v3.0接收数据,按照通信协定解读数据,解读出其中Hex数据,并将其烧录到正确的位置。

      通信协定

      PIC18单片机端PhsBoot_v3.0和PC端PhsLoader_v3.0之间的通信数据包采用以下协定

    <STX><CMD><ADDRL><ADDRH><ADDRU><LEN><DATA>...<DATA><ETX>

      定义如下:

    STX - Start of packet indicator
    ETX - End of packet indicator
    LEN - The length of true data
    DATA - General data 16 bytes, only first LEN of datas are true
    CMD - Base command
    ADDR - Address up to 24 bits  ( ADDRL , ADDRH , ADDRH)

      具体有以下Base command:

    RD-VER:  0x00 -- Read Version Information (最终版本删除了此命令)
    RD_MEM: 0x01 -- Read Program Memory (最终版本删除了此命令)
    ER_MEM: 0x03 -- Erase Program Memory
    WR_MEM: 0x02 -- Write Program Memory
    WR_CFG: 0x04 -- Write Configuration Registers

      PhsLoader_v3.0 功能

      定义好了通讯协定, 接着就按照协定去实现PhsLoader_v3.0。 PhsLoader_v3.0的具体功能包括选择COM端口和BAUD RATE, 连接COM, 加载应用程序Hex文件,Parse 应用程序的Hex文件,一行一行解读Hex文件,然后按照通讯协定通过串口发送Hex记录到单片机,接收单片机发送回来的Response,发送完毕后断开COM连接,发送期间出现问题就立马结束发送。

      PhsLoader_v3.0 主要代码段

      PhsLoader_v3.0是用C#实现的,是我在利用空余时间自学C#后写的,上面提到的功能都实现了。

            private void btnDownload_Click(object sender, EventArgs e)
            {
                btnDownload.Enabled = false;
                pBarLoading.Visible = false;
    
                if (!this.connect())
                {
                    btnDownload.Enabled = true;
                    return;
                }
    
                try
                {
                    loaderReader = new StreamReader(textBoxFile.Text);
    
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Error: " + ex.Message);
                    textBoxStatus.ForeColor = Color.Red;
                    textBoxStatus.AppendText("Read hex file unsuccessfully\r\n");
                    textBoxStatus.ForeColor = Color.Black;
                    loaderReader.Close();
                    loaderSerial.Close();
                    btnDownload.Enabled = true;
                    return;
                }
    
                loaderFrame = new SerialFrame();
                if (!erase())
                {
                    textBoxStatus.ForeColor = Color.Red;
                    textBoxStatus.AppendText("Erase unsuccessfully\r\n");
                    textBoxStatus.ForeColor = Color.Black;
                    loaderReader.Close();
                    loaderSerial.Close();
                    btnDownload.Enabled = true;
                    return;
                }
    
                pBarLoading.Refresh();
                pBarLoading.Visible = true;
                pBarLoading.Value = 0;
                pBarLoading.Maximum = loaderLines;
                pBarLoading.Step = 1;
    
                string recordLine;
                Address_U = 0;
                bool isNextLineUserID = false;
                bool isNextLineConfigBits = false;
                textBoxStatus.AppendText("\r\nDownloading hex file ...\r\n");
                try
                {
                    while (loaderReader.Peek() >= 0)
                    {
                        pBarLoading.PerformStep();
                        recordLine = loaderReader.ReadLine();
                        //if (recordLine.Contains(USER_ID_TOKEN) == true)
                        //{
                        //    isNextLineUserID = true;
                        //    continue;
                        //}
                        //else if (recordLine.Contains(CONFIG_BITS_TOKEN) == true)
                        //{
                        //    isNextLineConfigBits = true;
                        //    continue;
                        //}
                        if (recordLine.Contains(EXTEND_TOKEN) == true)
                        {
                            if (recordLine.Contains(USER_ID_TOKEN) == true)
                            {
                                isNextLineUserID = true;
                                continue;
                            }
                            else if (recordLine.Contains(CONFIG_BITS_TOKEN) == true)
                            {
                                isNextLineConfigBits = true;
                                continue;
                            }
                            else
                            {
                                const int ADDR_U_START_INDEX = 9;
                                const int ADDR_U_LENGTH = 4;
                                string addrU = recordLine.Substring(ADDR_U_START_INDEX, ADDR_U_LENGTH);
                                Address_U = Convert.ToInt32(addrU, 16) << 16;
                                continue;
                            }
                        }
                        else if (recordLine.Contains(END_OF_HEX_FILE_TOKEN) == true)
                        {
                            break;
                        }
                        if (isNextLineUserID)
                        {
                            isNextLineUserID = false;
                            // do nothing;
                        }
                        else if (isNextLineConfigBits)
                        {
                            if (!DownloadConfigLine(recordLine))
                            {
                                Debug.WriteLine("Error found during configuration bits programming");
                                loaderReader.Close();
                                loaderSerial.Close();
                                btnDownload.Enabled = true;
                                return;
                            }
                            isNextLineConfigBits = false;
                        }
                        else
                        {
                            //if (recordLine.Contains(J_TYPE_CONFIG_BITS_TOKEN) == true && Address_U == 0x10000)
                            //{
                            //    continue;
                            //}
                            /*else*/ 
                            if (!DownloadDataLine(recordLine))
                            {
                                Debug.WriteLine("Error found during data programming");
                                loaderReader.Close();
                                loaderSerial.Close();
                                btnDownload.Enabled = true;
                                return;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Error: " + ex.Message);
                    textBoxStatus.ForeColor = Color.Red;
                    textBoxStatus.AppendText("Downloading failed\r\n");
                    textBoxStatus.ForeColor = Color.Black;
                    loaderSerial.Close();
                    loaderReader.Close();
                    btnDownload.Enabled = true;
                    return;
                }
                textBoxStatus.AppendText("Downloading completed\r\n");
    
                if (!run())
                {
                    textBoxStatus.ForeColor = Color.Red;
                    textBoxStatus.AppendText("Jump to Application unsuccessfully\r\n");
                    textBoxStatus.ForeColor = Color.Black;
                    loaderReader.Close();
                    loaderSerial.Close();
                    btnDownload.Enabled = true;
                    return;
                }
                loaderSerial.Close();
                loaderReader.Close();
                btnDownload.Enabled = true;
            }
    View Code

      PhsLoader_v3.0 用户界面

      

      PhsBoot_v3.0 功能

      在PhsLoader_v3.0完成后,接着就是完成PhsBoot_v3.0。 PhsBoot_v3.0主要功能就是接收PhsLoader_v3.0传送过来的Hex记录。解读Hex记录中的启始位,命名,地址,数据和结束位,将数据烧录到指定的程序存储器的位置上,然后通过串口返回Response消息给PC端PhsLoader_v3.0。

      PhsBoot_v3.0 位置

      PhsBoot_v3.0放置在程序存储器的头部,大小为0x400程序字。

      

      Interrupt Vector Remap

      由于新PIC18 bootloader 位于程序存储器的头部,需要对Interrupt Vector进行remap. 代码如下。

        #asm
            PSECT intcode
            goto APP_START + 0x8
            PSECT intcodelo
            goto APP_START + 0x18
        #endasm

      PhsBoot_v3.0 主要代码段

      PhsBoot_v3.0 是用C语言写的,Microchip 8-bit C Compiler--XC8编译的。

        while (1)
        {
            if (PIR1bits.RCIF == 1)
            {
                RecivedByte = RCREG;
                PIR1bits.RCIF == 0;
                m_buffer[m_buffer_Index++] = RecivedByte; //receive data
                if (m_buffer_Index >= BUFFER_MAX)
                {
                    if (m_buffer[0] == STX && RecivedByte == ETX)
                    { //get complete cmd
                        switch (m_buffer[CMD_INDEX])
                        {
                        case WR_MEM:
                            EECON1 = PGM_WRITE;
                            WriteMem();
                            break;
                        case WR_CFG:
                            if (block_Start)
                            {
                                WriteStart();
                                resetBuffer();
                                block_Start = 0;
                            }
                            EECON1 = CFG_WRITE;
                            WriteCfg();
                            break;
                        case ER_MEM:
                            EECON1 = PGM_ERASE;
                            EraseMem();
                            break;
                        case RUN_APP:
                            if (block_Start)
                            {
                                WriteStart();
                                resetBuffer();
                                block_Start = 0;
                            }
                            sendResponse();
                            TXSTA = 0x02;           
                            RCSTA = 0x00;
                            asm("goto " ___mkstr(APP_START));
                        default:
                            break;
                        }
                    }
                    else
                    { //Send data error back
                        TXREG = '?';
                        while (TXSTAbits.TRMT == 0); //wait empty
                    }
                    m_buffer_Index=0;
                }
            }
        }

      如何使用 

      1. 使用XC8编译PhsBoot_v3.0。

      2. 使用pickit3烧录PhsBoot_v3.0的Hex文件到目标板中。

      3. 拔除pickit3烧录器

      4. 连接目标板与PC的串口,打开PhsLoader_v3.0用户界面,选择COM端口,BAUD RATE。

      5. 点击PhsLoader_v3.0用户界面上的“.."按钮加载需要烧录的应用程序Hex文件 (注意:由于新PIC18 bootloader占用了程序存储器头部0x400程序字,所以应用程序编译需要设置Code offset为0x400)。

      6. 重启目标板,接着立刻在PhsLoader_v3.0界面上点击Download按钮。如果超时未点击Download按钮,目标板会自动跳转到上次烧录的应用程序中去。

      7. 烧录完毕,再次重启目标板, 2秒后目标板开始正常运行应用程序。

      之后每次更新应用程序,只需重复步骤 4 ~ 7 就可以了。

      主要特性

      新的PIC18 serial bootloader有以下主要特性

      1. C语言写的,XC8 编译。

      2. 非常容易移植。

      3. 支持FLASH烧写, 快速,占用空间小。

      4. 可支持EEPROM烧写。

      5. 支持CONFIG BITS/IDLOC 烧写。

     

      如果你有什么疑问,或有兴趣了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 验证信息请填bootloader 或 cnblogs)

     

      若需了解我的上一款PIC18 串口bootloader 请阅读随笔《自己用C语言写PIC18单片机的serial bootloader》

    posted on 2015-10-09 22:17 GeekyGeek 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/geekygeek/p/pic18_serial_bootloader.html

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,520
精华内容 3,808
关键字:

c语言 pic