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

📄 uart_motor.c

📁 ARM7 LPC2114自已工作中编写的直流马达驱动源程序。 文件: uart_motor.HEX Uart_motor.mcp LPC2294.h 等相关文件。
💻 C
字号:
/****************************************Copyright (c)**************************************************
**
**									FOXCONN 测试开发部
** 作者: 梁浩荡 
** 日 期: 2008-05-28
**描        述: HG1223209C-YF62L-VA LCD的uc/osII底层驱动 
********************************************************************************************************/

#include "config.h"


#define motor_contorl (1<<9)    

#define 	KEY2		(1<<17)
#define 	KEY3		(1<<18)
#define 	KEY4		(1<<19)

#define   LED1CON       (1<<22)              /* P0.22口为LED1控制端 */

#define  	  TASK_STK_SIZE                 128
OS_STK        TaskStk[TASK_STK_SIZE];
OS_STK        TaskStartStk[TASK_STK_SIZE];
OS_STK		  TaskKeyScanStk[TASK_STK_SIZE];
OS_EVENT *Uart0ReviceMbox;
uint32 Uartbps;
uint32 motor_counter,motor_circle_set=0;
void  TaskStart(void *data);
void  TaskUart0Revice(void *pdata);
void  TaskKeyScan(void *pdata);
void  Eint0_Excepiton(void);
void  Eint3_Excepiton(void);

/****************************************************************************
* 名称:DelayNmS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值为1时,延时为1ms
* 出口参数:无
****************************************************************************/
	void  DelayNms(INT32U  dly)
{  INT32U  i;

   for(; dly>0; dly--) 
      for(i=0; i<7142; i++);
}

/*********************************************************************************************************
** 函数名称: LCD_DispChar
** 功能描述: 从UART0将缓冲区的数据显示到LCD。
** 输 入: cp		要显示数据的缓冲区指针
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 陈明计
** 日 期: 2003年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 梁浩荡
** 日 期: 2008-05-28
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void LCD_DispChar(uint8 *cp)
{
   
    cp++;
    
    OS_ENTER_CRITICAL();
    LCD_Display_a_Number_FUN(0x90,*cp++);
	OSTimeDly(OS_TICKS_PER_SEC/2);	
    OS_EXIT_CRITICAL();

    OS_ENTER_CRITICAL();
    LCD_Display_a_Number_FUN(0x92,*cp++);
	OSTimeDly(OS_TICKS_PER_SEC/2);	
    OS_EXIT_CRITICAL();
  
    OS_ENTER_CRITICAL();
    LCD_Display_a_Number_FUN(0x94,*cp++);
	OSTimeDly(OS_TICKS_PER_SEC/2);	
    OS_EXIT_CRITICAL(); 
    
    OS_ENTER_CRITICAL();
    LCD_Display_a_Number_FUN(0x96,*cp++);
	OSTimeDly(OS_TICKS_PER_SEC/2);	
    OS_EXIT_CRITICAL();  

        
}


/*********************************************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: PC_DispClrScr,OSInit,OSTaskCreate,OSStart
**
** 作 者: 陈明计
** 日 期: 2003年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 梁浩荡
** 日 期: 2008-05-28
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        int main (void)
{
    OSInit();

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    
    OSStart();
    return 0;
}

/*********************************************************************************************************
** 函数名称: TaskStart
** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 陈明计
** 日 期: 2003年7月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

        void  TaskStart(void *pdata)
{
   // uint8 *cp,*temp;
   // uint8 err;
   
	pdata = pdata; 
                                                    /* 避免编译警告 */
   PINSEL0 = 0x00000005; // 除UART0/I2C外,设置所有管脚连接GPIO
   PINSEL1 = 0x00000301;		// 设置管脚连接,P0.16设置为EINT0
   IO0DIR = motor_contorl | LED1CON;		// 设置motor LED1控制口为输出,其它I/O为输入
   IO0CLR = motor_contorl;	
   
   EXTMODE = 0x00;					// 设置EINT0、EINT3中断为边沿触发模式
   EXTPOLAR = 0x00;					// 设置EINT0、EINT3中断为下降沿触发
   
   Uart0ReviceMbox = OSMboxCreate(NULL);                           /* 建立邮箱     */
    if (Uart0ReviceMbox == NULL)
    {
        while (1);
    }
	      
    TargetInit();    					/* 目标板初始化 */
    
    
    OSTaskCreate(TaskUart0Revice, (void *)0, 
                 &TaskStk[TASK_STK_SIZE - 1], 10);                  /* 创建任务     */
    OSTaskCreate(TaskKeyScan, (void *)0, &TaskKeyScanStk[TASK_STK_SIZE - 1],9);
    
    LCD_Display_a_Sentence_FUN(0x80,"马达每秒转速:",1);
     
    for (;;)
    {
		
        //cp = (uint8 *)OSMboxPend(Uart0ReviceMbox, 0, &err);         /* 接收数据 */
        //temp = cp;
        //LCD_DispChar(cp);                          /* 显示接收到的数据 */
    	//temp++;
    	//motor_circle_set = 1;
    	motor_counter = 0;
    	IO0SET = motor_contorl;
    	OSTimeDlyHMSM(0,0,2,0);
    	motor_counter = motor_counter/2;
    	LCD_Display_a_Number_FUN(0x90,motor_counter);
    	OSTimeDly(OS_TICKS_PER_SEC/5);
  
    }
}


/****************************************************************************
* 名称:IRQ_Eint0()
* 功能:外部中断EINT0服务函数。
* 入口参数:无
* 出口参数:无
****************************************************************************/
	void   Eint0_Excepiton(void)
{ 	
   OS_ENTER_CRITICAL();

   motor_counter++;   
   /*if(motor_counter == motor_circle_set) 
   {
    IO0CLR = motor_contorl;
    motor_counter = 0;
   }  	
   */
      while( (EXTINT&0x01)!=0 )		
   {  
   	  EXTINT = 0x01;				// 清除EINT0中断标志
   }
   VICVectAddr = 0;
  	
   OS_EXIT_CRITICAL();
}

/****************************************************************************
* 名称:IRQ_Eint0()
* 功能:外部中断EINT0服务函数。
* 入口参数:无
* 出口参数:无
****************************************************************************/
	void   Eint3_Excepiton(void)
{  uint32  i;
	
   OS_ENTER_CRITICAL();
   i = IO0SET;						// 读取当前MOTOR控制值
   if( (i&motor_contorl)==0 )		// 控制MOTOR输出取反
   {  
      IO0SET = motor_contorl;
   }
   else
   {  
      IO0CLR = motor_contorl;
   }
     	
   /* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */
   while( (EXTINT&0x08)!=0 )		
   {  
   	  EXTINT = 0x08;				// 清除EINT0中断标志
   }   
   VICVectAddr = 0;
   	
   OS_EXIT_CRITICAL();
}

/*********************************************************************************************************
** 函数名称: TaskUart0Revice
** 功能描述: μCOS-II的任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 梁浩荡
** 日 期: 2008年5月28日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
	void  TaskUart0Revice(void *pdata)
{
    
    uint8 Buf[8],i;
    uint8 *data;
    pdata = pdata;                                                  /* 避免编译警告 */

    for (;;)
    {	
    	data = (uint8 *)UART0Getch_8Number();
    	for(i=0;i<5;i++)
    		{
    			Buf[i] = *data++;
    		} 
    		   	
		OSMboxPost(Uart0ReviceMbox, (void *)Buf);
		
    }
}


/*********************************************************************************************************
** 函数名称: TaskKeyScan
** 功能描述: μCOS-II的任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 梁浩荡
** 日 期: 2008年5月28日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
 
/************************设置串口通讯数率********************************************/
	void TaskKeyScan(void *pdata)
{
	pdata = pdata;
	
	IO0DIR &= (~KEY2)|(~KEY3)|(~KEY4);
	
	for(;;)
	{
	
		OS_ENTER_CRITICAL();
		if((IO0PIN&KEY2)==0) 
				{
					Uartbps = 115200;
					LCD_Display_a_Sentence_FUN(0x80,"波特率:",1);
	        		LCD_Display_a_Sentence_FUN(0x84,"115200",0);
	        		UART0Init2(Uartbps);
				}
	   		else if((IO0PIN&KEY3)==0) 
	   				{
	   					Uartbps = 19200;
	   					LCD_Display_a_Sentence_FUN(0x80,"波特率:",1);
	        			LCD_Display_a_Sentence_FUN(0x84,"19200",0);
	        			UART0Init2(Uartbps);
	   				}else if((IO0PIN&KEY4)==0) 
	   					  {
		   					Uartbps = 9600;
		   					LCD_Display_a_Sentence_FUN(0x80,"波特率:",1);
		        			LCD_Display_a_Sentence_FUN(0x84,"9600",0);
		        			UART0Init2(Uartbps);
		   			 	  }
		
		
		OS_EXIT_CRITICAL();
		OSTimeDly(OS_TICKS_PER_SEC);
	 }
}
/*******************************************************************************************/    



/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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