搜索
bottom↓
回复: 24

前段时间,完成了串口自编程上、下位程序,发帖分享一下!

[复制链接]

出0入0汤圆

发表于 2006-9-26 22:41:29 | 显示全部楼层 |阅读模式
上位用C++Builder开发,界面如下:

为什么图传不上来呀

附件也无法传呀,待续……

-----此内容被qingwei_cui于2006-09-26,22:42:50编辑过


-----此内容被qingwei_cui于2006-09-26,22:47:04编辑过

出0入0汤圆

发表于 2006-9-27 08:10:39 | 显示全部楼层
可以上传呀

出0入0汤圆

发表于 2006-9-27 08:35:39 | 显示全部楼层
等待ing

出0入0汤圆

 楼主| 发表于 2006-9-27 09:34:16 | 显示全部楼层
昨晚,真得不能!

界面如下:





上位机程序:

点击此处下载armok01129957.rar

出0入0汤圆

 楼主| 发表于 2006-9-27 09:46:02 | 显示全部楼层
GCC环境下,下位机程序:

/*------------------------------------------------------------------------------

- Title            : cuiboot.c

- Revision         : Ver1.00

- Device         : mega32

- Author           : cqw

- Date             : 10/09/2006

--------------------------------------------------------------------------------

- Function explain :

--------------------------------------------------------------------------------

- Modify   :       

------------------------------------------------------------------------------*/

#include <avr/io.h>

#include <avr/pgmspace.h>

#include <avr/boot.h>

#include <avr/interrupt.h>



#define        MCU_WRITE                        0xAF

#define        MCU_READ                        0xA0

#define        MCU_RUN                            0xBF

#define        MCU_SETPAGE                    0xB0

#define        MCU_UARTACK                    0xAA



#define  SPM_PAGESIZE                  128         // 按字节



unsigned int        count;

unsigned int         g_wPageIndex = 0;   

unsigned char         g_aPageTemp[SPM_PAGESIZE];



void (*reset)(void)=0x0000;



void uart_putc(unsigned char c)

{

          while( !(UCSRA & (1<<UDRE)) );

        UDR=c;

}



unsigned char uart_getc(void)

{

          while( !(UCSRA & (1<<RXC)) );  

        return UDR;

}

void WritePage(void)

{

        unsigned char i;

  

        /* 接收当前页面数据 */

        for(i=0;i<SPM_PAGESIZE;i++)

                  g_aPageTemp=uart_getc();

  

        /* 页擦除操作 */

         boot_page_erase(g_wPageIndex);

   

        /* 查忙 */

         while(boot_rww_busy())

            boot_rww_enable();



        /* 填充缓冲页 */

           for(i = 0; i < SPM_PAGESIZE; i +=2)  

         boot_page_fill((unsigned long)i,*((unsigned int *)(g_aPageTemp +i)));

        /* 页写入操作 */

         boot_page_write(g_wPageIndex);

         while(boot_rww_busy())

              boot_rww_enable();

     

         g_wPageIndex+=SPM_PAGESIZE;

}



void ReadPage(void)

{

    unsigned char i;

   

    for(i=0;i<SPM_PAGESIZE;i++)

        uart_putc(pgm_read_byte(i+(g_wPageIndex*SPM_PAGESIZE)));



    g_wPageIndex++;

}

/*

SIGNAL(TIMER0_OVF_vect)

{

         TCNT0 = 0xB9;               // 9.861mSec (1.4%) prescale:1024

       

        if ( count )

        {

                if ( --count <=1 )

                {

                        MCUCR = 0x01;

                     MCUCR = 0x00;   // 将中断向量表迁移到应用程序区头部

                     reset();               // 跳转到Flash的0x0000处,执行用户的应用程序

                }

        }

       

}*/

int main(void)  

{

        unsigned char tmp;

        /*boot程序停留时间*/

        count = 300;               // 3s

        /*定时器初始化*

        TCNT0 = 0xB9;

        OCR0  = 0x47;

        TCCR0 = 0x05;

        *串口初始化*/

        UBRRH=0;

          UBRRL=0x5F;                                                        // 4800 7.3728MHz

        UCSRB=(1<<RXEN)|(1<<TXEN);

       

          while(1)

        {

                  tmp=uart_getc();                        // recv command

                  if ( tmp == MCU_SETPAGE )                // 设置页地址

                {

                        g_wPageIndex=uart_getc();

                }

                else if ( tmp == MCU_WRITE )        // 写一页

                {

                        WritePage();

                    uart_putc(MCU_UARTACK);                // 应答

                }

                else if ( tmp == MCU_READ )                // 读

                {

                        ReadPage();

                }

                else if ( tmp == MCU_RUN )                 // 运行用户程序

                {

                        reset();

                }

                else if ( tmp == MCU_UARTACK )        // 回应检测命令

                {

                        uart_putc(MCU_UARTACK);

                        count = 0;

                }

        }

}

/*--------------------------------------end-----------------------------------*/

出0入0汤圆

 楼主| 发表于 2006-9-27 09:47:53 | 显示全部楼层
ICC环境下,下位机程序:

/*------------------------------------------------------------------------------

- Title            : cuiboot.c

- Revision         : Ver1.00

- Author           : cqw

- Date             : 10/09/2006

--------------------------------------------------------------------------------

- Function explain : 暂未加入熔丝位更改

--------------------------------------------------------------------------------

- Modify   :       

------------------------------------------------------------------------------*/

#include <iom32v.h>

#include <macros.h>



#define        MCU_WRITE                        0xAF

#define        MCU_READ                        0xA0

#define        MCU_RUN                            0xBF

#define        MCU_SETPAGE                    0xB0

#define        MCU_UARTACK                    0xAA



#define SPM_PageSize                  128                        // falsh页大小(按字节)



extern void boot_page_ew          (unsigned int ,unsigned char);

extern void boot_page_fill        (unsigned int ,unsigned int );  

extern void wait_page_rw_ok        (void);

extern void write_lock_bits (unsigned char);

extern unsigned char read_program_memory(unsigned int,unsigned char);



unsigned int  count;       

unsigned int  g_wPageIndex=0;                   // 页索引

unsigned char g_aPageTemp[SPM_PageSize];// 缓存





void quitboot(void)                                         // 退出Bootloader程序,从0x0000处执行应用程序

{

          //MCUCR = 0x01;

    //MCUCR = 0x00;                            // 将中断向量表迁移到应用程序区头部

    GICR = (1<<IVCE);

    GICR = (0<<IVCE)|(0<<IVSEL);        // 将中断向量表迁移到应用程序区头部

        asm("jmp 0x0000
");                // 跳转到Flash的0x0000处,执行用户的应用程序

}



void uart_putc(unsigned char c)

{

          while( !(UCSRA & (1<<UDRE)) );

        UDR=c;

}



unsigned char uart_getc(void)

{

          while( !(UCSRA & (1<<RXC)) );  

        return UDR;

}



void WritePage(void)

{

        unsigned char i;

       

        for(i=0;i<SPM_PageSize;i++)

                  g_aPageTemp=uart_getc();                 // 接收当前页面数据

               

          boot_page_ew(g_wPageIndex,0x03);                // 擦除页

        wait_page_rw_ok();                          // 等待擦除完成

         

        for(i=0;i<SPM_PageSize;i+=2)                          // 将数据填入Flash缓冲页中

        {

                boot_page_fill(i,((g_aPageTemp[i+1]<<8)|g_aPageTemp));

    }       

        boot_page_ew(g_wPageIndex,0x05);             // 将缓冲页数据写入一个Flash页

    wait_page_rw_ok();                          // 等待写入完成



        g_wPageIndex+=SPM_PageSize;

}



void ReadPage(void)

{

    unsigned int i;

     

        for(i=0;i<SPM_PageSize;i++)

             uart_putc(read_program_memory((i+g_wPageIndex),0));



        g_wPageIndex+=SPM_PageSize;

}



void  main(void)  

{

        unsigned char tmp;

       

        unsigned int i,j;

       

        GICR = (1<<IVCE);

    GICR = (0<<IVCE)|(1<<IVSEL);        // 将中断向量表迁移到Boot区头部

        CLI();                                                                // 关闭中断

        /*定时器初始化

        TCNT0 = 0xB8;                                                 // 10ms prescale:1024

        OCR0  = 0x47;

        TCCR0 = 0x05; */

        /*串口初始化*/

        UBRRH=0;

          UBRRL=0x5F;                                                        // 4800Mhz

        UCSRB=(1<<RXEN)|(1<<TXEN);

       

        count = 0;                                                        // 3s boot程序停留时间

        g_wPageIndex = 0;

        /*

        while(1)

    {

        if(uart_getc()== MCU_UARTACK)

                {

                        count = 0;

                        uart_putc(MCU_UARTACK);

                        break;

                }

        if (TIFR & (1<<OCF0))                      // timer0 over flow

        {

                    TCNT0 = 0xB8;

                       

                        if ( ++count > 300 )

                        {

                                quitboot();                                // 跳转到Flash的0x0000处,执行用户的应用程序

                        }

            TIFR = TIFR|(1<<OCF0);

        }

    } */

        i=0;

        j=0;

          while(1)

        {

                  tmp=uart_getc();                                // recv command

       

                   if ( tmp == MCU_SETPAGE )                // 设置页地址

                {

                        g_wPageIndex=uart_getc();

            }

                else if ( tmp == MCU_WRITE )        // 写一页

                {

                        WritePage();

                    uart_putc(MCU_UARTACK);                // 应答

                }

                else if ( tmp == MCU_READ )                // 读

                {

                        ReadPage();

                }

                else if ( tmp == MCU_RUN )                 // 运行用户程序

                {

                        quitboot();

                }

                else if ( tmp == MCU_UARTACK )        // 回应检测命令

                {

                        uart_putc(MCU_UARTACK);

                }/*

                if (TIFR & (1<<OCF0))                      // timer0 over flow

        {

                    TCNT0 = 0xB8;

                        if ( count )

                        {

                                if ( --count <=1 )

                                {

                                        quitboot();                        // 跳转到Flash的0x0000处,执行用户的应用程序

                                }

                        }

            TIFR = TIFR|(1<<OCF0);

        }

                if (++i>100)

                        j++;

                if (j>100)

                        quitboot();        */

                /*       

                for ( i=0;i<10; i++)

                {

                        for( j=0;j<1000; j++);

                }

                GICR = (1<<IVCE);

            GICR = (0<<IVCE)|(0<<IVSEL);        // 将中断向量表迁移到应用程序区头部

                asm("jmp 0x0000
");                // 跳转到Flash的0x0000处,执行用户的应用程序 */

        }

}



********************************************************************************



/*------------------------------------------------------------------------------

- Title            : selfprgo.c

- Revision         : Ver1.00

- Author           : cqw

- Date             : 10/09/2006

--------------------------------------------------------------------------------

- Function explain :SPM操作函数,根据machao程序改编

--------------------------------------------------------------------------------

- Modify   :       

------------------------------------------------------------------------------*/

#include <iom32v.h>

#include <macros.h>



#define  R0        (*(volatile unsigned char *)0x00)



/*------------------------------------------------------------------------------

functionName:void someNop(void)

description: 擦除(code=0x03)和写入(code=0x05)一个Flash页

------------------------------------------------------------------------------*/

void boot_page_ew(unsigned int pageAddr,unsigned char code)

{

           asm("mov r30,r16
"

        "mov r31,r17
");                    // 将页地址放入Z寄存器和RAMPZ的Bit0中

           SPMCR = code;                                // 寄存器SPMCSR中为操作码

           asm("spm
");                            // 对指定Flash页进行操作

}         

/*------------------------------------------------------------------------------

functionName:void boot_page_fill(unsigned int address,unsigned int data)  

description: 填充Flash缓冲页中的一个字

------------------------------------------------------------------------------*/

void boot_page_fill(unsigned int address,unsigned int data)

{

    asm("mov r30,r16
"

            "mov r31,r17
"                     // Z寄存器中为填冲页内地址

            "mov r0,r18
"

        "mov r1,r19
");                    // R0R1中为一个指令字

    SPMCR = 0x01;

    asm("spm
");

}

/*------------------------------------------------------------------------------

functionName:void wait_page_rw_ok(void)

description: 等待一个Flash页的写完成

------------------------------------------------------------------------------*/

void wait_page_rw_ok(void)

{

        while(SPMCR & 0x40)

        {

            while(SPMCR & 0x01);

        SPMCR = 0x11;

        asm("spm
");

     }

}

/*------------------------------------------------------------------------------

functionName:void write_lock_bits (unsigned char val)

description:写锁定位

------------------------------------------------------------------------------*/

void write_lock_bits (unsigned char val)

{

        asm("mov r0,r16
");

        SPMCR=0x09;

        asm("spm
");

        while(SPMCR&BIT(0));

        SPMCR = 0x11;

    asm("spm
");

}

/*------------------------------------------------------------------------------

functionName:unsigned char read_program_memory (unsigned int addr,unsigned char cmd)

description: 返回addr地址数据,以字节为单位

cmd:

0:读flashrom

1:读熔丝位或者锁定位

addr=0x0001                锁定位

addr=0x0000                熔丝位低字节

addr=0x0003         熔丝位高字节

------------------------------------------------------------------------------*/

unsigned char read_program_memory(unsigned int addr,unsigned char cmd)

{

        asm("mov r30,r16
"                

        "mov r31,r17
");  

    if(cmd)

    {

            SPMCR=0x09;

    }               

        asm("lpm r0,z
");

        return(R0);

}

出0入0汤圆

发表于 2006-9-27 09:54:58 | 显示全部楼层
上位机代码能共享一下吗?

出0入0汤圆

发表于 2006-9-27 10:06:40 | 显示全部楼层

出0入0汤圆

发表于 2006-9-27 21:49:26 | 显示全部楼层
帮你顶!!

出0入0汤圆

 楼主| 发表于 2007-11-15 11:48:33 | 显示全部楼层
不能沉啊
头像被屏蔽

出0入0汤圆

发表于 2007-11-15 12:12:29 | 显示全部楼层
Cool !

出0入0汤圆

 楼主| 发表于 2007-11-15 15:56:37 | 显示全部楼层
站长,什么时候换的头像啊。这张真男人,呵呵。

出0入0汤圆

发表于 2008-3-13 14:08:46 | 显示全部楼层
哥们,能将没有错误的ICC程序发给我吗 我的邮箱是joken_007@163.com,谢~~~~~~~~~
还有再问你一个,
如果想支持其它的芯片是不是把头文件改一下就行了

出50入0汤圆

发表于 2008-3-13 14:37:00 | 显示全部楼层
积分为1,直接要程序,不厚道呢~~

出0入0汤圆

发表于 2008-3-13 14:45:55 | 显示全部楼层
很漂亮!

出0入0汤圆

发表于 2008-3-13 16:34:31 | 显示全部楼层
不错,不过要看懂得一阵时间了.

出0入0汤圆

发表于 2008-6-11 10:21:59 | 显示全部楼层
好贴

出20入0汤圆

发表于 2009-8-31 16:10:21 | 显示全部楼层
我学习了 等有空再好好研究下

出0入85汤圆

发表于 2010-4-3 08:28:17 | 显示全部楼层
mark

出0入264汤圆

发表于 2010-4-3 09:24:43 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-9-27 17:38:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-30 16:48:48 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2011-5-8 20:54:13 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2011-5-8 21:33:00 | 显示全部楼层
MARk

出0入0汤圆

发表于 2011-5-9 19:23:15 | 显示全部楼层
MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 23:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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