/*! ----------------------------------------------------------------------------
|
* @file port.c
|
* @brief HW specific definitions and functions for portability
|
*
|
* @attention
|
*
|
* Copyright 2013 (c) DecaWave Ltd, Dublin, Ireland.
|
*
|
* All rights reserved.
|
*
|
* @author DecaWave
|
*/
|
#include "deca_sleep.h"
|
#include "lcd.h"
|
#include "port.h"
|
|
#define rcc_init(x) RCC_Configuration(x)
|
#define systick_init(x) SysTick_Configuration(x)
|
#define rtc_init(x) RTC_Configuration(x)
|
#define interrupt_init(x) NVIC_Configuration(x)
|
#define usart_init(x) USART_Configuration(x)
|
#define spi_init(x) SPI_Configuration(x)
|
#define gpio_init(x) GPIO_Configuration(x)
|
#define ethernet_init(x) No_Configuration(x)
|
#define fs_init(x) No_Configuration(x)
|
#define usb_init(x) No_Configuration(x)
|
#define lcd_init(x) LCD_Configuration(x)
|
#define touch_screen_init(x) No_Configuration(x)
|
|
/* System tick 32 bit variable defined by the platform */
|
extern __IO unsigned long time32_incr;
|
|
/* Internal functions prototypes. */
|
static void LCD_Configuration(void);
|
static void spi_peripheral_init(void);
|
|
int No_Configuration(void)
|
{
|
return -1;
|
}
|
|
unsigned long portGetTickCnt(void)
|
{
|
return time32_incr;
|
}
|
|
int SysTick_Configuration(void)
|
{
|
if (SysTick_Config(SystemCoreClock / CLOCKS_PER_SEC))
|
{
|
/* Capture error */
|
while (1);
|
}
|
NVIC_SetPriority (SysTick_IRQn, 5);
|
|
return 0;
|
}
|
|
void RTC_Configuration(void)
|
{
|
/* Enable PWR and BKP clocks */
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
|
|
/* Allow access to BKP Domain */
|
PWR_BackupAccessCmd(ENABLE);
|
|
/* Reset Backup Domain */
|
BKP_DeInit();
|
|
/* Enable LSE */
|
RCC_LSEConfig(RCC_LSE_ON);
|
/* Wait till LSE is ready */
|
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {}
|
|
/* Select LSE as RTC Clock Source */
|
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
|
|
/* Enable RTC Clock */
|
RCC_RTCCLKCmd(ENABLE);
|
|
/* Wait for RTC registers synchronization */
|
RTC_WaitForSynchro();
|
|
/* Wait until last write operation on RTC registers has finished */
|
RTC_WaitForLastTask();
|
|
/* Enable the RTC Second */
|
RTC_ITConfig(RTC_IT_SEC, ENABLE);
|
|
/* Wait until last write operation on RTC registers has finished */
|
RTC_WaitForLastTask();
|
|
/* Set RTC prescaler: set RTC period to 1sec */
|
RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
|
|
/* Wait until last write operation on RTC registers has finished */
|
RTC_WaitForLastTask();
|
}
|
|
|
int NVIC_DisableDECAIRQ(void)
|
{
|
EXTI_InitTypeDef EXTI_InitStructure;
|
|
/* 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 = DECAIRQ_EXTI_NOIRQ;
|
EXTI_Init(&EXTI_InitStructure);
|
|
return 0;
|
}
|
|
|
int NVIC_Configuration(void)
|
{
|
GPIO_InitTypeDef GPIO_InitStructure;
|
EXTI_InitTypeDef EXTI_InitStructure;
|
NVIC_InitTypeDef NVIC_InitStructure;
|
|
// Enable GPIO used as DECA IRQ for interrupt
|
GPIO_InitStructure.GPIO_Pin = DECAIRQ;
|
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_Init(DECAIRQ_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 = DECAIRQ_EXTI_USEIRQ;
|
EXTI_Init(&EXTI_InitStructure);
|
|
/* Set NVIC Grouping to 16 groups of interrupt without sub-grouping */
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
|
|
/* Enable and set EXTI Interrupt to the lowest priority */
|
NVIC_InitStructure.NVIC_IRQChannel = DECAIRQ_EXTI_IRQn;
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
NVIC_InitStructure.NVIC_IRQChannelCmd = DECAIRQ_EXTI_USEIRQ;
|
|
NVIC_Init(&NVIC_InitStructure);
|
|
/* Enable the RTC Interrupt */
|
//NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
|
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10;
|
//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
//NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
//NVIC_Init(&NVIC_InitStructure);
|
|
return 0;
|
}
|
|
/**
|
* @brief Checks whether the specified EXTI line is enabled or not.
|
* @param EXTI_Line: specifies the EXTI line to check.
|
* This parameter can be:
|
* @arg EXTI_Linex: External interrupt line x where x(0..19)
|
* @retval The "enable" state of EXTI_Line (SET or RESET).
|
*/
|
ITStatus EXTI_GetITEnStatus(uint32_t EXTI_Line)
|
{
|
ITStatus bitstatus = RESET;
|
uint32_t enablestatus = 0;
|
/* Check the parameters */
|
assert_param(IS_GET_EXTI_LINE(EXTI_Line));
|
|
enablestatus = EXTI->IMR & EXTI_Line;
|
if (enablestatus != (uint32_t)RESET)
|
{
|
bitstatus = SET;
|
}
|
else
|
{
|
bitstatus = RESET;
|
}
|
return bitstatus;
|
}
|
|
int RCC_Configuration(void)
|
{
|
ErrorStatus HSEStartUpStatus;
|
RCC_ClocksTypeDef RCC_ClockFreq;
|
|
/* Set HSION bit */
|
RCC->CR |= (uint32_t)0x00000001;
|
|
// select HSI as PLL source
|
RCC->CFGR |= (uint32_t)RCC_CFGR_PLLSRC_HSI_Div2;
|
|
//PLLCLK=8/2*12=48M
|
RCC->CFGR |= (uint32_t)RCC_CFGR_PLLMULL9;
|
|
/* HCLK = SYSCLK/1 */
|
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
|
|
/* Enable PLL */
|
RCC->CR |= RCC_CR_PLLON;
|
|
/* Wait till PLL is ready */
|
while((RCC->CR & RCC_CR_PLLRDY) == 0)
|
{
|
}
|
/* Select PLL as system clock source */
|
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
|
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
|
|
/* Wait till PLL is used as system clock source */
|
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
|
{
|
}
|
SystemCoreClockUpdate();
|
RCC_GetClocksFreq(&RCC_ClockFreq);
|
|
/* Enable SPI1 clock */
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
|
|
/* Enable SPI2 clock */
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
|
|
/* Enable GPIOs clocks */
|
RCC_APB2PeriphClockCmd(
|
RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
|
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
|
RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,
|
ENABLE);
|
|
return 0;
|
}
|
|
void usartinit(void)
|
{
|
USART_InitTypeDef USART_InitStructure;
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
/* USARTx configured as follow:
|
- BaudRate = 115200 baud
|
- Word Length = 8 Bits
|
- One Stop Bit
|
- No parity
|
- Hardware flow control disabled (RTS and CTS signals)
|
- Receive and transmit enabled
|
*/
|
USART_InitStructure.USART_BaudRate = 115200 ;
|
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
USART_InitStructure.USART_StopBits = USART_StopBits_1;
|
USART_InitStructure.USART_Parity = USART_Parity_No;
|
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
|
/* Enable GPIO clock */
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
|
|
//For EVB1000 -> USART2_REMAP = 0
|
|
/* Enable the USART2 Pins Software Remapping */
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
|
|
|
/* Configure USART Tx as alternate function push-pull */
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
/* Configure USART Rx as input floating */
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
/* USART configuration */
|
USART_Init(USART1, &USART_InitStructure);
|
|
/* Enable USART */
|
USART_Cmd(USART1, ENABLE);
|
}
|
|
void SPI_ChangeRate(uint16_t scalingfactor)
|
{
|
uint16_t tmpreg = 0;
|
|
/* Get the SPIx CR1 value */
|
tmpreg = SPIx->CR1;
|
|
/*clear the scaling bits*/
|
tmpreg &= 0xFFC7;
|
|
/*set the scaling bits*/
|
tmpreg |= scalingfactor;
|
|
/* Write to SPIx CR1 */
|
SPIx->CR1 = tmpreg;
|
}
|
|
/*! ------------------------------------------------------------------------------------------------------------------
|
* @fn spi_set_rate_low()
|
*
|
* @brief Set SPI rate to less than 3 MHz to properly perform DW1000 initialisation.
|
*
|
* @param none
|
*
|
* @return none
|
*/
|
void spi_set_rate_low (void)
|
{
|
SPI_ChangeRate(SPI_BaudRatePrescaler_32);
|
}
|
|
/*! ------------------------------------------------------------------------------------------------------------------
|
* @fn spi_set_rate_high()
|
*
|
* @brief Set SPI rate as close to 20 MHz as possible for optimum performances.
|
*
|
* @param none
|
*
|
* @return none
|
*/
|
void spi_set_rate_high (void)
|
{
|
SPI_ChangeRate(SPI_BaudRatePrescaler_16);
|
}
|
|
void SPI_ConfigFastRate(uint16_t scalingfactor)
|
{
|
SPI_InitTypeDef SPI_InitStructure;
|
|
SPI_I2S_DeInit(SPIx);
|
|
// SPIx Mode setup
|
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
|
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
|
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
|
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //
|
//SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //
|
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
|
//SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //
|
//SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
|
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
|
SPI_InitStructure.SPI_BaudRatePrescaler = scalingfactor; //sets BR[2:0] bits - baudrate in SPI_CR1 reg bits 4-6
|
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
|
SPI_InitStructure.SPI_CRCPolynomial = 7;
|
|
SPI_Init(SPIx, &SPI_InitStructure);
|
|
// Enable SPIx
|
SPI_Cmd(SPIx, ENABLE);
|
}
|
|
int SPI_Configuration(void)
|
{
|
SPI_InitTypeDef SPI_InitStructure;
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
SPI_I2S_DeInit(SPIx);
|
|
// SPIx Mode setup
|
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
|
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
|
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
|
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //
|
//SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //
|
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
|
//SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //
|
//SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
|
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
|
//SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //sets BR[2:0] bits - baudrate in SPI_CR1 reg bits 4-6
|
SPI_InitStructure.SPI_BaudRatePrescaler = SPIx_PRESCALER;
|
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
|
SPI_InitStructure.SPI_CRCPolynomial = 7;
|
|
SPI_Init(SPIx, &SPI_InitStructure);
|
|
// SPIx SCK and MOSI pin setup
|
GPIO_InitStructure.GPIO_Pin = SPIx_SCK | SPIx_MOSI;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_Init(SPIx_GPIO, &GPIO_InitStructure);
|
|
// SPIx MISO pin setup
|
GPIO_InitStructure.GPIO_Pin = SPIx_MISO;
|
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
|
GPIO_Init(SPIx_GPIO, &GPIO_InitStructure);
|
|
// SPIx CS pin setup
|
GPIO_InitStructure.GPIO_Pin = SPIx_CS;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_Init(SPIx_CS_GPIO, &GPIO_InitStructure);
|
|
// Disable SPIx SS Output
|
SPI_SSOutputCmd(SPIx, DISABLE);
|
|
// Enable SPIx
|
SPI_Cmd(SPIx, ENABLE);
|
|
// Set CS high
|
GPIO_SetBits(SPIx_CS_GPIO, SPIx_CS);
|
|
return 0;
|
}
|
|
|
int SPI2_Configuration(void)
|
{
|
SPI_InitTypeDef SPI_InitStructure;
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
SPI_I2S_DeInit(SPIy);
|
|
// SPIy Mode setup
|
//SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
|
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
|
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
|
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
|
//SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //
|
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //
|
//SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
|
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //
|
//SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
|
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
|
SPI_InitStructure.SPI_BaudRatePrescaler = SPIy_PRESCALER;
|
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
|
SPI_InitStructure.SPI_CRCPolynomial = 7;
|
|
SPI_Init(SPIy, &SPI_InitStructure);
|
|
// SPIy SCK and MOSI pin setup
|
GPIO_InitStructure.GPIO_Pin = SPIy_SCK | SPIy_MOSI;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_Init(SPIy_GPIO, &GPIO_InitStructure);
|
|
// SPIy MISO pin setup
|
GPIO_InitStructure.GPIO_Pin = SPIy_MISO;
|
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
|
GPIO_Init(SPIy_GPIO, &GPIO_InitStructure);
|
|
// SPIy CS pin setup
|
GPIO_InitStructure.GPIO_Pin = SPIy_CS;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_Init(SPIy_CS_GPIO, &GPIO_InitStructure);
|
|
// Disable SPIy SS Output
|
SPI_SSOutputCmd(SPIy, DISABLE);
|
|
// Enable SPIy
|
SPI_Cmd(SPIy, ENABLE);
|
|
// Set CS high
|
GPIO_SetBits(SPIy_CS_GPIO, SPIy_CS);
|
|
// LCD_RS pin setup
|
GPIO_InitStructure.GPIO_Pin = LCD_RS;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_Init(SPIy_GPIO, &GPIO_InitStructure);
|
|
// LCD_RW pin setup
|
GPIO_InitStructure.GPIO_Pin = LCD_RW;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_Init(SPIy_GPIO, &GPIO_InitStructure);
|
|
return 0;
|
}
|
//#define LED_PIN GPIO_Pin_8
|
#define SW1 GPIO_Pin_12
|
#define SW2 GPIO_Pin_15
|
#define SW3 GPIO_Pin_3
|
#define SW4 GPIO_Pin_4
|
#define SW5 GPIO_Pin_5
|
#define SW6 GPIO_Pin_6
|
#define SW7 GPIO_Pin_7
|
#define SW8 GPIO_Pin_8
|
uint8_t Work_Mode;
|
extern uint8_t TAG_ID, ANCHOR_ID;
|
int GPIO_Configuration(void)
|
{
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
/* Configure all unused GPIO port pins in Analog Input mode (floating input
|
* trigger OFF), this will reduce the power consumption and increase the device
|
* immunity against EMI/EMC */
|
|
// Enable GPIOs clocks
|
RCC_APB2PeriphClockCmd(
|
RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
|
RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,
|
ENABLE);
|
|
// Set all GPIO pins as analog inputs
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
|
//Enable GPIO used for User button
|
GPIO_InitStructure.GPIO_Pin = TA_BOOT1;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
GPIO_Init(TA_BOOT1_GPIO, &GPIO_InitStructure);
|
|
//Enable GPIO used for Response Delay setting
|
|
GPIO_InitStructure.GPIO_Pin = SW1 | SW2;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
GPIO_InitStructure.GPIO_Pin = SW3 | SW4 | SW5 | SW6 | SW7 | SW8;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|
GPIO_InitStructure.GPIO_Pin = LED_PIN;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
if (GPIO_ReadInputDataBit(GPIOA, SW1) == RESET)
|
{
|
Work_Mode = 0;//TX
|
GPIO_Toggle(GPIOA, LED_PIN);
|
}
|
else
|
{
|
Work_Mode = 1; //RX
|
}
|
TAG_ID = 0;
|
if(GPIO_ReadInputDataBit(GPIOB, SW6) == RESET)
|
{
|
TAG_ID |= 1 << 2;
|
}
|
if(GPIO_ReadInputDataBit(GPIOB, SW7) == RESET)
|
{
|
TAG_ID |= 1 << 1;
|
}
|
if(GPIO_ReadInputDataBit(GPIOB, SW8) == RESET)
|
{
|
TAG_ID |= 1;
|
}
|
|
if(GPIO_ReadInputDataBit(GPIOB, SW3) == RESET)
|
{
|
ANCHOR_ID |= 1 << 2;
|
}
|
if(GPIO_ReadInputDataBit(GPIOB, SW4) == RESET)
|
{
|
ANCHOR_ID |= 1 << 1;
|
}
|
if(GPIO_ReadInputDataBit(GPIOB, SW5) == RESET)
|
{
|
ANCHOR_ID |= 1;
|
}
|
|
// Disable GPIOs clocks
|
//RCC_APB2PeriphClockCmd(
|
// RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
|
// RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
|
// RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,
|
// DISABLE);
|
|
// Enable GPIO used for LEDs
|
|
|
return 0;
|
}
|
|
|
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 setup_DW1000RSTnIRQ(int enable)
|
{
|
GPIO_InitTypeDef GPIO_InitStructure;
|
EXTI_InitTypeDef EXTI_InitStructure;
|
NVIC_InitTypeDef NVIC_InitStructure;
|
|
if(enable)
|
{
|
// Enable GPIO used as DECA IRQ for interrupt
|
GPIO_InitStructure.GPIO_Pin = DECARSTIRQ;
|
//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_Mode = GPIO_Mode_IN_FLOATING;
|
GPIO_Init(DECARSTIRQ_GPIO, &GPIO_InitStructure);
|
|
/* Connect EXTI Line to GPIO Pin */
|
GPIO_EXTILineConfig(DECARSTIRQ_EXTI_PORT, DECARSTIRQ_EXTI_PIN);
|
|
/* Configure EXTI line */
|
EXTI_InitStructure.EXTI_Line = DECARSTIRQ_EXTI;
|
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //MP IRQ polarity is high by default
|
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
EXTI_Init(&EXTI_InitStructure);
|
|
/* Set NVIC Grouping to 16 groups of interrupt without sub-grouping */
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
|
|
/* Enable and set EXTI Interrupt to the lowest priority */
|
NVIC_InitStructure.NVIC_IRQChannel = DECARSTIRQ_EXTI_IRQn;
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
NVIC_Init(&NVIC_InitStructure);
|
}
|
else
|
{
|
//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);
|
|
/* Configure EXTI line */
|
EXTI_InitStructure.EXTI_Line = DECARSTIRQ_EXTI;
|
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //MP IRQ polarity is high by default
|
EXTI_InitStructure.EXTI_LineCmd = DISABLE;
|
EXTI_Init(&EXTI_InitStructure);
|
}
|
}
|
|
|
int ETH_GPIOConfigure(void)
|
{
|
#if 0
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
/* ETHERNET pins configuration */
|
/* AF Output Push Pull:
|
- ETH_MII_MDIO / ETH_RMII_MDIO: PA2
|
- ETH_MII_MDC / ETH_RMII_MDC: PC1
|
- ETH_MII_TXD2: PC2
|
- ETH_MII_TX_EN / ETH_RMII_TX_EN: PB11
|
- ETH_MII_TXD0 / ETH_RMII_TXD0: PB12
|
- ETH_MII_TXD1 / ETH_RMII_TXD1: PB13
|
- ETH_MII_PPS_OUT / ETH_RMII_PPS_OUT: PB5
|
- ETH_MII_TXD3: PB8 */
|
|
/* Configure PA2 as alternate function push-pull */
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
/* Configure PC1 and PC2 as alternate function push-pull */
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
/* Configure PB5, PB8, PB11, PB12 and PB13 as alternate function push-pull */
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_11 |
|
GPIO_Pin_12 | GPIO_Pin_13;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|
/**************************************************************/
|
/* For Remapped Ethernet pins */
|
/*************************************************************/
|
/* Input (Reset Value):
|
- ETH_MII_CRS CRS: PA0
|
- ETH_MII_RX_CLK / ETH_RMII_REF_CLK: PA1
|
- ETH_MII_COL: PA3
|
- ETH_MII_RX_DV / ETH_RMII_CRS_DV: PD8
|
- ETH_MII_TX_CLK: PC3
|
- ETH_MII_RXD0 / ETH_RMII_RXD0: PD9
|
- ETH_MII_RXD1 / ETH_RMII_RXD1: PD10
|
- ETH_MII_RXD2: PD11
|
- ETH_MII_RXD3: PD12
|
- ETH_MII_RX_ER: PB10 */
|
|
/* Configure PA0, PA1 and PA3 as input */
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
/* Configure PB10 as input */
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|
/* Configure PC3 as input */
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
/* Configure PD8, PD9, PD10, PD11 and PD12 as input */
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
GPIO_Init(GPIOD, &GPIO_InitStructure); /**/
|
|
|
|
/* MCO pin configuration------------------------------------------------- */
|
/* Configure MCO (PA8) as alternate function push-pull */
|
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
|
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
//GPIO_Init(GPIOA, &GPIO_InitStructure);
|
#endif
|
|
return 0;
|
}
|
|
int is_button_low(uint16_t GPIOpin)
|
{
|
int result = 1;
|
|
if (GPIO_ReadInputDataBit(TA_BOOT1_GPIO, TA_BOOT1))
|
result = 0;
|
|
return result;
|
}
|
|
//when switch (S1) is 'on' the pin is low
|
int is_switch_on(uint16_t GPIOpin)
|
{
|
int result = 1;
|
|
if (GPIO_ReadInputDataBit(TA_SW1_GPIO, GPIOpin))
|
result = 0;
|
|
return result;
|
}
|
|
|
void led_off (led_t led)
|
{
|
switch (led)
|
{
|
case LED_PC6:
|
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
|
break;
|
case LED_PC7:
|
GPIO_ResetBits(GPIOC, GPIO_Pin_7);
|
break;
|
case LED_PC8:
|
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
|
break;
|
case LED_PC9:
|
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
|
break;
|
case LED_ALL:
|
GPIO_ResetBits(GPIOC, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_6 | GPIO_Pin_7);
|
break;
|
default:
|
// do nothing for undefined led number
|
break;
|
}
|
}
|
|
void led_on (led_t led)
|
{
|
switch (led)
|
{
|
case LED_PC6:
|
GPIO_SetBits(GPIOC, GPIO_Pin_6);
|
break;
|
case LED_PC7:
|
GPIO_SetBits(GPIOC, GPIO_Pin_7);
|
break;
|
case LED_PC8:
|
GPIO_SetBits(GPIOC, GPIO_Pin_8);
|
break;
|
case LED_PC9:
|
GPIO_SetBits(GPIOC, GPIO_Pin_9);
|
break;
|
case LED_ALL:
|
GPIO_SetBits(GPIOC, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_6 | GPIO_Pin_7);
|
break;
|
default:
|
// do nothing for undefined led number
|
break;
|
}
|
}
|
|
#ifdef USART_SUPPORT
|
|
/**
|
* @brief Configures COM port.
|
* @param USART_InitStruct: pointer to a USART_InitTypeDef structure that
|
* contains the configuration information for the specified USART peripheral.
|
* @retval None
|
*/
|
|
|
|
|
//#include <stdio.h>
|
//#include <stdarg.h>
|
//#include <stdlib.h>
|
//void printf2(const char *format, ...)
|
//{
|
// va_list list;
|
// va_start(list, format);
|
|
// int len = vsnprintf(0, 0, format, list);
|
// char *s;
|
|
// s = (char *)malloc(len + 1);
|
// vsprintf(s, format, list);
|
|
// USART_puts(s);
|
|
// free(s);
|
// va_end(list);
|
// return;
|
//}
|
|
|
#endif
|
|
|
int is_IRQ_enabled(void)
|
{
|
return (( NVIC->ISER[((uint32_t)(DECAIRQ_EXTI_IRQn) >> 5)]
|
& (uint32_t)0x01 << (DECAIRQ_EXTI_IRQn & (uint8_t)0x1F) ) ? 1 : 0) ;
|
}
|
|
/*! ------------------------------------------------------------------------------------------------------------------
|
* @fn LCD_configuration()
|
*
|
* @brief Initialise LCD screen.
|
*
|
* @param none
|
*
|
* @return none
|
*/
|
static void LCD_Configuration(void)
|
{
|
unsigned char initseq[9] = { 0x39, 0x14, 0x55, 0x6D, 0x78, 0x38, 0x0C, 0x01, 0x06 };
|
unsigned char command = 0x0;
|
|
// Write initialisation sequence.
|
writetoLCD(9, 0, initseq);
|
deca_sleep(10);
|
|
// Return cursor home and clear screen.
|
command = 0x2;
|
writetoLCD(1, 0, &command);
|
command = 0x1;
|
writetoLCD(1, 0, &command);
|
}
|
|
/*! ------------------------------------------------------------------------------------------------------------------
|
* @fn spi_peripheral_init()
|
*
|
* @brief Initialise all SPI peripherals at once.
|
*
|
* @param none
|
*
|
* @return none
|
*/
|
static void spi_peripheral_init(void)
|
{
|
spi_init();
|
|
// Initialise SPI2 peripheral for LCD contro
|
|
// Wait for LCD to power on.
|
deca_sleep(10);
|
}
|
|
/*! ------------------------------------------------------------------------------------------------------------------
|
* @fn peripherals_init()
|
*
|
* @brief Initialise all peripherals.
|
*
|
* @param none
|
*
|
* @return none
|
*/
|
void peripherals_init (void)
|
{
|
rcc_init();
|
gpio_init();
|
systick_init();
|
spi_peripheral_init();
|
usartinit();
|
}
|