#include "boardinit.h" #include "../App/public.h" #include "../App/xspDataOpt.h" TestInitConut testcount; extiMsg_t g_extimsg; // 中断信息 Identity g_iDentity; // 身份信息 主或从 DevResetMsg g_devResetMsg; DevPtMsg g_devPtMsg; PortMsg g_portMsg[4] = { {GPIOD,GPIO_PIN_5, GPIO_PIN_1, GPIO_PIN_3, GPIO_PIN_2}, {GPIOE,GPIO_PIN_5, GPIO_PIN_1, GPIO_PIN_3, GPIO_PIN_2}, {GPIOD,GPIO_PIN_13,GPIO_PIN_9, GPIO_PIN_11,GPIO_PIN_10}, {GPIOE,GPIO_PIN_14,GPIO_PIN_10,GPIO_PIN_12,GPIO_PIN_11}, }; void EXTI5_9_IRQHandler(void) { volatile uint8_t status = 0; if(RESET != exti_interrupt_flag_get(g_extimsg.extiLine)){ // #if (0) if(testcount.btestStart==1){ status = gpio_input_bit_get(GPIOE,g_extimsg.extiPin); testcount.exittest[testcount.count].tick = gTimer_tickt; testcount.exittest[testcount.count].status = status; testcount.count++; if(testcount.count >=22) testcount.count = 0; } else { g_timeInfo.bExit = 1; g_timeInfo.exitTick = gTimer_tickt; } #else if((0==g_timeInfo.bRead) &&(RESET==gpio_input_bit_get(g_extimsg.csGroup,g_extimsg.csPin))){ delay_ms(1); reset_port_all_pin(PLN,PORT_ALL); //reset_port_pin(PLN,3); delay_ms(1);//延时 if(RESET==gpio_input_bit_get(g_extimsg.csGroup,g_extimsg.csPin)){ set_port_all_pin(PLN,PORT_ALL); //set_port_pin(PLN,3); g_timeInfo.bRead = 1; } } #endif exti_interrupt_flag_clear(g_extimsg.extiLine); } } void set_port_pin(uint8_t cmd,uint8_t index) { switch(cmd){ case CEN: gpio_bit_set(g_portMsg[index].group, g_portMsg[index].cePin); break; case CLK: gpio_bit_set(g_portMsg[index].group, g_portMsg[index].cpPin); break; case PLN: gpio_bit_set(g_portMsg[index].group, g_portMsg[index].plPin); break; } } void set_port_all_pin(uint8_t cmd,uint8_t index)//0x01 02 04 08 { uint8_t i=0; for(i=0;i<4;i++){ if(0x00 ==((index>>i)&0x01)) continue; set_port_pin(cmd,i); } } void reset_port_pin(uint8_t cmd,uint8_t index) { switch(cmd){ case CEN: gpio_bit_reset(g_portMsg[index].group, g_portMsg[index].cePin); break; case CLK: gpio_bit_reset(g_portMsg[index].group, g_portMsg[index].cpPin); break; case PLN: gpio_bit_reset(g_portMsg[index].group, g_portMsg[index].plPin); break; } } void reset_port_all_pin(uint8_t cmd,uint8_t index)//0x01 02 04 08 { uint8_t i=0; for(i=0;i<4;i++){ if(0x00 ==((index>>i)&0x01)) continue; reset_port_pin(cmd,i); } } uint8_t read_daout_pin(uint8_t index) { uint8_t ret; ret = gpio_input_bit_get(g_portMsg[index].group, g_portMsg[index].doutPin); return ret; } /*------------------------------------------------------------------ * 根据配置表,初始化片选 以及外部中断 * Port1: CS0-PD0, CS6-PD6 * Port2: AD0-PE0, AD6-PE6 * Port3: CS15-PD8 CS9-PD14 * Port4: AD9-PE9 AD15-PE15 * -----------------------------------------------------------------*/ void exti_msg_init(void) { // uint8_t port = 0; epprom_read_com_config(); return; // switch (port){ // case 0: // CS6 // g_extimsg.csGroup = GPIOD; // g_extimsg.csPin = GPIO_PIN_6; // g_extimsg.extiIRQn = EXTI5_9_IRQn; // g_extimsg.extiLine = EXTI_6; // g_extimsg.extiPinSource = GPIO_PIN_SOURCE_6; // g_extimsg.extiPin = GPIO_PIN_6; // g_extimsg.outputPort = 3; // break; // case 1: // break; // case 2: // AD6 // g_extimsg.csGroup = GPIOE; // g_extimsg.csPin = GPIO_PIN_6; // g_extimsg.extiIRQn = EXTI5_9_IRQn; // g_extimsg.extiLine = EXTI_6; // g_extimsg.extiPinSource = GPIO_PIN_SOURCE_6; // g_extimsg.extiPin = GPIO_PIN_6; // g_extimsg.outputPort = 4; // break; // case 3: // CS15--PD8 // g_extimsg.csGroup = GPIOD; // g_extimsg.csPin = GPIO_PIN_8; // g_extimsg.extiIRQn = EXTI5_9_IRQn; // g_extimsg.extiLine = EXTI_8; // g_extimsg.extiPinSource = GPIO_PIN_SOURCE_8; // g_extimsg.extiPin = GPIO_PIN_8; // g_extimsg.outputPort = 3; // break; // default: // break; // } } /*----------------------------------------------------------------- * 初始化GPIO管脚 * 版选模式: * PD0~PD15,PC0~PC9 PB3~PB5:CS片选,设置为输出; * PE0~PE15:DATA信号,输出为输入 * PE8:设置为外部中断, 上升沿下降沿中断 ,在片选CS8(PD15)上 * 串转并模式: * PD0 PD1 PD6 PD8 PD9 PD14 设置为输入 (PD1 PD9为DOUT,其它为COM端) 0x4343 * PE0 PE1 PE6 PE9 PE10 PE15 设置为输入 (PE1 PE10为DOUT,其它为COM端)0x8643 * 其它的PE、PD端口都设置为输出 PD:0xBCBC PE:0x79BC * ----------------------------------------------------------------*/ void exti_gpio_init(void) { #if SEL_74CH165 rcu_periph_clock_enable(RCU_GPIOD);// PD rcu_periph_clock_enable(RCU_GPIOE); // PE gpio_bit_set(GPIOD, 0xBCBC); gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,0xBCBC); // 设置输出 gpio_bit_set(GPIOE, 0x79BC); gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,0x79BC); // PE 设置输出 gpio_init(GPIOD, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ,0x4343); gpio_init(GPIOE, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ,0x8643); rcu_periph_clock_enable(RCU_AF); /* AFIO时钟使能 */ nvic_irq_enable(g_extimsg.extiIRQn, 2U, 0U); /* 设置优先级 */ /* connect key EXTI line to key GPIO pin */ gpio_exti_source_select(g_extimsg.outputPort,g_extimsg.extiPinSource); /* 设置EXTI的触发源 */ exti_deinit(); exti_init(g_extimsg.extiLine, EXTI_INTERRUPT, EXTI_TRIG_FALLING); /*触发方式:上升沿 下降沿触发*/ exti_interrupt_flag_clear(g_extimsg.extiLine); /* 清除中断 */ exti_interrupt_enable(g_extimsg.extiLine); #else rcu_periph_clock_enable(RCU_GPIOD);// PD设置为输出 gpio_bit_set(GPIOD, GPIO_PIN_ALL); gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_ALL); rcu_periph_clock_enable(RCU_GPIOC);// PC设置为输出 PC0~PC9 gpio_bit_set(GPIOC, 0x3FF); gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,0x3FF); rcu_periph_clock_enable(RCU_GPIOB);// PB设置为输出 PB3~PB5 gpio_bit_set(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); rcu_periph_clock_enable(RCU_GPIOE); // PE设置为输入 gpio_init(GPIOE, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ,GPIO_PIN_ALL); rcu_periph_clock_enable(RCU_AF); /* AFIO时钟使能 */ /* enable and set key EXTI interrupt priority */ nvic_irq_enable(g_extimsg.extiIRQn, 2U, 0U); /* 设置优先级 */ /* connect key EXTI line to key GPIO pin */ gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOE,g_extimsg.extiPinSource); /* 设置EXTI的触发源 */ exti_init(g_extimsg.extiLine, EXTI_INTERRUPT, EXTI_TRIG_BOTH); /*触发方式:上升沿 下降沿触发*/ exti_interrupt_flag_clear(g_extimsg.extiLine); /* 清除中断 */ exti_interrupt_enable(g_extimsg.extiLine); #endif } /*---------------------------------------------------------------- * 初始化板级控制管脚 * PC13: led_green PA0:leg_red * PA8: cs_en_all 所有片选使能 * PB8: LTE_DC 4G模块是否插入 配置为输入上拉 * ---------------------------------------------------------------*/ void board_gpio_init(void) { rcu_periph_clock_enable(RCU_GPIOC); rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); gpio_bit_set(GPIOC, GPIO_PIN_13); gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_13); //初始化LED管脚 PC13 gpio_bit_set(GPIOA, GPIO_PIN_0); gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_0); //初始化LED管脚 PA0 gpio_bit_reset(GPIOA, GPIO_PIN_8); gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_8); //CS_EN_ALL PA8 gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,GPIO_PIN_8); //PB8 LTE_DC 配置上拉 gpio_bit_reset(GPIOB, GPIO_PIN_9); // set :上电 reset:断电 gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_9); //PB9 4G断电 // 初始化抬枪信号 gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,GPIO_PIN_15); //PB15 IN1 抬枪信号1 gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,GPIO_PIN_14); //PB14 IN2 抬枪信号2 gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,GPIO_PIN_13); //PB13 IN3 抬枪信号3 gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,GPIO_PIN_12); //PB12 IN4 抬枪信号4 } void init_fwdgt_timer(void) { // fwdgt_counter_reload(); } void fwdgt_feed(uint32_t tickt) { if((tickt%2000)==0) fwdgt_counter_reload(); } void board_init(void) { board_gpio_init(); i2c_init(); usart0_config(); //exti_msg_init(); //exti_gpio_init(); // init_gun_status(); timer4_init(); timer5_init(); key_init(); g_iDentity = IDENTITY_MASTER; // if(!gpio_input_bit_get(GPIOB,GPIO_PIN_8)) g_devMsg.bHave4G = B4G_HAVE;// 有4G模块 else g_devMsg.bHave4G = B4G_NOHAVE; // 无4G模块 printf(" dev have 4g :%d\r\n", g_devMsg.bHave4G); } /*-------------------------------------------------------------------------------- * 上电时读取复位类型 * -------------------------------------------------------------------------------*/ uint32_t power_up_system_resettype(void) { uint32_t RestFlag = 0; if(RESET != rcu_flag_get(RCU_FLAG_EPRST)){ // 复位引脚复位 external PIN reset flag RestFlag |= RESET_PINRST; } if(RESET != rcu_flag_get(RCU_FLAG_PORRST)){ // 掉电复位 : power reset flag RestFlag |= RESET_PORRSTF; } if(RESET != rcu_flag_get(RCU_FLAG_SWRST)) { // 软件复位 : software reset flag RestFlag |= RESET_SFTRSTF; } if(RESET != rcu_flag_get(RCU_FLAG_FWDGTRST)){// 独立看门狗复位 : free watchdog timer reset flag RestFlag |= RESET_IWDGRSTF;// } if(RESET != rcu_flag_get(RCU_FLAG_WWDGTRST)) { //窗口看门狗复位 : window watchdog timer reset flag RestFlag |= RESET_IWDGRSTF;// } if(RESET != rcu_flag_get(RCU_FLAG_LPRST)){ // 低功耗复位: low-power reset flag RestFlag |= RESET_LPWRRSTF;// } rcu_all_reset_flag_clear(); printf("复位类型 : %x\r\n",RestFlag); //存储复位 类型 return RestFlag; } void uart_init(void) { dam_init_uart_485(); usart_485_dma_init(); if(B4G_HAVE == g_devMsg.bHave4G){ // 初始化4G串口 dma_init_uart_4G(); usart_4G_dma_init(); gpio_bit_set(GPIOB, GPIO_PIN_9); // set :上电 reset:断电 } } /*------------------------------------------------------ * 4g 模块断电上电 * -----------------------------------------------------*/ void init_4g_power_up(void) { gpio_bit_reset(GPIOB, GPIO_PIN_9); // set :上电 reset:断电 start_delay_ms(2000); while(!g_iDelayfinish); stop_delay_ms(); gpio_bit_set(GPIOB, GPIO_PIN_9); // set :上电 reset:断电 }