📄 target.c
字号:
{
PINSEL0 |= 0x00200000; // 设定TMR1抓取通道0
T1IR = 0xFFFFFFFF; // 清除TMR1的所有中断标识
T1CCR = 0x05; // 设定TMR1抓取通道0的上升沿,并产生中断(速度) CAP1.0
T1TC = 0x0; // TMR1定时器清0
T1TCR = 0x01; // 开TMR1
}
/*********************************************************************************************************
** 函数名称: PWMInit()
** 功能描述: PWM功能初始化
**
** 输 入 : 无
** 输 出 : 无
** 全局变量: 无
** 调用模块: IGBT_GetPeriod()
** IGBT_GetWidth()
** 说 明:
** 作 者: 周川福
** 日 期: 2006-04-19
**-------------------------------------------------------------------------------------------------------
** 修 改:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void PWMInit(void)
{
PINSEL0 = (PINSEL0 & 0xFFFF3FFF) | (2 << 14);
PWMIR = 0xFFFFFFFF; // 清除PWM中断标识
PWMTC = 0x00; // PWM定时器清零
PWMPCR = 1 << 10; // 使能PWM2,模式为单边沿控制
// PWMMCR = 0x0B; // PWMMR0匹配时产生中断并复位PWMTC,PWMMR1匹配时产生中断
PWMMCR = 0x02; // PWMMR0匹配时复位PWMTC,
PWMMR0 = IGBT_GetPeriod(); // PWM(IGBT)控制周期
PWMMR2 = 0x00; // PWM(IGBT)占空比,也就是IGBT的导通时间
PWMTCR = 0x01; // 启动PWM定时器
}
/*********************************************************************************************************
** 函数名称: InitialiseUART0
** 功能描述: 设置串口0
** 输 入: bps:波特率 19200
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人: 饶阳胜
** 日 期: 05-6-11
** 修改原因: 增加中断, 关闭FIFO
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void InitUART0(uint32 bps)
{
uint16 Fdiv;
PINSEL0 = (PINSEL0 & 0xFFFFFFF0) | UART0_COMMT; // 选择管脚为UART0
U0LCR = 0x80; // 允许访问分频因子寄存器
Fdiv = (Fpclk / 16) / bps; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03; // 禁止访问分频因子寄存器
// 且设置为8,1,n
U0IER = RV_ENABLE; // 使能接收中断
}
/*********************************************************************************************************
** 函数名称: VICInit
** 功能描述: 向量中断控制器初始化
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人: 饶阳胜
** 日 期: 05-5-23
** 修改原因: 增加TMR1中断处理
**------------------------------------------------------------------------------------------------------
** 修改人: 饶阳胜
** 日 期: 05-6-24
** 修改原因: 增加I2C中断处理
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void VICInit(void)
{
void IRQ_Handler(void); // 声明外部非向量中断函数
void Timer0_Handler(void); // 声明外部TMR0中断处理函数
void Timer1_Handler(void); // 声明TMR1中断处理函数
void Uart0_Handler(void); // 声明外部UART0处理函数
void I2c_Handler(void); // 声明I2C中断处理函数
void PWM_Handler(void); // 申明PWM输出处理函数
VICVectAddr = 0;
VICIntEnClr = 0xFFFFFFFF; // 关闭所有中断
VICIntSelect = 0x0; // 所有中断为IRQ中断
VICDefVectAddr = (INT32U)IRQ_Handler; // 得到非向量中断处理入口
VICVectAddr0 = (INT32U)Timer0_Handler; // 得到TMR0中断处理入口
VICVectAddr5 = (INT32U)Timer1_Handler; // 得到TMR1中断处理入口
VICVectAddr6 = (INT32U)PWM_Handler; // 得到PWM中断处理入口
VICVectAddr7 = (INT32U)Uart0_Handler; // 得到UART0中断处理入口
VICVectAddr12 = (INT32U)I2c_Handler; // 得到I2C中断处理程序入口
VICVectCntl0 = (0x20 | 0x04); // 分配TMR0的中断优先级为0
VICVectCntl5 = (0x20 | 0x05); // 分配TMR0的中断优先级为5
VICVectCntl6 = (0x20 | 0x08); // 分配PWM的中断优先级为6
VICVectCntl7 = (0x20 | 0x06); // 分配UART0的中断优先级为7
VICVectCntl12 = (0x20 | 9); // 分配I2C的中断优先级为12
VICIntEnable |= 1 << 4; // 使能TMR0中断 (为方便调试,把中断关掉)
VICIntEnable |= 1 << 5; // 使能TMR1中断
// VICIntEnable |= 1 << 8; // 使能PWM中断
VICIntEnable |= 1 << 6; // 使能UART0中断
}
/*********************************************************************************************************
** 函数名称: TargetInit
** 功能描述: 目标板初始化代码,在需要的地方调用,根据需要改变
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人: 饶阳胜
** 日 期: 05-5-22
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TargetInit(void)
{
IODIR = WORK_SHOW | AD_RC | AD_BYTE | OUT_CONTROL; // 定义输出引脚
IODIR |= ZSSS | ZSXJ | MOTOR| WHEEL_1 | WHEEL_2 | TRANS_MOTOR;
OS_ENTER_CRITICAL();
srand((uint32) TargetInit);
IGBT_Init(); // IGBT初始化
Timer0Init(); // Timer0初始化
Timer1Init(); // Timrer1初始化
PWMInit(); // PWM初始化
InitUART0(19200); // 设置串行口
set_control_value = 0; // 设定控制值清0
force_dema_point = 0; // 力标定点清0
parameter[SPEED] = 0;
parameter[FORCE] = 0;
parameter[POWER] = 0;
parameter[JSD] = 0;
parameter[DISTANCE] = 0;
ScSpeed = 0;
speed_set_value = 0;
force_set_value = 0;
power_set_value = 0;
adi_sum = 0;
adi_times = 0;
adi_value = 0;
times = 0;
G_PulseCount = 0;
G_Kp = 0;
G_Ki = 0;
G_Kd = 0;
G_Kc = 0;
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函数名称: TargetResetInit
** 功能描述: 调用main函数前目标板初始化代码,根据需要改变,不能删除
** 输 入: 无
**
** 输 出: 无
**
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TargetResetInit(void)
{
#ifdef __DEBUG_RAM
MEMMAP = 0x2; //remap
#endif
#ifdef __DEBUG_FLASH
MEMMAP = 0x1; //remap
#endif
#ifdef __IN_CHIP
MEMMAP = 0x1; //remap
#endif
/* 设置系统各部分时钟 */
PLLCON = 1;
#if (Fpclk / (Fcclk / 4)) == 1
VPBDIV = 0;
#endif
#if (Fpclk / (Fcclk / 4)) == 2
VPBDIV = 2;
#endif
#if (Fpclk / (Fcclk / 4)) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
/* 设置存储器加速模块 */
MAMCR = 0;
#if Fcclk < 20000000
MAMTIM = 1;
#else
#if Fcclk < 40000000
MAMTIM = 2;
#else
MAMTIM = 3;
#endif
#endif
MAMCR = 2;
}
/********************************************************************************
* 函数名称: char* cpystr(char *src, char *dest, int pose, int count);
* 功 能: 把字符串src 拷贝到dest中,pose是拷贝的起始位置,count为拷贝的数量
* 入口参数: *src -- 原字符串
*dest -- 目标字符串
pose -- 起始位置
count -- 拷贝的数量
* 出口参数: char * -- 拷贝后字符串的地址指针
* 调用模块:
*
* 全局变量:
*
*--------------------------------------------------------------------------------
* 设计者: Hexen
* 日 期: 2006-9-24
* 说 明:
********************************************************************************/
char* cpystr(char *src, char *dest, int pose, int count)
{
int i,j;
if( strlen(src) == 0 ) return NULL;
j = 0;
for(i = pose; i < (count + pose); i++) {
dest[j++] = src[i];
}
dest[j] = 0;
return dest;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -