O_嵌入式专题目录

  • 已合并至 (ATY_LIB)[]

(Tips:Win系统反编译chm hh -decompile D:\htmlFloder D:\DEC.chm

INCLUDE_ATY.h

/**
* @mainpage ATYSTMLIB_HAL
* @section Project
*       - ATYSTMLIB_HAL
*
* @section Author
*       - ATY
*
* @section Copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @section Descriptions
*       - Familiar functions for STM32F1 series
**********************************************************************************
*/

#ifndef __INCLUDE_ATY_H
#define __INCLUDE_ATY_H


#include "stdio.h"
//#include "GPIO_ATY.h"
//#include "TIMER_ATY.h"
//#include "UART_ATY.h"
//#include "I2C_ATY.h"
//#include "RTC_ATY.h"
//#include "PID_ATY.h"
//#include "CRC_ATY.h"
//#include "FILTER_ATY.h"
//#include "L_74HC165_ATY.h"
//#include "L_TPIC6B595_ATY.h"


#endif  /* __INCLUDE_ATY_H */

/******************************** End Of File *********************************/

CRC_ATY.h

/**
* @file CRC_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of CRC for all codes
*
* @par Update
*       - 1_01_200318 > ATY
*           -# Preliminary version, first Release
*       - 1_03_200318 > ATY
*           -# Add Conditional Compilation
*           -# Add user port
*       - 1_05_200722 > ATY
*           -# Change parameters
**********************************************************************************
*/


#ifndef __CRC_ATY_H
#define __CRC_ATY_H

#include "stm32f1xx_hal.h"


/******************************* For user *************************************/
/******************************************************************************/


/**
* @brief Invert buf with uint8_t size
* @param genBuf     - Generate buf
* @param srcBuf     - Input source buf
*/
void InvertUint8(uint8_t *genBuf, uint8_t *srcBuf)
{
    uint8_t i;
    uint8_t tempBuf=0;

    for(i=0;i<8;i++)
    {
        if(srcBuf[0]&(1<<i))
            tempBuf|=1<<(7-i);
    }
    genBuf[0]=tempBuf;
}
/**
* @brief Invert buf with uint16_t size
* @param genBuf     - Generate buf
* @param srcBuf     - Input source buf
*/
void InvertUint16(uint16_t *genBuf, uint16_t *srcBuf)
{
    uint8_t i;
    uint16_t tempBuf=0;

    for(i=0;i<16;i++)
    {
        if(srcBuf[0]&(1<<i))
            tempBuf|=1<<(15-i);
    }
    genBuf[0]=tempBuf;
}
/**
* @brief Generate CRC of Modbus 16
* @param buf        - Generate buf
* @param size       - Input source buf
* @return Value of CRC generate
* @warning Buf size should not cross the boundary, otherwise it will get stuck
*/
uint16_t GenCrc16Modbus(uint8_t *buf, uint8_t size)
{
    uint16_t crcXorResult=0xFFFF;
    uint16_t crcXorMultinomial=0x8005;
    uint8_t tempBuf=0;

    while(size--)
    {
        tempBuf=*(buf++);
        InvertUint8(&tempBuf, &tempBuf);
        crcXorResult^=(tempBuf<<8);

        for(int i=0;i<8;i++)
        {
            if(crcXorResult&0x8000)
                crcXorResult=(crcXorResult<<1)^crcXorMultinomial;
            else
                crcXorResult=crcXorResult<<1;
        }
    }
    InvertUint16(&crcXorResult, &crcXorResult);
    return (crcXorResult);
}
/**
* @brief Generate CRC of Modbus 16 with high bit or low bit
* @param buf        - Generate buf
* @param size       - Input source buf
* @param highLow    - Choose output high bit or low bit, 1 is high, 0 is low
* @return Value of CRC generate in high bit or low bit
* @warning Buf size should not cross the boundary, otherwise it will get stuck
*/
uint8_t GenCrc16ModbusHL(uint8_t *buf, uint8_t size, uint8_t highLow)
{
    uint16_t crcXorResult=0xFFFF;
    uint16_t crcXorMultinomial=0x8005;
    uint8_t tempBuf=0;

    while(size--)
    {
        tempBuf=*(buf++);
        InvertUint8(&tempBuf, &tempBuf);
        crcXorResult^=(tempBuf<<8);

        for(int i=0;i<8;i++)
        {
            if(crcXorResult&0x8000)
                crcXorResult=(crcXorResult<<1)^crcXorMultinomial;
            else
                crcXorResult=crcXorResult<<1;
        }
    }
    InvertUint16(&crcXorResult, &crcXorResult);
    if(highLow)
        return ((uint8_t)(crcXorResult & 0x00FF));
    return ((uint8_t)((crcXorResult >> 8) & 0xFF));
}
/**
* @brief Check CRC of Modbus 16
* @param buf        - Generate buf
* @param size       - Input source buf
* @return Check CRC success or fault
* @warning Buf size should not cross the boundary, otherwise it will get stuck
* @todo "bufData" can creat with unkonw size
*/
uint8_t CheckCrc16Modbus(uint8_t *buf, uint8_t size)
{
    uint8_t bufData[20];
    for(int i=0;i<size-2;i++)
        bufData[i]=buf[i];

    uint16_t crcO=GenCrc16Modbus(bufData, size-2);
    uint8_t CRC_L=(uint8_t)(crcO&0x00FF);
    uint8_t CRC_H=(uint8_t)((crcO>>8)&0xFF);

    if((buf[size-2]==CRC_L) && (buf[size-1]==CRC_H))
        return 1;
    return 0;
}

/**
* @brief Method of application
*/
void UseOfCrc16Modbus(void)
{
    volatile uint8_t checkResult=0;
    uint8_t tempA[12]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0xB3,0xC3};
    uint8_t tempB[12]={0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01};  //B0E7
    uint8_t tempC[12]={0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01};  //B0E7

    checkResult=CheckCrc16Modbus(tempA, 12);
    tempB[10]=(uint8_t)(GenCrc16Modbus(tempB, 10) & 0x00FF);
    tempB[11]=(uint8_t)((GenCrc16Modbus(tempB, 10) >> 8) & 0x00FF);
    tempC[10]=GenCrc16ModbusHL(tempC, 10, 1);
    tempC[11]=GenCrc16ModbusHL(tempC, 10, 0);
}


#endif  /* __CRC_ATY_H */

/******************************** End Of File *********************************/

FILTER_ATY.h

/**
* @file FILTER_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of CRC for all codes
*
* @par Update
*       - 1_01_200318 > ATY
*           -# Preliminary version, first Release
*       - 1_02_200318 > ATY
*           -# Add Conditional Compilation
*           -# Add user port
**********************************************************************************
*/


#ifndef __FILTER_ATY_H
#define __FILTER_ATY_H

#include "stm32f1xx_hal.h"


/******************************* For user *************************************/
#define CHECK_TIMES  0x06
#define CHECK_STATE  0x14
/******************************************************************************/


volatile uint8_t filterState8[CHECK_STATE][CHECK_TIMES]={0};
/**
* @brief 8 byte size filter
* @param name       - Which array bit to save
* @param state      - The newest state of input
* @param checkTimes - Times to check
* @return The newest state when it be stable
* @warning The real filter time depends on the total run time of the loop which
*          contains this program multiply the number of filter times
*/
uint8_t FilterA_8(uint8_t name, uint8_t state, uint8_t checkTimes)
{
    uint8_t FilterA_8_i=0;
    for(FilterA_8_i=0; FilterA_8_i < (checkTimes-1); FilterA_8_i++)
        filterState8[name][FilterA_8_i+1] = filterState8[name][(FilterA_8_i)];
    filterState8[name][0]=state;
    for(FilterA_8_i=0; FilterA_8_i < (checkTimes-1); FilterA_8_i++)
    {
        if(filterState8[name][FilterA_8_i] != filterState8[name][(FilterA_8_i+1)])
            return 0xFF;
    }
    return filterState8[name][0];
}


volatile uint32_t filterState32[CHECK_STATE][CHECK_TIMES]={0};
/**
* @brief 32 byte size filter
* @param name       - Which array bit to save
* @param state      - The newest state of input
* @param checkTimes - Times to check
* @return The newest state when it be stable
* @warning The real filter time depends on the total run time of the loop which
*          contains this program multiply the number of filter times
*/
uint32_t FilterA_32(uint32_t name, uint32_t state, uint32_t checkTimes)
{
    uint32_t FilterA_32_i=0;
    filterState32[name][CHECK_TIMES-1]=state;
    for(FilterA_32_i=0; FilterA_32_i < (checkTimes-1); FilterA_32_i++)
        filterState32[name][FilterA_32_i] = filterState32[name][(FilterA_32_i+1)];
    for(FilterA_32_i=0; FilterA_32_i < (checkTimes-1); FilterA_32_i++)
    {
        if(filterState32[name][FilterA_32_i] != filterState32[name][(FilterA_32_i+1)])
            return 0xFF;
    }
    return filterState32[name][0];
}


#endif  /* __DEBOUNCE_ATY_H */

/******************************** End Of File *********************************/

GPIO_ATY.h

/**
* @file GPIO_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of CRC for all codes
*
* @attention
*       - If use KeyDetect function, the whole while delay should be as small
*         as possible
*
* @par Update
*       - 1_01_200321 > ATY
*           -# Preliminary version, first Release
*       - 1_02_200401 > ATY
*           -# Add KeyTest()
*       - 1_03_200402 > ATY
*           -# Add KeyScan() reserved function
*           -# Refactor all function
*           -# Add KeyDetectOnce()
*           -# Add KeyDetectTwiceBlock()
*           -# Add KeyDetectTwiceUnblock()
**********************************************************************************
*/


#ifndef __GPIO_ATY_H
#define __GPIO_ATY_H

#include "stm32f1xx_hal.h"


/******************************* For user *************************************/
/** @brief You can define GPIO read&write function with your MCU type */

#define HeartbeatLedPort    GPIOE
#define HeartbeatLedPin     GPIO_PIN_5
#define KeyPort             GPIOE
#define KeyPin              GPIO_PIN_4
/******************************************************************************/


#define NONE_PRESS   0
#define PRESS_ONCE   1
#define PRESS_TWICE  2
#define PRESS_LONG   3


uint8_t pressType=NONE_PRESS;
#define LONG_PRESS_TIME 60
uint8_t longPressCount=0;
/**
* @brief Detect whether the key is pressed and how to press
* @param GPIOx      - GPIO_Port
* @param GPIO_Pin   - GPIO_Pin
*/
void KeyDetectOnce(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
    if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)==GPIO_PIN_RESET)
    {
        HAL_Delay(20);
        if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)==GPIO_PIN_RESET)
        {
            if(longPressCount>LONG_PRESS_TIME)
            {
                pressType=PRESS_LONG;
            }
            else
            {
                longPressCount++;
            }
        }
    }
    if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin)==GPIO_PIN_SET)
    {
        if(longPressCount>0 && longPressCount<=LONG_PRESS_TIME)
        {
            pressType=PRESS_ONCE;
        }
        longPressCount=0;
    }
}

#define INTERVAL_TIME   100
uint16_t intervalCount=0;
/**
* @brief Detect press key twice in block way
* @param GPIOx      - GPIO_Port
* @param GPIO_Pin   - GPIO_Pin
*/
void KeyDetectTwiceBlock(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
    KeyDetectOnce(GPIOx, GPIO_Pin);
    if(pressType==PRESS_ONCE)
    {
        intervalCount=0;
        pressType=NONE_PRESS;
        while(++intervalCount)
        {
            KeyDetectOnce(GPIOx, GPIO_Pin);
            HAL_Delay(1);
            if(pressType==PRESS_ONCE)
            {
                pressType=PRESS_TWICE;
                break;
            }
            else
            {
                if(intervalCount>INTERVAL_TIME)
                {
                    pressType=PRESS_ONCE;
                    break;
                }
            }
        }
    }
}

uint8_t pressTimes=0;
/**
* @brief Detect press key twice in block way
* @param GPIOx      - GPIO_Port
* @param GPIO_Pin   - GPIO_Pin
*/
void KeyDetectTwiceUnblock(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
    KeyDetectOnce(GPIOx, GPIO_Pin);
    if(pressType==PRESS_ONCE)
    {
        intervalCount=0;
        if(pressTimes==0)
        {
            pressType=NONE_PRESS;
            pressTimes++;
        }
        else
        {
            pressType=PRESS_TWICE;
            pressTimes=0;
            intervalCount=0;
        }
    }
    intervalCount++;
    HAL_Delay(1);
    if(intervalCount>INTERVAL_TIME && pressTimes!=0)
    {
        pressType=PRESS_ONCE;
        pressTimes=0;
        intervalCount=0;
    }
}
/**
* @brief Scan key matrix value
* @warning If return value is 32bit, theoretical support 16*16 key matrix
*/
uint32_t KeyScan(void)
{

    return 0;
}
/**
* @brief 8 byte size filter
* @param keyValue       - Key value from KeyScan() return
*/
void KeyDetectCombine(uint32_t keyValue)
{

}
/**
* @brief Test key input
* @param testMode       - Test key input
*/
void KeyTest(uint8_t testMode)
{
    switch(testMode)
    {
        case 1:
        {
            KeyDetectOnce(KeyPort, KeyPin);
            if(pressType==PRESS_ONCE)
            {
                pressType=NONE_PRESS;
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
            }
            else if(pressType==PRESS_LONG)
            {
                pressType=NONE_PRESS;
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(20);
            }
            break;
        }
        case 2:
        {
            KeyDetectTwiceBlock(KeyPort, KeyPin);
            if(pressType==PRESS_ONCE)
            {
                pressType=NONE_PRESS;
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
            }
            else if(pressType==PRESS_LONG)
            {
                pressType=NONE_PRESS;
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(20);
            }
            else if(pressType==PRESS_TWICE)
            {
                pressType=NONE_PRESS;
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(200);
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(200);
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(200);
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(200);

            }
            break;
        }
        case 3:
        {
            KeyDetectTwiceUnblock(KeyPort, KeyPin);
            if(pressType==PRESS_ONCE)
            {
                pressType=NONE_PRESS;
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
            }
            else if(pressType==PRESS_LONG)
            {
                pressType=NONE_PRESS;
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(20);
            }
            else if(pressType==PRESS_TWICE)
            {
                pressType=NONE_PRESS;
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(200);
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(200);
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(200);
                HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
                HAL_Delay(200);

            }
            break;
        }
        case 4:
        {
            KeyScan();
            break;
        }
    }
}


#endif  /* __GPIO_ATY_H */

/******************************** End Of File *********************************/

I2C_ATY.h

/**
* @file I2C_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of CRC for all codes
*
* @par Update
*       - 1_01_200320 > ATY
*           -# Preliminary version, first Release
**********************************************************************************
*/


#ifndef __I2C_ATY_H
#define __I2C_ATY_H

#include "stm32f1xx_hal.h"


/******************************* For user *************************************/
#define HI2C_N hi2c1
/******************************************************************************/


extern I2C_HandleTypeDef HI2C_N;
/**
* @brief Read I2C with HAL lib function
* @param addr       - Start address
* @param pData      - Data
* @param size       - Size to write or read
*/
void I2C_Read(uint16_t addr, uint8_t *pData, uint16_t size)
{
    HAL_I2C_Mem_Read(&HI2C_N, 0xA0, addr, I2C_MEMADD_SIZE_8BIT, pData, size, 100);
}
/**
* @brief Write I2C with HAL lib function
* @param addr       - Start address
* @param pData      - Data
* @param size       - Size to write or read
*/
void I2C_Write(uint16_t addr, uint8_t *pData, uint16_t size)
{
    uint16_t firstWrite=0,i=0;

    HAL_I2C_Mem_Write(&HI2C_N, 0xA1, addr, I2C_MEMADD_SIZE_8BIT, pData, size, 100);
    HAL_Delay(5);

    firstWrite=8-(addr%8);                        //How long left of this page
    if((addr/8) != ((addr+size)/8))
    {
        for(i=0; i<(((addr+size)/8)-(addr/8)); i++)
        {
//            HAL_IWDG_Refresh(&hiwdg);
            HAL_I2C_Mem_Write(&HI2C_N, 0xA1, addr+firstWrite+(i*8), I2C_MEMADD_SIZE_8BIT,
                              pData+firstWrite+(i*8), size-firstWrite-(i*8), 100);
            HAL_Delay(5);
        }
    }
}

#define WRITE_LENGTH    5
/**
* @brief A template to use I2C function for AT24C02
*/
void I2C_Template(void)
{
    uint8_t tmpWriteData[WRITE_LENGTH]={0};
    uint8_t tmpAddr=0,tmpReadData=0;
    uint16_t i=0;

    I2C_Read(0, &tmpAddr, 1);
    if(tmpAddr>=(256-WRITE_LENGTH))
    {
        tmpAddr=0;
    }
    tmpAddr+=WRITE_LENGTH;
    I2C_Write(0, &tmpAddr, 1);

    tmpWriteData[0]+=tmpAddr;
    for(i=0;i<(WRITE_LENGTH-1);i++)
    {
//        HAL_IWDG_Refresh(&hiwdg);
        tmpWriteData[i+1]=tmpWriteData[i]+1;
    }
    I2C_Write(tmpAddr, tmpWriteData, WRITE_LENGTH);

    for(i=0;i<(tmpAddr+WRITE_LENGTH);i++)
    {
//        HAL_IWDG_Refresh(&hiwdg);
        I2C_Read(i, &tmpReadData, 1);
        printf("%d ", tmpReadData);
    }
    printf("\n\n");

//  I2C_Read(tmpAddr, tmpBuf+2, WRITE_LENGTH);         //tmpBuf can be a pointer like a aarry
}


/**
* @brief Eliminate HAL_I2C bug
* @warning Put "__HAL_RCC_I2C1_CLK_ENABLE();" before GPIO init
*/
//void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
//{
//  GPIO_InitTypeDef GPIO_InitStruct = {0};
//  if(hi2c->Instance==I2C1)
//  {
//  /* USER CODE BEGIN I2C1_MspInit 0 */
//  __HAL_RCC_I2C1_CLK_ENABLE();
//  /* USER CODE END I2C1_MspInit 0 */
//
//    __HAL_RCC_GPIOB_CLK_ENABLE();
//    /**I2C1 GPIO Configuration
//    PB6     ------> I2C1_SCL
//    PB7     ------> I2C1_SDA
//    */
//    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
//    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
//    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
//    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//
//    /* Peripheral clock enable */
//    //__HAL_RCC_I2C1_CLK_ENABLE();
//  /* USER CODE BEGIN I2C1_MspInit 1 */
//
//  /* USER CODE END I2C1_MspInit 1 */
//  }
//
//}


#endif  /* __I2C_ATY_H */

/******************************** End Of File *********************************/

L_74HC165_ATY.h

/**
* @file L_74HC165_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of L_74HC165 for all codes
*
* @par Update
*       - 1_01_200525 > ATY
*           -# Preliminary version, first Release
*       - 1_02_200525 > ATY
*           -# Add Conditional Compilation
*           -# Add user port
**********************************************************************************
*/


#ifndef __L_74HC165_ATY_H
#define __L_74HC165_ATY_H

#include "stm32f1xx_hal.h"

/******************************* For user *************************************/
#define CLK_W_H     HAL_GPIO_WritePin(L_74HC165_CLK_GPIO_Port, L_74HC165_CLK_Pin, GPIO_PIN_SET)
#define CLK_W_L     HAL_GPIO_WritePin(L_74HC165_CLK_GPIO_Port, L_74HC165_CLK_Pin, GPIO_PIN_RESET)
#define SH_W_H      HAL_GPIO_WritePin(L_74HC165_SH_GPIO_Port, L_74HC165_SH_Pin, GPIO_PIN_SET)
#define SH_W_L      HAL_GPIO_WritePin(L_74HC165_SH_GPIO_Port, L_74HC165_SH_Pin, GPIO_PIN_RESET)
#defien DATA_R_H    (HAL_GPIO_ReadPin(L_74HC165_DATA_GPIO_Port, L_74HC165_DATA_Pin) == GPIO_PIN_SET)
#define DATA_R_L    (HAL_GPIO_ReadPin(L_74HC165_DATA_GPIO_Port, L_74HC165_DATA_Pin) == GPIO_PIN_RESET)
/******************************************************************************/


/**
* @brief Get value of L_74HC165
* @param size       - Size to read
* @return Value of L_74HC165
* @warning L_74HC165 reading data unstable at high temperature(about 80 celsius degree),
*          so it's better to read at the begining only
*/
uint32_t L_74HC165_Get(uint32_t size)
{
    uint32_t scanValue=0,i_L_74HC165_Get=0;

    CLK_W_H;
    SH_W_L;     //Start read
    SH_W_H;     //Stop read

    for(i_L_74HC165_Get=0; i_L_74HC165_Get<size; i_L_74HC165_Get++)
    {
        scanValue = scanValue << 1;
        if(DATA_R_H)
            scanValue |= 0x01;
        CLK_W_L;
        __nop();
        CLK_W_H;
    }

    CLK_W_L;

    return scanValue;
}

#endif  /* __L_74HC165_ATY_H */

/******************************** End Of File *********************************/

PID_ATY.h

/**
* @file PID_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of CRC for all codes
*
* @par Update
*       - 1_01_200318 > ATY
*           -# Preliminary version, first Release
*       - 1_02_200318 > ATY
*           -# Add Conditional Compilation
*           -# Add user port
**********************************************************************************
*/


#ifndef __PID_ATY_H
#define __PID_ATY_H

#include "stm32f1xx_hal.h"
#include "string.h"


/******************************* For user *************************************/
/******************************************************************************/


double pidSetNum=0,pidCurNum=0;

typedef struct PID{
    double SetPoint;            //Set point desired value
    double Proportion;          //Proportional const
    double Integral;            //Integral const
    double Derivative;          //Derivative const
    double LastError;           //Error[-1]
    double PrevError;           //Error[-2]
    double SumError;            //Sums of errors
}PID;

/**
* @brief Calculate rOut
* @param pidStruct      - pidStruct
* @param nextPoint      - nextPoint
* @return pidStruct
*/
double PidCalc(PID *pidStruct, double nextPoint)
{
    double dError,Error;
    Error=pidStruct->SetPoint-nextPoint;                        //Deviation
    pidStruct->SumError+=Error;                                 //Integral
    dError=pidStruct->LastError-pidStruct->PrevError;           //Current differential
    pidStruct->PrevError=pidStruct->LastError;
    pidStruct->LastError=Error;
    return (pidStruct->Proportion *Error                        //Proportional
                    +pidStruct->Integral *pidStruct->SumError   //Integral item
                    +pidStruct->Derivative *dError );           //Differential item
}

/**
* @brief Init pid
* @param pidStruct      - pidStruct
*/
void PidInit (PID *pidStruct)
{
    memset(pidStruct, 0, sizeof(PID));
}

/**
* @brief Calculate pidCurNum
* @param rDelta     - rDelta
* @return
*/
void Actuator(double rDelta)
{
    pidCurNum+=rDelta;
}

/**
* @brief Pid control
*/
void PidControl(void)
{
    PID sPID[2];                                                //PID Control Struct
    double rOut[2];                                             //PID Response (Output)
    double rIn[2];                                              //PID Feedback (Input)
    uint8_t i=0;

    PidInit(&sPID[0]);                                          //Initialize Struct
    sPID[0].Proportion=0.5;                                     //Set PID Coefficients
    sPID[0].Integral=0.5;
    sPID[0].Derivative=0;
    sPID[0].SetPoint=pidSetNum;                                 //Set PID Setpoint (Goal)

    while(1)                                                    //Better torite in timer interrupt call back function
    {                                                           //Mock Up of PID processing
        if(i>50)
        {
            i=0;
            pidSetNum+=10;
            if(pidSetNum>100)
                pidSetNum=0;
        }
        i++;

        sPID[0].SetPoint=pidSetNum;

        rIn[0]=pidCurNum;                                       //Reads the input variable function (Read Input )
        rOut[0]=PidCalc(&sPID[0], rIn[0]);                      //PID calculation function (Perform PID Interation)
        Actuator(rOut[0]);                                      //Output variable control function (Effect Needed Changes)

//      printf("In: %f\nOut: %f\nPidCur: %f\n\n", rIn[0], rOut[0], pidCurNum);
        printf("%f\n", pidCurNum);

        HAL_Delay(100);
    }
}


#endif  /* __PID_ATY_H */

/******************************** End Of File *********************************/

RTC_ATY.h

/**
* @file RTC_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of CRC for all codes
*
* @par Update
*       - 1_01_200317 > ATY
*           -# Preliminary version, first Release
*       - 1_02_200318 > ATY
*           -# Add RTC_Set and RTC_GetShowHex()
*       - 1_03_200319 > ATY
*           -# Add RTC_UartSet()
*           -# Add RTC_FormatToUnix32()
*           -# Add RTC_Unix32ToFormat()
**********************************************************************************
*/


#ifndef __RTC_ATY_H
#define __RTC_ATY_H

#include "stm32f1xx_hal.h"
#include "time.h"


/******************************* For user *************************************/
#define RTC_N   hrtc
// #define SET_IN_UART
/******************************************************************************/


extern RTC_HandleTypeDef RTC_N;
RTC_DateTypeDef rtcDateStructure;
RTC_TimeTypeDef rtcTimeStructure;

/**
* @brief Init rtc date and time
*/
void RTC_Init(void)
{
    rtcDateStructure.Year=20;
    rtcDateStructure.Month=3;
    rtcDateStructure.Date=16;
    rtcTimeStructure.Hours=17;
    rtcTimeStructure.Minutes=12;
    rtcTimeStructure.Seconds=00;
    HAL_RTC_SetDate(&RTC_N, &rtcDateStructure, RTC_FORMAT_BIN);
    HAL_RTC_SetTime(&RTC_N, &rtcTimeStructure, RTC_FORMAT_BIN);
}

/**
* @brief Set rtc date and time
* @param year           - Year
* @param month          - Month
* @param date           - Date
* @param hours          - Hours
* @param minutes        - Minutes
* @param seconds        - Seconds
*/
void RTC_Set(uint8_t year, uint8_t month, uint8_t date,
            uint8_t hours, uint8_t minutes, uint8_t seconds)
{
    rtcDateStructure.Year=year;
    rtcDateStructure.Month=month;
    rtcDateStructure.Date=date;
    rtcTimeStructure.Hours=hours;
    rtcTimeStructure.Minutes=minutes;
    rtcTimeStructure.Seconds=seconds;
    HAL_RTC_SetDate(&RTC_N, &rtcDateStructure, RTC_FORMAT_BIN);
    HAL_RTC_SetTime(&RTC_N, &rtcTimeStructure, RTC_FORMAT_BIN);
}

/**
* @brief Determine if it's a leap year
* @param year       - Year
* @return Is leap year or not
* @brief
*           Month         01 02 03 04 05 06 07 08 09 10 11 12
*           IsLeapYear    31 29 31 30 31 30 31 31 30 31 30 31
*           NotLeapYear   31 28 31 30 31 30 31 31 30 31 30 31
*/
uint8_t IsLeapYear(uint16_t year)
{
    if(year%4==0)
    {
        if(year%100==0)
        {
            /*- It has to be divisible by 400 if the year end with 00 */
            if(year%400==0)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        else
        {
            return 1;
        }
    }
    else
    {
        return 0;
    }
}


/**
* @brief Get rtc date time and convert to unix
* @param show       - Chose to print or not
* @return Time data in unix32
* @warning Must get time before get date
*/
uint32_t RTC_FormatToUnix32(uint8_t show)
{
    uint32_t unixTime;
    struct tm stmT;

    HAL_RTC_GetTime(&hrtc, &rtcTimeStructure, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc, &rtcDateStructure, RTC_FORMAT_BIN);

    stmT.tm_year=rtcDateStructure.Year+100;
    stmT.tm_mon=rtcDateStructure.Month-1;
    stmT.tm_mday=rtcDateStructure.Date;
    stmT.tm_hour=rtcTimeStructure.Hours-8;
    stmT.tm_min=rtcTimeStructure.Minutes;
    stmT.tm_sec=rtcTimeStructure.Seconds;

    unixTime=mktime(&stmT);
    if(show)
    {
        printf("UTC:%d\n",unixTime);
    }
    return unixTime;
}

/**
* @brief Detect whether the key is pressed and how to press
* @param unixTime       - Time data in unix32
* @param show           - Chose to print or not
*/
void RTC_Unix32ToFormat(uint32_t unixTime, uint8_t show)
{
    struct tm *stmU;

    stmU=localtime(&unixTime);

    rtcDateStructure.Year=stmU->tm_year-100;
    rtcDateStructure.Month=stmU->tm_mon+1;
    rtcDateStructure.Date=stmU->tm_mday;
    rtcTimeStructure.Hours=stmU->tm_hour+8;
    rtcTimeStructure.Minutes=stmU->tm_min;
    rtcTimeStructure.Seconds=stmU->tm_sec;

    HAL_RTC_SetDate(&hrtc, &rtcDateStructure, RTC_FORMAT_BIN);
    HAL_RTC_SetTime(&hrtc, &rtcTimeStructure, RTC_FORMAT_BIN);

    if(show)
    {
        printf("%02d/%02d/%02d\n", 2000+rtcDateStructure.Year, rtcDateStructure.Month, rtcDateStructure.Date);
        printf("%02d:%02d:%02d\n\n", rtcTimeStructure.Hours, rtcTimeStructure.Minutes, rtcTimeStructure.Seconds);
    }
}

uint8_t dateTimeShow[6]={0};
/**
* @brief Get rtc date time and print to uart
* @param show       - Chose to print or not
* @warning Must get time before get date
*/
void RTC_GetShow(uint8_t show)
{
    HAL_RTC_GetTime(&RTC_N, &rtcTimeStructure, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&RTC_N, &rtcDateStructure, RTC_FORMAT_BIN);

    if(show)
    {
        dateTimeShow[0]=RTC_FormatToUnix32(0)>>24;
        dateTimeShow[1]=RTC_FormatToUnix32(0)>>16;
        dateTimeShow[2]=RTC_FormatToUnix32(0)>>8;
        dateTimeShow[3]=RTC_FormatToUnix32(0);
        dateTimeShow[4]=0x00;
        dateTimeShow[5]=0x00;
//        dateTimeShow[0]=rtcDateStructure.Year;
//        dateTimeShow[1]=rtcDateStructure.Month;
//        dateTimeShow[2]=rtcDateStructure.Date;
//        dateTimeShow[3]=rtcTimeStructure.Hours;
//        dateTimeShow[4]=rtcTimeStructure.Minutes;
//        dateTimeShow[5]=rtcTimeStructure.Seconds;
//        /* Display date Format : yy-mm-dd */
        printf("\n%02d-%02d-%02d\n",2000+rtcDateStructure.Year,
                                   rtcDateStructure.Month,
                                   rtcDateStructure.Date);
//        /* Display time Format : hh:mm:ss */
        printf("%02d:%02d:%02d\n",rtcTimeStructure.Hours,
                             rtcTimeStructure.Minutes,
                             rtcTimeStructure.Seconds);
    }
}

/**
* @brief Get rtc date time and print to uart in hexadecimal
* @param show       - Chose to print or not
* @warning Must get time before get date
*/
void RTC_GetShowHex(uint8_t show)
{
    uint32_t dateHex=0,timeHex=0;

    HAL_RTC_GetTime(&RTC_N, &rtcTimeStructure, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&RTC_N, &rtcDateStructure, RTC_FORMAT_BIN);

    timeHex=(rtcTimeStructure.Hours<<16)+(rtcTimeStructure.Minutes<<8)+rtcTimeStructure.Seconds;
    dateHex=(rtcDateStructure.Year<<16)+(rtcDateStructure.Month<<8)+rtcDateStructure.Date;

    if(show)
    {
        printf("\n%08x\n",dateHex);
        printf("%08x\n",timeHex);
    }
}

void RTC_GetShowUnix32(uint8_t show)
{

}

#ifdef SET_IN_UART
/**
* @brief Use uart set RTC time
* @brief Temp: 200318083000 - 2020/03/18 08:30:00
*/
void RTC_SetInUart(void)
{
    if(uart1GetCount >0)
    {
        rtcDateStructure.Year=((uart1GetStr[0]-48)*10)+(uart1GetStr[1]-48);
        rtcDateStructure.Month=((uart1GetStr[2]-48)*10)+(uart1GetStr[3]-48);
        rtcDateStructure.Date=((uart1GetStr[4]-48)*10)+(uart1GetStr[5]-48);
        rtcTimeStructure.Hours=((uart1GetStr[6]-48)*10)+(uart1GetStr[7]-48);
        rtcTimeStructure.Minutes=((uart1GetStr[8]-48)*10)+(uart1GetStr[9]-48);
        rtcTimeStructure.Seconds=((uart1GetStr[10]-48)*10)+(uart1GetStr[11]-48);
        HAL_RTC_SetTime(&RTC_N, &rtcTimeStructure, RTC_FORMAT_BIN);
        HAL_RTC_SetDate(&RTC_N, &rtcDateStructure, RTC_FORMAT_BIN);
        memset(uart1GetStr, 0, sizeof(uart1GetStr));
        uart1GetCount=0;
    }
}
#endif  /* SET_IN_UART */


#endif  /* __RTC_ATY_H */

/******************************** End Of File *********************************/

TIMER_ATY.h

/**
* @file TIMER_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of CRC for all codes
*
* @par Update
*       - 1_01_200317 > ATY
*           -# Preliminary version, first Release
*       - 1_02_200318 > ATY
*           -# Add Conditional Compilation
*           -# Add user port
*       - 1_03_200319 > ATY
*           -# Add RTC delay_s()
*       - 1_04_200401 > ATY
*           -# Add delay_s() for other types
*           -# Add delayTest()
*           -# Fix Timer type function bug
*       - 1_05_200423 > ATY
*           -# Add TEST_ATY()
**********************************************************************************
*/


#ifndef __TIMER_ATY_H
#define __TIMER_ATY_H

#include "stm32f1xx_hal.h"


/******************************* For user *************************************/
//#define SYS_ATY
//#define HAL_ATY
#define TIM_ATY
#define HTIM_N  htim2
//#define RTC_ATY
//#define HRTC_N  hrtc

//#define TEST_ATY
/******************************************************************************/


/****************************** Use SysTick ***********************************/
#ifdef SYS_ATY
#define F0_BASE_NUM_SYS 6
#define F1_BASE_NUM_SYS 9
#define BASE_NUM_SYS    F1_BASE_NUM_SYS
/**
* @brief Delay n us with SysTick
* @param us     - us
* @brief SysTick is a 24-bit timer, max count number is 16777215;
*        F0: 48MHz/8 -> 6 -> 6 numbers per us -> 2796ms max;
*        F1: 72MHz/8 -> 9 -> 9 numbers per us -> 1864ms max;
*/
void delay_us(uint32_t us)
{
    uint32_t temp;
    SysTick->LOAD=BASE_NUM_SYS*us;
    SysTick->VAL=0X00;
    SysTick->CTRL=0X01;
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&(!(temp&(1<<16))));

    SysTick->CTRL=0x00;
    SysTick->VAL=0X00;
}
/**
* @brief Delay n ms with SysTick
* @param ms     - ms
*/
void delay_ms(uint16_t ms)
{
    uint32_t temp;
    SysTick->LOAD=BASE_NUM_SYS*1000*ms;
    SysTick->VAL=0X00;
    SysTick->CTRL=0X01;
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&(!(temp&(1<<16))));

    SysTick->CTRL=0x00;
    SysTick->VAL=0X00;
}
/**
* @brief Delay n s with SysTick
* @param s     - s
*/
void delay_s(uint32_t s)
{
    for(;s>0;s--)
    {
        delay_ms(1000);
    }
}
#endif    /* SYS_ATY */


/**************************** Change Hal_Delay() ******************************/
#ifdef HAL_ATY
/**
* @brief Delay n us in changing RCC clock
* @param us     - us
*/
void delay_us(uint32_t us)
{
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);
    HAL_Delay(us);
}
/**
* @brief Delay n ms in changing RCC clock
* @param ms     - ms
* @return
*/
void delay_ms(uint16_t ms)
{
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
    HAL_Delay(ms);
}
/**
* @brief Delay n s in changing RCC clock
* @param s     - s
*/
void delay_s(uint32_t s)
{
    for(;s>0;s--)
    {
        delay_ms(1000);
    }
}

#endif  /* HAL_ATY */


/********************************* Use Timer **********************************/
#ifdef TIM_ATY
extern TIM_HandleTypeDef HTIM_N;
/**
* @brief Delay n us with TimerN
* @param us     - us
* @brief Commonly used in RTOS microsecond delay;
*        F1 -> 72Mhz -> Prescaler=71 -> 1us per count,
*                       Prescaler=719 -> 10us per count,
*                       Prescaler=7199 -> 100us per count,
*        so Period init number need to be larger than max us,
*        and Prescaler init must be 71 if use this type delay function
* @warning Be easily disturbed by other interrupt;
*/
void delay_us(uint16_t us)
{
    uint16_t timerCounter=0xffff-us-5;
    HAL_TIM_Base_Start(&HTIM_N);
    __HAL_TIM_SET_COUNTER(&HTIM_N,timerCounter);
    while(timerCounter<0xffff-5)
    {
        timerCounter=__HAL_TIM_GET_COUNTER(&HTIM_N);
    }
    HAL_TIM_Base_Stop(&HTIM_N);
}
/**
* @brief Delay n ms with TimerN
* @param ms     - ms
*/
void delay_ms(uint32_t ms)
{
    for(;ms>0;ms--)
    {
        delay_us(1000);
    }
}
/**
* @brief Delay n s with TimerN
* @param s     - s
*/
void delay_s(uint32_t s)
{
    for(;s>0;s--)
    {
        delay_ms(1000);
    }
}
#endif  /* TIM_ATY */


/********************************* Use RTC ************************************/
#ifdef RTC_ATY
extern RTC_HandleTypeDef HRTC_N;
/**
* @brief Get counter number of rtc
* @param hrtc       - hrtc
*/
uint32_t RTC_ReadTimeCounter(RTC_HandleTypeDef *hrtc)
{
    uint16_t highFirst=0U,low=0U,highSecond=0U;
    uint32_t timeCounter=0U;
    highFirst=READ_REG(hrtc->Instance->CNTH & RTC_CNTH_RTC_CNT);
    low=READ_REG(hrtc->Instance->CNTL & RTC_CNTL_RTC_CNT);
    highSecond=READ_REG(hrtc->Instance->CNTH & RTC_CNTH_RTC_CNT);

    if(highFirst!=highSecond)
    {
        /*- In this case the counter roll over during reading of CNTL and CNTH registers,
        read again CNTL register then return the counter value */
        timeCounter=(((uint32_t)highSecond<<16U) |
                    READ_REG(hrtc->Instance->CNTL & RTC_CNTL_RTC_CNT));
    }
    else
    {
        /*- No counter roll over during reading of CNTL and CNTH registers,
        counter value is equal to first value of CNTL and CNTH */
        timeCounter=(((uint32_t)highFirst<<16U) | low);
    }

    return timeCounter;
}

/**
* @brief Delay n us
*/
void delay_us(void){}
/**
* @brief Delay n ms
*/
void delay_ms(void){}

/**
* @FunctionName: delay_s
* @Descriptions: Delay n seconds with RTC timeCounter
* @Parameters: seconds
* @ReturnedValue: none
* @Instruction:
*/
void delay_s(uint32_t s)
{
    s+=RTC_ReadTimeCounter(&HRTC_N);
    while(s>RTC_ReadTimeCounter(&HRTC_N)){}
}
#endif  /* RTC_ATY */

#ifdef TEST_ATY
/**
* @brief A simple test function for delay_us/ms/s
* @brief Heartbeat LED need to be defined at GPIO_ATY.h
*/
void delayTest(void)
{
    HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
    delay_ms(1000);
    HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
    for(i_ATY=0;i_ATY<1000;i_ATY++)
        delay_us(1000);
    HAL_GPIO_TogglePin(HeartbeatLedPort, HeartbeatLedPin);
    delay_s(5);

}
#endif  /* TEST_ATY */

#endif  /* __TIMER_ATY_H */

/******************************** End Of File *********************************/

L_TPIC6B595_ATY.h

/**
* @file L_TPIC6B595_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of L_TPIC6B595 for all codes
*
* @par Update
*       - 1_01_200825 > ATY
*           -# Preliminary version, first Release
**********************************************************************************
*/


#ifndef __L_TPIC6B595_ATY_H
#define __L_TPIC6B595_ATY_H

#include "stm32f1xx_hal.h"

/******************************* For user *************************************/
#define SERIN_W_H       HAL_GPIO_WritePin(L_TPIC6B595_SERIN_GPIO_Port, L_TPIC6B595_SERIN_Pin, GPIO_PIN_SET)
#define SERIN_W_L       HAL_GPIO_WritePin(L_TPIC6B595_SERIN_GPIO_Port, L_TPIC6B595_SERIN_Pin, GPIO_PIN_RESET)
#define RSCK_W_H        HAL_GPIO_WritePin(L_TPIC6B595_RSCK_GPIO_Port, L_TPIC6B595_RSCK_Pin, GPIO_PIN_SET)
#define RSCK_W_L        HAL_GPIO_WritePin(L_TPIC6B595_RSCK_GPIO_Port, L_TPIC6B595_RSCK_Pin, GPIO_PIN_RESET)
#defien SCK_W_H         HAL_GPIO_WritePin(L_TPIC6B595_SCK_GPIO_Port, L_TPIC6B595_SCK_Pin, GPIO_PIN_SET)
#define SCK_W_L         HAL_GPIO_WritePin(L_TPIC6B595_SCK_GPIO_Port, L_TPIC6B595_SCK_Pin, GPIO_PIN_RESET)
/******************************************************************************/


/**
* @brief Set value of L_TPIC6B595
* @param data       - Data to write
* @param size       - Size of data
*/
void L_TPIC6B595_Set(uint32_t data, uint32_t size)
{
    uint32_t i_L_TPIC6B595_Set=0;

    SCK_W_L;
    RSCK_W_L;

    for(i_L_TPIC6B595_Set=0; i_L_TPIC6B595_Set<size; i_L_TPIC6B595_Set++)
    {
        if(data&0X01)
            SERIN_W_H;
        else
            SERIN_W_L;
        __nop();__nop();
        SCK_W_L;
        __nop();__nop();
        SCK_W_H;
        __nop();__nop();
        data>>=1;
    }

    RSCK_W_L;
    __nop();__nop();
    RSCK_W_H;
    __nop();__nop();
    RSCK_W_L;
}

#endif  /* __L_TPIC6B595_ATY_H */

/******************************** End Of File *********************************/

UART_ATY.h

/**
* @file UART_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of CRC for all codes
*
* @attention
*       - "UartInit_ATY();" need to be added at main()
*
* @par Update
*       - 1_01_200317 > ATY
*           -# Preliminary version, first Release
*       - 1_02_200318 > ATY
*           -# Add Conditional Compilation
*           -# Add user port
*       - 1_03_200401 > ATY
*           -# Fix UartControlTemplate()
*           -# Change UartSend() to use string and size
*           -# Test uart 1-5 in normal IT
*           -# Change DMA all function
*           -# Test uart 1-4 in DMA IT
*           -# (Might be the last version)
*       - 1_04_200423 > ATY
*           -# Add TEST_ATY()
*       - 1_05_200429 > ATY
*           -# Change to uart1-5 independent function
**********************************************************************************
*/


#ifndef __UART_ATY_H
#define __UART_ATY_H

#include "stm32f1xx_hal.h"
#include "stdio.h"                      //For "FILE"
#include "string.h"                     //For memset etc.


/******************************* For user *************************************/
// #define TEST_IT_ATY
// #define TEST_DMA_ATY

//#define HUART_N huart2                  //For printf();

#define UART1_NIT_ATY
// #define UART1_DMA_ATY
#define UART1_GET_SIZE   4
#define UART1_SEND_SIZE  8

#define UART2_NIT_ATY
// #define UART2_DMA_ATY
#define UART2_GET_SIZE   11
#define UART2_SEND_SIZE  8

#define UART3_NIT_ATY
// #define UART3_DMA_ATY
#define UART3_GET_SIZE   13
#define UART3_SEND_SIZE  255

// #define UART4_NIT_ATY
// #define UART4_DMA_ATY
// #define UART4_GET_SIZE   8
// #define UART4_SEND_SIZE  8

// #define UART5_NIT_ATY
// #define UART5_DMA_ATY
// #define UART5_GET_SIZE   8
// #define UART5_SEND_SIZE  8
/******************************************************************************/


#ifdef UART1_NIT_ATY
uint8_t uart1GetByte=0;
uint8_t uart1GetCount=0;
uint8_t uart1GetStr[UART1_GET_SIZE];
uint8_t uart1SendStr[UART1_SEND_SIZE];
#endif  /* UART1_NIT_ATY */

#ifdef UART2_NIT_ATY
uint8_t uart2GetByte=0;
uint8_t uart2GetCount=0;
uint8_t uart2GetStr[UART2_GET_SIZE];
uint8_t uart2SendStr[UART2_SEND_SIZE];
#endif  /* UART2_NIT_ATY */

#ifdef UART3_NIT_ATY
uint8_t uart3GetByte=0;
uint8_t uart3GetCount=0;
uint8_t uart3GetStr[UART3_GET_SIZE];
uint8_t uart3SendStr[UART3_SEND_SIZE];
#endif  /* UART3_NIT_ATY */

#ifdef UART4_NIT_ATY
uint8_t uart4GetByte=0;
uint8_t uart4GetCount=0;
uint8_t uart4GetStr[UART4_GET_SIZE];
uint8_t uart4SendStr[UART4_SEND_SIZE];
#endif  /* UART4_NIT_ATY */

#ifdef UART5_NIT_ATY
uint8_t uart5GetByte=0;
uint8_t uart5GetCount=0;
uint8_t uart5GetStr[UART5_GET_SIZE];
uint8_t uart5SendStr[UART5_SEND_SIZE];
#endif  /* UART5_NIT_ATY */


#ifdef UART1_DMA_ATY
uint8_t uart1GetByte=0;
uint8_t uart1GetCount=0;
uint8_t uart1GetStr[UART1_GET_SIZE];
uint8_t uart1SendStr[UART1_SEND_SIZE];
uint16_t uart1DmaSendFlag=0;
volatile uint8_t uart1RecvEndFlag=0;
static __IO ITStatus uart1Ready=RESET;
extern DMA_HandleTypeDef hdma_usart1_rx;
#endif  /* UART1_DMA_ATY */


#ifdef UART2_DMA_ATY
uint8_t uart2GetByte=0;
uint8_t uart2GetCount=0;
uint8_t uart2GetStr[UART2_GET_SIZE];
uint8_t uart2SendStr[UART2_SEND_SIZE];
uint16_t uart2DmaSendFlag=0;
volatile uint8_t uart2RecvEndFlag=0;
static __IO ITStatus uart2Ready=RESET;
extern DMA_HandleTypeDef hdma_usart2_rx;
#endif  /* UART2_DMA_ATY */


#ifdef UART3_DMA_ATY
uint8_t uart3GetByte=0;
uint8_t uart3GetCount=0;
uint8_t uart3GetStr[UART3_GET_SIZE];
uint8_t uart3SendStr[UART3_SEND_SIZE];
uint16_t uart3DmaSendFlag=0;
volatile uint8_t uart3RecvEndFlag=0;
static __IO ITStatus uart3Ready=RESET;
extern DMA_HandleTypeDef hdma_usart3_rx;
#endif  /* UART3_DMA_ATY */


#ifdef UART4_DMA_ATY
uint8_t uart4GetByte=0;
uint8_t uart4GetCount=0;
uint8_t uart4GetStr[UART4_GET_SIZE];
uint8_t uart4SendStr[UART4_SEND_SIZE];
uint16_t uart4DmaSendFlag=0;
volatile uint8_t uart4RecvEndFlag=0;
static __IO ITStatus uart4Ready=RESET;
extern DMA_HandleTypeDef hdma_usart4_rx;
#endif  /* UART4_DMA_ATY */


#ifdef UART5_DMA_ATY
uint8_t uart5GetByte=0;
uint8_t uart5GetCount=0;
uint8_t uart5GetStr[UART5_GET_SIZE];
uint8_t uart5SendStr[UART5_SEND_SIZE];
uint16_t uart5DmaSendFlag=0;
volatile uint8_t uart5RecvEndFlag=0;
static __IO ITStatus uart5Ready=RESET;
extern DMA_HandleTypeDef hdma_usart5_rx;
#endif  /* UART5_DMA_ATY */


/**
* @brief Rewrite "printf();"
*/
//extern UART_HandleTypeDef HUART_N;
//int fputc(int ch, FILE *f)
//{
//    HAL_UART_Transmit(&HUART_N, (uint8_t*)&ch, 1, 1000);
//    return ch;
//}


/**
* @brief Init uart interrupt
*/
void UartInit_ATY(void)
{
#ifdef UART1_NIT_ATY
    HAL_UART_Receive_IT(&huart1, &uart1GetByte, 1);
#endif  /* UART1_NIT_ATY */

#ifdef UART2_NIT_ATY
    HAL_UART_Receive_IT(&huart2, &uart2GetByte, 1);
#endif  /* UART2_NIT_ATY */

#ifdef UART3_NIT_ATY
    HAL_UART_Receive_IT(&huart3, &uart3GetByte, 1);
#endif  /* UART3_NIT_ATY */

#ifdef UART4_NIT_ATY
    HAL_UART_Receive_IT(&huart4, &uart4GetByte, 1);
#endif  /* UART4_NIT_ATY */

#ifdef UART5_NIT_ATY
    HAL_UART_Receive_IT(&huart5, &uart5GetByte, 1);
#endif  /* UART5_NIT_ATY */


#ifdef UART1_DMA_ATY
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
    HAL_UART_Receive_DMA(&huart1, uart1GetStr, UART1_GET_SIZE);
#endif  /* UART1_DMA_ATY */

#ifdef UART2_DMA_ATY
    __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
    HAL_UART_Receive_DMA(&huart2, uart2GetStr, UART2_GET_SIZE);
#endif  /* UART2_DMA_ATY */

#ifdef UART3_DMA_ATY
    __HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
    HAL_UART_Receive_DMA(&huart3, uart3GetStr, UART3_GET_SIZE);
#endif  /* UART3_DMA_ATY */

#ifdef UART4_DMA_ATY
    __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
    HAL_UART_Receive_DMA(&huart4, uart4GetStr, UART4_GET_SIZE);
#endif  /* UART4_DMA_ATY */

#ifdef UART5_DMA_ATY
    __HAL_UART_ENABLE_IT(&huart5, UART_IT_IDLE);
    HAL_UART_Receive_DMA(&huart5, uart5GetStr, UART5_GET_SIZE);
#endif  /* UART5_DMA_ATY */
}

/******************************* Normal IT Type *******************************/
#ifdef UART1_NIT_ATY
/**
* @brief Send data from uart
* @param pData      - Data to send
* @param Size       - Size of data
*/
void Uart1Send(uint8_t *pData, uint16_t Size)
{
    HAL_UART_Transmit_IT(&huart1, (uint8_t*)pData, Size);
}
/**
* @brief Receive data from uart with IT
*/
void Uart1Recv(void)
{
    if(uart1GetCount<UART1_GET_SIZE)
    {
        uart1GetStr[uart1GetCount++]=uart1GetByte;
    }
    else
    {
        uart1GetCount=0;
    }
    while(HAL_UART_Receive_IT(&huart1, &uart1GetByte, 1)==HAL_OK);
}
#endif  /* UART1_NIT_ATY */


#ifdef UART2_NIT_ATY
/**
* @brief Send data from uart
* @param pData      - Data to send
* @param Size       - Size of data
*/
void Uart2Send(uint8_t *pData, uint16_t Size)
{
    HAL_UART_Transmit_IT(&huart2, (uint8_t*)pData, Size);
}
/**
* @brief Receive data from uart with IT
*/
void Uart2Recv(void)
{
    if(uart2GetCount<UART2_GET_SIZE)
    {
        uart2GetStr[uart2GetCount++]=uart2GetByte;
    }
    else
    {
        uart2GetCount=0;
    }
    while(HAL_UART_Receive_IT(&huart2, &uart2GetByte, 1)==HAL_OK);
}
#endif  /* UART2_NIT_ATY */


#ifdef UART3_NIT_ATY
/**
* @brief Send data from uart
* @param pData      - Data to send
* @param Size       - Size of data
*/
void Uart3Send(uint8_t *pData, uint16_t Size)
{
    HAL_UART_Transmit_IT(&huart3, (uint8_t*)pData, Size);
}
/**
* @brief Receive data from uart with IT
*/
void Uart3Recv(void)
{
    if(uart3GetCount<UART3_GET_SIZE)
    {
        uart3GetStr[uart3GetCount++]=uart3GetByte;
    }
    else
    {
        uart3GetCount=0;
    }
    while(HAL_UART_Receive_IT(&huart3, &uart3GetByte, 1)==HAL_OK);
}
#endif  /* UART3_NIT_ATY */


#ifdef UART4_NIT_ATY
/**
* @brief Send data from uart
* @param pData      - Data to send
* @param Size       - Size of data
*/
void Uart4Send(uint8_t *pData, uint16_t Size)
{
    HAL_UART_Transmit_IT(&huart4, (uint8_t*)pData, Size);
}
/**
* @brief Receive data from uart with IT
*/
void Uart4Recv(void)
{
    if(uart4GetCount<UART4_GET_SIZE)
    {
        uart4GetStr[uart4GetCount++]=uart4GetByte;
    }
    else
    {
        uart4GetCount=0;
    }
    while(HAL_UART_Receive_IT(&huart4, &uart4GetByte, 1)==HAL_OK);
}
#endif  /* UART4_NIT_ATY */


#ifdef UART5_NIT_ATY
/**
* @brief Send data from uart
* @param pData      - Data to send
* @param Size       - Size of data
*/
void Uart5Send(uint8_t *pData, uint16_t Size)
{
    HAL_UART_Transmit_IT(&huart5, (uint8_t*)pData, Size);
}
/**
* @brief Receive data from uart with IT
*/
void Uart5Recv(void)
{
    if(uart5GetCount<UART5_GET_SIZE)
    {
        uart5GetStr[uart5GetCount++]=uart5GetByte;
    }
    else
    {
        uart5GetCount=0;
    }
    while(HAL_UART_Receive_IT(&huart5, &uart5GetByte, 1)==HAL_OK);
}
#endif  /* UART5_NIT_ATY */


#if defined(UART1_NIT_ATY) \
    || defined(UART2_NIT_ATY) \
    || defined(UART3_NIT_ATY) \
    || defined(UART4_NIT_ATY) \
    || defined(UART5_NIT_ATY)
/**
* @brief Rewrite uart rx interrupt call-back function
* @param huart      - huart
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
#ifdef UART1_NIT_ATY
    if(huart==&huart1)
    {
        Uart1Recv();
    }
#endif  /* UART1_NIT_ATY */

#ifdef UART2_NIT_ATY
    if(huart==&huart2)
    {
        Uart2Recv();
    }
#endif  /* UART2_NIT_ATY */

#ifdef UART3_NIT_ATY
    if(huart==&huart3)
    {
        Uart3Recv();
    }
#endif  /* UART3_NIT_ATY */

#ifdef UART4_NIT_ATY
    if(huart==&huart4)
    {
        Uart4Recv();
    }
#endif  /* UART4_NIT_ATY */

#ifdef UART5_NIT_ATY
    if(huart==&huart5)
    {
        Uart5Recv();
    }
#endif  /* UART5_NIT_ATY */
}
#endif  /* UART1-5_NIT_ATY */


#ifdef TEST_NIT_ATY
/**
* @brief A template function of using uart raceive
* @brief 50ms is the min interval time when tested at 9600 baud rate
*/
void UartControlTemplate(void)
{
    HAL_UART_Receive_IT(&HUART_N, &uartByte, 1);
    if(uartBufCount>0)
    {
        if(memcmp(uartBuf, "Hello STM32F1!", 14)==0)
        {
            printf("Getted! - printf\n");
            UartSend("Getted! - send\n", 15);
            uartBufCount=0;
            memset(uartBuf, 0, sizeof(uartBuf));
        }
    }
}
#endif  /* TEST_NIT_ATY */


/******************************** DMA IT Type *********************************/
#if defined(UART1_DMA_ATY) \
    || defined(UART2_DMA_ATY) \
    || defined(UART3_DMA_ATY) \
    || defined(UART4_DMA_ATY) \
    || defined(UART5_DMA_ATY)
/**
* @brief Uart tx DMA interrupt call back
* @param huart      - huart
*/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
#ifdef UART1_DMA_ATY
    if(huart==&huart1)
        uart1Ready=SET;
#endif  /* UART1_DMA_ATY */

#ifdef UART2_DMA_ATY
    if(huart==&huart2)
        uart2Ready=SET;
#endif  /* UART2_DMA_ATY */

#ifdef UART3_DMA_ATY
    if(huart==&huart3)
        uart3Ready=SET;
#endif  /* UART3_DMA_ATY */

#ifdef UART4_DMA_ATY
    if(huart==&huart4)
        uart4Ready=SET;
#endif  /* UART4_DMA_ATY */

#ifdef UART5_DMA_ATY
    if(huart==&huart5)
        uart5Ready=SET;
#endif  /* UART5_DMA_ATY */
}
/**
* @brief Uart tx DMA interrupt call back
* @param huart      - huart
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
#ifdef UART1_DMA_ATY
    if(huart==&huart1)
        uart1Ready=SET;
#endif  /* UART1_DMA_ATY */

#ifdef UART2_DMA_ATY
    if(huart==&huart2)
        uart2Ready=SET;
#endif  /* UART2_DMA_ATY */

#ifdef UART3_DMA_ATY
    if(huart==&huart3)
        uart3Ready=SET;
#endif  /* UART3_DMA_ATY */

#ifdef UART4_DMA_ATY
    if(huart==&huart4)
        uart4Ready=SET;
#endif  /* UART4_DMA_ATY */

#ifdef UART5_DMA_ATY
    if(huart==&huart5)
        uart5Ready=SET;
#endif  /* UART5_DMA_ATY */
}
#endif  /* UART1-5_DMA_ATY */


#ifdef UART1_DMA_ATY
/**
* @brief Send data with DMA
* @param pData      - Data to send
* @param Size       - Size of data
*/
void Uart1SendDMA(uint8_t *pData, uint16_t Size)
{
    if(HAL_UART_Transmit_DMA(&huart1, pData, Size)!=HAL_OK)
    {
        Error_Handler();
    }
    while(uart1Ready!=SET){}
    uart1Ready=RESET;
    uart1DmaSendFlag=0;
}
/**
* @brief Uart interrupt function, use to get data
*/
void USART1_IRQHandler(void)                    //\Src\stm32f1xx_it.c
{
    uint32_t tmpFlag=0;
    uint32_t temp;
    tmpFlag=__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE);
    if((tmpFlag!=RESET))
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
        temp=huart1.Instance->SR;
        temp=huart1.Instance->DR;
        HAL_UART_DMAStop(&huart1);
        temp=hdma_usart1_rx.Instance->CNDTR;
        uart1GetCount=UART1_GET_SIZE-temp;
        uart1RecvEndFlag=1;
    }
    HAL_UART_IRQHandler(&huart1);
    HAL_UART_Receive_DMA(&huart1, uart1GetStr, UART1_GET_SIZE);
}
#endif  /* UART1_DMA_ATY */


#ifdef UART2_DMA_ATY
/**
* @brief Send data with DMA
* @param pData      - Data to send
* @param Size       - Size of data
*/
void Uart2SendDMA(uint8_t *pData, uint16_t Size)
{
    if(HAL_UART_Transmit_DMA(&huart2, pData, Size)!=HAL_OK)
    {
        Error_Handler();
    }
    while(uart2Ready!=SET){}
    uart2Ready=RESET;
    uart2DmaSendFlag=0;
}
/**
* @brief Uart interrupt function, use to get data
*/
void USART2_IRQHandler(void)                    //\Src\stm32f1xx_it.c
{
    uint32_t tmpFlag=0;
    uint32_t temp;
    tmpFlag=__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE);
    if((tmpFlag!=RESET))
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart2);
        temp=huart2.Instance->SR;
        temp=huart2.Instance->DR;
        HAL_UART_DMAStop(&huart2);
        temp=hdma_usart2_rx.Instance->CNDTR;
        uart2GetCount=UART2_GET_SIZE-temp;
        uart2RecvEndFlag=1;
    }
    HAL_UART_IRQHandler(&huart2);
    HAL_UART_Receive_DMA(&huart2, uart2GetStr, UART2_GET_SIZE);
}
#endif  /* UART2_DMA_ATY */


#ifdef UART3_DMA_ATY
/**
* @brief Send data with DMA
* @param pData      - Data to send
* @param Size       - Size of data
*/
void Uart3SendDMA(uint8_t *pData, uint16_t Size)
{
    if(HAL_UART_Transmit_DMA(&huart3, pData, Size)!=HAL_OK)
    {
        Error_Handler();
    }
    while(uart3Ready!=SET){}
    uart3Ready=RESET;
    uart3DmaSendFlag=0;
}
/**
* @brief Uart interrupt function, use to get data
*/
void USART3_IRQHandler(void)                    //\Src\stm32f1xx_it.c
{
    uint32_t tmpFlag=0;
    uint32_t temp;
    tmpFlag=__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE);
    if((tmpFlag!=RESET))
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart3);
        temp=huart3.Instance->SR;
        temp=huart3.Instance->DR;
        HAL_UART_DMAStop(&huart3);
        temp=hdma_usart3_rx.Instance->CNDTR;
        uart3GetCount=UART3_GET_SIZE-temp;
        uart3RecvEndFlag=1;
    }
    HAL_UART_IRQHandler(&huart3);
    HAL_UART_Receive_DMA(&huart3, uart3GetStr, UART3_GET_SIZE);
}
#endif  /* UART3_DMA_ATY */


#ifdef UART4_DMA_ATY
/**
* @brief Send data with DMA
* @param pData      - Data to send
* @param Size       - Size of data
*/
void Uart4SendDMA(uint8_t *pData, uint16_t Size)
{
    if(HAL_UART_Transmit_DMA(&huart4, pData, Size)!=HAL_OK)
    {
        Error_Handler();
    }
    while(uart4Ready!=SET){}
    uart4Ready=RESET;
    uart4DmaSendFlag=0;
}
/**
* @brief Uart interrupt function, use to get data
*/
void USART4_IRQHandler(void)                    //\Src\stm32f1xx_it.c
{
    uint32_t tmpFlag=0;
    uint32_t temp;
    tmpFlag=__HAL_UART_GET_FLAG(&huart4, UART_FLAG_IDLE);
    if((tmpFlag!=RESET))
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart4);
        temp=huart4.Instance->SR;
        temp=huart4.Instance->DR;
        HAL_UART_DMAStop(&huart4);
        temp=hdma_usart4_rx.Instance->CNDTR;
        uart4GetCount=UART4_GET_SIZE-temp;
        uart4RecvEndFlag=1;
    }
    HAL_UART_IRQHandler(&huart4);
    HAL_UART_Receive_DMA(&huart4, uart4GetStr, UART4_GET_SIZE);
}
#endif  /* UART4_DMA_ATY */


#ifdef UART5_DMA_ATY
/**
* @brief Send data with DMA
* @param pData      - Data to send
* @param Size       - Size of data
*/
void Uart5SendDMA(uint8_t *pData, uint16_t Size)
{
    if(HAL_UART_Transmit_DMA(&huart5, pData, Size)!=HAL_OK)
    {
        Error_Handler();
    }
    while(uart5Ready!=SET){}
    uart5Ready=RESET;
    uart5DmaSendFlag=0;
}
/**
* @brief Uart interrupt function, use to get data
*/
void USART5_IRQHandler(void)                    //\Src\stm32f1xx_it.c
{
    uint32_t tmpFlag=0;
    uint32_t temp;
    tmpFlag=__HAL_UART_GET_FLAG(&huart5, UART_FLAG_IDLE);
    if((tmpFlag!=RESET))
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart5);
        temp=huart5.Instance->SR;
        temp=huart5.Instance->DR;
        HAL_UART_DMAStop(&huart5);
        temp=hdma_usart5_rx.Instance->CNDTR;
        uart5GetCount=UART5_GET_SIZE-temp;
        uart5RecvEndFlag=1;
    }
    HAL_UART_IRQHandler(&huart5);
    HAL_UART_Receive_DMA(&huart5, uart5GetStr, UART5_GET_SIZE);
}
#endif  /* UART5_DMA_ATY */


#ifdef TEST_DMA_ATY
/**
* @brief A template function of using uart raceive with DMA
* @brief 50ms is the min interval time when tested at 9600 baud rate;
*        shorter time is unstable, but better than narmal IT type
*/
void UartControlTemplate(void)
{
    if(uart1RecvEndFlag)
    {
        if(memcmp(uart1GetStr, "Hello STM32F1!", 14)==0)
        {
            printf("Getted! - printf\n");
            Uart1SendDMA("Getted! - send\n", 15);
            memset(uart1GetStr, 0, sizeof(uart1GetStr));
            uart1GetCount=0;
        }
        uart1RecvEndFlag=0;
    }
}
#endif  /* TEST_DMA_ATY */


#endif  /* __UART_ATY_H */

/******************************** End Of File *********************************/

UARTIO_ATY.h - 整理中

/**
* @file UARTIO_ATY.h
* @par Project
*       - ATYSTMLIB_HAL
*
* @author
*       - ATY
*
* @copyright
*       - Copyright © 2020 MZ-ATY
*       - This code follows:
*           - MZ-ATY Various Contents Joint Statement -
*               <a href="https://mengze.top/MZ-ATY_VCJS">
*                        https://mengze.top/MZ-ATY_VCJS</a>
*           - CC 4.0 BY-NC-SA -
*               <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
*                        https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
*       - Your use will be deemed to have accepted the terms of this statement.
*       - 您的使用行为将视为已接受本声明各项条款。
*
* @par Descriptions
*       - Familiar functions of CRC for all codes
*
* @par Update
*       - 1_01_20722 > ATY
*           -# Preliminary version, first Release
**********************************************************************************
*/

#ifndef __UART_ATY_H
#define __UART_ATY_H

#include "stm32f1xx_hal.h"
#include "stdio.h"                      //For "FILE"
#include "string.h"                     //For memset etc.


/******************************* For user *************************************/

/******************************************************************************/

#endif  /* __UART_ATY_H */

/******************************** End Of File *********************************/

评论已关闭

Loading...
Fullscreen Image