void main (void) { #if(PREEMPTION == 1) //配置PIT0的NVIC分组 nvic_init_struct.NVIC_IRQChannel = PIT0_IRQn; nvic_init_struct.NVIC_IRQChannelGroupPriority = NVIC_PriorityGroup_1; nvic_init_struct.NVIC_IRQChannelPreemptionPriority = 0; LPLD_NVIC_Init(nvic_init_struct); //配置PIT1的NVIC分组 nvic_init_struct.NVIC_IRQChannel = PIT1_IRQn; nvic_init_struct.NVIC_IRQChannelGroupPriority = NVIC_PriorityGroup_1; nvic_init_struct.NVIC_IRQChannelPreemptionPriority = 1; LPLD_NVIC_Init(nvic_init_struct); #endif //配置PIT0 pit0_init_struct.PIT_Pitx = PIT0; pit0_init_struct.PIT_PeriodMs = 500; pit0_init_struct.PIT_Isr = pit0_isr; LPLD_PIT_Init(pit0_init_struct); //配置PIT1 pit1_init_struct.PIT_Pitx = PIT1; pit1_init_struct.PIT_PeriodMs = 1000; pit1_init_struct.PIT_Isr = pit1_isr; LPLD_PIT_Init(pit1_init_struct); LPLD_PIT_EnableIrq(pit0_init_struct); LPLD_PIT_EnableIrq(pit1_init_struct); while(1) { } }
void control_init(void) { init_gpio(); init_pwm(); LPLD_UART_Init(UART2, 115200); //裁判机 LPLD_UART_RIE_Enable(UART2, uart2_recv_isr); while (!GetCmdAction()); while(1) { right_set_v(V_SLOW); left_set_v(V_SLOW); scan_infrared(r1, r2, r3, r4); if(IS_AT_CORNER()) break; } motor_time_wait = 0; while (1) { if(motor_time_wait < 100000)//等待电机反应时间 不然直接下一步有影响 没有彻底停下来 { motor_time_wait ++; right_set_v(0); left_set_v(0); } else { motor_time_wait = 0; break; } } can_interrupt = 1; //计时器寄存器每减少50过1us LPLD_UART_Init(UART1, 19200); //读卡器 LPLD_UART_Init(UART3, 9600); //蓝牙 LPLD_UART_Init(UART4, 9600); LPLD_UART_Init(UART5, 19200); //读卡器 LPLD_UART_RIE_Enable(UART1, uart1_recv_isr); LPLD_UART_RIE_Enable(UART3, uart3_recv_isr); //LPLD_UART_RIE_Enable(UART4, uart4_recv_isr); LPLD_UART_RIE_Enable(UART5, uart5_recv_isr); LPLD_LPTMR_Init(MODE_PLACC, 0, LPTMR_ALT1, IRQ_DISABLE, NULL); //UP_LCD_Init(); //初始化LCD LPLD_ADC_Init(ADC0, MODE_16, CONV_SING); memset(control_callbacks, NULL, sizeof(control_callbacks)); memset(r1, 0, sizeof(r1)); memset(r2, 0, sizeof(r2)); memset(r3, 0, sizeof(r3)); memset(r4, 0, sizeof(r4)); LPLD_PIT_Init(PIT0, 5000, pit_isr0); //电机控制 LPLD_PIT_Init(PIT1, 100000, pit_isr1); //计时 TIME_PASSED = 0; }
void init_PIT() { pit0_init_struct.PIT_Pitx = PIT0; //选择PIT0 pit0_init_struct.PIT_PeriodUs = MY_SAMPLE_TIME; //PIT0计数周期500ms pit0_init_struct.PIT_Isr = pitdacisr; //初始化PIT0 LPLD_PIT_Init(pit0_init_struct); LPLD_PIT_EnableIrq(pit0_init_struct); }
//-------------------------------------------------------------------------------------------------------- void PIT_Init(void) { pit_init_struct.PIT_Pitx = PIT0; pit_init_struct.PIT_PeriodMs = 1; //定时周期1毫秒 pit_init_struct.PIT_Isr = PIT_Signal; //设置中断函数名 LPLD_PIT_Init(pit_init_struct); LPLD_PIT_EnableIrq(pit_init_struct); }
/* * 初始化PIT定时器 * */ void pit_init(void) { //配置定时周期中断参数 pit_init_struct.PIT_Pitx = PIT0; pit_init_struct.PIT_PeriodMs = 20; //20毫秒产生一起中断 pit_init_struct.PIT_Isr = pit_isr; //初始化PIT LPLD_PIT_Init(pit_init_struct); //使能PIT定时中断 LPLD_PIT_EnableIrq(pit_init_struct); }
/* * 初始化PIT0和PIT1通道 * */ void pit_init(void) { //配置PIT0参数 pit0_init_struct.PIT_Pitx = PIT0; pit0_init_struct.PIT_PeriodS = 2; //定时周期2秒 pit0_init_struct.PIT_Isr = pit0_isr; //设置中断函数 //初始化PIT0 LPLD_PIT_Init(pit0_init_struct); //配置PIT1参数 pit1_init_struct.PIT_Pitx = PIT1; pit1_init_struct.PIT_PeriodMs = 1000; //定时周期1000毫秒 pit1_init_struct.PIT_Isr = pit1_isr; //设置中断函数 //初始化PIT1 LPLD_PIT_Init(pit1_init_struct); //使能PIT0和PIT1 LPLD_PIT_EnableIrq(pit0_init_struct); LPLD_PIT_EnableIrq(pit1_init_struct); }
void control_init() //初始化方向,速度和传感器映射顺序 { LPLD_PIT_Init(PIT0,20000,do_control); //设置20ms中断,每20ms控制一次电机 for(int i=0; i<EVEN_NUM; i++) { for(int j=0; j<CONTROL_ACTION_NUM; j++) { control_call_back_function[j][i]=NULL; } } //for(int i=0;i<10;i++) bad_infrare[i]=0; //标记损坏的红外,暂不用 // bad_infrare[5]=1; }
void pit_init() { PIT_InitTypeDef pit0_init_struct={PIT0}; pit0_init_struct.PIT_Pitx = PIT0; //配置PIT0参数 pit0_init_struct.PIT_PeriodMs = PIT0_MS; //定时周期 pit0_init_struct.PIT_Isr = pit0_isr; //设置中断函数 LPLD_PIT_Init(pit0_init_struct); //初始化PIT0 LPLD_PIT_EnableIrq(pit0_init_struct); //使能PIT0 PIT->CHANNEL[PIT1].LDVAL = 0xFFFFFFFF; //用于测程序执行时间 PIT->CHANNEL[PIT1].TCTRL |= PIT_TCTRL_TEN_MASK; }
void infrare_init() { //前排红外front_infrare LPLD_GPIO_Init(PTB, 9, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTB, 10, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTB, 11, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTB, 18, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTB, 19, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTB, 20, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTB, 21, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTB, 22, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTC, 6, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTC, 7, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTC, 8, DIR_INPUT, INPUT_PUP, IRQC_DIS); //后排红外tail_infrare LPLD_GPIO_Init(PTB, 0, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTA, 5, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTA, 12, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTA, 13, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTA, 14, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTA, 16, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTA, 17, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTD, 1, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTD, 2, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTD, 3, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTB, 1, DIR_INPUT, INPUT_PUP, IRQC_DIS); //左侧红外left_infrare LPLD_GPIO_Init(PTE, 24, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTE, 25, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTE, 26, DIR_INPUT, INPUT_PUP, IRQC_DIS); //右侧红外right_infrare LPLD_GPIO_Init(PTC, 9, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTC, 12, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_GPIO_Init(PTC, 13, DIR_INPUT, INPUT_PUP, IRQC_DIS); LPLD_PIT_Init(PIT1,5000,infrare_update); }
void pit_init(PITx PIT_Pitx, uint32 PIT_PeriodUs) { pit_init_struct.PIT_Pitx = PIT_Pitx; //选择PIT0 pit_init_struct.PIT_PeriodUs = PIT_PeriodUs; //PIT0计数周期500ms LPLD_PIT_Init(pit_init_struct); }