📄 board.c
字号:
#include "44b0x.h"
#include "defs.h"
#include <avt.h>
#include <avtcpu.h>
#include <string.h>
void TickHandler(void);
void Timer1Handler(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
Timer1Isr(void){
}
// 错误显示函数
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -