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

📄 main.c

📁 这是LPC2300的例程 ZLG的ARM2300开发板带的
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			Litiantian
** Modified date:		2007-04-28
** Version:
** Descriptions:		SSP DMA方式发送实验,74HC595驱动流水灯。
**                              用户需要在SmartARM2300工控开发平台上,将JP1上的SSEL,MOSI,SCLK,MISO和P1.21、P1.24、P1.20、P1.23短接
**                              在启动代码处需要使能IRQ中断(已经设置)。
********************************************************************************************************/
#include  	"config.h" 

#define 	SSPCR1_SSE		1 << 1			// SSP主机使能
#define 	GPDMA_INT		25

#define 	SRC_RAMBUF		0x7FD00000		// USB RAM区的一个存储单元地址
#define         RAMBUF			(*(uint8*)SRC_RAMBUF) 	// 定义一个位于0x7FD00000地址的uint8类型变量
#define 	SSP0DR_ADDR		0xE0068008		// SSP0的FIFO存储器之地址

/*********************************************************************************************************
** 函数名称 :DMA_IRQ
** 函数功能 :DMA接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
 __irq __arm void DMA_IRQ(void)
{
	/* 清除相关的中断标志位 */
	if(DMACIntTCStatus != 0)DMACIntTCClear |= 0x02;		
	if(DMACIntErrorStatus != 0)DMACIntErrClr |= 0x02;
	VICVectAddr = 0x00;				// 中断处理结束
}

/********************************************************************************************************
** 函数名称:DelayNS
** 函数功能:长软件延时
** 入口参数:dly		延时参数,值越大,延时越久。
** 出口参数:无
********************************************************************************************************/
void  DelayNS(uint32  dly)
{  
    uint32  i;
    for(; dly>0; dly--) 
        for(i=0; i<35000; i++);
}

/*********************************************************************************************************
** 函数名称:SSP_Init
** 函数功能:将SSP控制器设置为主机。
** 入口参数:无
** 出口参数:无
**********************************************************************************************************/
void  SSP_Init(void)
{
	PCONP |= (1 << 21);		    // 在外设功率控制寄存器里使能SSP外设,默认情况下,该外设已被使能。
	/* 初始化P1.20、P1.21、P1.23、P1.24为SSP接口引脚,不用另外的IO口作从机选择线,直接用SSEL1完成片选595的功能。*/
	PINSEL3 = 0;
	PINSEL3 |= (0x03 << 8)|(0x03 << 10)|(0x03 << 14)|(0x03 << 16);    
    /* 初始化SSP的通讯方式,设置数据长度为8bit,帧格式为SSP,SCK 为低有效
    ,数据在SCK 的第一个时钟沿采样,设置SSP串行时钟通信速率为默认值。 */
    SSP0CR0  |= 0x00000047;
    SSP0CPSR = 0x02;			    // 设置SSP从Pclk获得的分频值,主模式下有效, 最小值为0x02。
    SSP0CR1  = SSPCR1_SSE;		    // 设置SSP为主机模式,不使用回写模式,并使能。
}

/********************************************************************************************************
** 函数名称:SSPDMAInit
** 函数功能:初始化SSP的DMA接口
** 入口参数:无
** 出口参数:无
********************************************************************************************************/
void  SSPDMAInit(void)
{  
	PCONP |= 1 << 29;			// 使能DMA时钟
	/* 首先清除DMA通道1的中断标志 */
	DMACIntTCClear = 0x02;			// 清除终端计数中断标志
	DMACIntErrClr  = 0x02;			// 清除错误中断标志
	/* 初始化DMA1的通道寄存器 */
	DMACC1SrcAddr  = SRC_RAMBUF;	// 设置USB的RAM BUF区为DMA源存储区
	DMACC1DestAddr = SSP0DR_ADDR;	// 设置SSP0的FIFO为目标缓存
	DMACC1LLI	   = 0;				// 下一个链表项无效,本次DMA传输使用连续存储空间
	DMACC1Control   |= 0x01			// 指定突发传输次数为1
					|(0x02 << 12)	// 指定源突发的传输大小为8位
					|(0x02 << 15)	// 指定目标突发传输的大小为8位
					|(0x00 << 18)	// 指定源传输数据宽度为8位
					|(0x00 << 21)	// 指定目标传输数据宽度为8位
					|(0 << 26)		// 指定源地址不自动增加
					|(0 << 27)		// 指定目标地址不自动增加
					|0x80000000;	// 指定触发终端计数中断
	/* 初始化DMA中断接口 */
	VICIntEnClr  |= 1 << GPDMA_INT;	// 禁止本中断
	VICVectPri25  = 0x05;		// 设置串口中断优先级为5
	VICVectAddr25 = (uint32)DMA_IRQ;// 装入串口中断服务程序地址
	VICIntEnable |= 1 << GPDMA_INT;	// 使能本中断
	/* 使能DMA */
	DMACConfiguration   |=0x01;		 // 使能DMA
	DMACC1Configuration  = 0;		 // 清零
	DMACC1Configuration |= 0xc000	 // 使能通道1的DMA中断
			    |(0x01 << 11)// 指定数据从存储器传输到外设,DMA为流控制器	
			    |(0x00 << 1);// 指定DMA源请求外设
	DMACC1Configuration |= 0x01;	 // 使能DMA通道1
}

/*********************************************************************************************************
* 函数名称:SSP_DMASnd
* 函数功能:SSP接口以DMA方式向74HC595发送流水灯数据。
* 入口参数:无
* 出口参数:无
*********************************************************************************************************/
void  SSP_DMASnd(void)
{  
    uint32 i = 0;

   	/* 流水灯花样数据,低电平点亮,注意调用时候用了取反操作 */
	const uint32 LED_TBL[] = 
	{
		0x00, 0xFF,					// 全部熄灭后,再全部点亮
		0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,	// 依次逐个点亮
		0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF,	// 依次逐个叠加
		0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01,	// 依次逐个递减
		0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81,	// 两个靠拢后分开
		0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81	// 从两边叠加后递减
	};
   
   	for(i = 0;i < 42;i++)
   	{
 		RAMBUF = LED_TBL[i];		// 设置内存单元RAMBUF的值
  		DelayNS(10);			// 延时
		DMACC1Control   |= 0x01;	// 由于流控制器为DMA时,突发传输次数会根据传输状况自动更新,所以在传输结束后再指定突发传输次数为1
		DMACC1Configuration |= 0x01;    // 由于传输结束后,DMA通道1会被禁能,所以需要再重新使能DMA通道1
   		SSP0DMACR = 0x02;		// 使能SSP0的发送DMA
   	}
}

/********************************************************************************************************
** 函数名称:main
** 函数功能:使用硬件SSP DMA发送数据,驱动74HC595控制8盏LED动态显示。  
** 入口参数:无
** 出口参数:无
** 调试说明:需将JP1上的SSEL,MOSI,SCLK,MISO和P1.21、P1.24、P1.20、P1.23短接
********************************************************************************************************/    
int main (void)
{  	
    SSP_Init();			       		// 初始化SSP接口
    SSPDMAInit();				// 初始化SSP DMA接口
    while(1) SSP_DMASnd();			// 调用SSP DMA发送函数进行发送			
    //return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -