#include "dw_driver.h" #include "deca_device_api.h" void Reset_DW1000(void) { GPIO_InitTypeDef GPIO_InitStructure; // Enable GPIO used for DW1000 reset GPIO_InitStructure.GPIO_Pin = DW1000_RSTn; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DW1000_RSTn_GPIO, &GPIO_InitStructure); //drive the RSTn pin low GPIO_ResetBits(DW1000_RSTn_GPIO, DW1000_RSTn); //put the pin back to tri-state ... as input GPIO_InitStructure.GPIO_Pin = DW1000_RSTn; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DW1000_RSTn_GPIO, &GPIO_InitStructure); deca_sleep(2); } void DW_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* Enable GPIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Enable GPIO used for DW1000 wakeup GPIO_InitStructure.GPIO_Pin = DW1000_WAKEUP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DW1000_WAKEUP_GPIO, &GPIO_InitStructure); // Enable GPIO used for DW1000 IRQ GPIO_InitStructure.GPIO_Pin = DW1000_IRQ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //IRQ pin should be Pull Down to prevent unnecessary EXT IRQ while DW1000 goes to sleep mode GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DW1000_IRQ_GPIO, &GPIO_InitStructure); // Connect EXTI Line to GPIO Pin GPIO_EXTILineConfig(DECAIRQ_EXTI_PORT, DECAIRQ_EXTI_PIN); // Configure EXTI line EXTI_InitStructure.EXTI_Line = DECAIRQ_EXTI; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //MPW3 IRQ polarity is high by default EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } //¶ÁÈ¡ÍⲿÖжÏ״̬ ITStatus Get_Ext_IRQ_Statues(void) { return EXTI_GetITStatus(DECAIRQ_EXTI); } //ʹÄÜÍⲿÖÐ¶Ï void Enable_Ext_IRQ(void) { NVIC_EnableIRQ(DECAIRQ_EXTI_IRQn); } //½ûÖ¹ÍⲿÖÐ¶Ï void Disable_Ext_IRQ(void) { NVIC_DisableIRQ(DECAIRQ_EXTI_IRQn); } /*! ------------------------------------------------------------------------------------------------------------------ * Function: decamutexon() * * Description: This function should disable interrupts. This is called at the start of a critical section * It returns the irq state before disable, this value is used to re-enable in decamutexoff call * * Note: The body of this function is defined in deca_mutex.c and is platform specific * * input parameters: * * output parameters * * returns the state of the DW1000 interrupt */ decaIrqStatus_t decamutexon(void) { decaIrqStatus_t s = Get_Ext_IRQ_Statues(); if(s) { Disable_Ext_IRQ(); //disable the external interrupt line } return s ; // return state before disable, value is used to re-enable in decamutexoff call } /*! ------------------------------------------------------------------------------------------------------------------ * Function: decamutexoff() * * Description: This function should re-enable interrupts, or at least restore their state as returned(&saved) by decamutexon * This is called at the end of a critical section * * Note: The body of this function is defined in deca_mutex.c and is platform specific * * input parameters: * @param s - the state of the DW1000 interrupt as returned by decamutexon * * output parameters * * returns the state of the DW1000 interrupt */ void decamutexoff(decaIrqStatus_t s) // put a function here that re-enables the interrupt at the end of the critical section { if(s) //need to check the port state as we can't use level sensitive interrupt on the STM ARM { Enable_Ext_IRQ(); } }