#ifndef __PAN_HAL_H__ #define __PAN_HAL_H__ #include //#include "sdk_config.h" typedef enum { HAL_SUCCESS, HAL_INVALID_PARAMS, HAL_IO_ERROR, HAL_DEVICE_BUSY, HAL_NO_MEM, HAL_NO_HARDWARE_SOURCE, HAL_UNKNOWN, } HAL_Error; typedef enum { HAL_OK = 0x00U, HAL_ERROR = 0x01U, HAL_BUSY = 0x02U, HAL_TIMEOUT = 0x03U } HAL_Status; #define HAL_TIME_FOREVER 0xFFFFFFFFU #define HAL_ASSERT SYS_ASSERT extern uint32_t HAL_TimeConvMsToTick(uint32_t ms); extern uint32_t HAL_TimeGetCurrTick(void); extern void HAL_DelayMs(uint32_t ms); extern void HAL_DriverInit(void); extern void HAL_IoTimingTrackInit(void); #include "pan_hal_gpio.h" #include "pan_hal_uart.h" #include "pan_hal_dmac.h" #include "pan_hal_spi.h" #include "pan_hal_i2c.h" #include "pan_hal_wdt.h" #include "pan_hal_wwdt.h" #include "pan_hal_pwm.h" #include "pan_hal_timer.h" #include "pan_hal_adc.h" /* IO Timing Track for IRQs of HAL Driver */ #if CONFIG_IO_TIMING_TRACK // Define an alternative name of PDIOs to support keil configuration wizard of sdk config file #define P0x00 P00 #define P0x01 P01 #define P0x02 P02 #define P0x03 P03 #define P0x04 P04 #define P0x05 P05 #define P0x06 P06 #define P0x07 P07 #define P0x10 P10 #define P0x11 P11 #define P0x12 P12 #define P0x13 P13 #define P0x14 P14 #define P0x15 P15 #define P0x16 P16 #define P0x17 P17 #define P0x20 P20 #define P0x21 P21 #define P0x22 P22 #define P0x23 P23 #define P0x24 P24 #define P0x25 P25 #define P0x26 P26 #define P0x27 P27 #define P0x30 P30 #define P0x31 P31 __STATIC_FORCEINLINE void HAL_SetMfpGpio(uint8_t port, uint8_t bit) { (&SYS->P0_MFP)[port] = (&SYS->P0_MFP)[port] & ~(SYS_MFP_P00_Msk << bit); } __STATIC_FORCEINLINE void HAL_GpioSetModeOutput(uint8_t port, uint8_t bit) { GPIO_SetMode((GPIO_T*)(P0_BASE + 0x40 * (port)), BIT0 << bit, GPIO_MODE_OUTPUT); } __STATIC_FORCEINLINE void HAL_GpioToggle(uint8_t port, uint8_t bit) { GPIO_Toggle((GPIO_T*)(P0_BASE + 0x40 * (port)), BIT0 << bit); } #define __GPIO_OUTPUT_INIT_PIN(pinId, initLevel) \ do { \ uint32_t port = pinId >> 4; \ uint32_t bit = pinId & 0x0F; \ HAL_SetMfpGpio(port, bit); \ HAL_GpioSetModeOutput(port, bit); \ GPIO_PIN_ADDR(port, bit) = initLevel; \ } while (0) #define __PAN_COND_CODE_0x99(_flag, _if_0x99_code, _else_code) \ __PAN_COND_CODE(_NNNNN##_flag, _if_0x99_code, _else_code) #define _NNNNN0x99 _ZZZZZ, /** * @brief Like PAN_COND_CODE_1() except tests if _flag is 0x99. * * This is like PAN_COND_CODE_1(), except that it tests whether _flag * expands to the integer literal 0x99. It expands to _if_0x99_code if * so, and _else_code otherwise; both of these must be enclosed in * parentheses. * * @param _flag evaluated flag * @param _if_0x99_code result if _flag expands to 0x99; must be in parentheses * @param _else_code result otherwise; must be in parentheses * @see PAN_COND_CODE_1() */ #define PAN_COND_CODE_0x99(_flag, _if_0x99_code, _else_code) \ __PAN_COND_CODE_0x99(_flag, _if_0x99_code, _else_code) /** * @brief Init specified GPIO pin for IO Timing Track */ #define PAN_IO_TIMING_TRACK_INIT_PIN(_track_pin, _init_level) \ PAN_COND_CODE_0x99(_track_pin, (), (__GPIO_OUTPUT_INIT_PIN(_track_pin, _init_level))) /** * @brief Set level for specified IO timing track pin */ #define PAN_IO_TIMING_TRACK_LEVEL(_track_pin, _level) \ PAN_COND_CODE_0x99(_track_pin, (), (PAN_CONCAT(P, _track_pin) = _level)) /** * @brief Toggle specified IO timing track pin */ #define PAN_IO_TIMING_TRACK_TOGGLE(_track_pin) \ PAN_COND_CODE_0x99(_track_pin, (), (do{uint32_t port = _track_pin >> 4; uint32_t bit = _track_pin & 0x0F; HAL_GpioToggle(port, bit);} while(0))) #else #define PAN_IO_TIMING_TRACK_INIT_PIN(...) #define PAN_IO_TIMING_TRACK_LEVEL(...) #define PAN_IO_TIMING_TRACK_TOGGLE(...) #endif // CONFIG_IO_TIMING_TRACK #endif // __PAN_HAL_H__