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

📄 lpc214x test.c

📁 LPC2140 cpu外设全接口 注释详细到极点了
💻 C
📖 第 1 页 / 共 5 页
字号:
/*********************************************************************
 
 *********************************************************************/
#define CPU_GLOBALS
#include "includes.h"

/*********************************************************************
*                           启动定时器T0函数                         *
*  功能描述:启动定时器TImer0开始定时计数。                          *
*  输入参数:void                                                    *
*  输出参数:void                                                    * 
**********************************************************************/
void CPU_TMR_StartT0(void)
{
    T0TCR = BIT0;
    CpuTimer0Stat = WORKING_STAT;     
}

/*********************************************************************
*                           启动定时器T1函数                         *
*  功能描述:启动定时器TImer1开始定时计数。                          *
*  输入参数:void                                                    *
*  输出参数:void                                                    * 
**********************************************************************/
void CPU_TMR_StartT1(void)
{
    T1TCR = BIT0;
    CpuTimer1Stat = WORKING_STAT;
}

/*********************************************************************
*                           停止定时器T0函数                         *
*  功能描述:停止定时器Timer0工作。                                  *
*  输入参数:void                                                    *
*  输出参数:void                                                    * 
**********************************************************************/
void CPU_TMR_StopT0(void)
{
    T0TCR = 0x00;
    CpuTimer0Stat = STOP_STAT;
}

/*********************************************************************
*                           停止定时器T1函数                         *
*  功能描述:停止定时器Timer1工作。                                  *
*  输入参数:void                                                    *
*  输出参数:void                                                    * 
**********************************************************************/
void CPU_TMR_StopT1(void)
{
    T1TCR = 0x00;
    CpuTimer1Stat = STOP_STAT;
}

/*********************************************************************
*                      定时器定时功能设置函数                        *
*  功能描述:对定时器定时功能的特殊寄存器进行初始化。                *
*  输入参数:tmrsel    定时器选择Timer0或者Timer1                    *
*            chann     定时器MRx通道号                               *
*            work_mod  匹配控制方式设置                              *
*            tlen      定时长度   单位:us                           *  
*            clktyp    时钟类型                                      *
*            freq      时钟频率   单位:Hz                           *  
*  输出参数:void                                                    * 
**********************************************************************/
void CPU_TMR_SetTime(INT8U tmrsel, INT8U chann, INT16U work_mod, INT32U tlen, INT8U clktyp, INT32U freq)
{
    INT8U div;
    FP64 temp;
    INT8U work_stat;
    
    div = (INT8U)((FP64)freq/ULONG_MAX * ((FP64)tlen/1000000L));
    
    if(chann > 3) return;
      
    if(tmrsel == CPU_T0)                              //选用定时器0
    {
        work_stat = CpuTimer0Stat;
        if(CpuTimer0Stat == WORKING_STAT)
            CPU_TMR_StopT0(); 
		T0IR = 0xFF;
		T0TC = 0;                                    //定时器设置为0  
        T0PR = div;                                  //时钟分频
        T0MCR  = T0MCR & (~(0x07<<(chann*3))) | work_mod<<(chann*3);
    #ifdef CPU_LPC2100
        switch(clktyp)
        {
        	case CPU_TMR_CAP0:
        		T0CTCR |= 0x01;
        		break;
        	case CPU_TMR_CAP1:
        		T0CTCR |= 0x05; 
        		break;
            case CPU_TMR_CAP2:
        		T0CTCR |= 0x09; 
        		break;
            case CPU_TMR_CAP3:
        		T0CTCR |= 0x0D; 
        		break;
        	default:
        		T0CTCR = 0x00;
        		break;	 		
        }
    #endif
        temp=((FP64)tlen/1000000L)*freq;
        switch(chann)
        {
            case 0:
                T0MR0 = (INT32U)temp;
                break; 
            case 1:
                T0MR1 = (INT32U)temp;
                break;
            case 2:
                T0MR2 = (INT32U)temp;
                break;
            default:
                T0MR3 = (INT32U)temp;
                break;
        }
        if(work_stat == WORKING_STAT)
            CPU_TMR_StartT0();    
    }
    else                                               //选用定时器1
    {
        work_stat = CpuTimer1Stat;
        if(CpuTimer1Stat == WORKING_STAT)
            CPU_TMR_StopT1();
		T1IR = 0xFF;
		T1TC = 0;                                      //定时器设置为0  
        T1PR = div;                                    //时钟分频
        T1MCR  = T1MCR & (~(0x07<<(chann*3))) | work_mod<<(chann*3);
	#ifdef CPU_LPC2100
        switch(clktyp)
        {
        	case CPU_TMR_CAP0:
        		T1CTCR |= 0x01; 
        		break;
        	case CPU_TMR_CAP1:
        		T1CTCR |= 0x05; 
        		break;
            case CPU_TMR_CAP2:
        		T1CTCR |= 0x09;  
        		break;
            case CPU_TMR_CAP3:
        		T1CTCR |= 0x0D;  
        		break;
        	default:
        		T1CTCR = 0x00;
        		break;	
        }
	#endif
        temp=((FP64)tlen/1000000L)*freq;
        switch(chann)
        {
            case 0:
                T1MR0 = (INT32U)temp;
                break; 
            case 1:
                T1MR1 = (INT32U)temp;
                break;
            case 2:
                T1MR2 = (INT32U)temp;
                break;
            default:
                T1MR3 = (INT32U)temp;
                break;
        }
        if(work_stat == WORKING_STAT)
            CPU_TMR_StartT1();        
    }
}

/*********************************************************************
*                      定时器捕获功能设置函数                        *
*  功能描述:对定时器捕获功能的特殊寄存器进行初始化。                *
*  输入参数:tmrsel   选择定时器0或1用作捕获功能           *  
*            pinsel   引脚选择                    *
*            edge     定时器捕获边沿的选择              *
*  输出参数:void                                                    * 
**********************************************************************/
void CPU_TMR_SetCap(INT8U tmrsel,INT8U chann,INT8U edge)
{
    if(tmrsel == CPU_T0)
    {
    	T0CCR = T0CCR&(~(0x07 << (chann * 3)))|(edge << (chann*3));
    	T0TC = 0;
    }  
    else
    {
    	T1CCR = T1CCR&(~(0x07 << (chann * 3)))|(edge << (chann*3));
    	T1TC = 0;
    }	
}

/*********************************************************************
*                   停止定时器某通道函数                             *
*  功能描述:停止指定定时器某一通道的工作。                          *
*  输入参数:tmrsel    定时器选择Timer0或者Timer1                    *
*            chann     定时器MRx通道号                               *
*  输出参数:void                                                    * 
**********************************************************************/
void CPU_TMR_StopChannel(INT8U tmrsel, INT8U chann)
{
    if(chann > 3) return;
    if(tmrsel == CPU_T0)                              //选用定时器0
    {
        T0MCR  = T0MCR & (~(0x07<<(chann*3)));
    }
    else
    {
        T1MCR  = T1MCR & (~(0x07<<(chann*3)));
    }
}

/*********************************************************************
*                          屏蔽中断源函数                            *
*  功能描述:屏蔽指定中断。                                          *
*  输入参数:intr     中断源                                         *     
*  输出参数:void                                                    * 
**********************************************************************/
void CPU_VIC_DisIrq(INT8U intr)
{
    VICIntEnable &= ~(1 << intr);                       //使能中断源
}

/*********************************************************************
*                          使能中断源函数                            *
*  功能描述:使能指定中断。                                          *
*  输入参数:intr     中断源                                         * 
*  输出参数:void                                                    * 
**********************************************************************/
void CPU_VIC_EnIrq(INT8U intr)
{
    VICIntEnable |= 1 << intr;                         //使能中断源
}

/*********************************************************************
*                      设置向量中断控制器中断源函数                  *
*  功能描述:对VIC控制的中断源进行设置。                             *
*  输入参数:inttyp   中断源产生中断的类型有FIQ、向量IRQ、非向量IRQ  *
*            irq_pri  向量IRQ的优先级选择slot0~15                    *
*            intr     中断源                                         *
*            intaddr  中断服务程序入口地址                           *     
*  输出参数:void                                                    * 
**********************************************************************/
INT8U CPU_VIC_SetIntr(INT8U inttyp, INT8U intr, INT8U irq_pri, INT32U intaddr)
{    
    if(inttyp == CPU_FIQ)                               
    {
        VICIntSelect |= 1 << intr;                    //设置中断源为FIQ中断
    }
    else if(inttyp == CPU_VECT_IRQ)
    {
    	if(0 == intaddr) return 1;
        VICIntSelect = VICIntSelect & (~(1 << intr)); //中断源相对应的通道设置为IRQ中断
        switch(irq_pri)
        {
            case 0:                                     
                VICVectCntl0 = CPU_EN_IRQ | intr;    //中断源intr分配到IRQslot0,即最高优先级
                VICVectAddr0 = (INT32U) intaddr;     //中断源intr中断服务程序地址
                break;
            case 1:
                VICVectCntl1 = CPU_EN_IRQ | intr;    //中断源intr分配到IRQslot1
                VICVectAddr1 = (INT32U) intaddr;     //中断源intr中断服务程序地址
                break;
            case 2:
                VICVectCntl2 = CPU_EN_IRQ | intr;    //中断源intr分配到IRQslot2
                VICVectAddr2 = (INT32U) intaddr;     //中断源intr中断服务程序地址   
                break; 
            case 3:
                VICVectCntl3 = CPU_EN_IRQ | intr;    //中断源intr分配到IRQslot3
                VICVectAddr3 = (INT32U) intaddr;     //中断源intr中断服务程序地址
                break;
            case 4:
                VICVectCntl4 = CPU_EN_IRQ | intr;    //中断源intr分配到IRQslot4
                VICVectAddr4 = (INT32U) intaddr;     //中断源intr中断服务程序地址
                break;
            case 5:
                VICVectCntl5 = CPU_EN_IRQ | intr;    //中断源intr分配到IRQslot5
                VICVectAddr5 = (INT32U) intaddr;     //中断源intr中断服务程序地址
                break;
            case 6:
                VICVectCntl6 = CPU_EN_IRQ | intr;    //中断源intr分配到IRQslot6
                VICVectAddr6 = (INT32U) intaddr;     //中断源intr中断服务程序地址
                break;
            case 7:
                VICVectCntl7 = CPU_EN_IRQ | intr;    //中断源intr分配到IRQslot7
                VICVectAddr7 = (INT32U) intaddr;     //中断源intr中断服务程序地址
                break;
            case 8:
                VICVectCntl8 = CPU_EN_IRQ | intr;    //中断源intr分配到IRQslot8
                VICVectAddr8 = (INT32U) intaddr;     //中断源intr中断服务程序地址
                break;
            case 9:
                VICVectCntl9 = CPU_EN_IRQ | intr;    //中断源intr分配到IRQslot9
                VICVectAddr9 = (INT32U) intaddr;     //中断源intr中断服务程序地址
                break;
            case 10:
                VICVectCntl10 = CPU_EN_IRQ | intr;   //中断源intr分配到IRQslot10
                VICVectAddr10 = (INT32U) intaddr;    //中断源intr中断服务程序地址
                break;
            case 11:
                VICVectCntl11 = CPU_EN_IRQ | intr;   //中断源intr分配到IRQslot11
                VICVectAddr11 = (INT32U) intaddr;    //中断源intr中断服务程序地址
                break;
            case 12:

⌨️ 快捷键说明

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