// 本模块为硬件驱动的接口层，包括HAL和LL库里相关函数的实现
#ifndef __HAL_INTERFACE_H
#define __HAL_INTERFACE_H

#include "stm32l4xx_hal.h"
#include "type.h"

// 是否允许调试打印输出？
#define PRINT_DEBUG	1

#if PRINT_DEBUG
	#define PRINTF printf
#else
	#define PRINTF NO_PRINTF
#endif

#define NO_PRINTF(format, ...) {}
	
// 延时函数
#define GetTickCount() HAL_GetTick()
u32 GetDelayTick(u32 ms);
u8 IsTickOut(u32 OutTick);
void delay_ms(u32 ms);
void delay_us(uint16_t us);
	
// 实现从Bootloader跳转到App
void JumpToEntry(uint32_t addr);
// 实现从App跳转到Bootloader
void JumpToLoader();

typedef struct USART_Handle
{
	USART_TypeDef 		*Instance;
	volatile uint16_t 	TxXferCount;
	volatile uint8_t 	BusyTx;		// 发送忙
	volatile uint8_t	ITx;		// 是否以中断方式发送
	uint8_t 			*pTxBuffPtr;
	void 				(*TxISR)(struct USART_Handle *huart);
	void 				(*RxISR)(struct USART_Handle *huart);
} USART_Handle;

extern USART_Handle huart1, huart2, huart3, hlpuart1;

// 实现串口发送
void UART_Transmit(USART_Handle *uart, uint8_t *buf, uint16_t len);
// 实现以中断方式串口发送
uint8_t UART_Transmit_IT(USART_Handle *huart, uint8_t *pData, uint16_t Size);
// 应用程序的串口中断处理
void APP_USART_IRQHandler(USART_Handle *usart);

// 启动原因代码
extern volatile uint32_t SYS_RSTSTS;
// 读取启动原因代码
void Get_ResetFlags();
	
#endif
