⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsp.c

📁 ARM7(LPC2131) + FreeRTOS, 基于 Codesourcery gcc, 共10个任务, 仅占 2k RAM
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*==================================================================================================
* 板级支持包,主要为驱动程序
*==================================================================================================
*/

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