?? bsp.c
字號:
/*
*==================================================================================================
* 板級支持包,主要為驅動程序
*==================================================================================================
*/
#include "..\bsp\lpc213_4x.h"
#include "..\bsp\bsp.h"
#include "..\bsp\i2c.h"
#include "..\rtos\source\FreeRTOS.h"
#include "..\rtos\source\task.h"
/*{{{PART_1, SYS相關*/
/*
*--------------------------------------------------------------------------------------------------
* BSP initialization
*--------------------------------------------------------------------------------------------------
*/
void BSP_Init (void)
{
SYS_Init();
VIC_Init();
GPIO_Init();
UART_Init();
SPI_Init();
I2C_Init();
//TMR1_Init();
ADC_Init();
}
/*
*--------------------------------------------------------------------------------------------------
* System control module init (MEMMAP & PLL & VPB & PCON & MAM)
*--------------------------------------------------------------------------------------------------
*/
void SYS_Init (void)
{
PLLCFG = 0x22; // a. 0 01 00010, P=2, M=3 (see bsp.h)
PLLCON = 0x01; // b. enable PLL
PLLFEED = 0xAA; PLLFEED = 0x55; // c. feed sequence
while (!(PLLSTAT & (1<<10))) ; // d. waiting for PLL lock freq
PLLCON = 0x03; // e. connect PLL
PLLFEED = 0xAA; PLLFEED = 0x55; // f. feed sequence
VPBDIV = 0x00; // (0,2,1)-->Fpclk=(1,2,4)*(Fcclk/4)=15M
MAMCR = 0x00; // Close MAM
MAMTIM = 0x03; // if Fcclk>40MHz, MAMTIM=3
MAMCR = 0x02; // Full open MAM
MEMMAP = 0x01; // User Flash Mode
}
/*
*--------------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------------
*/
void VIC_Init(void)
{
VICIntSelect = 0xFFFFFFFF;
VICIntSelect &= ~(1<<6); //串口0中斷通道設為IRQ
VICIntEnable |= (1<<6); //使能串口0中斷
VICVectCntl2 = 0x26; //串口0中斷分配到向量控制器1
VICVectAddr2 = (unsigned long)UART0_ISR; //設置中斷服務程序地址
//CIntSelect &= ~(1<<7); //串口1中斷通道設為IRQ
//CIntEnable |= (1<<7); //使能串口1中斷
//CVectCntl3 = 0x27; //串口1中斷分配到向量控制器2
//CVectAddr3 = (unsigned long)UART1_ISR; //設置中斷服務程序地址
VICIntSelect &= ~(1<<9); //I20C中斷通道設為IRQ
VICIntEnable |= (1<<9); //使能I20C中斷
VICVectCntl4 = 0x29; //I20C中斷分配到向量控制器4
VICVectAddr4 = (unsigned long)I2C_ISR; //設置中斷服務程序地址
}
/*
*-------------------------------------------------------------------------------------------------
*-------------------------------------------------------------------------------------------------
*/
void GPIO_Init(void)
{
PINSEL2 |= (1<<2); // P1[36:26] 接 Jtag
PINSEL0 = 0x00; // 置為GPIO
PINSEL1 = 0x00; // 置為GPIO
PINSEL2 &= ~(1<<3); // P1[25:16] 接 GPIO
IODIR1 |= DS2MASK; // P1.24出至DS2
IODIR0 |= DS3MASK|BELLMASK; // P0.25出至DS3, P0.8出至BEEP
IODIR0 |= keyscan1|keyscan2|keyscan3|keyscan4;
TurnOffDS2();
TurnOffDS3();
TurnOffBELL();
}
/*
*--------------------------------------------------------------------------------------------------
* 掃描 4X4 按鍵,另需在任務中加去抖,例如延時 50ms 等等
*--------------------------------------------------------------------------------------------------
*/
const unsigned long keyscan[4]={keyscan1,keyscan2,keyscan3,keyscan4};
unsigned long key_scan(void)
{
unsigned long k=0;
static unsigned long ksp=0;
IOSET0 = keyscan1|keyscan2|keyscan3|keyscan4; // 設置掃描輸出腳為高電平
IOCLR0 = keyscan[ksp]; // 輪流使掃描線變低電平
for (k=200; k; k--) { // 等待IO口穩定
; ;
}
k = IOPIN0&(keyin1|keyin2|keyin3|keyin4); // 讀取keyin IO口
k |= 0x80000000; // 判斷是否有按鍵按下
if (k!=keyin1+keyin2+keyin3+keyin4+0x80000000) {
if ((k&keyin1)==0) k=0;
else if ((k&keyin2)==0) k=4;
else if ((k&keyin3)==0) k=8;
else if ((k&keyin4)==0) k=12;
else k=17;
}
k += ksp;
ksp ++;
if (ksp==4) ksp = 0;
return (k);
}
/*}}}PART_1*/
/*{{{PART_2, TMR相關*/
/*
*--------------------------------------------------------------------------------------------------
* TICKER initialization, 已由 port.c 和 portISR.c 中的相關處理代替
*--------------------------------------------------------------------------------------------------
*/
/*void TMR0_Init (void)
{
VICIntSelect &= ~(1 << VIC_TIMER0); // Enable interrupts
VICVectAddr1 = (unsigned long)TMR0_ISR; // Set the vector address
VICVectCntl1 = 0x20 | VIC_TIMER0; // Enable vectored interrupts
VICIntEnable = (1 << VIC_TIMER0); // Enable Interrupts
T0TCR = 0; // Disable timer 0.
T0PC = 0; // Prescaler is set to no division.
T0MR0 = Fpclk / OSTicksPerSec; // Count up to this value.
T0MCR = 3; // Reset and interrupt on MR0 (match register 0).
T0CCR = 0; // Capture is disabled.
T0EMR = 0; // No external match output.
T0TCR = 1; // Enable timer 0
}*/
/*
*--------------------------------------------------------------------------------------------------
* TIMER1 initialization
*--------------------------------------------------------------------------------------------------
*/
/*void TMR1_Init(void)
{
T1TCR = 0; // Timer0 Enable
T1MR0 = Fpclk/OSTicksPerSec-1; // Compare-hit at 10mSec (-1 reset "tick")
T1MCR = 3; // Interrupt and Reset on MR0
T1TCR = 1; // Timer0 Enable
VICVectAddr5 = (unsigned long)TMR1_ISR; // set interrupt vector in 0
VICVectCntl5 = (1<<5) | 5; // use it for Timer 0 Interrupt:
VICIntEnable = (1<<5); // Enable Timer0 Interrupt
}*/
/*
*--------------------------------------------------------------------------------------------------
* TIMER1 IRQ HANDLER
*--------------------------------------------------------------------------------------------------
*/
/*void __attribute__ ((interrupt("IRQ"))) TMR1_ISR(void)
{
//timeval++;
T1IR = 1<<0; // Clear interrupt flag by writing 1 to Bit 0
VICVectAddr = 0; // Acknowledge Interrupt (rough?)
}*/
/*
*--------------------------------------------------------------------------------------------------
* 精確延時
*--------------------------------------------------------------------------------------------------
*/
/*static void delay(unsigned long delay)
{
unsigned long i;
i = timeval + delay;
while ( i != timeval);
}*/
/*
*--------------------------------------------------------------------------------------------------
* 簡單延時
*--------------------------------------------------------------------------------------------------
*/
void delay2(unsigned long dly)
{
unsigned long i, j;
for (; dly>0; dly--) {
for (i=0; i<5000000; i++) {
j++;
}
}
}
/*}}}PART_2*/
/*{{{PART_3, UART相關*/
volatile unsigned char UART0RBUF[14];
/*
*--------------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------------
*/
void UART_Init(void)
{
unsigned short div_latch_val;
PINSEL0 = (PINSEL0&0xFFFFFFF0)|0x5; //配置P0.0為TxD0, P0.1為RxD0
U0LCR = 0x80; //允許改波特率(DLAB=1)
div_latch_val = (Fpclk/16)/9600; //波特率=9600bps
U0DLM = div_latch_val >> 8;
U0DLL = div_latch_val & 0x00FF;
U0LCR = 0x03; //設為 8-1-N, (DLAB=0)
U0FCR = 0xC7; //使能 FIFO, 長度為 14
U0IER = 0x01; //使能 RDA 中斷, 關閉 THRE 中斷
/*NSEL0 = (PINSEL0&0xFFF0FFFF)|0x50000; //配置P0.8為TxD1, P0.9為RxD1
U1LCR = 0x80; //允許改波特率(DLAB=1)
div_latch_val = (Fpclk/16)/9600; //波特率=9600bps
U1DLM = div_latch_val >> 8;
U1DLL = div_latch_val & 0x00FF;
U1LCR = 0x03; //設為 8-1-N, (DLAB=0)
U1FCR = 0x87; //使能 FIFO, 長度為 8
U1IER = 0x01; //使能 RDA 中斷, 關閉 THRE 中斷
*/
}
/*
*--------------------------------------------------------------------------------------------------
* UART0 通信前臺: 收取數據
*--------------------------------------------------------------------------------------------------
*/
void UART0_ISR(void) __attribute__ ((interrupt("IRQ")));
void UART0_ISR(void)
{
unsigned int i;
switch (U0IIR&0x0F) {
case 0x04: //收滿14節
for (i=0; i<14; i++) {
UART0RBUF[i] = U0RBR;
}
msg_uart0_rcv_data ++;
break;
case 0x0C: //未滿14節而超時
for (i=0; i<13; i++) {
if (!(U0LSR&0x01)) break;
UART0RBUF[i] = U0RBR;
}
msg_uart0_rcv_data ++;
break;
default: break;
}
VICVectAddr = 0;
}
/*
*--------------------------------------------------------------------------------------------------
* UART1 通信前臺: 收取數據
*--------------------------------------------------------------------------------------------------
*/
/*id UART1_ISR(void) __attribute__ ((interrupt("IRQ")));
void UART1_ISR(void)
{
unsigned char i, tmp;
switch (U1IIR&0x0F) {
case 0x04: //收滿8節
for (i=0; i<8; i++) {
tmp = U1RBR;
//SaveToMetRbuf(tmp);
}
break;
case 0x0C: //未滿8節而超時
for (i=0; i<8; i++) {
if (!(U1LSR&0x01)) break;
else {
tmp = U1RBR;
//SaveToMetRbuf(tmp);
}
}
break;
default: break;
}
VICVectAddr = 0;
}*/
/*
*--------------------------------------------------------------------------------------------------
* 串口0發送一節
*--------------------------------------------------------------------------------------------------
*/
/*void UART0_putchar(unsigned char byte)
{
U0THR = byte;
while ((U0LSR&0x20)==0) ;
}*/
/*
*--------------------------------------------------------------------------------------------------
* 串口1發送一節
*--------------------------------------------------------------------------------------------------
*/
/*void UART1_putchar(unsigned char byte)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -