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