📄 main.c
字号:
//*----------------------------------------------------------------------------
//* 文件名 : main.c
//* 创建人 :张正锋 2006/2/20 embed_tech@126.com
//*----------------------------------------------------------------------------
// 包含标准的头文件
#include "Board.h"
#include "Main.h"
#include "dbgu.h"
char message[100];
char write_data[10];
//全局变量1
#define SPEED (MCKKHz/10)
unsigned int LedSpeed = SPEED *50 ;
const int led_mask[NB_LEB]= {LED1, LED2, LED3, LED4};
//全局变量2
volatile char testCAN0 = AT91C_TEST_NOK;
volatile char testCAN1 = AT91C_TEST_NOK;
//*--------------------------------------------------------------------------------------
//* 函数名 : wait
//* 功能 : 软件延时
//* 输入参数 : 全局变量 LedSpeed.
//* 输出参数 : 无
//* 创建人 :张正锋 2006/2/20 embed_tech@126.com
//*--------------------------------------------------------------------------------------
void wait ( void )
{
unsigned int waiting_time ;
for(waiting_time = 0; waiting_time < LedSpeed; waiting_time++) ;
}
//*--------------------------------------------------------------------------------------
//* 函数名 : AT91F_CAN0_Handler
//* 功能 : CAN0 WAKEUP中断执行函数
//* 输入参数 : 无
//* 输出参数 : 无
//* 创建人 :张正锋 2006/2/20
//*--------------------------------------------------------------------------------------
void AT91F_CAN0_Handler(void)
{
volatile unsigned int status;
status = AT91F_CAN_GetStatus(AT91C_BASE_CAN0) & AT91F_CAN_GetInterruptMaskStatus(AT91C_BASE_CAN0);
AT91F_CAN_DisableIt(AT91C_BASE_CAN0,status);
//读取中断状态寄存器,如果是WAKEUP中断,说明CAN准备好,设置相关标志,打印输出信息。
if(status & AT91C_CAN_WAKEUP) {
testCAN0 = AT91C_TEST_OK;
AT91F_DBGU_Printk("=> CAN0 WAKEUP ");
}
}
//*--------------------------------------------------------------------------------------
//* 函数名 : AT91F_CAN0_Handler
//* 功能 : CAN0 WAKEUP中断执行函数
//* 输入参数 : 无
//* 输出参数 : 无
//* 创建人 :张正锋 2006/2/20 embed_tech@126.com
//*--------------------------------------------------------------------------------------
void AT91F_CAN1_Handler(void)
{
volatile unsigned int status;
status = AT91F_CAN_GetStatus(AT91C_BASE_CAN1) & AT91F_CAN_GetInterruptMaskStatus(AT91C_BASE_CAN1);
AT91F_CAN_DisableIt(AT91C_BASE_CAN1,status);
//读取中断状态寄存器,如果是WAKEUP中断,说明CAN准备好,设置相关标志,打印输出信息。
if((status & AT91C_CAN_WAKEUP) == AT91C_CAN_WAKEUP) {
testCAN1 = AT91C_TEST_OK;
AT91F_DBGU_Printk("=> CAN1 WAKEUP ");
}
}
//*--------------------------------------------------------------------------------------
//* 函数名 : Main
//* 功能 : 主程序入口
//* 输入参数 : 无
//* 输出参数 : 无
//* 创建人 : 张正锋 2006/2/20 embed_tech@126.com
//*--------------------------------------------------------------------------------------
int main()
{
int i;
//使能PIOA的时钟
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
//配置PA20 ,PA21 , PA24 ,PA25 作为输出I/O
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ) ;
//关闭LED1,LED2,LDE3,LED4(PA20 ,PA21 , PA24 ,PA25=1) --结合开发板硬件考虑
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK ) ;
//设置用户按键复位功能 (复位时间大约 512*(1/32k)=16ms)
AT91F_RSTSetMode(AT91C_BASE_RSTC,(8<<8)|(1<<0)); //函数原形 in lib_AT91SAM7A3.h
//初始化DBGU端口
AT91F_DBGU_Init();
//输出调试信息
AT91F_DBGU_Printk("CAN TEST ----ZZF-2006-2-10\n\r");
///////////////////////////////////////////////////////////////////////////////////
//CAN 初始化 Init CAN0 and CAN1
// 配置PIO作为CAN0,CAN1外设
AT91F_CAN0_CfgPIO();
AT91F_CAN1_CfgPIO();
// 开 CAN0 、 CAN1 时钟
AT91F_CAN0_CfgPMC();
AT91F_CAN1_CfgPMC();
// 使能CAN接口芯片
AT91F_PIOA_CfgPMC();
AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ;
// 清除PA23 --使能CAN正常传输
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ;
// 初始化CAN0中断
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, // CAN0 基地址
AT91C_ID_CAN0, // CAN0 ID
AT91C_AIC_PRIOR_HIGHEST, // 最高优先级
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, // 内部中断源--高电平触发
AT91F_CAN0_Handler); // 中断 C 处理程序
// 使能CAN0中断
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_CAN0);
// 初始化CAN1中断
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, // CAN1基地址
AT91C_ID_CAN1, // CAN1 ID
AT91C_AIC_PRIOR_HIGHEST-1, // 次高优先级
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, // 内部中断源--高电平触发
AT91F_CAN1_Handler); // 中断 C 处理程序
//// 使能CAN0中断
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_CAN1);
//设置CAN0,CAN1的波特率---在同一个CAN系统中,波特率必须相同---详细见DATASHEET
// Cfg CAN Baudrate to 1Mbit/s => BRP = 5
// We choose 8 Time Quanta (tCSC = 125ns): 8tCSC = tSYNC + tPRS + tPHS1 + tPHS2
// Cfg PHASE1 PHASE2 PROPAG and SYNC segment
// Delay of busdriver + delay of receiver circuit = 200ns
// Delay of bus line considered negligible = 0ns
// tPRS = 2*(200+0) = 400ns < 4tCSC => PROPAG = 3
// tSYNC = 1tCSC => 8tCSC = 1tCSC + 4tCSC + tPHS1 + tPHS2
// tPHS1 + tPHS2 = 3tCSC => Phase Segment 2 = Max(IPT=2TQ,Phase Segment 1) = 2TQ => PHASE2 = 2-1 = 1 => PHASE1 = 0
// tSJW = Min(4 TQ, Phase Segment 1) = 1TQ => SJW = 1-1 = 0
AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN0,0x00050301);
AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN1,0x00050301);
//调用CAN测试程序--详见can.c
AT91F_CanTestSuite();
for (;;)
{
//顺时针依次亮灭
for ( i=0 ; i < NB_LEB ; i++ )
{
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_mask[i]) ;
wait();
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led_mask[i] ) ;
wait();
}
//逆时针依次亮灭
for ( i=(NB_LEB-1) ; i >= 0 ; i-- )
{
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_mask[i]) ;
wait();
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led_mask[i] ) ;
wait();
}
}// FOR循环结束
}//MAIN函数结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -