📄 main.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.c
//* Object : main application written in C
//* Creation : ODi 11/18/2002
//*
//*----------------------------------------------------------------------------
#include "lib_arm920t.h"
#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
// The following function is defined in init.c
extern void AT91F_DBGU_Printk(char *buffer);
// The following DBGU ASM handler is defined in asm_isr.s
extern void AT91F_ASM_DBGU_Handler(void);
#define RUNNING 0
#define GO_TO_IDLE_MODE_PMC 1
#define GO_TO_IDLE_MODE_CP15 2
char state = RUNNING;
//*----------------------------------------------------------------------------
//* \fn AT91F_DBGU_Handler
//* \brief This function is invoked by AT91F_ASM_DBGU_Handler
//* This function is for demonstration purpose only
//*----------------------------------------------------------------------------
void AT91F_DBGU_Handler(void)
{
unsigned int csr = (((AT91PS_USART)AT91C_BASE_DBGU)->US_CSR & ((AT91PS_USART)AT91C_BASE_DBGU)->US_IMR);
if (csr & AT91C_US_RXRDY) {
switch (AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU)) {
case 'p':
case 'P': state = GO_TO_IDLE_MODE_PMC; break;
case 'c':
case 'C': state = GO_TO_IDLE_MODE_CP15; break;
default : state = RUNNING; break;
}
}
else {
AT91F_DBGU_Printk("-E- DBGU error\n\r");
}
}
//*----------------------------------------------------------------------------
//* \fn main
//* \brief
//*
//*----------------------------------------------------------------------------
int main()
{
unsigned int tick = *(AT91C_ST_CRTR);
AT91F_DBGU_Printk("\n\n\r-I- ======================================\n\r");
AT91F_DBGU_Printk("-I- AT91RM9200 idle mode example\n\r");
AT91F_DBGU_Printk("-I- --------------------------------------\n\r");
AT91F_DBGU_Printk("-I- Hit P to enter in idle mode using PMC\n\r");
AT91F_DBGU_Printk("-I- Hit C to enter in idle mode using CP15\n\r");
AT91F_DBGU_Printk("-I- Hit another key to exit idle mode\n\r");
AT91F_DBGU_Printk("-I- ======================================\n\r");
// Enable interrupt to get one IT each time a character is entered
AT91F_AIC_ConfigureIt (
AT91C_BASE_AIC, // AIC base address
AT91C_ID_SYS, // System peripheral ID
AT91C_AIC_PRIOR_HIGHEST, // Max priority
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, // Level sensitive
AT91F_ASM_DBGU_Handler );
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SYS);
AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_DBGU, (AT91C_US_RXRDY | AT91C_US_OVRE | AT91C_US_FRAME | AT91C_US_PARE));
AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU);
// Print a 'C' character each second
tick = *(AT91C_ST_CRTR);
while (1) {
// User ask to move in Idle mode configuring PMC
if (state == GO_TO_IDLE_MODE_PMC) {
AT91F_DBGU_Printk("\n\r-I- Enter in Idle mode using PMC\n\r");
AT91C_BASE_PMC->PMC_SCDR = AT91C_PMC_PCK;
AT91F_DBGU_Printk("-I- Interrupt received, exit Idle mode\n\r");
}
// User ask to mode in Idle mode configuring CP15
else if (state == GO_TO_IDLE_MODE_CP15) {
AT91F_DBGU_Printk("\n\r-I- Enter in Idle mode using CP15\n\r");
AT91F_ARM_WaitForInterrupt();
AT91F_DBGU_Printk("-I- Interrupt received, exit Idle mode\n\r");
}
// Send each second a character (in RUNNING mode)
else if (tick != *(AT91C_ST_CRTR)) {
AT91F_DBGU_Printk("R");
tick = *(AT91C_ST_CRTR);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -