#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();
|
}
|
}
|