#ifndef __BSP_H__
#define __BSP_H__

/* BSP INCLUDE */
#include "Board.h"
/* STDC INCLUDE */
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* MCU INCLUDE */
#include <stm32f10x.h>
#include "stm32f10x_conf.h"

//SystemInit
void BspConfigInit(void);

//GPIO
#define IO_TYPE_DO  0
#define IO_TYPE_DI  1
#define IO_TYPE_AO  2
#define IO_TYPE_AI  3
#define IO_TYPE_LED 4
typedef enum {
    false = 0,
    true  = 1,
} bool_t;
typedef struct
{
    GPIO_TypeDef* GpioX;
    uint16_t GpioPinX;
}GPIO_LIST;
void BspInitGpioClock(void);
void GpioConfig(GPIO_TypeDef* GpioX, uint16_t GpioPinX, GPIOMode_TypeDef GpioMode, GPIOSpeed_TypeDef GpioSpeed);
void SetGpioSts(GPIO_TypeDef* GpioX, uint16_t GpioPinX, bool_t state);
bool_t GetGpioSts(GPIO_TypeDef *GpioX, uint16_t GpioPinX);

//Delay
void DelayConfig(void);
uint32_t GetDwtCnt(void);
void DelayUs(uint32_t Us);
void DelayMs(uint32_t Ms);

//Interrupt
#define INTERRUPT_NUM   300
typedef struct
{
    void(*CallBack)(uint32_t);     //回调函数
    int32_t IntId;              //触发中断的外设id
} INT_DESC;
typedef struct
{
    INT_DESC Adc_1_2;            
    INT_DESC Usb_Hp_Can1_Tx;
    INT_DESC Usb_Hp_Can1_Rx0;   
    INT_DESC Can1_Rx1;            
    INT_DESC Can1_Sce;
    INT_DESC Exti_9_5;
    INT_DESC Tim_1_Brk;
    INT_DESC Tim_1_Up;
    INT_DESC Tim_1_Trg_Com;
    INT_DESC Tim_1_Cc;
    INT_DESC Tim_2;
    INT_DESC Tim_3;
    INT_DESC Tim_4;
    INT_DESC I2c_1_Ev;
    INT_DESC I2c_1_ER;
    INT_DESC I2c_2_Ev;
    INT_DESC I2c_2_ER;
    INT_DESC Spi_1;
    INT_DESC Spi_2;
    INT_DESC Usart1;
    INT_DESC Usart2;
    INT_DESC Usart3;
    INT_DESC Exti_15_10;
    INT_DESC Rtc_Alarm;
    INT_DESC Usb_WackUp;
    INT_DESC Tim_8_Brk;
    INT_DESC Tim_8_Up;
    INT_DESC Tim_8_Trg_Com;
    INT_DESC Tim_8_Cc;
    INT_DESC Adc_3;
    INT_DESC Fsmc;
    INT_DESC Sdio;
    INT_DESC Tim_5;
    INT_DESC Spi_3;
    INT_DESC Uart4;
    INT_DESC Uart5;
    INT_DESC Tim_6;
    INT_DESC Tim_7;
    INT_DESC Dma_2_Chnl_1;
    INT_DESC Dma_2_Chnl_2;
    INT_DESC Dma_2_Chnl_3;
    INT_DESC Dma_2_Chnl_4;
} SYSTEM_INT_REG;
void DisAllowInt(void);
void AllowInt(void);
void IntCbInit(void);
void IntCbReg(uint32_t Vector, void(*Func)(uint32_t));
void IntSetLevel(uint32_t Vector, uint8_t NvicPrePriority, uint8_t NvicSubPriority);


//USART
#define DataBit_8       USART_WordLength_8b
#define DataBit_9       USART_WordLength_9b
#define StopBit_1       USART_StopBits_1
#define StopBit_0_5     USART_StopBits_0_5
#define StopBit_2       USART_StopBits_2
#define StopBit_1_5     USART_StopBits_1_5
#define Parity_No       USART_Parity_No  
#define Parity_Even     USART_Parity_Even
#define Parity_Odd      USART_Parity_Odd 
void BspInitUsartClock(void);
void UsartStdConfig(uint32_t ComId, uint32_t baud);
void UsartAdvConfig(uint32_t ComId, uint32_t baud, uint8_t DataBits, uint8_t StopBits, uint8_t Parity);
void UsartSendChar(uint32_t ComId,uint8_t Data);
void UsartSendStr(uint32_t ComId,uint8_t* Data, uint64_t Len);
uint8_t UsartReceiveChar(uint32_t ComId);

//用户层接口
void IoCtlToggleDo(uint16_t IoChnl);
uint32_t IoCtl(uint8_t IoType, uint16_t IoChnl,uint32_t state);
void IoCtlLedToggle(uint16_t IoChnl);
#endif
