📄 board.c.bak
字号:
#include "44b0x.h"
#include "defs.h"
#include <avt.h>
#include <avtcpu.h>
#include <string.h>
void TickHandler(void);
void URX0Handler(void);
void UTX0Handler(void);
void UndefHandler(void);
void PrefechAbortHandler(void);
void DataAbortHandler(void);
void SwiHandler(void);
void EINT0Handler(void);
void EINT1Handler(void);
void EINT2Handler(void);
void EINT3Handler(void);
#define MCLK 60000000
// S3C44B0X定时器寄存器
#define PWM5_UPDATE (0x1 << 25)
#define PWM5_START (0x1 << 24)
// 串口收发缓冲区
#define BUFSZ 1024
static UCHAR TxdBuf[BUFSZ];
static UCHAR RxdBuf[BUFSZ];
// 缓冲区读写指针
static UINT TxdR, TxdW;
static UINT RxdR, RxdW;
// 串口信号量
UINT smUart0;
// 根任务堆栈大小
UINT root_stack_size = 4096;
// iva interrupt vector address
// isa interrupt service address
void
IntConnect(UINT iva, UINT isa ) { //功能是将中断函数注册到中断向量表。加载分支指令
*(UINT*)iva = 0xEA000000 | ((isa - iva - 8)>>2);//矢量中断模式的指令机器码,目标地址-向量地址
}
// 串口0接收中断
void
URX0Isr(void) {
UINT n, ifs;
UCHAR t, ntf;
ntf = FALSE;
ifs = interrupts_disable();
t = rUFSTAT0;//?TX/RX状态寄存器,初始值0X6。FIFO满16字节,[9]=1,[4:7]TXFIFO中的数据数量,[0:3]RXFIFO中的数据数量
while(t & 0xF) { // 接收FIFO大小
t = rURXH0;//接受到的数据?发送保持寄存器,内容
// 放入接收缓冲区
n = (RxdW + 1) & (BUFSZ - 1);//写指针下个位置和终点比较,N 为下一个写地址
if(n != RxdR) {
RxdBuf[RxdW] = t;
RxdW = n;
}
// 需要执行v操作
ntf = TRUE;
t = rUFSTAT0;
}
if(ntf)
sm_v(smUart0);
interrupts_enable(ifs);
rI_ISPC = BIT_URXD0;
}
// 串口0发送中断
void
UTX0Isr(void) {
UINT stop, ifs;
ifs = interrupts_disable();
stop = TxdR == TxdW;
// 将发送缓冲区中数据填入串口FIFO
while(!(rUFSTAT0 & 0x200) && TxdR != TxdW) {
rUTXH0 = TxdBuf[TxdR++];
TxdR &= BUFSZ - 1;
}
// 发送完成后关闭发送中断
if(stop) {
rINTMSK |= BIT_UTXD0;
}
interrupts_enable(ifs);
rI_ISPC = BIT_UTXD0;
}
// 从串口接收一个字节
int
ReadByte(void) {
UCHAR c;
// 如果接收缓冲区空,则等待
while(RxdR == RxdW)
sm_p(smUart0, FOREVER);
c = RxdBuf[RxdR];
RxdR = (RxdR + 1) & (BUFSZ - 1);
return c;
}
/////////////////////////////////////////
// 从串口接收一个字节,*不等待*
UCHAR
getkey(void)
{
if(rUTRSTAT1 & 0x1) //Receive data ready
return rURXH1;
else
return 0;
}
// 发送一个字节
// data: 待发送字节数据
//
void
bsp_putc(int data)
{
int psw;
psw = interrupts_disable();
// 如果是\n,则再发送\r
if(data == '\n') {
while(!(rUTRSTAT1 & 0x2));//发送缓冲器中不含有效数据时为0X2
rUTXH1 = '\r';
}
while(!(rUTRSTAT1 & 0x2)); //Wait until THR is empty.
rUTXH1 = data;
interrupts_enable(psw);
}
// 发送字符串
void
bsp_puts(const char *pt) {
int psw;
CHECK_PTR(pt);
psw = interrupts_disable();
while(*pt)
bsp_putc(*pt++);
interrupts_enable(psw);
}
void
EINT0Isr(void) {
UINT ifs;
ifs = interrupts_disable();
bsp_puts("EINT0中断...\n");
speed++;
rPDATC ^= 1;
interrupts_enable(ifs);
rI_ISPC = BIT_EINT0;
}
void
EINT1Isr(void) {
UINT ifs;
ifs = interrupts_disable();
bsp_puts("EINT1中断...\n");
interrupts_enable(ifs);
rI_ISPC = BIT_EINT1;
}
void
EINT2Isr(void) {
UINT ifs;
ifs = interrupts_disable();
bsp_puts("EINT2中断...\n");
interrupts_enable(ifs);
rI_ISPC = BIT_EINT2;
}
void
EINT3Isr(void) {
UINT ifs;
ifs = interrupts_disable();
bsp_puts("EINT3中断...\n");
interrupts_enable(ifs);
rI_ISPC = BIT_EINT3;
}
// 错误显示函数
void
internal_fatal(const char *msg) {
bsp_puts(msg);
while(1);
}
// 异常处理函数
void
DoException(uint *regs, int type) {
char *tstr;
interrupts_disable();
switch(type) {
case 0:
tstr = "未定义的指令异常!\n";
break;
case 1:
tstr = "指令预取中止异常!\n";
break;
case 2:
tstr = "数据访问中止异常!\n";
break;
case 3:
tstr = "SWI!\n";
break;
default:
tstr = "未知异常中断!";
}
bsp_puts(tstr);
while(1);
}
// 串口初始化
void
bspInitSio(void) {
TxdR = TxdW = 0;
RxdR = RxdW = 0;
rULCON0 = 0x03; //Normal,No parity,1 bit stop,8 bit data,字长为8
rUCON0 = 0x02C5; //控制寄存器 5,BDMA0请求,C允许RX超时中断和错误中断,TX电平方式
//rUFCON0 = 0xF7; // FIFO CONTROL , ENable FIFO
rUFCON0 = 0x17; // FIFO CONTROL , ENable FIFO
rUMCON0 = 0x01; // nRTS valid
//rUBRDIV0 = MCLK / (16UL * 115200UL) - 1;
rUBRDIV0 = MCLK / (16UL * 9600UL) - 1;//波特率分频寄存器
rULCON1 = 0x03; //Normal,No parity,1 bit stop,8 bit data
rUCON1 = 0x02C5;
rUFCON1 = 0x17; // FIFO CONTROL , ENable FIFO
rUMCON1 = 0x00;
rUBRDIV1 = MCLK / (16UL * 115200UL) - 1;
IntConnect(ISR_UTXD0, (UINT)UTX0Handler);
IntConnect(ISR_URXD0, (UINT)URX0Handler);
//rINTMSK &= ~(BIT_URXD0);
}
//10ms时钟中断函数
extern tm_tick();
void
tick_wrapper(void) {
// 调用操作系统时钟处理
tm_tick();
}
//
// 初始化时钟
//
static void
bspInitClock(void) {
rTCFG0 = (0x1 << 24) | (29 << 16); // T5 = MCLK / 30
rTCFG1 = 0x00000000; // T5 = T5/2
rTCON = 0x04CCCC0C;
//
// 10000 -> 10ms
//
rTCNTB5= MCLK/(HZ * 30 * 2);
rTCON = rTCON | PWM5_UPDATE;
rTCON = rTCON & (~PWM5_UPDATE);
rTCON = rTCON | PWM5_START; //开始计数
rINTMSK &= ~(BIT_TIMER5);
}
// 每微秒循环数
static ULONG dlycnt;
static ULONG factor = 0xC4BA;
// 微秒延时
void
udelay(ULONG us) {
dlycnt = us * factor / 10000;
while(dlycnt != 0)
dlycnt--;
}
// 毫秒延时
void
mdelay(ULONG ms) {
while(ms--)
udelay(1000);
}
static void
Port_Init(void) {
///****PortA 使用默认值****/ 10-bit output
//*********断口 PortB配置********/ 11-bit output
// 引脚 功能 配置值
// PortB.10 nGCS5 1
// PortB.09 nGCS4 1
// PortB.08 nGCS3 1
// PortB.07 nGCS2 1
// PortB.06 nGCS1 1
// PortB.05 OUTPUT 0
// PortB.04 OUTPUT 0
// PortB.03 nSRAS 1
// PortB.02 nSCAS 1
// PortB.01 SCLK 1
// PortB.00 SCKE 1
rPCONB = 0x000007CF;//端口配置寄存器,决定每个引脚功能
rPDATB = 0x07EF;//端口数据寄存器
rPCONB |= 1 << 4;
//*********端口 PortC配置********/ 16-bit input/output
// 引脚 功能 配置值
// PortC.15 Input 00
// PortC.14 Input 00
// PortC.13 RxD1 11
// PortC.12 TxD1 11
// PortC.11 Output 01
// PortC.10 Output 01
// PortC.09 Output 01
// PortC.08 Input 00
// PortC.07 VD4 11
// PortC.06 VD5 11
// PortC.05 VD6 11
// PortC.04 VD7 11
// PortC.03 IISCLK 11 01 OUTPUT
// PortC.02 IISDI 11 01 OUTPUT
// PortC.01 IISDO 11 01 OUTPUT
// PortC.00 IISRLCK 11 01 OUTPUT
rPCONC = 0x0F54FF55;
rPDATC = 0xFEFF;
rPUPE |= 0xC000; //端口上拉寄存器
//*********端口 PortD配置********/ 8-bit input/output
// 引脚 功能 配置值
// PortD.07 VFRAME 10
// PortD.06 VM 10
// PortD.05 VLINE 10
// PortD.04 VCLK 10
// PortD.03 VD3 10
// PortD.02 VD2 10
// PortD.01 VD1 10
// PortD.00 VD0 10
rPCOND = 0x0000AAAA;
rPDATD = 0xFF;
//*********端口 PortE配置********/ 9-bit input/output
// 引脚 功能 配置值
// PortE.08 CODECLK 10
// PortE.07 OutPut 01 10 TOUT4 D5
// PortE.06 OutPut 01 D4
// PortE.05 OutPut 01 D3
// PortE.04 OutPut 01 10 TOUT1 D2
// PortE.03 OutPut 01 D1
// PortE.02 RxD0 10
// PortE.01 TxD0 10
// PortE.00 OutPut 00
rPCONE = 0x00029668;
rPDATE = 0x1FF;
rPUPE |= 0x0FF06;
//*********端口 PortF配置********/ 9-bit input/output
// 引脚 功能 配置值
// PortF.08 SIOCLK 011
// PortF.07 SIORxD 011
// PortF.06 SIORDY 011 001 OUTPUT
// PortF.05 SIOTXD 011
// PortF.04 nXDREQ0 11
// PortF.03 nXDACK0 11
// PortF.02 nWAIT 10
// PortF.01 IICSDA 10
// PortF.00 IICSCL 10
//rPCONF = 0x001B2FEA;
//*********端口 PortG配置********/ 8-bit input/output
// 引脚 功能 配置值
// PortG.07 IISLRCK 10
// PortG.06 IISDO 10
// PortG.05 IISDI 10
// PortG.04 IISCLK 10
// PortG.03 INPUT 00 11 --EINT3
// PortG.02 EINT2 11
// PortG.01 EINT1 11
// PortG.00 EINT0 11
rPCONG = 0xAAFF;
rPDATG = 0x2;
rPUPG = 0x0;
/***** 外部中断触发模式配置 *****/
// 000 低电平中断
// 001 高电平中断
// 01x 下降沿触发
// 10x 上升沿触发
// 11x 沿触发
// SL811HS高电平中断输出,我们将它反向接EINT0
rEXTINT = 0x22; // FIXED ME!!! SL811HS/EINT0下降沿触发,MCP2510/EINT1低电平触发
}
//将BIN码转换成BCD码
#define Byte2Bcd(x) __bin2bcd[x]
//将BCD码转换成BIN码
#define Bcd2Byte(x) __bcd2bin[x];
const UCHAR __bcd2bin[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0,
50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, 0,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, 0, 0, 0, 0, 0,
70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 0, 0, 0, 0, 0, 0,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 0, 0, 0, 0, 0, 0,
90, 91, 92, 93, 94, 95, 96, 97, 98, 99
};
const UCHAR __bin2bcd[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99
};
// 设置时钟时间
void
SetTime(struct tm *t) {
int psw;
CHECK_PTR(t);
psw = interrupts_disable();
rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset
rBCDYEAR = Byte2Bcd(t->tm_year - 2000);
rBCDMON = Byte2Bcd(t->tm_mon);
rBCDDAY = Byte2Bcd(t->tm_mday);
//rBCDDATE = Byte2Bcd(t->tm_wday);// SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
rBCDHOUR = Byte2Bcd(t->tm_hour);
rBCDMIN = Byte2Bcd(t->tm_min);
rBCDSEC = Byte2Bcd(t->tm_sec);
rRTCCON = 0x00;
interrupts_enable(psw);
}
// 读时钟时间
void
GetTime(struct tm *t) {
int psw;
CHECK_PTR(t);
psw = interrupts_disable();
rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset
t->tm_year = 2000 + Bcd2Byte(rBCDYEAR);
t->tm_mon = Bcd2Byte(rBCDMON);
t->tm_mday = Bcd2Byte(rBCDDAY);
t->tm_wday = Bcd2Byte(rBCDDATE);
t->tm_hour = Bcd2Byte(rBCDHOUR);
t->tm_min = Bcd2Byte(rBCDMIN);
t->tm_sec = Bcd2Byte(rBCDSEC);
rRTCCON = 0x00;
interrupts_enable(psw);
}
// 初始化实时实钟
static void
bspRtcInit(void) {
rRTCALM = 0x0; // disable alarm
rRTCCON = 0x00; // R/W disable(for power consumption), 1/32768, Normal(merge), No reset
}
PwmInit(void){
rPDATE |= 1 << 5; //LS2置高
rPDATE |= 1 << 6; //LS1置高
rPDATC |= 1; //MC33883 GN控制置高
/*设置定时器的预分频值:TIME0/1=255,TIME2/3=0,TIME4/5=255*/
rTCFG0=0Xfa00fa;//参考TCFG0表
/*设置定时器的工作模式;中断模式,设置时频驱动器取值:TIME0、TIME1、TIME2、TIME3、TIME4为1/4*/
rTCFG1=0x11111;//参考TCFG1表
rTCON=0x0;
rTCNTB1=60;
rTCMPB1=40; //设置占空比
rTCNTB4=60;
rTCMPB4=40; //设置占空比
rTCON=0xa00a00; /*手工装载定时器的计数值*/
rTCON=0x900900; /*启动定时器,并周期触发*/
}
// bsp初始化
void
bspInit(void) {
//配置Cache
//rSYSCFG = SYSCFG_8KB; //使用8K字节的指令缓存
//rNCACHBE0=((0x0c000000UL>>12)<<16)|(0x02000000UL>>12);
rSYSCFG = (0 << 0) // stall disable
| (3 << 1) // Full Cache enable (8KB cache)
| (1 << 3) // Enable write buffer operation
| (0 << 4) // read stall disable
| (0 << 5) // Enable data abort
;
//rSYSCFG = 0;
// DISABLE CACHE nGCS3(SL811HS) AND LCD VIDEORAM
rNCACHBE0 = ((0x0C080000UL >> 12) << 16) | (0x200000UL >> 12);
ChangePllValue(52, 3, 1 ); //设置CPU频率为60M
Port_Init();
clrwtd();
// 关闭蜂鸣器
rPCONB |= 1 << 4;
// 设置中断向量
IntConnect(ISR_UNDEF, (uint)UndefHandler);
IntConnect(ISR_PABORT, (uint)PrefechAbortHandler);
IntConnect(ISR_DABORT, (uint)DataAbortHandler);
IntConnect(ISR_SWI, (uint)SwiHandler);
// 设置EINT0-EINT3中断向量
IntConnect(ISR_EINT0, (uint)EINT0Handler);
IntConnect(ISR_EINT1, (uint)EINT1Handler);
IntConnect(ISR_EINT2, (uint)EINT2Handler);
IntConnect(ISR_EINT3, (uint)EINT3Handler);
// 设置系统时钟中断向量
IntConnect(ISR_TIMER5, (uint)TickHandler);
// 初始化系统时钟
bspInitClock();
// 初始化实时时钟
bspRtcInit();
// 初始化Pwm
PwmInit();
//bspInitSio();
// 允许中断
rINTMSK &= ~(BIT_GLOBAL);
// 允许EINT0中断
rINTMSK &= ~(BIT_EINT0);
rINTMSK &= ~(BIT_EINT1);
rINTMSK &= ~(BIT_EINT2);
rINTMSK &= ~(BIT_EINT3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -