📄 xaioche_over.txt
字号:
#include "config.h"
#define PWM2 (2 << 14) //P0.7
#define DIR1 (1 << 5) //P0.5
#define DIR2 (1 << 6) //P0.6
#define KEY1 (1 << 16) //P0.16,EXINT0
#define KEY5 (1 << 20) //P0.20,EXINT3
void __irq IRQ_youzhuan(void);
void __irq IRQ_zuozhuan(void);
void __irq IRQ_Timer0(void);
void DelayNS (uint32 dly) //延时程序
{
uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<5000; i++);
}
void PWM2_Init()
{ PWMPR = 0x00; //不分频,PWM计数频率为Fpclk
PWMMCR = 0x02; //PWMMR0与PWMTC匹配时复位PWMTC
PWMPCR = (1 << 0) | //PWM2单边沿控制
(1 <<10); //使能PWM2输出
PWMMR0 = Fpclk/400; //PWM速率控制/计数初值,T=1/400s,//经验值,电机转速
PWMMR2 = PWMMR0/2; //PWM1的位置,方波作为STK_CLK
PWMLER = 0x05; //锁存0,2的PWM匹配值
PWMTCR = 0x02; //复位PWMTC
PWMTCR = 0x09; //使能PWM
}
void Timer0_Init(void)
{ T0TC = 0; //定时器设置为0
T0PR = 0; //时钟不分频
T0MCR = 0x03; //设置T0MR0匹配复位T0TC,并产生中断标志
T0MR0 = Fpclk/10; //1/10s定时,//经验值,小车转弯角
T0TCR = 0x01; //启动定时器0
T0IR = 0x01; //清除中断标志
}
void EINT_Init(void)
{ VICIntSelect = 0; //设置所有中断匹配为IRQ中断
VICVectCntl0 = 0x20 | 14; //分配EINT0中断到向量中断0
VICVectAddr0 = (uint32)IRQ_zuozhuan; //设置中断服务程序地址
EXTMODE = 0x01; //设置EINT1为边沿触发。
//极性寄存器使用默认值,0,下降沿
VICVectCntl1 = 0x20 | 17; // 分配EINT3中断到向量中断1
VICVectAddr1 = (uint32)IRQ_youzhuan; // 设置中断服务程序地址
EXTMODE = EXTMODE | 0x06; //设置EINT3为边沿触发。
//极性寄存器使用默认值,0,下降沿
EXTINT = 0x09; // 清除EINT0、EINT3中断标志
VICVectCntl2 = 0x20 | 4; //分配Timer0中断到向量中断2
VICVectAddr2 = (uint32)IRQ_Timer0; //设置中断服务程序地址
T0IR = 0x01;
VICIntEnable = (1<<4)|(1 << 14) | (1 << 17);//使能Timer0、INT0、EINT3中断
IRQEnable(); //使能IRQ中断
}
void __irq IRQ_Timer0 (void)
{ IO0SET = DIR2; //输出为1
IO0CLR = DIR1; //输出为0
T0TCR = 0x00; //禁止定时器0
while( (T0IR & 0x01) !=0 ) //等待外部中断信号恢复为高电平
{ T0IR = 0x01; //清除EINT0中断标志
}
VICVectAddr = 0x00; //通知VIC中断处理结束
}
void __irq IRQ_zuozhuan(void)
{ T0TCR = 0x00; //禁止定时器0
if( (IO0PIN & KEY5 ) == 0 )
{ DelayNS (10); //去干扰,3.9ms
if( (IO0PIN & KEY5 ) == 0 ) //同时检测到黑线,停
PWMTCR = 0x00; //禁止PWM
else
{
IO0SET = DIR1 | DIR2; //输出为1
Timer0_Init();
}
}
else
{
IO0SET = DIR1 | DIR2; //输出为1
Timer0_Init();
}
while ((EXTINT & 0x01) != 0)
{
EXTINT = 0x01; //清除EINT0中断标志
}
VICVectAddr = 0x00; //通知VIC中断处理结束
}
void __irq IRQ_youzhuan(void)
{ T0TCR = 0x00; //禁止定时器0
if( (IO0PIN & KEY1 ) == 0 )
{ DelayNS (10); //去干扰,3.9ms
if( (IO0PIN & KEY1 ) == 0 ) //同时检测到黑线,停
PWMTCR = 0x00; //禁止PWM
else
{
IO0CLR = DIR1 | DIR2; //输出为0
Timer0_Init();
}
}
else
{
IO0CLR = DIR1 | DIR2; //输出为0
Timer0_Init();
}
while( (EXTINT&0x08)!=0 ) //等待外部中断信号恢复为高电平
{ EXTINT = 0x08; //清除EINT3中断标志
}
VICVectAddr = 0x00; //通知VIC中断处理结束
}
int main (void)
{ PINSEL0 = PWM2; //P0.7连接PWM2
PINSEL1 = 0x00000301; //设置管脚连接,P0.16设置为EINT0,P0.20设置为EINT3
//其余为GPIO
IODIR = DIR1 | //都为输出
DIR2; //
IO0SET = DIR2; //输出为1
IO0CLR = DIR1; //输出为0
PWM2_Init(); //PWM1初始化
EINT_Init(); //EINT1,EINT2初始化
while(1);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -