| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 |
- /*
- * @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;
- }
- }
|