📄 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 + -