/**
* @file INCLUDE_ATY.h
*
* @param Project DEVICE_GENERAL_ATY_LIB
*
* @author ATY
*
* @copyright
* - Copyright 2017 - 2026 MZ-ATY
* - This code follows:
* - MZ-ATY Various Contents Joint Statement -
*
* https://mengze.top/MZ-ATY_VCJS
* - CC 4.0 BY-NC-SA -
*
* https://creativecommons.org/licenses/by-nc-sa/4.0/
* - Your use will be deemed to have accepted the terms of this statement.
*
* @brief Headers include or defines for C platform
*
* @version
* - D+: Design, T+: Test, A+: Archive
* - 1_01_220605 > ATY
* -# Preliminary version, first Release
* - 1_02_251114 > ATY
* -# refact and reorganize
* @todo Not support 64 platfrom, do or never(and double)
********************************************************************************
*/
// fromelf.exe --bin -o ./Pro/Pro.bin ./Pro/Pro.axf
/* Keyword *********************************************************************
| ANSI C (A) | ANSI C (B) | C99 | C11 | C51(C89) |
|------------|------------|------------|-----------------|------------|
| auto | break | inline | _Alignas | _at_ |
| case | char | restrict | _Alignof | bdata |
| const | continue | _Bool | _Atomic | bit |
| default | do | _Complex | _Static_assert | code |
| double | else | _Imaginary | _Noreturn | data |
| enum | extern | | _Thread_local | idata |
| float | for | | _Generic | xdata |
| goto | if | | | pdata |
| int | long | | | sbit |
| register | return | | | sfr |
| short | signed | | | sfr16 |
| sizeof | static | | | interrupt |
| struct | switch | | | using |
| typedef | union | | | reentrant |
| unsigned | void | | | |
| volatile | while | | | |
********************************************************************************
Removed keywords (C51 or compiler-model terms):
- alien, compact, large, small, _priority_, _task_
*/
#ifndef __INCLUDE_ATY_H
#define __INCLUDE_ATY_H
/******************************* Platform *************************************/
/********************************* Words **************************************/
#if defined (__SDCC_SYNTAX_FIX)
# warning SDCC unrecognized compiler
#define __BIT
#define __DATA
#define __IDATA
#define __PDATA
#define __XDATA
#define __CODE
#define __REENTRANT
#define __ATY_NOP
#define __ATY_WEAK
#elif defined(SDCC) || defined(__SDCC)
#define __BIT __bit
#define __DATA __data
#define __IDATA __idata
#define __PDATA __pdata
#define __XDATA __xdata
#define __CODE __code
#define __REENTRANT __reentrant
#define __ATY_NOP __asm NOP __endasm
#define __ATY_WEAK
#elif defined(__CX51__) || defined(__C51__)
#define __BIT bit
#define __DATA data
#define __IDATA idata
#define __PDATA pdata
#define __XDATA xdata
#define __CODE code
#define __REENTRANT reentrant
#include // _nop_()
extern void _nop_(void);
#define __ATY_NOP _nop_()
#define __ATY_WEAK
#elif defined(__ICCARM__)
#define __BIT bit
#define __DATA
#define __IDATA
#define __PDATA
#define __XDATA
#define __REENTRANT
#define __CODE
#define __ATY_NOP __nop()
#define __ATY_WEAK __WEAK __ATTRIBUTES
#elif defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__ARMCOMPILER_VERSION)
#define __BIT bit
#define __DATA
#define __IDATA
#define __PDATA
#define __XDATA
#define __REENTRANT
#define __CODE
#define __ATY_NOP __nop()
#define __ATY_WEAK __weak
#else
#warning Unsupported compiler!
#endif /* Words */
/******************************* Compiler *************************************/
#if defined(_MSC_VER)
#warning __ATY_COMPILER_MSVC 1
#define __ATY_COMPILER_MSVC 1
#else
#define __ATY_COMPILER_MSVC 0
#endif
#if defined(__clang__)
#warning __ATY_COMPILER_CLANG 1
#define __ATY_COMPILER_CLANG 1
#else
#define __ATY_COMPILER_CLANG 0
#endif
#if defined(__GNUC__) && !defined(__clang__)
// ESP-IDF,
#warning __ATY_COMPILER_GCC 1
#define __ATY_COMPILER_GCC 1
#else
#define __ATY_COMPILER_GCC 0
#endif
#if defined(__ICCARM__)
// IAR, STM8,
#warning __ATY_COMPILER_IAR 1
#define __ATY_COMPILER_IAR 1
#else
#define __ATY_COMPILER_IAR 0
#endif
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__ARMCOMPILER_VERSION)
// Keil MDK ARM, like STM32\GD32\ HX32...,
#pragma diag_suppress 1215 // user #warning
#warning __ATY_COMPILER_ARMCC 1
#define __ATY_COMPILER_ARMCC 1
#else
#define __ATY_COMPILER_ARMCC 0
#endif
#if defined(SDCC) || defined(__SDCC)
// 51,
#warning __ATY_COMPILER_SDCC 1
#define __ATY_COMPILER_SDCC 1
#else
#define __ATY_COMPILER_SDCC 0
#endif
#if defined(__C51__) || defined(__CX51__)
// 51,
#warning __ATY_COMPILER_KEIL_C51 1
#define __ATY_COMPILER_KEIL_C51 1
#else
#define __ATY_COMPILER_KEIL_C51 0
#endif
#if __ATY_COMPILER_SDCC || __ATY_COMPILER_KEIL_C51
#warning __ATY_IS_8051_COMPILER 1
#define __ATY_IS_8051_COMPILER 1
#else
#define __ATY_IS_8051_COMPILER 0
#endif
#if __ATY_IS_8051_COMPILER
#define __ATY_HAS_64BIT 0
#else
#define __ATY_HAS_64BIT 1
#endif
// USE_HAL_DRIVER
// USE_FULL_LL_DRIVER
// USE_STDPERIPH_DRIVER
/******************************** Endian **************************************/
#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__)
#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
#define __ATY_ENDIAN_LE 1
#define __ATY_ENDIAN_BE 0
#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
#define __ATY_ENDIAN_LE 0
#define __ATY_ENDIAN_BE 1
#else
#define __ATY_ENDIAN_LE 1
#define __ATY_ENDIAN_BE 0
#endif
#elif defined(__ARMEL__)
#define __ATY_ENDIAN_LE 1
#define __ATY_ENDIAN_BE 0
#elif defined(__ARMEB__)
#define __ATY_ENDIAN_LE 0
#define __ATY_ENDIAN_BE 1
#elif __ATY_IS_8051_COMPILER
#define __ATY_ENDIAN_LE 0
#define __ATY_ENDIAN_BE 1
#elif defined(_WIN32) || defined(_WIN64)
#define __ATY_ENDIAN_LE 1
#define __ATY_ENDIAN_BE 0
#else
#define __ATY_ENDIAN_LE 1
#define __ATY_ENDIAN_BE 0
#endif
#define __ATY_BSWAP16(x) (uint16_t)( \
(((uint16_t)(x) & 0x00FFu) << 8) | \
(((uint16_t)(x) & 0xFF00u) >> 8))
#define __ATY_BSWAP32(x) (uint32_t)(( \
((uint32_t)(x) & 0x000000FFu) << 24) | \
(((uint32_t)(x) & 0x0000FF00u) << 8) | \
(((uint32_t)(x) & 0x00FF0000u) >> 8) | \
(((uint32_t)(x) & 0xFF000000u) >> 24))
#if __ATY_HAS_64BIT
#define __ATY_BSWAP64(x) (uint64_t)( \
((((uint64_t)(x)) & 0x00000000000000FFULL) << 56) | \
((((uint64_t)(x)) & 0x000000000000FF00ULL) << 40) | \
((((uint64_t)(x)) & 0x0000000000FF0000ULL) << 24) | \
((((uint64_t)(x)) & 0x00000000FF000000ULL) << 8 ) | \
((((uint64_t)(x)) & 0x000000FF00000000ULL) >> 8 ) | \
((((uint64_t)(x)) & 0x0000FF0000000000ULL) >> 24) | \
((((uint64_t)(x)) & 0x00FF000000000000ULL) >> 40) | \
((((uint64_t)(x)) & 0xFF00000000000000ULL) >> 56))
#endif
#if __ATY_ENDIAN_LE
#define __ATY_HTOLE16(x) (uint16_t)(x)
#define __ATY_LETOH16(x) (uint16_t)(x)
#define __ATY_HTOBE16(x) __ATY_BSWAP16(x)
#define __ATY_BETOH16(x) __ATY_BSWAP16(x)
#define __ATY_HTOLE32(x) (uint32_t)(x)
#define __ATY_LETOH32(x) (uint32_t)(x)
#define __ATY_HTOBE32(x) __ATY_BSWAP32(x)
#define __ATY_BETOH32(x) __ATY_BSWAP32(x)
#if __ATY_HAS_64BIT
#define __ATY_HTOLE64(x) (uint64_t)(x)
#define __ATY_LETOH64(x) (uint64_t)(x)
#define __ATY_HTOBE64(x) __ATY_BSWAP64(x)
#define __ATY_BETOH64(x) __ATY_BSWAP64(x)
#endif
#else
#define __ATY_HTOLE16(x) __ATY_BSWAP16(x)
#define __ATY_LETOH16(x) __ATY_BSWAP16(x)
#define __ATY_HTOBE16(x) (uint16_t)(x)
#define __ATY_BETOH16(x) (uint16_t)(x)
#define __ATY_HTOLE32(x) __ATY_BSWAP32(x)
#define __ATY_LETOH32(x) __ATY_BSWAP32(x)
#define __ATY_HTOBE32(x) (uint32_t)(x)
#define __ATY_BETOH32(x) (uint32_t)(x)
#if __ATY_HAS_64BIT
#define __ATY_HTOLE64(x) __ATY_BSWAP64(x)
#define __ATY_LETOH64(x) __ATY_BSWAP64(x)
#define __ATY_HTOBE64(x) (uint64_t)(x)
#define __ATY_BETOH64(x) (uint64_t)(x)
#endif
#endif
/******************************* Data Type ************************************/
// #define __UNUSED(x) ((void)(x))
#define __UNUSED(x) (x = x) // not suit for const, used for function formal parameter uaually
#ifndef __stdint_h
#define __stdint_h
#ifndef bool
#define bool uint8_t
#endif /* bool */
#ifndef true
#define true 1
#endif /* true */
#ifndef false
#define false 0
#endif /* false */
#ifndef bit
#define bit uint8_t
#endif /* bit */
#ifndef _UINT8_T
#define _UINT8_T
typedef unsigned char uint8_t;
#endif /* _UINT8_T */
#ifndef _UINT16_T
#define _UINT16_T
typedef unsigned short int uint16_t;
#endif /* _UINT16_T */
#ifndef _UINT32_T
#define _UINT32_T
typedef unsigned long uint32_t;
#endif /* _UINT32_T */
#ifndef _UINT64_T
#define _UINT64_T
#if __ATY_HAS_64BIT
typedef unsigned long long int uint64_t;
#else
typedef unsigned long int uint64_t; // 64 = 32, not 64 bit platform
#endif /* uint64_t */
#endif /* _UINT64_T */
#ifndef _INT8_T
#define _INT8_T
typedef signed char int8_t;
#endif /* _INT8_T */
#ifndef _INT16_T
#define _INT16_T
typedef signed short int int16_t;
#endif /* _INT16_T */
#ifndef _INT32_T
#define _INT32_T
typedef signed int int32_t;
#endif /* _INT32_T */
#ifndef _INT64_T
#define _INT64_T
#if __ATY_HAS_64BIT
typedef signed long long int int64_t;
#else
typedef signed long int int64_t; // 64 = 32, not 64 bit platform
#endif /* int64_t */
#endif /* _INT64_T */
#endif /* __stdint_h */
/********************************** ATY ***************************************/
#define __ATY_IO_I 0
#define __ATY_IO_O 1
#define __ATY_HL_L 0
#define __ATY_HL_H 1
#define __ATY_RW_W 0
#define __ATY_RW_R 1
#define __ATY_RW_RW 2
#define __ATY_BUSY 99
#define __ATY_LOCKED 101
#define __ATY_UNLOCKED 102
#if (USE_RTOS == 1U)
#define __ATY_LOCK(__HANDLE__)
#define __ATY_UNLOCK(__HANDLE__)
#else
#define __ATY_LOCK(__HANDLE__) \
do{ \
if((__HANDLE__)->lock == __ATY_LOCKED) { \
return __ATY_BUSY; \
} \
else { \
(__HANDLE__)->lock = __ATY_LOCKED; \
} \
}while (0U)
#define __ATY_UNLOCK(__HANDLE__) \
do{ \
(__HANDLE__)->lock = __ATY_UNLOCKED; \
}while (0U)
#endif /* USE_RTOS */
/******************************* For user *************************************/
#include "main.h"
/* Diagnostic Suppress (hide warnings) *****************************************
| Platform | Assigned but not used |
|-----------------|------------------------------------------------------------|
| ArmCC5(KeilARM) | #pragma diag_suppress 550 |
| IAR (ICCARM) | #pragma diag_suppress=Pe550 |
| GCC | #pragma GCC diagnostic ignored "-Wunused-but-set-variable" |
| Clang/ArmClang | #pragma clang diagnostic ignored "-Wunused..." |
| MSVC | #pragma warning(disable: 4189) |
| Keil C51 | Not supported unified pragma diag |
| SDCC (8051) | Not supported unified pragma diag |
*******************************************************************************/
#if defined (__ATY_COMPILER_ARMCC)
#pragma diag_suppress 1215 // user #warning (before #warning)
#pragma diag_suppress 550 // variable "" was set but never used
#pragma diag_suppress 177 // function "" was declared but never referenced
#pragma diag_suppress 186 // pointless comparison of unsigned integer with zero
#pragma diag_suppress 1035 // single-precision operand implicitly converted to double-precision
// #pragma diag_suppress 223 // function "xxx" declared implicitly
#endif
// stdarg ----------------------------------------------------------------------
#define __ATY_USE_STDARG_LIB
#ifdef __ATY_USE_STDARG_LIB
#include
#else
#ifndef __stdarg_h
#define __stdarg_h
#if __ATY_COMPILER_CLANG || __ATY_COMPILER_GCC
typedef __builtin_va_list va_list;
#define va_start(ap, param) __builtin_va_start(ap, param)
#define va_end(ap) __builtin_va_end(ap)
#define va_arg(ap, type) __builtin_va_arg(ap, type)
#define va_copy(dest, src) __builtin_va_copy(dest, src)
#elif __ATY_COMPILER_ARMCC
typedef struct __va_list{ void* __ap; } va_list;
#define va_start(ap, parmN) __va_start(ap, parmN)
#define va_arg(ap, type) __va_arg(ap, type)
#define va_end(ap) __va_end(ap)
#define va_copy(dest, src) ((void)((dest) = (src)))
#elif __ATY_COMPILER_IAR
typedef char* va_list;
#define __ATY_VA_ALIGN (sizeof(int))
#define va_start(ap, last) ((ap) = (char*)&(last) + ((sizeof(last)+__ATY_VA_ALIGN-1)&~(__ATY_VA_ALIGN-1)))
#define va_arg(ap, type) (*(type*)((ap += ((sizeof(type)+__ATY_VA_ALIGN-1)&~(__ATY_VA_ALIGN-1))) - ((sizeof(type)+__ATY_VA_ALIGN-1)&~(__ATY_VA_ALIGN-1))))
#define va_end(ap) ((ap) = (va_list)0)
#define va_copy(dest, src) ((dest) = (src))
#elif __ATY_IS_8051_COMPILER
typedef unsigned char* va_list;
#define va_start(ap, last) ((ap) = (unsigned char*)&(last) + sizeof(last))
#define va_arg(ap, type) (*(type*)((ap += sizeof(type)) - sizeof(type)))
#define va_end(ap) ((ap) = (va_list)0)
#define va_copy(dest, src) ((dest) = (src))
#elif __ATY_COMPILER_MSVC
typedef char* va_list;
#define __ATY_VA_ALIGN (sizeof(int))
#define va_start(ap, last) ((ap) = (char*)&(last) + ((sizeof(last)+__ATY_VA_ALIGN-1)&~(__ATY_VA_ALIGN-1)))
#define va_arg(ap, type) (*(type*)((ap += ((sizeof(type)+__ATY_VA_ALIGN-1)&~(__ATY_VA_ALIGN-1))) - ((sizeof(type)+__ATY_VA_ALIGN-1)&~(__ATY_VA_ALIGN-1))))
#define va_end(ap) ((ap) = (va_list)0)
#define va_copy(dest, src) ((dest) = (src))
#else
typedef char* va_list;
#define __ATY_VA_ALIGN (sizeof(int))
#define va_start(ap, last) ((ap) = (char*)&(last) + ((sizeof(last)+__ATY_VA_ALIGN-1)&~(__ATY_VA_ALIGN-1)))
#define va_arg(ap, type) (*(type*)((ap += ((sizeof(type)+__ATY_VA_ALIGN-1)&~(__ATY_VA_ALIGN-1))) - ((sizeof(type)+__ATY_VA_ALIGN-1)&~(__ATY_VA_ALIGN-1))))
#define va_end(ap) ((ap) = (va_list)0)
#define va_copy(dest, src) ((dest) = (src))
#endif
#endif /* __stdarg_h */
#endif /* __ATY_USE_STDARG_LIB */
#define __ATY_PRINT_ENABLE 1
#define __ATY_DEBUG_ENABLE 1
#if __ATY_PRINT_ENABLE
#include "HW_UART_ATY.h"
extern struct HW_UART_ATY_Dev HW_UART_ATY_Dev_1;
#define printf_ATY(...) UartPrintf(&HW_UART_ATY_Dev_1, __VA_ARGS__)
#if __ATY_DEBUG_ENABLE
#define printf_ATY_D(...) UartPrintf(&HW_UART_ATY_Dev_1, __VA_ARGS__)
#else
#define printf_ATY_D(...)
#endif
#else
#define printf_ATY(...)
#define printf_ATY_D(...)
#endif
// Soft Reset ------------------------------------------------------------------
#ifndef __ATY_SOFT_RESET
#if __ATY_IS_8051_COMPILER
#if __ATY_COMPILER_SDCC
#define __ATY_SOFT_RESET() \
do { \
IAP_CONTR |= 0x60; \
void (* __code __aty_reset)(void) = (void (__code *)(void))0x0000; \
__aty_reset(); \
} while (0U)
#elif __ATY_COMPILER_KEIL_C51
#define __ATY_SOFT_RESET() \
do { \
IAP_CONTR |= 0x60; \
void (* __aty_reset)(void) = (void (*)(void))0x0000; \
__aty_reset(); \
} while (0U)
#else
#define __ATY_SOFT_RESET() do { } while (0U)
#endif
#elif __ATY_COMPILER_ARMCC || __ATY_COMPILER_IAR || __ATY_COMPILER_GCC || __ATY_COMPILER_CLANG
#define __ATY_SOFT_RESET() \
do { \
__disable_irq(); \
__NVIC_SystemReset(); \
} while (0U)
#elif __ATY_COMPILER_MSVC
#include
#define __ATY_SOFT_RESET() \
do { \
abort(); \
} while (0U)
#else
#define __ATY_SOFT_RESET() do { } while (0U)
#endif
#endif
// DBG IO ----------------------------------------------------------------------
// todo: move to HW_GPIO
#define __ATY_DBG_DH 64u
#define __ATY_DBG_DL 64u
// #if defined(USE_HAL_DRIVER) && defined(ATY_DBG_GPIO_Port) && defined(ATY_DBG_GPIO_Pin)
// #define __ATY_DEBUG_GPIO_WRITE(v) HAL_GPIO_WritePin(ATY_DBG_GPIO_Port, ATY_DBG_GPIO_Pin, ((v)?GPIO_PIN_SET:GPIO_PIN_RESET))
// #define __ATY_DEBUG_GPIO_READ() (HAL_GPIO_ReadPin(ATY_DBG_GPIO_Port, ATY_DBG_GPIO_Pin)?1:0)
// #elif __ATY_IS_8051_COMPILER && defined(ATY_DBG_BIT)
// #define __ATY_DEBUG_GPIO_WRITE(v) do{ ATY_DBG_BIT = ((v)?1:0); }while(0)
// #define __ATY_DEBUG_GPIO_READ() ((ATY_DBG_BIT)?1:0)
// #elif defined(__ESP32_IDF_ATY) && defined(ATY_DBG_GPIO_NUM)
// #define __ATY_DEBUG_GPIO_WRITE(v) gpio_set_level((gpio_num_t)(ATY_DBG_GPIO_NUM), ((v)?1:0))
// #define __ATY_DEBUG_GPIO_READ() ((int)gpio_get_level((gpio_num_t)(ATY_DBG_GPIO_NUM)))
// #endif
#ifndef __ATY_DEBUG_GPIO_WRITE
#define __ATY_DEBUG_GPIO_WRITE(v) do{ (void)(v); }while(0)
#endif
#ifndef __ATY_DEBUG_GPIO_READ
#define __ATY_DEBUG_GPIO_READ() (0)
#endif
#define __ATY_DELAY_LOOP(n) \
do { \
volatile uint32_t __aty_d = (uint32_t)(n); \
while (__aty_d--) { \
__NOP_ATY; \
} \
} while (0U)
#define __ATY_DBG_WAIT_RISING(timeout, okflag) \
do { \
uint32_t __aty_to = (uint32_t)(timeout); \
(okflag) = 0; \
while ((__ATY_DEBUG_GPIO_READ() == 0) && (__aty_to--)) { \
__NOP_ATY; \
} \
if (__ATY_DEBUG_GPIO_READ() != 0) { \
(okflag) = 1; \
} \
} while (0U)
#define __ATY_DBG_WAIT_FALLING(timeout, okflag) \
do { \
uint32_t __aty_to = (uint32_t)(timeout); \
(okflag) = 0; \
while ((__ATY_DEBUG_GPIO_READ() != 0) && (__aty_to--)) { \
__NOP_ATY; \
} \
if (__ATY_DEBUG_GPIO_READ() == 0) { \
(okflag) = 1; \
} \
} while (0U)
#define __ATY_DBG_MEASURE_HIGH(maxcount, count_out) \
do { \
uint32_t __aty_cnt = 0u; \
while ((__ATY_DEBUG_GPIO_READ() != 0) && (__aty_cnt < (uint32_t)(maxcount))) { \
__aty_cnt++; \
__NOP_ATY; \
} \
(count_out) = __aty_cnt; \
} while (0U)
#define __ATY_DBG_RECV8(dst) \
do { \
uint8_t __aty_v = 0u; \
for (uint8_t __aty_i = 0u; __aty_i < 8u; ++__aty_i) { \
uint8_t __aty_ok = 0u; \
__ATY_DBG_WAIT_RISING((__ATY_DBG_DH * 8u + __ATY_DBG_DL * 8u), __aty_ok); \
if (!__aty_ok) { \
break; \
} \
uint32_t __aty_len = 0u; \
__ATY_DBG_MEASURE_HIGH((__ATY_DBG_DH * 3u), __aty_len); \
if (__aty_len <= (__ATY_DBG_DH + (__ATY_DBG_DH / 2u))) { \
__aty_v |= (uint8_t)(1u << __aty_i); \
} \
__ATY_DBG_WAIT_FALLING((__ATY_DBG_DL * 8u), __aty_ok); \
__ATY_DELAY_LOOP(__ATY_DBG_DL); \
} \
(dst) = __aty_v; \
__ATY_DELAY_LOOP(__ATY_DBG_DH * 4u); \
} while (0U)
#define __ATY_DBG_PULSE(hi, lo) \
do { \
__ATY_DEBUG_GPIO_WRITE(1); \
__ATY_DELAY_LOOP((hi)); \
__ATY_DEBUG_GPIO_WRITE(0); \
__ATY_DELAY_LOOP((lo)); \
} while (0U)
#define __ATY_DBG_MARK(cnt, hi, lo) \
do { \
uint32_t __aty_c = (uint32_t)(cnt); \
while (__aty_c--) { \
__ATY_DBG_PULSE((hi), (lo)); \
} \
__ATY_DELAY_LOOP((hi) * 4u); \
} while (0U)
#define __ATY_DBG_SEND8(v) \
do { \
uint8_t __aty_b = (uint8_t)(v); \
for (uint8_t __aty_i = 0u; __aty_i < 8u; ++__aty_i) { \
if (((__aty_b & 0x01u) != 0u)) { \
__ATY_DEBUG_GPIO_WRITE(1); \
__ATY_DELAY_LOOP(__ATY_DBG_DH); \
__ATY_DEBUG_GPIO_WRITE(0); \
__ATY_DELAY_LOOP(__ATY_DBG_DL); \
} else { \
__ATY_DEBUG_GPIO_WRITE(1); \
__ATY_DELAY_LOOP(__ATY_DBG_DH * 2u); \
__ATY_DEBUG_GPIO_WRITE(0); \
__ATY_DELAY_LOOP(__ATY_DBG_DL); \
} \
__aty_b >>= 1; \
} \
__ATY_DELAY_LOOP(__ATY_DBG_DH * 4u); \
} while (0U)
#define __ATY_DBG_R(v) __ATY_DBG_RECV8(v)
#define __ATY_DBG_W(v) __ATY_DBG_SEND8(v)
// remember to define __ATY_DEBUG_GPIO_WRITE(v) and __ATY_DEBUG_GPIO_READ()
// for example:
// #define __ATY_DEBUG_GPIO_WRITE(v) HAL_GPIO_WritePin(ATY_DBG_GPIO_Port, ATY_DBG_GPIO_Pin, ((v)?GPIO_PIN_SET:GPIO_PIN_RESET))
// #define __ATY_DEBUG_GPIO_READ() (HAL_GPIO_ReadPin(ATY_DBG_GPIO_Port, ATY_DBG_GPIO_Pin)?1:0)
/******************************************************************************/
#endif /* __INCLUDE_ATY_H */
/************************************ etc *************************************/
/* init */
/* use */
/******************************************************************************/
/******************************** End Of File *********************************/