소스 검색

change uart and timer to dev type

SKY-20210407USB\Administrator 1 년 전
부모
커밋
61c22aa6ad
7개의 변경된 파일576개의 추가작업 그리고 374개의 파일을 삭제
  1. 7 0
      HW_I2C_ATY.c
  2. 130 110
      HW_TIMER_ATY.c
  3. 22 14
      HW_TIMER_ATY.h
  4. 292 227
      HW_UART_ATY.c
  5. 38 22
      HW_UART_ATY.h
  6. 85 1
      MODBUS_S_LOW_ATY.c
  7. 2 0
      MODBUS_S_LOW_ATY.h

+ 7 - 0
HW_I2C_ATY.c

@@ -410,6 +410,7 @@ uint8_t I2C_ReadReg(uint8_t addr, uint8_t reg, uint8_t* data_t, uint8_t len, str
 
 /************************************ etc *************************************/
 /* init */
+/* software */
 // void I2C_1_SCL_SET(uint8_t level){ }
 // void I2C_1_SDA_SET(uint8_t cmd, uint8_t param){ }
 // uint8_t I2C_1_SDA_GET(void){ return 0; }
@@ -628,6 +629,10 @@ uint8_t I2C_ReadReg(uint8_t addr, uint8_t reg, uint8_t* data_t, uint8_t len, str
 // }
 
 
+
+
+
+/* software */
 // void I2C_1_SCL_SET(uint8_t level){
 //     if(level == _ATY_HL_L){
 //         GPIO_SET_L(I2C_SCL_PORT, I2C_SCL_PIN);
@@ -657,6 +662,8 @@ uint8_t I2C_ReadReg(uint8_t addr, uint8_t reg, uint8_t* data_t, uint8_t len, str
 // uint8_t I2C_1_SDA_GET(void){ return GPIO_GET(I2C_SDA_PORT, I2C_SDA_PIN); }
 // uint8_t I2C_1(uint8_t addr, uint8_t* data_t, uint8_t len, uint8_t rw){ return 0; }
 
+
+/* public */
 // void I2C_Delay(uint8_t t){ while(t--); }
 
 // struct HW_I2C_ATY_Dev HW_I2C_ATY_Dev_1 = {

+ 130 - 110
HW_TIMER_ATY.c

@@ -21,6 +21,9 @@
 * @version
 *       - 1_01_220602 > ATY
 *           -# Preliminary version, first Release
+*       - 1_02_240410 > ATY
+*           -# add multy addr and channel
+*           -# add lock
 *           - Undone
 ********************************************************************************
 */
@@ -32,6 +35,78 @@
 
 /******************************* For user *************************************/
 
+/******************************************************************************/
+
+/**
+ * @brief   define at user file and put at main while
+ * @note    long time process is not recommended
+ */
+void UserTimerLoopProcess(struct HW_TIMER_ATY_Dev* dev)
+{
+    if(dev->timerInitFlag == 0){
+        dev->timerInitFlag = 1;
+        dev->timerInit();
+    }
+
+    dev->timerLoopProcess_User();
+}
+
+/**
+ * @brief   1ms timer loop cycle
+ * @note    put at 1ms timer IT callback function
+ */
+void UserTimerLoop_Cycle1ms(struct HW_TIMER_ATY_Dev* dev)
+{
+    dev->msN++;
+    if(dev->ms10_f == 0)
+        dev->ms10++;
+    if(dev->ms100_f == 0)
+        dev->ms100++;
+    if(dev->s1_f == 0)
+        dev->s1++;
+    if(dev->s2_f == 0)
+        dev->s2++;
+    if(dev->s10_f == 0)
+        dev->s10++;
+
+    /* ATY: 1ms unit **********************************************************/
+    dev->ms1_f = 1;
+
+    /* ATY: 10ms unit *********************************************************/
+    if(dev->ms10 >= 10){
+        dev->ms10_f = 1;
+        dev->ms10 = 0;
+    }
+    /* ATY: 100ms unit ********************************************************/
+    if(dev->ms100 >= 100){
+        dev->ms100_f = 1;
+        dev->ms100 = 0;
+    }
+    /* ATY: 1s unit ***********************************************************/
+    if(dev->s1 >= 1000){
+        dev->s1_f = 1;
+        dev->s1 = 0;
+    }
+    /* ATY: 2s unit ***********************************************************/
+    if(dev->s2 >= 2000){
+        dev->s2_f = 1;
+        dev->s2 = 0;
+    }
+    /* ATY: 10s unit **********************************************************/
+    if(dev->s10 >= 10000){
+        dev->s10_f = 1;
+        dev->s10 = 0;
+    }
+}
+
+
+
+
+
+
+
+
+/******************************* For user *************************************/
 #if defined (__STC51_ATY)
 /**
  * @brief   1 us delay with for @ 24MHz about 1.04us
@@ -126,7 +201,7 @@ void TM4_Isr(void) INTERRUPT(20)
 }
 #endif /* TIMERC_N */
 
-#elif defined(__STM32_HAL_ATY)
+#elif defined(__STM32_HAL_ATY1)
 #include "tim.h"
 /**
  * @brief   us delay with soft cycle
@@ -158,35 +233,9 @@ __WEAK_ATY void DelayMs(uint32_t ms)
         DelayUs(1000);
     // HAL_Delay(ms);   // HAL_Delay not good for little time
 }
-
-/**
- * @brief   cycle timer IT callback function
- * @note    HAL_TIM_Base_Start_IT(&TIMERC_N); start IT at main init
- */
-void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
-{
-    if(htim == &TIMERC_N)
-    {
-        UserTimerLoop_Cycle1ms();
-    }
-}
 #endif /* PLATFORM */
-
-
 /******************************************************************************/
 
-struct _timeBaseCounter_ATY timeCounterUnit_ATY = {0};
-
-/**
- * @brief   sec delay
- * @param   sec sec
- */
-__WEAK_ATY void DelaySec(uint32_t sec)
-{
-    while(sec--)
-        DelayMs(1000);
-}
-
 #if 0
 uint8_t it = 0;
 void DelayTest(void)
@@ -239,99 +288,70 @@ void DelayTest(void)
 }
 #endif /* 0 */
 
+#endif /* __HW_TIMER_ATY_C */
 
-#ifdef __TIMER_CYCLE_ATY
-/**
- * @brief   define at user file and put at main while
- * @note    long time process is not recommended
- */
-__WEAK_ATY void UserTimerLoopProcess(void)
-{
-    TimerLoopProcess_User();
-
-}
-#ifndef __STC51_ATY
-__WEAK_ATY void TimerLoopProcess_User(void)
-{
-    // if(timeCounterUnit_ATY.ms1_f == 1)
-    // {
-    //     timeCounterUnit_ATY.ms1_f = 0;
-    // }
-    if(timeCounterUnit_ATY.ms100_f == 1)
-    {
-        timeCounterUnit_ATY.ms100_f = 0;
-        // ledBlinkType = (2);
-        // HAL_IWDG_Refresh(&hiwdg);
-    }
-    // if(timeCounterUnit_ATY.s2_f == 1)
-    // {
-    //     timeCounterUnit_ATY.s2_f = 0;
-    // }
-}
-#endif /* __STC51_ATY */
-
-/**
- * @brief   1ms timer loop cycle
- */
-void UserTimerLoop_Cycle1ms(void)
-{
-    // put at 1ms timer IT callback function
-    timeCounterUnit_ATY.msN++;
-    if(timeCounterUnit_ATY.ms10_f == 0)
-        timeCounterUnit_ATY.ms10++;
-    if(timeCounterUnit_ATY.ms100_f == 0)
-        timeCounterUnit_ATY.ms100++;
-    if(timeCounterUnit_ATY.s1_f == 0)
-        timeCounterUnit_ATY.s1++;
-    if(timeCounterUnit_ATY.s2_f == 0)
-        timeCounterUnit_ATY.s2++;
-    if(timeCounterUnit_ATY.s10_f == 0)
-        timeCounterUnit_ATY.s10++;
+/************************************ etc *************************************/
+/* init */
+// // timer loop
+// void TimerLoopProcess_User_4(void);
+// void TimerInit_4()
+// {
+//     HAL_TIM_Base_Start_IT(&htim4);
+// }
+// struct HW_TIMER_ATY_Dev HW_TIMER_ATY_Dev_4 = {
+//     .msN = 0,
+//     .ms10 = 0,
+//     .ms100 = 0,
+//     .s1 = 0,
 
-    /* ATY: 1ms unit **********************************************************/
-    timeCounterUnit_ATY.ms1_f = 1;
+//     .ms1_f = 0,
+//     .ms10_f = 0,
+//     .ms100_f = 0,
+//     .s1_f = 0,
 
-    /* ATY: 10ms unit *********************************************************/
-    if(timeCounterUnit_ATY.ms10 >= 10)
-    {
-        timeCounterUnit_ATY.ms10_f = 1;
-        timeCounterUnit_ATY.ms10 = 0;
+//     .timerInitFlag = 0,
+//     .timerInit = TimerInit_4,
 
-    }
-    /* ATY: 100ms unit ********************************************************/
-    if(timeCounterUnit_ATY.ms100 >= 100)
-    {
-        timeCounterUnit_ATY.ms100_f = 1;
-        timeCounterUnit_ATY.ms100 = 0;
-        // ledBlinkType = (2);
+//     .timerLoopProcess_User = TimerLoopProcess_User_4,
 
-    }
-    /* ATY: 1s unit ***********************************************************/
-    if(timeCounterUnit_ATY.s1 >= 1000)
-    {
-        timeCounterUnit_ATY.s1_f = 1;
-        timeCounterUnit_ATY.s1 = 0;
+//     .lock = _ATY_UNLOCKED,
+//     .debugEnable = 0,
+//     .LOG = printf
+// };
+// void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
+// {
+//     if(htim == &htim4)
+//     {
+//         UserTimerLoop_Cycle1ms(&HW_TIMER_ATY_Dev_4);
+//     }
+// }
 
-    }
-    /* ATY: 2s unit ***********************************************************/
-    if(timeCounterUnit_ATY.s2 >= 2000)
-    {
-        timeCounterUnit_ATY.s2_f = 1;
-        timeCounterUnit_ATY.s2 = 0;
+/* use */
+// void TimerLoopProcess_User_4(void)
+// {
+//     if(HW_TIMER_ATY_Dev_4.ms1_f == 1)
+//     {
+//         HW_TIMER_ATY_Dev_4.ms1_f = 0;
 
-    }
-    /* ATY: 10s unit **********************************************************/
-    if(timeCounterUnit_ATY.s10 >= 10000)
-    {
-        timeCounterUnit_ATY.s10_f = 1;
-        timeCounterUnit_ATY.s10 = 0;
+//     }
+//     if(HW_TIMER_ATY_Dev_4.ms100_f == 1)
+//     {
+//         HW_TIMER_ATY_Dev_4.ms100_f = 0;
+//         SysLedBlink(&LED_ATY_t_1);
 
-    }
-}
-#endif /* __TIMER_CYCLE_ATY */
+//         UpdateMbRegsFromFloat(mbG, &MODBUS_S_LOW_ATY_Dev_1);
+//     }
+//     if(HW_TIMER_ATY_Dev_4.msN >= 10000){
+//         HW_TIMER_ATY_Dev_4.msN = 0;
 
+//     }
+//     if(HW_TIMER_ATY_Dev_4.s1_f == 1)
+//     {
+//         HW_TIMER_ATY_Dev_4.s1_f = 0;
 
+//     }
+// }
 
-#endif /* __HW_TIMER_ATY_C */
+/******************************************************************************/
 
 /******************************** End Of File *********************************/

+ 22 - 14
HW_TIMER_ATY.h

@@ -21,6 +21,9 @@
 * @version
 *       - 1_01_220608 > ATY
 *           -# Preliminary version, first Release
+*       - 1_02_240410 > ATY
+*           -# add multy addr and channel
+*           -# add lock
 ********************************************************************************
 */
 
@@ -31,36 +34,41 @@
 #include "INCLUDE_ATY.h"
 
 /******************************* For user *************************************/
-#ifdef __STC51_ATY
-void TimerLoopInit(void);
-#endif /* __STC51_ATY */
 
 /******************************************************************************/
 
-void Delay1Us(void);
-void DelayUs(uint32_t us);
-void DelayMs(uint32_t ms);
-void DelaySec(uint32_t sec);
-
-typedef struct _timeBaseCounter_ATY
+struct HW_TIMER_ATY_Dev
 {
     uint32_t msN;
+
     uint32_t ms10;
     uint32_t ms100;
     uint32_t s1;
     uint32_t s2;
     uint32_t s10;
+
     uint8_t ms1_f;
     uint8_t ms10_f;
     uint8_t ms100_f;
     uint8_t s1_f;
     uint8_t s2_f;
     uint8_t s10_f;
-} timeBaseCounter;
-extern struct _timeBaseCounter_ATY timeCounterUnit_ATY;
-void UserTimerLoop_Cycle1ms(void);
-void UserTimerLoopProcess(void);
-void TimerLoopProcess_User(void);
+
+    uint8_t timerInitFlag;
+    void (*timerInit)();
+
+    /**
+     * @brief   timer cycle process in user define self
+     */
+    void (*timerLoopProcess_User)();
+
+    uint8_t lock;
+    uint8_t debugEnable;
+    void (*LOG)();
+};
+
+void UserTimerLoop_Cycle1ms(struct HW_TIMER_ATY_Dev* dev);
+void UserTimerLoopProcess(struct HW_TIMER_ATY_Dev* dev);
 
 #endif /* __HW_TIMER_ATY_H */
 

+ 292 - 227
HW_UART_ATY.c

@@ -21,7 +21,11 @@
 * @version
 *       - 1_01_221231 > ATY
 *           -# Preliminary version, first Release
-*       -Undone: over with "\r\n" type
+*       - 1_02_240410 > ATY
+*           -# add multy addr and channel
+*           -# add lock
+*       - Undone: over with "\r\n" type
+*       - todo: printf in multi platform
 ********************************************************************************
 */
 
@@ -30,11 +34,160 @@
 
 #include "HW_UART_ATY.h"
 
-struct _uartMsgStruct uartMsgStruct_t = {0};
+/******************************* For user *************************************/
+
+/******************************************************************************/
+
+/**
+ * @brief   uart send byte and init uart if not initialized
+ * @param   byte byte to send
+ * @param   dev
+ * @return  uint8_t
+ */
+uint8_t UartSendByte(uint8_t byte, struct HW_UART_ATY_Dev* dev)
+{
+    __ATY_LOCK(dev);
+
+    if(dev->uartInitFlag == 0){
+        dev->uartInitFlag = 1;
+        dev->uartInit(dev->rx);
+    }
+
+    while(dev->rxCount--)
+        dev->rx[dev->rxCount] = 0;
+
+    dev->uartSendByte(byte);
+
+    __ATY_UNLOCK(dev);
+    return 0;
+}
+
+/**
+ * @brief   uart send bytes
+ * @param   bytes bytes to send
+ * @param   len bytes to send
+ * @param   dev
+ */
+void UartSendBytes(uint8_t* bytes, uint16_t len, struct HW_UART_ATY_Dev* dev)
+{
+    while(len--)
+        UartSendByte(*bytes++, dev);
+}
+
+/**
+ * @brief   uart send string
+ * @param   str data to send
+ * @param   dev
+ */
+void UartSendStr(uint8_t* str, struct HW_UART_ATY_Dev* dev)
+{
+    while(*str)
+        UartSendByte(*str++, dev);
+}
+
+/**
+ * @brief   uart send float data in specified endian
+ * @param   dataFloat float number
+ * @param   endian
+ * @param   dev
+ */
+void UartSendFloat(float dataFloat, uint8_t endian, struct HW_UART_ATY_Dev* dev)
+{
+    union result
+    {
+        float temp_f;
+        uint8_t temp_uint8[4];
+    }resultA, resultB;
+
+    resultA.temp_f = dataFloat;
+    if(endian == 'B'){
+        resultB.temp_uint8[0] = resultA.temp_uint8[3];
+        resultB.temp_uint8[1] = resultA.temp_uint8[2];
+        resultB.temp_uint8[2] = resultA.temp_uint8[1];
+        resultB.temp_uint8[3] = resultA.temp_uint8[0];
+    }
+    else if(endian == 'L'){
+        resultB.temp_uint8[0] = resultA.temp_uint8[0];
+        resultB.temp_uint8[1] = resultA.temp_uint8[1];
+        resultB.temp_uint8[2] = resultA.temp_uint8[2];
+        resultB.temp_uint8[3] = resultA.temp_uint8[3];
+    }
+    UartSendBytes(resultB.temp_uint8, 4, dev);
+}
+
+/**
+ * @brief   uart send float data in ASCII character type
+ * @param   dataFloat number to send, use double to get better
+ * @param   DECIMALS_NUM
+ * @param   dev
+ * @note    float and double is the same in C51
+ */
+void UartSendFloatStr(float dataFloat, uint8_t DECIMALS_NUM, struct HW_UART_ATY_Dev* dev)
+// void UartSendFloatStr(double dataFloat)
+{
+    uint8_t i = 0;
+    uint8_t dataStr[10];    // ulongint 4294967295, 6.4f
+    unsigned long int tempSaveData = 0;
+
+    for(i = 0; i < 10; i++)
+        dataStr[i] = 0;
+
+    if(dataFloat < 0)
+    {
+        dataFloat = -dataFloat;
+        UartSendByte('-', dev);
+    }
+    tempSaveData = (dataFloat * 10000) + 0.5;
+    for(i = 0; tempSaveData != 0; i++)
+    {
+        dataStr[10 - 1 - i] = tempSaveData % 10;
+        tempSaveData /= 10;
+    }
+    // UartSendByte(i + 48);
+    if(i < 5)
+        i = 5;
+    while(i--)
+    {
+        UartSendByte(dataStr[10 - 1 - i] + 48, dev);
+        if(i == DECIMALS_NUM)
+            UartSendByte('.', dev);
+    }
+    UartSendByte(' ', dev);
+}
+
+
+/**
+ * @brief   uart receive data process
+ * @note    put at main while
+ * @param   dev
+ */
+void UartReceiveProcess(struct HW_UART_ATY_Dev* dev)
+{
+    if(dev->uartInitFlag == 0){
+        dev->uartInitFlag = 1;
+        dev->uartInit(dev->rx);
+    }
+
+    if(dev->rcvOverTimeOutCount > dev->rcvOverTimeOutCountNum)
+    {
+        dev->rcvOverTimeOutCount = 0;
+        if(dev->rxCount != 0)
+        {
+            dev->rcvOverFlag = 0;
+            dev->uartReceiveProcess_User();
+            while(dev->rxCount){
+                dev->rx[dev->rxCount--] = 0;
+            }
+        }
+    }
+    else
+        dev->rcvOverTimeOutCount++;
+}
+
+
 
 /******************************* For user *************************************/
 #if defined (__STC51_ATY)
-
 #define BRT         (uint32_t)(65536 - (uint32_t)FOSC / BAUD_RATE / 4)
 // #define FOSC        5529600UL  // 5.5296MHz MCU frequency
 #define FOSC        24000000UL  // 24MHz MCU frequency
@@ -104,23 +257,6 @@ void UartSendByte(uint8_t byte)
 
 #elif defined(__STM32_HAL_ATY)
 #include "usart.h"
-void UartSendByte(uint8_t byte)
-{
-    uint8_t i = 0;
-    for(i = 0; i < uartMsgStruct_t.rxCount; i++)
-        uartMsgStruct_t.rx[i] = 0;
-    uartMsgStruct_t.rxCount = 0;
-#ifdef LL
-    LL_USART_TransmitData8(PRINTF_UART, byte);
-    while(!LL_USART_IsActiveFlag_TC(PRINTF_UART)){}
-#else
-    HAL_UART_Transmit(&PRINTF_UART, (uint8_t*)&byte, 1, 0xFFFF);
-#endif
-}
-
-
-
-
 #ifndef __MICROLIB
 // for standart lib(not use MicroLIB)
 #pragma import(__use_no_semihosting)
@@ -170,234 +306,163 @@ GETCHAR_PROTOTYPE \
     HAL_UART_Receive(&PRINTF_UART, &ch, 1, 0xFFFF);
     return ch;
 }
-
-#ifdef DEBUG_PRINTF_RECEIVE
-uint8_t uartPrintfRxBuf[PRINTF_RX_MAX_LEN];
-
-
-/**
- * @brief   uart hardware init
- * @note    put at main init
- *          use DMA IDEL type, open uart IT and add rx dma, mode in Normal(not Circular!), data with byte
- */
-void UartInit(void)
-{
-    // __HAL_UART_ENABLE_IT(&PRINTF_UART, UART_IT_IDLE);
-    HAL_UARTEx_ReceiveToIdle_DMA(&PRINTF_UART, uartMsgStruct_t.rx, UART_RX_MAX_LEN);
-    __HAL_DMA_DISABLE_IT(&PRINTF_DMA, DMA_IT_HT);
-
-    *(uartMsgStruct_t.rx) = *uartPrintfRxBuf;
-    uartMsgStruct_t.rxCount = 0x00;
-    uartMsgStruct_t.txCount = 0x00;
-    uartMsgStruct_t.busyFlag = 0;
-}
-
-
-void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef* huart, uint16_t Size)
-{
-    if(huart == &PRINTF_UART){
-        HAL_UART_DMAStop(&PRINTF_UART);
-        uartMsgStruct_t.overCount = 0;
-        uartMsgStruct_t.rxCount = UART_RX_MAX_LEN - __HAL_DMA_GET_COUNTER(&PRINTF_DMA);
-        uartMsgStruct_t.rcvOverFlag = 1;
-
-        // HAL_UARTEx_ReceiveToIdle_DMA(&PRINTF_UART, uartMsgStruct_t.rx, UART_RX_MAX_LEN);
-        // __HAL_DMA_DISABLE_IT(&PRINTF_DMA, DMA_IT_HT);
-    }
-
-    /* if process is not too long, process function can be used at this call back;
-        otherwise put process at other cycle like while or timer cycle */
-    // PrintfReceiveProcess();
-}
-
-/**
- * @brief   init uart IT and DMA etc.
- */
-void PrintfReceiveInit(void)
-{
-    HAL_UARTEx_ReceiveToIdle_DMA(&PRINTF_UART, uartMsgStruct_t.rx, PRINTF_RX_MAX_LEN);
-    __HAL_DMA_DISABLE_IT(&PRINTF_DMA, DMA_IT_HT);
-}
-
-/**
- * @brief   uart receive data analysis
- * @note    put at main while
- */
-__WEAK_ATY void PrintfReceiveProcess(void)
-{
-    struct _uartMsgStruct* ptr = &uartMsgStruct_t;
-
-    if(ptr->rcvOverFlag)
-    {
-        ptr->rcvOverFlag = 0;
-        // ptr->rxCount = 0;
-
-        UartReceiveProcess_User(ptr);
-
-        PrintfReceiveInit();
-    }
-}
-#endif /* DEBUG_PRINTF_RECEIVE */
-
 #endif /* PLATFORM */
 /******************************************************************************/
 
+#endif /* __HW_UART_ATY_C */
 
+/************************************ etc *************************************/
+/* init */
+/* STM32 (Open uart global IT, open rx DMA(Mode Normal, Width Byte) and default DMA IT) */
+// // uart2
+// extern DMA_HandleTypeDef hdma_usart2_rx;
+// void UartReceiveProcess_User_2(void);
+// void UartInit_2(uint8_t* rx)
+// {
+//     // __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
+//     HAL_UARTEx_ReceiveToIdle_DMA(&huart2, rx, UART_RX_MAX_LEN);
+//     __HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT);
+// }
+// void UartSendByte_2(uint8_t byte)
+// {
+//     // LL
+//     // LL_USART_TransmitData8(huart2, byte);
+//     // while(!LL_USART_IsActiveFlag_TC(huart2)){}
+//     // HAL
+//     HAL_UART_Transmit(&huart2, (uint8_t*)&byte, 1, 0xFFFF);
+// }
+// struct HW_UART_ATY_Dev HW_UART_ATY_Dev_2 = {
+//     // .rx = uartRx1,
+//     .rx = {0},
+//     .rxCount = 0,
+//     .txCount = 0,
+//     .rcvOverTimeOutCountNum = 2000,
+//     .rcvOverTimeOutCount = 0,
+//     .rcvOverFlag = 0,
+
+//     .uartInitFlag = 0,
+//     .uartInit = UartInit_2,
+//     .uartSendByte = UartSendByte_2,
+
+//     .uartReceiveProcess_User = UartReceiveProcess_User_2,
+
+//     .lock = _ATY_UNLOCKED,
+//     .debugEnable = 0,
+//     // .LOG = printf
+// };
+// // uart3
+// extern DMA_HandleTypeDef hdma_usart3_rx;
+// void UartReceiveProcess_User_3(void);
+// void UartInit_3(uint8_t* rx)
+// {
+//     // __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
+//     HAL_UARTEx_ReceiveToIdle_DMA(&huart3, rx, UART_RX_MAX_LEN);
+//     __HAL_DMA_DISABLE_IT(&hdma_usart3_rx, DMA_IT_HT);
+// }
+// void UartSendByte_3(uint8_t byte)
+// {
+//     // LL
+//     // LL_USART_TransmitData8(huart3, byte);
+//     // while(!LL_USART_IsActiveFlag_TC(huart3)){}
+//     // HAL
+//     HAL_UART_Transmit(&huart3, (uint8_t*)&byte, 1, 0xFFFF);
+// }
+// struct HW_UART_ATY_Dev HW_UART_ATY_Dev_3 = {
+//     // .rx = uartRx1,
+//     .rx = {0},
+//     .rxCount = 0,
+//     .txCount = 0,
+//     .rcvOverTimeOutCountNum = 2000,
+//     .rcvOverTimeOutCount = 0,
+//     .rcvOverFlag = 0,
+
+//     .uartInitFlag = 0,
+//     .uartInit = UartInit_3,
+//     .uartSendByte = UartSendByte_3,
+
+//     .uartReceiveProcess_User = UartReceiveProcess_User_3,
+
+//     .lock = _ATY_UNLOCKED,
+//     .debugEnable = 0,
+//     // .LOG = printf
+// };
+// void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef* huart, uint16_t Size)
+// {
+//     if(huart == &huart2){
+//         HAL_UART_DMAStop(&huart2);
+//         HW_UART_ATY_Dev_2.rcvOverTimeOutCount = 0;
+//         HW_UART_ATY_Dev_2.rxCount = UART_RX_MAX_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);
+//         HW_UART_ATY_Dev_2.rcvOverFlag = 0;
+
+//         HAL_UARTEx_ReceiveToIdle_DMA(&huart2, HW_UART_ATY_Dev_2.rx, UART_RX_MAX_LEN);
+//         __HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT);
+//     }
+//     else if(huart == &huart3){
+//         HAL_UART_DMAStop(&huart3);
+//         HW_UART_ATY_Dev_3.rcvOverTimeOutCount = 0;
+//         HW_UART_ATY_Dev_3.rxCount = UART_RX_MAX_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);
+//         HW_UART_ATY_Dev_3.rcvOverFlag = 0;
+
+//         HAL_UARTEx_ReceiveToIdle_DMA(&huart3, HW_UART_ATY_Dev_3.rx, UART_RX_MAX_LEN);
+//         __HAL_DMA_DISABLE_IT(&hdma_usart3_rx, DMA_IT_HT);
+//     }
 
-/**
- * @brief   uart send bytes
- * @param   bytes bytes to send
- * @param   len bytes to send
- */
-void UartSendBytes(uint8_t* bytes, uint16_t len)
-{
-    while(len--)
-        UartSendByte(*bytes++);
-}
-
-/**
- * @brief   uart send string
- * @param   str data to send
- */
-void UartSendStr(uint8_t* str)
-{
-    while(*str)
-        UartSendByte(*str++);
-}
-
-/**
- * @brief   uart send float data in little endian
- * @param   dataFloat float number
- */
-void UartSendFloat(float dataFloat)
-{
-    union result
-    {
-        float temp_f;
-        uint8_t temp_uint8[4];
-    }resultA, resultB;
-
-    resultA.temp_f = dataFloat;
-    resultB.temp_uint8[0] = resultA.temp_uint8[0];
-    resultB.temp_uint8[1] = resultA.temp_uint8[1];
-    resultB.temp_uint8[2] = resultA.temp_uint8[2];
-    resultB.temp_uint8[3] = resultA.temp_uint8[3];
-    UartSendByte(resultB.temp_uint8[3]);
-    UartSendByte(resultB.temp_uint8[2]);
-    UartSendByte(resultB.temp_uint8[1]);
-    UartSendByte(resultB.temp_uint8[0]);
-}
-
-/**
- * @brief   uart send float data in ASCII character type
- * @param   dataFloat number to send, use double to get better
- * @note    float and double is the same in C51
- */
-// void UartSendFloatStr(double dataFloat)
-void UartSendFloatStr(float dataFloat)
-{
-#define DECIMALS_NUM 4
-    uint8_t i = 0;
-    uint8_t dataStr[10];    // ulongint 4294967295, 6.4f
-    unsigned long int tempSaveData = 0;
+//     /* if process is not too long, process function can be used at this call back;
+//         otherwise put process at other cycle like while or timer cycle */
+//     // UartReceiveProcess_User_2();
+//     // UartReceiveProcess_User_3();
+// }
 
-    for(i = 0; i < 10; i++)
-        dataStr[i] = 0;
+/* 51 */
 
-    if(dataFloat < 0)
-    {
-        dataFloat = -dataFloat;
-        UartSendByte('-');
-    }
-    tempSaveData = (dataFloat * 10000) + 0.5;
-    for(i = 0; tempSaveData != 0; i++)
-    {
-        dataStr[10 - 1 - i] = tempSaveData % 10;
-        tempSaveData /= 10;
-    }
-    // UartSendByte(i + 48);
-    if(i < 5)
-        i = 5;
-    while(i--)
-    {
-        UartSendByte(dataStr[10 - 1 - i] + 48);
-        if(i == DECIMALS_NUM)
-            UartSendByte('.');
-    }
-    UartSendByte(' ');
-}
 
 
+/* use */
+// void main()
+// {
+//     UartSendStr("Hello word!", &HW_UART_ATY_Dev_2);
+//     UartSendStr("Hello word!", &HW_UART_ATY_Dev_3);
+//     while (1)
+//     {
+//         UartReceiveProcess(&HW_UART_ATY_Dev_2);
+//         UartReceiveProcess(&HW_UART_ATY_Dev_3);
+//     }
+// }
 
-/**
- * @brief   uart receive data process
- * @note    put at main while
- */
-__WEAK_ATY void UartReceiveProcess(void)
-{
-#ifdef DEBUG_PRINTF_RECEIVE
-    PrintfReceiveProcess();
-#else
-    // if(uartMsgStruct_t.overCount >= 10000)
-    if(uartMsgStruct_t.overCount > 2000)
-    {
-        uartMsgStruct_t.overCount = 0;
-        if(uartMsgStruct_t.rxCount != 0)
-        {
-            // UartSendStr(&uartMsgStruct_t.rxCount);
-            UartReceiveProcess_User(&uartMsgStruct_t);
-            while(uartMsgStruct_t.rxCount){
-                uartMsgStruct_t.rx[uartMsgStruct_t.rxCount--] = 0;
-            }
-        }
-    }
-    else
-        uartMsgStruct_t.overCount++;
-#endif
-}
 
 // /**
 //  * @brief   uart receive data analysis in user define self
 //  */
-// void UartReceiveProcess_User(struct _uartMsgStruct* ptr)
+// void UartReceiveProcess_User_2(void)
 // {
-//     if(ptr->rx[0] == 'O' && ptr->rx[1] == 'K')
-//         UartSendStr("\r\nRC OK!\r\n");
-//     // UartSendStr(ptr->rx);
-
-//     if(memcmp("DSTART", (char*)ptr->rx, strlen("DSTART")) == 0)
+//     if((HW_UART_ATY_Dev_2.rx[0] == 'O'
+//         && HW_UART_ATY_Dev_2.rx[1] == 'K'
+//         && HW_UART_ATY_Dev_2.rx[2] == '?'))
+//         UartSendStr("OK!", &HW_UART_ATY_Dev_2);
+// }
+// void UartReceiveProcess_User_3(void)
+// {
+//     if((HW_UART_ATY_Dev_3.rx[0] == 'O'
+//         && HW_UART_ATY_Dev_3.rx[1] == 'K'
+//         && HW_UART_ATY_Dev_3.rx[2] == '?'))
+//         UartSendStr("OK!", &HW_UART_ATY_Dev_3);
+//
+//     Modbus_Process(HW_UART_ATY_Dev_3.rx, HW_UART_ATY_Dev_3.rxCount, &MODBUS_S_LOW_ATY_Dev_1);
+//
+//
+//     // UartSendStr(HW_UART_ATY_Dev_1.rx, &HW_UART_ATY_Dev_3);
+//     if(memcmp("DSTART", (char*)HW_UART_ATY_Dev_1.rx, strlen("DSTART")) == 0)
 //     {
 //         printf("\r\nDebug START!");
 //     }
-//     else if(memcmp("temp", (char*)ptr->rx, strlen("temp")) == 0)
+//     else if(memcmp("temp", (char*)HW_UART_ATY_Dev_1.rx, strlen("temp")) == 0)
 //     {
 //         printf("\r\ntemp %c%c%c",
-//             ptr->rx[strlen("temp_")],
-//             ptr->rx[strlen("temp_") + 1],
-//             ptr->rx[strlen("temp_") + 2]);
-//     }
-
-//     if((ptr->rx[0] == 'O'
-//         && ptr->rx[1] == 'K'
-//         && ptr->rx[2] == '?'))
-//         UartSendStr("OK!");
-
-//     Modbus_Process(ptr->rx, ptr->rxCount);
-// }
-
-
-// void main()
-// {
-//     UartInit();
-//     UartSendStr("Uart Test !\r\n");
-
-//     while (1)
-//     {
-//         UartReceiveProcess();
+//             HW_UART_ATY_Dev_1.rx[strlen("temp_")],
+//             HW_UART_ATY_Dev_1.rx[strlen("temp_") + 1],
+//             HW_UART_ATY_Dev_1.rx[strlen("temp_") + 2]);
 //     }
 // }
-
-
-#endif /* __HW_UART_ATY_C */
+/******************************************************************************/
 
 /******************************** End Of File *********************************/

+ 38 - 22
HW_UART_ATY.h

@@ -21,6 +21,10 @@
 * @version
 *       - 1_01_221231 > ATY
 *           -# Preliminary version, first Release
+*       - 1_02_240410 > ATY
+*           -# add multy addr and channel
+*           -# add lock
+*           -# 1ms with 2 channel at the same time tested good(OK?)
 ********************************************************************************
 */
 
@@ -29,37 +33,49 @@
 
 #include "INCLUDE_ATY.h"
 
-#include "stdio.h"
-// #include "stdlib.h"
-// #include "string.h"
-
 /******************************* For user *************************************/
+// #define UART_RX_MAX_LEN (9 + (15 * 4))
+#ifndef UART_RX_MAX_LEN
+#define UART_RX_MAX_LEN (254)
+#endif
 
 /******************************************************************************/
 
-// #define UART_RX_MAX_LEN (9 + (15 * 4))
-#define UART_RX_MAX_LEN (254)
-#define PRINTF_RX_MAX_LEN 254
-// #define UART_RX_MAX_LEN 16
-typedef struct _uartMsgStruct{
+struct HW_UART_ATY_Dev
+{
+    // uint8_t* rx;
     uint8_t rx[UART_RX_MAX_LEN];
-    uint8_t tx;
+    uint8_t* tx;
     uint8_t rxCount;
     uint8_t txCount;
-    uint8_t busyFlag;
-    uint32_t overCount;
+    uint32_t rcvOverTimeOutCountNum;
+    uint32_t rcvOverTimeOutCount;
     uint8_t rcvOverFlag;
-} uartMsgStruct;
-extern struct _uartMsgStruct uartMsgStruct_t;
-void UartInit(void);
-void UartSendByte(uint8_t byte);
-void UartSendBytes(uint8_t* bytes, uint16_t len);
-void UartSendStr(uint8_t* buf);
-void UartSendFloat(float dataFloat);
-void UartSendFloatStr(float dataFloat);
-void UartReceiveProcess(void);
-void UartReceiveProcess_User(struct _uartMsgStruct* ptr);
 
+    uint8_t uartInitFlag;
+    void (*uartInit)(uint8_t* rx);
+    void (*uartSendByte)(uint8_t byte);
+
+    /**
+     * @brief   uart receive data analysis in user define self
+     */
+    void (*uartReceiveProcess_User)();
+
+    uint8_t lock;
+    uint8_t debugEnable;
+    void (*LOG)();
+};
+
+uint8_t UartSendByte(uint8_t byte, struct HW_UART_ATY_Dev* dev);
+void UartSendBytes(uint8_t* bytes, uint16_t len, struct HW_UART_ATY_Dev* dev);
+void UartSendStr(uint8_t* buf, struct HW_UART_ATY_Dev* dev);
+void UartSendFloat(float dataFloat, uint8_t endian, struct HW_UART_ATY_Dev* dev);
+void UartSendFloatStr(float dataFloat, uint8_t DECIMALS_NUM, struct HW_UART_ATY_Dev* dev);
+void UartReceiveProcess(struct HW_UART_ATY_Dev* dev);
+
+#include "stdio.h"  // for printf
+// #include "stdlib.h"
+// #include "string.h"
 
 #endif /* __HW_UART_ATY_H */
 

+ 85 - 1
MODBUS_S_LOW_ATY.c

@@ -40,7 +40,6 @@
 
 /**
  * @brief   modbus process
- *
  * @param   buf
  * @param   len
  * @param   dev
@@ -172,6 +171,91 @@ uint8_t Modbus_Process(uint8_t* buf, uint8_t len, struct MODBUS_S_LOW_ATY_Dev* d
     return 0;
 }
 
+/**
+ * @brief
+ *
+ * @param floatBuf
+ * @param dev
+ */
+void UpdateMbRegsFromFloat(float* floatBuf, struct MODBUS_S_LOW_ATY_Dev* dev)
+{
+    union mbFloatChange mbFloatChange_u = {0};
+    uint8_t i = 0;
+    for(i = 0; i < (uint8_t)(MODBUS_REG_HOLDING_SIZE / 2); i++){
+        mbFloatChange_u.f_t = floatBuf[i];
+        if(dev->bigEndian){
+            dev->mbRegs[i * 2] = (mbFloatChange_u.u8_t[0] << 8) + mbFloatChange_u.u8_t[1];
+            dev->mbRegs[(i * 2) + 1] = (mbFloatChange_u.u8_t[2] << 8) + mbFloatChange_u.u8_t[3];
+        }
+        else{
+            dev->mbRegs[i * 2] = (mbFloatChange_u.u8_t[3] << 8) + mbFloatChange_u.u8_t[2];
+            dev->mbRegs[(i * 2) + 1] = (mbFloatChange_u.u8_t[1] << 8) + mbFloatChange_u.u8_t[0];
+        }
+    }
+}
+
+/**
+ * @brief
+ *
+ * @param floatBuf
+ * @param dev
+ */
+void TransMbRegsToFloat(float* floatBuf, struct MODBUS_S_LOW_ATY_Dev* dev)
+{
+    union mbFloatChange mbFloatChange_u = {0};
+    uint8_t i = 0;
+    for(i = 0; i < (uint8_t)(MODBUS_REG_HOLDING_SIZE / 2); i++){
+        if(dev->bigEndian){
+            mbFloatChange_u.u8_t[0] = (uint8_t)(dev->mbRegs[i * 2] >> 8);
+            mbFloatChange_u.u8_t[1] = (uint8_t)(dev->mbRegs[i * 2]);
+            mbFloatChange_u.u8_t[2] = (uint8_t)(dev->mbRegs[(i * 2) + 1] >> 8);
+            mbFloatChange_u.u8_t[3] = (uint8_t)(dev->mbRegs[(i * 2) + 1]);
+        }
+        else{
+            mbFloatChange_u.u8_t[3] = (uint8_t)(dev->mbRegs[i * 2] >> 8);
+            mbFloatChange_u.u8_t[2] = (uint8_t)(dev->mbRegs[i * 2]);
+            mbFloatChange_u.u8_t[1] = (uint8_t)(dev->mbRegs[(i * 2) + 1] >> 8);
+            mbFloatChange_u.u8_t[0] = (uint8_t)(dev->mbRegs[(i * 2) + 1]);
+        }
+        floatBuf[i] = mbFloatChange_u.f_t;
+    }
+}
+
 #endif /* __MODBUS_S_LOW_ATY_C */
 
+/************************************ etc *************************************/
+/* init */
+// // mb
+// uint8_t MODBUS1_UART(uint8_t* buf, uint8_t len){
+//     UartSendBytes(buf, len, &HW_UART_ATY_Dev_3);
+//     return 0;
+// }
+// struct MODBUS_S_LOW_ATY_Dev MODBUS_S_LOW_ATY_Dev_1 = {
+//     .addr = 0x01,
+//     .size = MODBUS_REG_HOLDING_SIZE,
+//     .mbRegs = {0},
+//     .uartSendBytes = MODBUS1_UART,
+//     .lock = _ATY_UNLOCKED,
+//     .debugEnable = 0,
+//     .LOG = printf
+// };
+
+/* use */
+// void UartReceiveProcess_User_3(void)
+// {
+//     if((HW_UART_ATY_Dev_3.rx[0] == 'O'
+//         && HW_UART_ATY_Dev_3.rx[1] == 'K'
+//         && HW_UART_ATY_Dev_3.rx[2] == '?'))
+//         UartSendStr("OK!", &HW_UART_ATY_Dev_3);
+
+//     Modbus_Process(HW_UART_ATY_Dev_3.rx, HW_UART_ATY_Dev_3.rxCount, &MODBUS_S_LOW_ATY_Dev_1);
+// }
+
+// // 100ms cycle
+// {
+//     UpdateMbRegsFromFloat(mbG, &MODBUS_S_LOW_ATY_Dev_1);
+// }
+
+/******************************************************************************/
+
 /******************************** End Of File *********************************/

+ 2 - 0
MODBUS_S_LOW_ATY.h

@@ -68,6 +68,8 @@ struct MODBUS_S_LOW_ATY_Dev
 union mbFloatChange{ float f_t; uint8_t u8_t[4]; };
 
 uint8_t Modbus_Process(uint8_t* buf, uint8_t len, struct MODBUS_S_LOW_ATY_Dev* dev);
+void UpdateMbRegsFromFloat(float* floatBuf, struct MODBUS_S_LOW_ATY_Dev* dev);
+void TransMbRegsToFloat(float* floatBuf, struct MODBUS_S_LOW_ATY_Dev* dev);
 
 #endif /* __MODBUS_S_LOW_ATY_H */