⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_xmodem.c

📁 ARM入门的好帮手.包含了从简单到相对较复杂的程序.
💻 C
字号:
//*----------------------------------------------------------------------------
//*      ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : main_xmodem.c
//* Object              : Test the Flash and Ram presence
//*                       This project can be run on all EBxx Targes
//*
//* 1.0 20/11/00 JPP    : Creation
//*----------------------------------------------------------------------------

//* --------------------------- include file ----------------------------------

#include <stdio.h>
#include <string.h>

//* Use this descriptor for the specific 55800 peripheral
#include "parts/m55800/lib_m55800.h"

/* Driver description  */
#include "drivers/com/com.h"                    //* Communication driver

/* Driver description  */
#include "xmodem.h"                        //* Communication driver
#include "get_usart.h"                        //* Communication driver

//* --------------------------- Constant definition ---------------------------

#define BAUD_RATE       38400

//* ------------------------------  extern function  --------------------------

extern void monitor_menu(void);

//* ------------------------------  extern global data  -----------------------

//* ------------------------------  Local variable ----------------------------
static const char main_menu[]=
{
"\n\r  COMMAND MENU: Base\n\r"
"  0)  Info\n\r"
"  1)  Get global value\n\r"
"  2)  receive file (Xmodem)\n\r"
"  3)  transmit file (Xmodem)\n\r"
"  4)  Set MEC EBI \n\r"
"  8)  Usart Monitor\n\r"
"  9)  Memory Monitor\n\r"
"Enter command to execute: "
};
static const u_int mec_ebi[]=
{
    0x03002529,         //* csr 2  Flash AT49BV1604 2 M byte
    0x04002429,         //* csr 3  Flash AT49BV8011 1 M byte
    0x05002021,         //* csr 4  RAM 1 M byte
    0x05102021          //* csr 4  RAM 1 M byte
};
int data_abort;
ComDesc COM;
ComDesc 		*Xmodem_COM;
unsigned char *pt_data;
int len;
int mcki;
int read_get_val;
//*----------------------------------------------------------------------------
//* Function Name       : ram_write
//* Object              : write a Xmodem frame in RAM
//* Input Parameters    : <val> value to update
//* Output Parameters   : None
//*----------------------------------------------------------------------------
int ram_write(u_char *data , int size)
{
    u_int count;
    for ( count=0 ; count < size ; count++)
    {
         *pt_data++= * data++;
    }
    return TRUE;
}

//*----------------------------------------------------------------------------
//* Function Name       : get_val
//* Object              : get a integer or no update the value
//* Input Parameters    : <val> value to update
//* Output Parameters   : value updated
//*----------------------------------------------------------------------------
int  get_val( int val ,char * type )
{

    char buff[20];
    //* echo
    read_get_val = sprintf(&buff[0],type,val);
    sprintf(&buff[read_get_val],"\n\r");

    at91_print(&COM,buff);
    //* scan new value
    read_get_val = 0xFF;
    at91_scanf(&COM,type,&read_get_val);
    //* update if change
    if (   read_get_val != 0xFF ) val = read_get_val;
    at91_print_crlf(&COM);
    return val;
}

//*----------------------------------------------------------------------------
//* Function Name       : Get_Command
//* Object              : Get command val
//* Input Parameters    : None
//* Output Parameters   : int : Command num
//*----------------------------------------------------------------------------
int Get_Command(const char * menu)
{
  int command;
  at91_print(&COM,(char *)menu);
  at91_scanf(&COM,"%d", &command);
  at91_print_crlf(&COM);
  return command;
}
//*----------------------------------------------------------------------------
//* Function Name       : menu
//* Object              : check general menu
//* Input Parameters    : None
//* Output Parameters   : None
//*----------------------------------------------------------------------------
void menu(void)
{
int     command = 0;
int     count;
char    message[512];

//init global data
pt_data = (u_char *)0x02000000;
len     = 0x48000;

for(;;)
  {
    command = Get_Command(main_menu);
    switch(command)
    {
    case 1:
            at91_print(&COM,"Start work address:");
            pt_data = (u_char *) get_val((int )pt_data,"%08X");
            at91_print(&COM,"len:");
            len = get_val(len,"%08X");
    case 0:
            sprintf(message,"Start work address 0x%08X len 0x%08X (%d) %d Kb\n\r",(int )pt_data,len,len,len/1024);
            at91_print(&COM,message);
        break;
    case 2:
            at91_print(&COM,"Xmodem wait frame (Send Syncrh 'C')\n\r");
            xmodem_receive( &ram_write);
            at91_print(&COM,"Reception ended \n\r");
        break;
    case 3:
            at91_print(&COM,"Xmodem Wait Syncrh 'C'(and send frame)\n\r");
            xmodem_transmit(pt_data,len);
            at91_print(&COM,"Transmission ended \n\r");
        break;
    case 4:
            for (count=0; count < 4 ;count++)
            {
                EBI_BASE->EBI_CSR[count+2]=mec_ebi[count];

                sprintf(message,"EBI CSR: %d value %08X\n\r",count+2,mec_ebi[count]);
                at91_print(&COM,message);
            }
        break;

     case 9://* dump memory
            monitor_menu();
          break;

    default:         /*  invalid command  */
            at91_print(&COM,"Invalid command entered. Please enter again!\n\r");
    }
  }
}


//*----------------------------------------------------------------------------
//* Function Name       : main
//* Object              : Main function of Polling USART 0
//* Input Parameters    : none
//* Output Parameters   : True
//*----------------------------------------------------------------------------
int main( void )
//* Begin

{
    u_short cd_baud;

    //* open COM get usart for AT91 parts

    COM.usart= get_usart0_desc ( &mcki );

    cd_baud = at91_baud_com(mcki, BAUD_RATE);

	//* Set the Xmodem transaction on USART 0 COM
	Xmodem_COM = &COM;

    at91_open_com(&COM,(COM_8_BIT|COM_PAR_NONE|COM_NBSTOP_1|COM_FLOW_CONTROL_NONE),cd_baud);

    menu();

    return(TRUE);
//* End
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -