#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; GunStatus01 g_gunSta; 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}, }; /* CS_D_0:PB15 CS_D_1:PB14 CS_D_2:PB13 CS_D_3:PB12 * CS_D_4:PE7 CS_D_5:PB1 CS_D_6:PB0 CS_D_7:PC5 * CS_D_8:PC4 CS_D_9:PA7 CS_D_10:PA6 CS_D_11:PA5 * * CS_U_0:PE1 CS_U_1:PE0 CS_U_2:PB9 CS_U_3:PB8 * CS_U_4:PB7 CS_U_5:PB6 CS_U_6:PB5 CS_U_7:PC11 * CS_U_8:PC10 CS_U_9:PA15 CS_U_10:PA12 CS_U_11:PA11 */ CSPortMsg g_csPortMsg[24] = { {GPIOB,GPIO_PIN_15}, //CS_D_00--PB15 {GPIOB,GPIO_PIN_14}, //CS_D_01--PB14 {GPIOB,GPIO_PIN_13}, //CS_D_02--PB13 {GPIOB,GPIO_PIN_12}, //CS_D_03--PB12 {GPIOE,GPIO_PIN_7}, //CS_D_04--PE7 {GPIOB,GPIO_PIN_1}, //CS_D_05--PB1 {GPIOB,GPIO_PIN_0}, //CS_D_06--PB0 {GPIOC,GPIO_PIN_5}, //CS_D_07--PC5 {GPIOC,GPIO_PIN_4}, //CS_D_08--PC4 {GPIOA,GPIO_PIN_7}, //CS_D_09--PA7 {GPIOA,GPIO_PIN_6}, //CS_D_10--PA6 {GPIOA,GPIO_PIN_5}, //CS_D_11--PA5 {GPIOE,GPIO_PIN_1}, //CS_U_00--PE1 {GPIOE,GPIO_PIN_0}, //CS_U_01--PE0 {GPIOB,GPIO_PIN_9}, //CS_U_02--PB9 {GPIOB,GPIO_PIN_8}, //CS_U_03--PB8 {GPIOB,GPIO_PIN_7}, //CS_U_04--PB7 {GPIOB,GPIO_PIN_6}, //CS_U_05--PB6 {GPIOB,GPIO_PIN_5}, //CS_U_06--PB5 {GPIOC,GPIO_PIN_12}, //CS_U_07--PC12 {GPIOC,GPIO_PIN_11}, //CS_U_08--PC11 {GPIOC,GPIO_PIN_10}, //CS_U_09--PC10 {GPIOA,GPIO_PIN_12}, //CS_U_10--PA12 {GPIOA,GPIO_PIN_11}, //CS_U_11--PA11 }; void exti_irq_fuction(void) { volatile uint8_t status = 0; volatile uint8_t i = 0,j=0,daUp,daDn; volatile uint32_t count = 0; // if(RESET == gpio_input_bit_get(g_extimsg.extiPort,g_extimsg.extiPin)){ // // if(testcount.btestStart==1){ // status = gpio_input_bit_get(g_extimsg.extiPort,g_extimsg.extiPin); // testcount.exittest[testcount.count].tick = gTimer_tickt; // testcount.exittest[testcount.count].status = status; // testcount.count++; // if(testcount.count >=24) testcount.count = 0; // } #if (NO_INIT_COLLECT) // else { // g_timeInfo.bExit = 1; // g_timeInfo.exitTick = gTimer_tickt; // } #else else { g_timeInfo.bExit = 1; g_timeInfo.bRead = 0; //exti_interrupt_disable(g_extimsg.extiLine); // 关闭外部中断 for(count=0;count<0x7FFF;count++) status = gpio_input_bit_get(g_extimsg.extiPort,g_extimsg.extiPin); if(status == RESET) { // COM端为电平时取数 set_all_cs_port_status(SET); // 所有的片选置高 for(j=0;j<20;j++); for(i=0;i>8)&0xFF; g_timeInfo.srcDa[i+CS_GROUP_NUM] = daUp&0xFF; gpio_bit_set(g_csPortMsg[i].csPort,g_csPortMsg[i].csPin); gpio_bit_set(g_csPortMsg[i+12].csPort,g_csPortMsg[i+12].csPin); for(j=0;j<20;j++); } } g_timeInfo.bExit = 0; g_timeInfo.bRead = 1; } #endif // } // else if(SET == gpio_input_bit_get(g_extimsg.extiPort,g_extimsg.extiPin)){ // if(testcount.btestStart==1){ // status = gpio_input_bit_get(g_extimsg.extiPort,g_extimsg.extiPin); // testcount.exittest[testcount.count].tick = gTimer_tickt; // testcount.exittest[testcount.count].status = status; // testcount.count++; // if(testcount.count >=24) testcount.count = 0; // } // } } void EXTI5_9_IRQHandler(void) { volatile static uint8_t gunLevel = 0; // if(RESET != exti_interrupt_flag_get(g_extimsg.extiLine)){ // // exti_irq_fuction(); // //if(g_extimsg.extiLine != EXTI_8) // exti_interrupt_flag_clear(g_extimsg.extiLine); // } } void EXTI10_15_IRQHandler(void) { // if(RESET != exti_interrupt_flag_get(g_extimsg.extiLine)){ // // exti_irq_fuction(); // exti_interrupt_flag_clear(g_extimsg.extiLine); // } } void EXTI0_IRQHandler(void) { // if(RESET != exti_interrupt_flag_get(g_extimsg.extiLine)){ // // exti_irq_fuction(); // exti_interrupt_flag_clear(g_extimsg.extiLine); // } } void EXTI1_IRQHandler(void) { // if(RESET != exti_interrupt_flag_get(g_extimsg.extiLine)){ // // exti_irq_fuction(); // exti_interrupt_flag_clear(g_extimsg.extiLine); // } } #if(0) 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; } #endif /*------------------------------------------------------------------ * 根据配置表,初始化片选 以及外部中断 * 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(); // exti_interrupt_flag_clear(g_extimsg.extiLine); /* 清除中断 */ // exti_interrupt_disable(g_extimsg.extiLine); /*----start cs--cs_u_1--PE0 exit--ad_u_5--PD5------*/ /*g_extimsg.csGroup = GPIOB; g_extimsg.csPin = GPIO_PIN_9; g_extimsg.extiPin = GPIO_PIN_6; g_extimsg.extiPort = GPIOD; g_extimsg.extiIRQn = EXTI5_9_IRQn; g_extimsg.extiLine = EXTI_6; g_extimsg.extiPinSource = GPIO_PIN_SOURCE_6; g_extimsg.outputPort = GPIO_PORT_SOURCE_GPIOD;*///3; /*------------------end start---------------*/ 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管脚 * 版选模式: * CS_ALL : PE2 * CS片选,设置为输出: * CS_D_0:PB15 CS_D_1:PB14 CS_D_2:PB13 CS_D_3:PB12 * CS_D_4:PE7 CS_D_5:PB1 CS_D_6:PB0 CS_D_7:PC5 * CS_D_8:PC4 CS_D_9:PA7 CS_D_10:PA6 CS_D_11:PA5 * * CS_U_0:PE1 CS_U_1:PE0 CS_U_2:PB9 CS_U_3:PB8 * CS_U_4:PB7 CS_U_5:PB6 CS_U_6:PB5 CS_U_7:PC12 * CS_U_8:PC11 CS_U_9:PC10 CS_U_10:PA12 CS_U_11:PA11 * * DATA信号,设置为输入:PE8~PE15(0xFF00):AD_D0~AD_D7; PD0~PD7(0x00FF):AD_U0~AD_U7 * 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) { rcu_periph_clock_enable(RCU_GPIOE); gpio_init(GPIOE, GPIO_MODE_IPD, GPIO_OSPEED_2MHZ,0xFF00);// PE8~PE15设置为输入 gpio_bit_set(GPIOE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_7);// PE0/PE1/PE7 设置为输出 gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_7); gpio_bit_reset(GPIOE, GPIO_PIN_2);// CS_ALL gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ,GPIO_PIN_2); rcu_periph_clock_enable(RCU_GPIOD);// gpio_init(GPIOD, GPIO_MODE_IPD, GPIO_OSPEED_2MHZ,0x00FF);// PD0~PD7设置为输入 gpio_bit_reset(GPIOD, GPIO_PIN_9);// PD9 设置为输出 CS_ALL gpio_init(GPIOD, GPIO_MODE_OUT_OD, GPIO_OSPEED_2MHZ,GPIO_PIN_9); rcu_periph_clock_enable(RCU_GPIOC);// PC设置为输出 PC4/PC5/PC10/PC11/PC12 gpio_bit_set(GPIOC, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12); gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ,GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12); rcu_periph_clock_enable(RCU_GPIOB);// PB设置为输出 PB0~PB1/PB5~PB9/PB12~PB15 gpio_bit_set(GPIOB, 0xF3E3); gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ,0xF3E3); //rcu_periph_clock_enable(RCU_AF); // 必须要用这句,才能使用下面的remap; rcu_periph_clock_enable(RCU_GPIOA);// PA设置为输出 PA5~PA7/PA11~PA12 //gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE); // 将PA15做为普通IO口,PA13 PA14为SWD gpio_bit_set(GPIOA, 0x18E0); gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ,0x18E0); rcu_periph_clock_enable(RCU_AF); /* AFIO时钟使能 */ // for(i=0;i<4;i++){ // printf("csport = %d, cspin= %d,extipt = %d, extipin=%d\r\n",g_extimsg.csGroup[i],\ // g_extimsg.csPin[i],g_extimsg.extiPort[i],g_extimsg.extiPin[i]); // } //exti_deinit(); /* 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(g_extimsg.outputPort,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); #if (0) //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); #endif } /*------------------------------------------------------------------ * 所有的片选置高或是低 * ------------------------------------------------------------------*/ void set_all_cs_port_status(FlagStatus status) { uint8_t i = 0; CSPortMsg *csMsg = NULL; if(status == SET){ for(i=0;icsPort,csMsg->csPin); csMsg = &g_csPortMsg[i+12]; gpio_bit_set(csMsg->csPort,csMsg->csPin); } } else { for(i=0;icsPort,csMsg->csPin); csMsg = &g_csPortMsg[i+12]; gpio_bit_reset(csMsg->csPort,csMsg->csPin); } } } /*---------------------------------------------------------------- * 抬枪信号的初始化 * PC8 * ----------------------------------------------------------------*/ void gun_single_init(void) { //初始化抬枪信号 rcu_periph_clock_enable(RCU_GPIOC); gpio_init(TQ_PORT, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,TQ_PIN); //PC8 IN1 抬枪信号1 rcu_periph_clock_enable(RCU_AF); /* AFIO时钟使能 */ nvic_irq_enable(EXTI5_9_IRQn, 3U, 2U); /* 设置优先级 */ gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOC,GPIO_PIN_SOURCE_8); /* 设置EXTI的触发源 */ exti_init(EXTI_8, EXTI_INTERRUPT, EXTI_TRIG_BOTH); /*触发方式:上升沿 下降沿触发*/ exti_interrupt_flag_clear(EXTI_8); /* 清除中断 */ exti_interrupt_enable(EXTI_8); } /*---------------------------------------------------------------- * 初始化板级控制管脚 * PD14 : led_green PD15:leg_red * PE2: cs_en_all 所有片选使能 * ---------------------------------------------------------------*/ void board_gpio_init(void) { rcu_periph_clock_enable(RCU_GPIOC); rcu_periph_clock_enable(RCU_GPIOD); rcu_periph_clock_enable(RCU_GPIOE); gpio_bit_set(GPIOD, GPIO_PIN_15|GPIO_PIN_14); gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ,GPIO_PIN_14|GPIO_PIN_15); //初始化LED管脚 PC13 gpio_bit_reset(GPIOE, GPIO_PIN_2); gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ,GPIO_PIN_2); //cs_all 使能 // 初始化抬枪信号 gpio_init(TQ_PORT, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,TQ_PIN); //PC8 IN1 抬枪信号1 gpio_init(BM_PORT, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,BM_PIN); //PC9 编码器 } 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(); rct_init(); init_flash(); usart0_config(); exti_msg_init(); exti_gpio_init(); init_gun_status(); timer4_init(); timer5_init(); key_init(); g_iDentity = IDENTITY_SLAVE; // 从 g_devMsg.bHave4G = B4G_NOHAVE; // 无4G模块 } /*-------------------------------------------------------------------------------- * 上电时读取复位类型 * -------------------------------------------------------------------------------*/ 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(); }