/* * @Description: * @Version: 2.0 * @Author: Seven * @Date: 2022-08-23 17:12:39 * @LastEditors: Seven * @LastEditTime: 2022-08-23 18:23:10 */ #include "pos.h" #include "includes.h" #include "gw_ctrl.h" pos_info_t pos_info; pos_change_t pos_change; //切换开关引脚初始化 void sw_gpio_init(void) { //POS和ITSF开关切换 GPIO_COMM_Init(RCC_APB2Periph_GPIOD, GPIOD, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6, GPIO_Mode_Out_PP, GPIO_Speed_50MHz); //ITSF引脚配置 //YTSF_REV2 GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_0, GPIO_Mode_IPU, GPIO_Speed_2MHz); //YTSF_RST_N GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_1, GPIO_Mode_Out_PP, GPIO_Speed_2MHz); YTSF_GPIO_EN(); //YTSF_POSITION_N GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_2, GPIO_Mode_IPU, GPIO_Speed_2MHz); //YTSF_EN_N GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP, GPIO_Speed_2MHz); YTSF_GPIO_DN(); } //开关切换 void tax_ch_sw(uint8_t state, uint8_t posnode) { switch(state) { case PLAINTEXT: if(posnode == 1) { SW_ITSY1_OFF(); SW_POS1_OFF(); } else if(posnode == 2) { SW_ITSY2_OFF(); SW_POS2_OFF(); } else if(posnode == 3) { SW_ITSY1_OFF(); SW_POS1_OFF(); SW_ITSY2_OFF(); SW_POS2_OFF(); } break; case CIPHERTEXT: if(posnode == 1) { SW_ITSY1_ON(); SW_POS1_OFF(); } else if(posnode == 2) { SW_ITSY2_ON(); SW_POS2_OFF(); } else if(posnode == 3) { SW_ITSY1_ON(); SW_POS1_OFF(); SW_ITSY2_ON(); SW_POS2_OFF(); } break; case POS: if(posnode == 1) { SW_ITSY1_OFF(); SW_POS1_ON(); } else if(posnode == 2) { SW_ITSY2_OFF(); SW_POS2_ON(); } else if(posnode == 3) { SW_ITSY1_OFF(); SW_ITSY2_OFF(); SW_POS1_ON(); SW_POS2_ON(); } break; } } //开关复位 void tax_sw_reset(uint8_t tax) { OS_ERR err; tax_ch_sw(PLAINTEXT,tax); OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err); tax_ch_sw(POS,tax); OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err); if(device_fixed_info.Encrypt == CIPHERTEXT)//密文 { tax_ch_sw(CIPHERTEXT,tax); } else if(device_fixed_info.Encrypt == PLAINTEXT)//明文 { tax_ch_sw(PLAINTEXT,tax); } printf("pos%d change\n",tax); } //lora和加密模块电源引脚初始化 void lora_encrypt_power_init(uint8_t state) { OS_ERR err; if(state == ITSF_PWR) { ITSF_PWR_OFF(); } else if(state == LORA_PWR) { LORA_PWR_OFF(); } else if(state == ITSF_LORA_PWR) { ITSF_PWR_OFF(); LORA_PWR_OFF(); } OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err); if(state == ITSF_PWR) { ITSF_PWR_ON(); } else if(state == LORA_PWR) { LORA_PWR_ON(); } else if(state == ITSF_LORA_PWR) { ITSF_PWR_ON(); LORA_PWR_ON(); } } //判断明文密文 void port_init(uint8_t state) { // OS_ERR err; //上电先切换控制开关 tax_ch_sw(PLAINTEXT,3); device_fixed_info.Encrypt = 0x80; if (YTSF_GPIO_DETECT == 0) // 插入加密芯片,密文 YTSF_GPIO_DETECT YTSF_GPIO_REV3_DETECT { device_fixed_info.Encrypt |= 0x10; if(state == PORT_LED_ON) { Encryption_type_led_run_state(CIPHERTEXT);//明文密文指示灯运行 } led_run_set(LED_ALL,LED_OFF); } else { device_fixed_info.Encrypt = 0x80; if(state == PORT_LED_ON) { Encryption_type_led_run_state(PLAINTEXT);//明文密文指示灯运行 } } } //pos gpio初始化 void pos_gpio_init(void) { //pos口引脚初始化 GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//使能PORTA,PORTC时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz,这里不用传参,直接写死用最大速度50MHZ GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIO //中断配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟 GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource1); EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿和下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 //设置中断优先级 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //设置中断优先级 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); EXTI_ClearITPendingBit(EXTI_Line0|EXTI_Line1); //清除LINE11上的中断标志 } void EXTI0_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line0) != RESET)//lora中断 { pos_info.pos1_count++; // pos_info.pos1_timecount = TickCounter; if(pos_info.pos1_flag == 0) { timeout_setValue(&pos_info.pos1_tt,POS1_TIMEOUT_TIME,1);//打开pos口后定时 } else { timeout_setValue(&pos_info.pos1_off,POS1_TIMEOUT_TIME,1);//打开pos口后定时 } EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位 } } void EXTI1_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line1) != RESET)//lora中断 { pos_info.pos2_count++; // pos_info.pos2_timecount = TickCounter; if(pos_info.pos2_flag == 0) { timeout_setValue(&pos_info.pos2_tt,POS2_TIMEOUT_TIME,1); } else { timeout_setValue(&pos_info.pos2_off,POS2_TIMEOUT_TIME,1);//打开pos口后定时 } EXTI_ClearITPendingBit(EXTI_Line1);//清除中断标志位 } } //pos初始化 void pos_init(void) { pos_gpio_init(); memset(&pos_info,0,sizeof(pos_info)); } //pos关闭时开关切换 void pos_off_handle(uint8_t num) { tax_ch_sw(PLAINTEXT,num); } //pos机切换 void pos_changle(void) { if(pos_info.pos1_count > POS_SIGNAL_NUM) { if(pos_info.pos1_flag == 0) { pos_info.pos1_flag = 1; timeout_stop(&pos_info.pos1_tt); timeout_setValue(&pos_info.pos1_off,POS1_TIMEOUT_TIME,1); tax_ch_sw(POS,1); printf("pos1 on\n"); pos_change.pos1_num++; AT24CXX_Write(POS_CHANGE_ADDR,(uint8_t *)&pos_change,8); printf("pos1 num:%d\n",pos_change.pos1_num); } } if(pos_info.pos2_count > POS_SIGNAL_NUM) { if(pos_info.pos2_flag == 0) { pos_info.pos2_flag = 1; timeout_stop(&pos_info.pos2_tt); timeout_setValue(&pos_info.pos2_off,POS2_TIMEOUT_TIME,1); tax_ch_sw(POS,2); printf("pos2 on\n"); pos_change.pos2_num++; AT24CXX_Write(POS_CHANGE_ADDR,(uint8_t *)&pos_change,8); printf("pos2 num:%d\n",pos_change.pos2_num); } } if(pos_info.pos1_flag) { if(timeout_isOut(&pos_info.pos1_off)) { pos_info.pos1_count = 0; pos_info.pos1_flag = 0; pos_off_handle(1); printf("this is pos1 off\n"); } } if(pos_info.pos2_flag) { if(timeout_isOut(&pos_info.pos2_off)) { pos_info.pos2_count = 0; pos_info.pos2_flag = 0; pos_off_handle(2); printf("this is pos2 off\n"); } } //如果产生pos信号后1分钟,还没有达到切换pos条件,则清除pos口计数 if(timeout_isOut(&pos_info.pos1_tt)) { pos_info.pos1_count = 0; } if(timeout_isOut(&pos_info.pos2_tt)) { pos_info.pos2_count = 0; } }