📄 blinky.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 + -