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

📄 blinky.c

📁 atmel sam7a3 串口 pdc keil下成功运行 可在7a3 开发板上运行
💻 C
字号:
/******************************************************************************/
/* BLINKY.C: LED Flasher                                                      */
/******************************************************************************/
/* This file is part of the uVision/ARM development tools.                    */
/* Copyright (c) 2005-2006 Keil Software. All rights reserved.                */
/* This software may only be used under the terms of a valid, current,        */
/* end user licence from KEIL for a compatible version of KEIL software       */
/* development tools. Nothing else gives you the right to use this software.  */
/******************************************************************************/

#include <AT91SAM7A3.H>                     /* AT91SAM7A3 definitions */
#include "Board.h"
#include "lib_AT91SAM7A3.h"

#define TCK  1000                           /* Timer Clock  */
#define PIV  ((MCK/TCK/16)-1)               /* Periodic Interval Value */

//
AT91S_PIO  * pPIOA = AT91C_BASE_PIOA;       /* Global Pointer to PIOA */
AT91S_PIO  * pPIOB = AT91C_BASE_PIOB;       /* Global Pointer to PIOB */
AT91S_AIC  * pAIC  = AT91C_BASE_AIC;        /* Global Pointer to AIC  */
AT91S_PITC * pPIT  = AT91C_BASE_PITC;       /* Global Pointer to PIT */


const int LED_Mask[] = {                    /* LED I/O Mask */
  0, LED1, LED2, LED3, LED4
};

unsigned char Pos   = 0;                    /* Current Position */
unsigned char Dir   = 0;                    /* Current Direction */
unsigned int  Mask  = 0;                    /* Current Invert Mask */
unsigned int  Delay = 500;                  /* Current Delay */
unsigned int  JS    = 0xFFFFFFFF;           /* Current Joystick Values */

volatile unsigned int TimeTick;             /* Current Time Tick */
////////////////
unsigned int WriteStatus;
unsigned long   page,i;
unsigned long * Flash;
///////////
/***********************************************************************/
/*  This file is part of the ARM Toolchain package                     */
/*  Copyright KEIL ELEKTRONIK GmbH 2003 - 2006                         */
/***********************************************************************/
/*                                                                     */
/*  FlashDev.C:  Flash Programming Functions adapted                   */
/*               for AT91SAM7A3 (ONCHIP)                               */
/*                                                                     */
/***********************************************************************/

//#include "..\FlashOS.H"        // FlashOS Structures
#include <AT91SAM7A3.H>

#define AT91C_MC_CORRECT_KEY   ((unsigned int) 0x5A << 24)
#define FLASH_PAGE_SIZE_BYTE   256

#define STACK_SIZE   64        // Stack Size

char buff[2560];
 
extern int ProgramPage (unsigned int adr,unsigned int sz ,char* buf) ;


/*
 * Scan Joystick and setup global variables
 */

void joystick (void) {
  unsigned int js;

  js = pPIOB->PIO_PDSR;                     /* Read Joystick Pins */
  if (((js & JS_PUSH) == 0) &&              /* Push pressed */
      ((JS & JS_PUSH) != 0)) {
    Mask ^= 0xFFFFFFFF;                     /* Change Mask */
    pPIOA->PIO_SODR = LED_MASK;             /* Turn Off all LED's */
    pPIOA->PIO_CODR = LED_Mask[Pos] ^ Mask; /* Turn On selected LED's */
  }
  if ((js & JS_LEFT) == 0) {                /* Left -> Change Direction */
    Dir = 0;                                /* Direction is Left */
  }
  if ((js & JS_RIGHT) == 0) {               /* Right -> Change Direction */
    Dir = 1;                                /* Direction is Right */
  }
  if ((js & JS_DOWN) == 0) {                /* Down -> Slower */
    if (Delay < 1000) Delay += 10;          /* Increase Delay */
  }
  if ((js & JS_UP) == 0) {                  /* Up -> Faster */
    if (Delay > 50)   Delay -= 10;          /* Decrease Delay */
  }
  JS = js;                                  /* Save Joystick Values */
}


/*
 * System Interrupt Service Routine
 *  executed every 1ms
 */

void sys_irq (void) __irq {

  if (pPIT->PITC_PISR & AT91C_PITC_PITS) {  /* Check PIT Interrupt */
    TimeTick++;                             /* Increment Time Tick */
    if ((TimeTick & 0x1F) == 0) {           /* Check every 32ms */
      joystick();                           /* Scan Joystick */
    }
    pAIC->AIC_EOICR = pPIT->PITC_PIVR;      /* Ack & End of Interrupt */
  } else {
    pAIC->AIC_EOICR = 0;                    /* End of Interrupt */
  }
    pAIC->AIC_EOICR = pPIT->PITC_PISR;      /* Ack & End of Interrupt */

}


/*
 * Main Program
 */

int main (void) {
  unsigned int tick;
  unsigned char Dbgu_TXBUFF[256];
  int i=0;
//  unsigned int baudrate;
  	 AT91PS_USART pUSART=(AT91PS_USART)AT91C_BASE_DBGU ;
	 AT91PS_PDC  pPDC=(AT91PS_PDC) AT91C_DBGU_RPR; //PDC通道首址
	 AT91PS_PMC pPMC = (AT91PS_PMC)AT91C_BASE_PMC; 
	  for(i=0;i<256;i++)
	   {
	   	Dbgu_TXBUFF[i] = i;
	   }	
	 AT91F_PMC_EnablePeriphClock( pPMC,1 );

	 AT91F_US_Configure (pUSART ,48000000  ,AT91C_US_ASYNC_MODE ,9600 ,0);
	 pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;
	 pUSART->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;	
	 
   
	 AT91F_DBGU_CfgPIO(); 
//	 AT91F_PDC_DisableRx(pPDC);
	 AT91F_PDC_DisableTx(pPDC);
//	 AT91F_PDC_SetNextTx(pPDC, (char *) (Dbgu_TXBUFF+1), 10); 
	 AT91F_PDC_SetTx(pPDC,(char *)(Dbgu_TXBUFF), 256);
	    //* Enable the TX PDC transfer requests 
	 AT91F_PDC_EnableTx(pPDC);
	    //异步  8位  1stop  无校验


	    //关闭485发送功能 
//	    AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, DBUG_Ctr );
	    
	    //开启 接收一个字符及发PDC发送完一个字符中断允许 
//	      AT91F_US_EnableIt(pUSART ,AT91C_US_RXRDY|AT91C_US_TXRDY);
	    //配置调试串口中断及别,中断向量地址及中断检测类型(电平敏感)
//	 AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SYS, 7,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, DBUG_irq_handler);
	 //打开调试串口中断源
//	 AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);  


  *AT91C_PMC_PCER = (1 << AT91C_ID_PIOA) |  /* Enable Clock for PIOA */
                    (1 << AT91C_ID_PIOB);   /* Enable Clock for PIOB */

  pPIOA->PIO_PER  = LED_MASK;               /* Enable PIO for LED's  */
  pPIOA->PIO_OER  = LED_MASK;               /* LED's are Outputs     */
  pPIOA->PIO_SODR = LED_MASK;               /* Turn Off LED's ("1")  */

  pPIT->PITC_PIMR = AT91C_PITC_PITIEN |     /* PIT Interrupt Enable */
                    AT91C_PITC_PITEN  |     /* PIT Enable */
                    PIV;                    /* Periodic Interval Value */

  /* Setup System Interrupt Mode and Vector with Priority 7 and Enable it */
  pAIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 7;
  pAIC->AIC_SVR[AT91C_ID_SYS] = (unsigned long) sys_irq;
  pAIC->AIC_IECR = (1 << AT91C_ID_SYS);
///////


  while (1) { 


  
  
 /////////                               /* Loop forever */


    pPIOA->PIO_SODR = LED_MASK;             /* Turn Off all LED's */
    pPIOA->PIO_CODR = LED_Mask[Pos] ^ Mask; /* Turn On selected LED's */
    tick = TimeTick;                        /* Get Initial TimeTick */
    while ((TimeTick - tick) < Delay);      /* Wait for specified Delay */
    while ((TimeTick - tick) < Delay);      /* Wait for specified Delay */
    while ((TimeTick - tick) < Delay);      /* Wait for specified Delay */
    while ((TimeTick - tick) < Delay);      /* Wait for specified Delay */
    if (Dir) {                              /* Direction is Down */
      if (Pos > 0) {
        Pos--;                              /* Change Position */
      } else {
        Pos = LED_CNT;                      /* Change Position (Wrap) */
      }
    } else {                                /* Direction is Up */
      if (Pos < LED_CNT) {
        Pos++;                              /* Change Position */
      } else {
        Pos = 0;                            /* Change Position (Wrap) */
      }
    }
  }
}

⌨️ 快捷键说明

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