Browse Source

Update 4.2inch e-Paper (B) V2 routine.

shhds 1 year ago
parent
commit
bc23f8ee81
40 changed files with 3024 additions and 1611 deletions
  1. 1 1
      Arduino/epd4in2_V2/epd4in2_V2.cpp
  2. 264 123
      Arduino/epd4in2b_V2/epd4in2b_V2.cpp
  3. 19 45
      Arduino/epd4in2b_V2/epd4in2b_V2.h
  4. 30 34
      Arduino/epd4in2b_V2/epd4in2b_V2.ino
  5. 69 0
      Arduino/epd4in2b_V2/epdif.cpp
  6. 7 0
      Arduino/epd4in2b_V2/epdif.h
  7. 67 2
      RaspberryPi_JetsonNano/c/lib/Config/DEV_Config.c
  8. 6 0
      RaspberryPi_JetsonNano/c/lib/Config/DEV_Config.h
  9. 211 29
      RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_4in2b_V2.c
  10. 1 1
      RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_4in2b_V2.h
  11. 0 0
      RaspberryPi_JetsonNano/python/examples/.lgd-nfy0
  12. 1 1
      RaspberryPi_JetsonNano/python/examples/epd_4in2b_V2_test.py
  13. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/DEV_Config_32.so
  14. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/DEV_Config_64.so
  15. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__init__.pyc
  16. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/__init__.cpython-311.pyc
  17. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epd2in13_V3.cpython-311.pyc
  18. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epd2in13_V4.cpython-311.pyc
  19. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epd4in2b_V2.cpython-37.pyc
  20. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epd7in5_V2.cpython-311.pyc
  21. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epdconfig.cpython-311.pyc
  22. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epdconfig.cpython-37.pyc
  23. 2 2
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd2in7_V2.py
  24. 138 40
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd4in2b_V2.py
  25. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd4in2b_V2.pyc
  26. 57 19
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/epdconfig.py
  27. BIN
      RaspberryPi_JetsonNano/python/lib/waveshare_epd/epdconfig.pyc
  28. 4 0
      STM32/STM32-F103ZET6/Inc/main.h
  29. 140 140
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvguix.liuyujian
  30. 5 5
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvoptx
  31. 4 4
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.build_log.htm
  32. 1494 452
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.htm
  33. 188 675
      STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.map
  34. 5 5
      STM32/STM32-F103ZET6/MDK-ARM/startup_stm32f103xe.lst
  35. 87 1
      STM32/STM32-F103ZET6/User/Config/DEV_Config.c
  36. 6 0
      STM32/STM32-F103ZET6/User/Config/DEV_Config.h
  37. 2 2
      STM32/STM32-F103ZET6/User/Examples/EPD_1in54_V2_test.c
  38. 210 28
      STM32/STM32-F103ZET6/User/e-Paper/EPD_4in2b_V2.c
  39. 3 1
      Version_CN.txt
  40. 3 1
      Version_EN.txt

+ 1 - 1
Arduino/epd4in2_V2/epd4in2_V2.cpp

@@ -495,7 +495,7 @@ void Epd::Display_Partial_Not_refresh(unsigned char* Image, unsigned int  Xstart
 	// TurnOnDisplay_Partial();
 }
 
-void Epd::Set_4GrayDisplay(const char *Image, int x, int y, int w, int l)
+void Epd::Set_4GrayDisplay(const unsigned char *Image, int x, int y, int w, int l)
 {
     int i,j,k,m;
 	int z=0;

+ 264 - 123
Arduino/epd4in2b_V2/epd4in2b_V2.cpp

@@ -31,6 +31,7 @@ Epd::~Epd() {
 };
 
 Epd::Epd() {
+    flag=0;
     reset_pin = RST_PIN;
     dc_pin = DC_PIN;
     cs_pin = CS_PIN;
@@ -39,7 +40,58 @@ Epd::Epd() {
     height = EPD_HEIGHT;
 };
 
+int Epd::Init_old(void) {
+    Reset();
+    SendCommand(0x04);
+    ReadBusy();
+	
+    SendCommand(0x00);
+    SendData(0x0F);     // LUT from OTP
+	
+    // /* EPD hardware init end */
+    return 0;
+}
+
+int Epd::Init_new(void) {
+
+    Reset();
+
+    ReadBusy();
+    SendCommand(0x12);
+    ReadBusy();
+
+    SendCommand(0x3C); //BorderWavefrom
+    SendData(0x05);	
+
+    SendCommand(0x18); //Read built-in temperature sensor
+    SendData(0x80);	
+
+    SendCommand(0x11); //data entry mode       
+    SendData(0x03);
+
+    SendCommand(0x44); //set Ram-X address start/end position   
+    SendData(0x00);
+    SendData(width/8-1);
+
+    SendCommand(0x45); //set Ram-Y address start/end position          
+    SendData(0x00);
+    SendData(0x00); 
+    SendData((height-1)%256);    
+    SendData((height-1)/256);
+
+    SendCommand(0x4E);   // set RAM x address count to 0;
+    SendData(0x00);
+    SendCommand(0x4F);   // set RAM y address count to 0X199;    
+    SendData(0x00);    
+    SendData(0x00);
+    ReadBusy();
+
+    return 0;
+}
+
 int Epd::Init(void) {
+    unsigned char i=0;
+
     /* this calls the peripheral hardware interface, see epdif */
     if (IfInit() != 0) {
         return -1;
@@ -47,13 +99,28 @@ int Epd::Init(void) {
     /* EPD hardware init start */
     Reset();
 
-    SendCommand(POWER_ON);
-    WaitUntilIdle();
-	
-    SendCommand(PANEL_SETTING);
-    SendData(0x0F);     // LUT from OTP
+    EPD_GPIO_Init();
+    digitalWrite(dc_pin, 0);
+    EPD_SendData(0x2F);
+    DelayMs(50);
+    
+    digitalWrite(dc_pin, 1);
+    i = EPD_ReadData();
+    printf("%02x\n",i);
+    
+    EPD_SPI_Init();
+    if(i == 0x01)
+    {
+        flag = 0;
+        Init_new();
+    }
+    else
+    {
+        flag = 1;
+        Init_old();
+    }
 	
-    /* EPD hardware init end */
+    // /* EPD hardware init end */
     return 0;
 }
 
@@ -76,10 +143,19 @@ void Epd::SendData(unsigned char data) {
 /**
  *  @brief: Wait until the busy_pin goes HIGH
  */
-void Epd::WaitUntilIdle(void) {
-    while(DigitalRead(busy_pin) == 0) {      //0: busy, 1: idle
-        DelayMs(100);
-    }      
+void Epd::ReadBusy(void) {
+    if(flag == 0)
+    {
+        while(DigitalRead(busy_pin) == 1) {
+            DelayMs(100);
+        } 
+    }
+    else
+    {
+        while(DigitalRead(busy_pin) == 0) {
+            DelayMs(100);
+        } 
+    }     
 }
 
 /**
@@ -97,139 +173,192 @@ void Epd::Reset(void) {
 }
 
 /**
- *  @brief: transmit partial data to the SRAM
+ *  @brief: transmit partial data to the black part of SRAM
  */
-void Epd::SetPartialWindow(const unsigned char* buffer_black, const unsigned char* buffer_red, int x, int y, int w, int l) {
-    SendCommand(PARTIAL_IN);
-    SendCommand(PARTIAL_WINDOW);
-    SendData(x >> 8);
-    SendData(x & 0xf8);     // x should be the multiple of 8, the last 3 bit will always be ignored
-    SendData(((x & 0xf8) + w  - 1) >> 8);
-    SendData(((x & 0xf8) + w  - 1) | 0x07);
-    SendData(y >> 8);        
-    SendData(y & 0xff);
-    SendData((y + l - 1) >> 8);        
-    SendData((y + l - 1) & 0xff);
-    SendData(0x01);         // Gates scan both inside and outside of the partial window. (default) 
-    DelayMs(2);
-    SendCommand(DATA_START_TRANSMISSION_1);
-    if (buffer_black != NULL) {
-        for(int i = 0; i < w  / 8 * l; i++) {
-            SendData(buffer_black[i]);  
-        }  
-    }
-    DelayMs(2);
-    SendCommand(DATA_START_TRANSMISSION_2);
-    if (buffer_red != NULL) {
-        for(int i = 0; i < w  / 8 * l; i++) {
-            SendData(buffer_red[i]);  
-        }  
+void Epd::Display_Window_Black(const UBYTE *image, UBYTE count) {
+    UBYTE k;
+    if(count == 0 && flag == 0)
+        SendCommand(0x24);
+    else if(count == 0)
+        SendCommand(0x10);
+    
+    for (UWORD j = 0; j < 100; j++) {
+        for (UWORD i = 0; i < 50; i++) {
+            if(i<16)
+            {
+                SendData(image[i + (j*16)]);
+            }
+            else
+            {
+                SendData(0xFF);
+            } 
+        }
     }
-    DelayMs(2);
-    SendCommand(PARTIAL_OUT);  
 }
 
 /**
- *  @brief: transmit partial data to the black part of SRAM
+ *  @brief: transmit partial data to the red part of SRAM
  */
-void Epd::SetPartialWindowBlack(const unsigned char* buffer_black, int x, int y, int w, int l) {
-    SendCommand(PARTIAL_IN);
-    SendCommand(PARTIAL_WINDOW);
-    SendData(x >> 8);
-    SendData(x & 0xf8);     // x should be the multiple of 8, the last 3 bit will always be ignored
-    SendData(((x & 0xf8) + w  - 1) >> 8);
-    SendData(((x & 0xf8) + w  - 1) | 0x07);
-    SendData(y >> 8);        
-    SendData(y & 0xff);
-    SendData((y + l - 1) >> 8);        
-    SendData((y + l - 1) & 0xff);
-    SendData(0x01);         // Gates scan both inside and outside of the partial window. (default) 
-    DelayMs(2);
-    SendCommand(DATA_START_TRANSMISSION_1);
-    if (buffer_black != NULL) {
-        for(int i = 0; i < w  / 8 * l; i++) {
-            SendData(buffer_black[i]);  
-        }  
+void Epd::Display_Window_Red_new(const UBYTE *image, UBYTE count) {
+    UBYTE k;
+    if(count == 0)
+        SendCommand(0x26);
+    
+    for (UWORD j = 0; j < 100; j++) {
+        for (UWORD i = 0; i < 50; i++) {
+            if(i<16)
+            {
+                SendData(~image[i + (j*16)]);
+            }
+            else
+            {
+                SendData(0x00);
+            } 
+        }
     }
-    DelayMs(2);
-    SendCommand(PARTIAL_OUT);  
+}
+void Epd::Display_Window_Red_old(const UBYTE *image, UBYTE count) {
+    UBYTE k;
+    if(count == 0)
+        SendCommand(0x13);
+    
+    for (UWORD j = 0; j < 100; j++) {
+        for (UWORD i = 0; i < 50; i++) {
+            if(i<16)
+            {
+                SendData(image[i + (j*16)]);
+            }
+            else
+            {
+                SendData(0xFF);
+            } 
+        }
+    }
+}
+void Epd::Display_Window_Red(const UBYTE *image, UBYTE count) {
+    if(flag == 0)
+        Display_Window_Red_new(image, count);
+    else
+        Display_Window_Red_old(image, count);
 }
 
-/**
- *  @brief: transmit partial data to the red part of SRAM
- */
-void Epd::SetPartialWindowRed(const unsigned char* buffer_red, int x, int y, int w, int l) {
-    SendCommand(PARTIAL_IN);
-    SendCommand(PARTIAL_WINDOW);
-    SendData(x >> 8);
-    SendData(x & 0xf8);     // x should be the multiple of 8, the last 3 bit will always be ignored
-    SendData(((x & 0xf8) + w  - 1) >> 8);
-    SendData(((x & 0xf8) + w  - 1) | 0x07);
-    SendData(y >> 8);        
-    SendData(y & 0xff);
-    SendData((y + l - 1) >> 8);        
-    SendData((y + l - 1) & 0xff);
-    SendData(0x01);         // Gates scan both inside and outside of the partial window. (default) 
-    DelayMs(2);
-    SendCommand(DATA_START_TRANSMISSION_2);
-    if (buffer_red != NULL) {
-        for(int i = 0; i < w  / 8 * l; i++) {
-            SendData(buffer_red[i]);  
-        }  
+void Epd::DisplayFrame(void) {
+    if(flag == 0)
+    {
+        SendCommand(0x22);
+        SendData(0xF7);
+        SendCommand(0x20);
+        ReadBusy();
+    }
+    else
+    {
+        SendCommand(0x12);
+        DelayMs(100);
+        ReadBusy();
     }
-    DelayMs(2);
-    SendCommand(PARTIAL_OUT);  
 }
 
 /**
  * @brief: refresh and displays the frame
  */
-void Epd::DisplayFrame(const unsigned char* frame_black, const unsigned char* frame_red) {
-    if (frame_black != NULL) {
-        SendCommand(DATA_START_TRANSMISSION_1);
-        DelayMs(2);
-        for (int i = 0; i < this->width / 8 * this->height; i++) {
-            SendData(pgm_read_byte(&frame_black[i]));
+void Epd::Display_old(const UBYTE *blackimage, const UBYTE *ryimage) {
+    UBYTE k;
+    SendCommand(0x10);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width/8; i++) {
+          SendData(pgm_read_byte(&blackimage[i + (j*width/8)]));
         }
-        DelayMs(2);
     }
-    if (frame_red != NULL) {
-        SendCommand(DATA_START_TRANSMISSION_2);
-        DelayMs(2);
-        for (int i = 0; i < this->width / 8 * this->height; i++) {
-            SendData(pgm_read_byte(&frame_red[i]));
+    
+    SendCommand(0x13);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width/8; i++) {
+          SendData(pgm_read_byte(&ryimage[i + (j*width/8)]));
         }
-        DelayMs(2);
     }
-    SendCommand(DISPLAY_REFRESH);
-    WaitUntilIdle();
+    SendCommand(0x12);
+    DelayMs(100);
+    ReadBusy();
+}
+
+void Epd::Display_new(const UBYTE *blackimage, const UBYTE *ryimage) {
+    UBYTE k;
+    SendCommand(0x24);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width/8; i++) {
+          SendData(pgm_read_byte(&blackimage[i + (j*width/8)]));
+        }
+    }
+    
+    SendCommand(0x26);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width/8; i++) {
+          k = pgm_read_byte(&ryimage[i + (j*width/8)]);
+          SendData(~k);
+        }
+    }
+    SendCommand(0x22);
+    SendData(0xF7);
+    SendCommand(0x20);
+    ReadBusy();
+}
+
+void Epd::Display(const UBYTE *blackimage, const UBYTE *ryimage) {
+    if(flag == 0)
+        Display_new(blackimage, ryimage);
+    else
+        Display_old(blackimage, ryimage);
 }
 
 /**
  * @brief: clear the frame data from the SRAM, this won't refresh the display
  */
-void Epd::ClearFrame(void) {
-    SendCommand(DATA_START_TRANSMISSION_1);           
-    DelayMs(2);
-    for(int i = 0; i < width / 8 * height; i++) {
-        SendData(0xFF);  
-    }  
-    DelayMs(2);
-    SendCommand(DATA_START_TRANSMISSION_2);           
-    DelayMs(2);
-    for(int i = 0; i < width / 8 * height; i++) {
-        SendData(0xFF);  
-    }  
-    DelayMs(2);
+void Epd::Clear_new() {
+    //send black data
+    SendCommand(0x24);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width/8; i++) {
+            SendData(0xff);
+        }
+    }
+    //send red data
+    SendCommand(0x26);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width/8; i++) {
+            SendData(0x00);
+        }
+    }
+    SendCommand(0x22);
+    SendData(0xF7);
+    SendCommand(0x20);
+    ReadBusy();
 }
 
-/**
- * @brief: This displays the frame data from SRAM
- */
-void Epd::DisplayFrame(void) {
-    SendCommand(DISPLAY_REFRESH); 
+void Epd::Clear_old() {
+    //send black data
+    SendCommand(0x10);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width/8; i++) {
+            SendData(0xff);
+        }
+    }
+    //send red data
+    SendCommand(0x13);
+    for (UWORD j = 0; j < height; j++) {
+        for (UWORD i = 0; i < width/8; i++) {
+            SendData(0xff);
+        }
+    }
+    SendCommand(0x12);
     DelayMs(100);
-    WaitUntilIdle();
+    ReadBusy();
+}
+
+void Epd::Clear() {
+    if(flag == 0)
+        Clear_new();
+    else
+        Clear_old();
 }
 
 /**
@@ -238,13 +367,25 @@ void Epd::DisplayFrame(void) {
  *         check code, the command would be executed if check code = 0xA5. 
  *         You can use Epd::Reset() to awaken and use Epd::Init() to initialize.
  */
-void Epd::Sleep() {
-    SendCommand(VCOM_AND_DATA_INTERVAL_SETTING);
-    SendData(0xF7);     // border floating
-    SendCommand(POWER_OFF);
-    WaitUntilIdle();
-    SendCommand(DEEP_SLEEP);
-    SendData(0xA5);     // check code
+void Epd::Sleep_new(void) {
+    SendCommand(0x10);
+    SendData(0x01);
+}
+
+void Epd::Sleep_old() {
+   SendCommand(0X50);  	
+   SendData(0xf7);
+   SendCommand(0x02); 
+   ReadBusy();
+   SendCommand(0x07);  
+   SendData(0XA5);
+}
+
+void Epd::Sleep(void) {
+    if(flag == 0)
+        Sleep_new();
+    else
+        Sleep_old();
 }
 
 

+ 19 - 45
Arduino/epd4in2b_V2/epd4in2b_V2.h

@@ -33,64 +33,37 @@
 #define EPD_WIDTH       400
 #define EPD_HEIGHT      300
 
-// EPD4IN2 commands
-#define PANEL_SETTING                               0x00
-#define POWER_SETTING                               0x01
-#define POWER_OFF                                   0x02
-#define POWER_OFF_SEQUENCE_SETTING                  0x03
-#define POWER_ON                                    0x04
-#define POWER_ON_MEASURE                            0x05
-#define BOOSTER_SOFT_START                          0x06
-#define DEEP_SLEEP                                  0x07
-#define DATA_START_TRANSMISSION_1                   0x10
-#define DATA_STOP                                   0x11
-#define DISPLAY_REFRESH                             0x12
-#define DATA_START_TRANSMISSION_2                   0x13
-#define LUT_FOR_VCOM                                0x20 
-#define LUT_WHITE_TO_WHITE                          0x21
-#define LUT_BLACK_TO_WHITE                          0x22
-#define LUT_WHITE_TO_BLACK                          0x23
-#define LUT_BLACK_TO_BLACK                          0x24
-#define PLL_CONTROL                                 0x30
-#define TEMPERATURE_SENSOR_COMMAND                  0x40
-#define TEMPERATURE_SENSOR_SELECTION                0x41
-#define TEMPERATURE_SENSOR_WRITE                    0x42
-#define TEMPERATURE_SENSOR_READ                     0x43
-#define VCOM_AND_DATA_INTERVAL_SETTING              0x50
-#define LOW_POWER_DETECTION                         0x51
-#define TCON_SETTING                                0x60
-#define RESOLUTION_SETTING                          0x61
-#define GSST_SETTING                                0x65
-#define GET_STATUS                                  0x71
-#define AUTO_MEASUREMENT_VCOM                       0x80
-#define READ_VCOM_VALUE                             0x81
-#define VCM_DC_SETTING                              0x82
-#define PARTIAL_WINDOW                              0x90
-#define PARTIAL_IN                                  0x91
-#define PARTIAL_OUT                                 0x92
-#define PROGRAM_MODE                                0xA0
-#define ACTIVE_PROGRAMMING                          0xA1
-#define READ_OTP                                    0xA2
-#define POWER_SAVING                                0xE3
+#define UWORD  unsigned int
+#define UBYTE  unsigned char
 
 class Epd : EpdIf {
 public:
     unsigned int width;
     unsigned int height;
+    
 
     Epd();
     ~Epd();
+    int Init_new(void);
+    int Init_old(void);
     int  Init(void);
     void SendCommand(unsigned char command);
     void SendData(unsigned char data);
-    void WaitUntilIdle(void);
+    void ReadBusy(void);
     void Reset(void);
-    void SetPartialWindow(const unsigned char* buffer_black, const unsigned char* buffer_red, int x, int y, int w, int l);
-    void SetPartialWindowBlack(const unsigned char* buffer_black, int x, int y, int w, int l);
-    void SetPartialWindowRed(const unsigned char* buffer_red, int x, int y, int w, int l);
-    void DisplayFrame(const unsigned char* frame_black, const unsigned char* frame_red);
+    void Display_Window_Black(const UBYTE *image, UBYTE count);
+    void Display_Window_Red_new(const UBYTE *image, UBYTE count);
+    void Display_Window_Red_old(const UBYTE *image, UBYTE count);
+    void Display_Window_Red(const UBYTE *image, UBYTE count);
     void DisplayFrame(void);
-    void ClearFrame(void);
+    void Display_old(const UBYTE *blackimage, const UBYTE *ryimage);
+    void Display_new(const UBYTE *blackimage, const UBYTE *ryimage);
+    void Display(const UBYTE *blackimage, const UBYTE *ryimage);
+    void Clear_new();
+    void Clear_old();
+    void Clear();
+    void Sleep_new(void);
+    void Sleep_old();
     void Sleep(void);
 
 private:
@@ -98,6 +71,7 @@ private:
     unsigned int dc_pin;
     unsigned int cs_pin;
     unsigned int busy_pin;
+    unsigned char flag;
 };
 
 #endif /* EPD4IN2_H */

+ 30 - 34
Arduino/epd4in2b_V2/epd4in2b_V2.ino

@@ -43,7 +43,7 @@ void setup() {
   }
 
   /* This clears the SRAM of the e-paper display */
-  epd.ClearFrame();
+  epd.Clear();
 
   /**
     * Due to RAM not enough in Arduino UNO, a frame buffer is not allowed.
@@ -51,47 +51,43 @@ void setup() {
     * update a partial display several times.
     * 1 byte = 8 pixels, therefore you have to set 8*N pixels at a time.
     */
-  unsigned char image[1500];
-  Paint paint(image, 400, 28);    //width should be the multiple of 8 
+    unsigned char image[1600];
+    Paint paint(image, 128, 100);    //width should be the multiple of 8 
+    paint.SetWidth(128);
+    paint.SetHeight(100);
 
-  paint.Clear(UNCOLORED);
-  paint.DrawStringAt(0, 0, "e-Paper Demo", &Font24, COLORED);
-  epd.SetPartialWindowBlack(paint.GetImage(), 100, 40, paint.GetWidth(), paint.GetHeight());
+    paint.Clear(UNCOLORED);
+    paint.DrawStringAt(0, 0, "ePaper Demo", &Font16, COLORED);
+    epd.Display_Window_Black(paint.GetImage(), 0);
 
-  paint.Clear(COLORED);
-  paint.DrawStringAt(100, 2, "Hello world", &Font24, UNCOLORED);
-  epd.SetPartialWindowRed(paint.GetImage(), 0, 64, paint.GetWidth(), paint.GetHeight());
-  
-  paint.SetWidth(64);
-  paint.SetHeight(64);
+    paint.Clear(UNCOLORED);
+    paint.DrawRectangle(0, 0, 40, 50, COLORED);
+    paint.DrawLine(0, 0, 40, 50, COLORED);
+    paint.DrawLine(40, 0, 0, 50, COLORED);
+    epd.Display_Window_Black(paint.GetImage(), 1);    
 
-  paint.Clear(UNCOLORED);
-  paint.DrawRectangle(0, 0, 40, 50, COLORED);
-  paint.DrawLine(0, 0, 40, 50, COLORED);
-  paint.DrawLine(40, 0, 0, 50, COLORED);
-  epd.SetPartialWindowBlack(paint.GetImage(), 72, 120, paint.GetWidth(), paint.GetHeight());
-  
-  paint.Clear(UNCOLORED);
-  paint.DrawCircle(32, 32, 30, COLORED);
-  epd.SetPartialWindowBlack(paint.GetImage(), 200, 120, paint.GetWidth(), paint.GetHeight());
+    paint.Clear(UNCOLORED);
+    paint.DrawCircle(32, 32, 25, COLORED);
+    epd.Display_Window_Black(paint.GetImage(), 1);    
 
-  paint.Clear(UNCOLORED);
-  paint.DrawFilledRectangle(0, 0, 40, 50, COLORED);
-  epd.SetPartialWindowRed(paint.GetImage(), 72, 200, paint.GetWidth(), paint.GetHeight());
+    paint.Clear(UNCOLORED);
+    paint.DrawStringAt(0, 20, "Hello world", &Font16, COLORED);
+    epd.Display_Window_Red(paint.GetImage(), 0);
 
-  paint.Clear(UNCOLORED);
-  paint.DrawFilledCircle(32, 32, 30, COLORED);
-  epd.SetPartialWindowRed(paint.GetImage(), 200, 200, paint.GetWidth(), paint.GetHeight());
+    paint.Clear(UNCOLORED);
+    paint.DrawFilledRectangle(60, 0, 100, 50, COLORED);
+    epd.Display_Window_Red(paint.GetImage(), 1);
 
-  /* This displays the data from the SRAM in e-Paper module */
-  epd.DisplayFrame();
-  delay(1000);
-  /* This displays an image */
- // epd.DisplayFrame(IMAGE_BLACK, IMAGE_RED);
+    paint.Clear(UNCOLORED);
+    paint.DrawFilledCircle(92, 32, 25, COLORED);
+    epd.Display_Window_Red(paint.GetImage(), 1);
+    epd.DisplayFrame();
+    delay(1000);
+    /* This displays an image */
+    // epd.DisplayFrame(IMAGE_BLACK, IMAGE_RED);
 
   /* Deep sleep */
-  epd.ClearFrame();
-  epd.DisplayFrame();
+  epd.Clear();
   epd.Sleep();
 }
 

+ 69 - 0
Arduino/epd4in2b_V2/epdif.cpp

@@ -52,6 +52,75 @@ void EpdIf::SpiTransfer(unsigned char data) {
     digitalWrite(CS_PIN, HIGH);
 }
 
+void EpdIf::EPD_GPIO_Init()
+{
+    SPI.end(); 
+}
+
+void EpdIf::EPD_SPI_Init()
+{
+    SPI.begin();
+    SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
+}
+
+void EpdIf::EPD_Mode(int pin, char mode) {
+    if(mode == 0)
+        pinMode(pin, INPUT);
+    else
+        pinMode(pin, OUTPUT);
+}
+
+void EpdIf::EPD_SendData(unsigned char data) {
+    unsigned char i,j=data;
+	EPD_Mode(MOSI_PIN, 1);
+    EPD_Mode(SCLK_PIN, 1);
+	digitalWrite(CS_PIN, 0);
+	for(i = 0; i<8; i++)
+    {
+        digitalWrite(SCLK_PIN, 0);     
+        if (j & 0x80)
+        {
+            digitalWrite(MOSI_PIN, 1);
+        }
+        else
+        {
+            digitalWrite(MOSI_PIN, 0);
+        }
+        
+        digitalWrite(SCLK_PIN, 1);
+        j = j << 1;
+        // DelayMs(1);
+    }
+	digitalWrite(SCLK_PIN, 0);
+	digitalWrite(CS_PIN, 1);
+}
+
+unsigned char  EpdIf::EPD_ReadData()
+{
+    unsigned char i,j=0xff;
+    EPD_Mode(MOSI_PIN, 0);
+    EPD_Mode(SCLK_PIN, 1);
+    digitalWrite(CS_PIN, 0);
+    for(i = 0; i<8; i++)
+    {
+        digitalWrite(SCLK_PIN, 0);
+        j = j << 1;
+        if (DigitalRead(MOSI_PIN))
+        {
+                j = j | 0x01;
+        }
+        else
+        {
+                j= j & 0xfe;
+        }
+        digitalWrite(SCLK_PIN, 1);
+    }
+    digitalWrite(SCLK_PIN, 0);
+    digitalWrite(CS_PIN, 1);
+    return j;
+}
+
+
 int EpdIf::IfInit(void) {
     pinMode(CS_PIN, OUTPUT);
     pinMode(RST_PIN, OUTPUT);

+ 7 - 0
Arduino/epd4in2b_V2/epdif.h

@@ -31,6 +31,8 @@
 #include <Arduino.h>
 
 // Pin definition
+#define MOSI_PIN        11
+#define SCLK_PIN        13
 #define RST_PIN         8
 #define DC_PIN          9
 #define CS_PIN          10
@@ -43,6 +45,11 @@ public:
     ~EpdIf(void);
 
     static int  IfInit(void);
+    static void EPD_GPIO_Init();
+    static void EPD_SPI_Init();
+    static void EPD_Mode(int pin, char mode);
+    static void EPD_SendData(unsigned char data);
+    static unsigned char EPD_ReadData();
     static void DigitalWrite(int pin, int value); 
     static int  DigitalRead(int pin);
     static void DelayMs(unsigned int delaytime);

+ 67 - 2
RaspberryPi_JetsonNano/c/lib/Config/DEV_Config.c

@@ -28,7 +28,6 @@
 #
 ******************************************************************************/
 #include "DEV_Config.h"
-#include "RPI_gpiod.h"
 
 #if USE_LGPIO_LIB
 int GPIO_Handle;
@@ -43,6 +42,8 @@ int EPD_DC_PIN;
 int EPD_CS_PIN;
 int EPD_BUSY_PIN;
 int EPD_PWR_PIN;
+int EPD_MOSI_PIN;
+int EPD_SCLK_PIN;
 
 /**
  * GPIO read and write
@@ -284,12 +285,16 @@ void DEV_GPIO_Init(void)
 	EPD_CS_PIN      = 8;
     EPD_PWR_PIN     = 18;
 	EPD_BUSY_PIN    = 24;
+    EPD_MOSI_PIN    = 10;
+	EPD_SCLK_PIN    = 11;
 #elif JETSON
 	EPD_RST_PIN     = GPIO17;
 	EPD_DC_PIN      = GPIO25;
 	EPD_CS_PIN      = SPI0_CS0;
     EPD_PWR_PIN     = GPIO18;
 	EPD_BUSY_PIN    = GPIO24;
+    EPD_MOSI_PIN    = SPI0_MOSI;
+	EPD_SCLK_PIN    = SPI0_SCLK;
 #endif
 
     DEV_GPIO_Mode(EPD_BUSY_PIN, 0);
@@ -297,11 +302,72 @@ void DEV_GPIO_Init(void)
 	DEV_GPIO_Mode(EPD_DC_PIN, 1);
 	DEV_GPIO_Mode(EPD_CS_PIN, 1);
     DEV_GPIO_Mode(EPD_PWR_PIN, 1);
+    // DEV_GPIO_Mode(EPD_MOSI_PIN, 0);
+	// DEV_GPIO_Mode(EPD_SCLK_PIN, 1);
 
 	DEV_Digital_Write(EPD_CS_PIN, 1);
     DEV_Digital_Write(EPD_PWR_PIN, 1);
     
 }
+
+void DEV_SPI_SendnData(UBYTE *Reg)
+{
+    UDOUBLE size;
+    size = sizeof(Reg);
+    for(UDOUBLE i=0 ; i<size ; i++)
+    {
+        DEV_SPI_SendData(Reg[i]);
+    }
+}
+
+void DEV_SPI_SendData(UBYTE Reg)
+{
+	UBYTE i,j=Reg;
+	DEV_GPIO_Mode(EPD_MOSI_PIN, 1);
+	DEV_Digital_Write(EPD_CS_PIN, 0);
+	for(i = 0; i<8; i++)
+    {
+        DEV_Digital_Write(EPD_SCLK_PIN, 0);     
+        if (j & 0x80)
+        {
+            DEV_Digital_Write(EPD_MOSI_PIN, 1);
+        }
+        else
+        {
+            DEV_Digital_Write(EPD_MOSI_PIN, 0);
+        }
+        
+        DEV_Digital_Write(EPD_SCLK_PIN, 1);
+        j = j << 1;
+    }
+	DEV_Digital_Write(EPD_SCLK_PIN, 0);
+	DEV_Digital_Write(EPD_CS_PIN, 1);
+}
+
+UBYTE DEV_SPI_ReadData()
+{
+	UBYTE i,j=0xff;
+	DEV_GPIO_Mode(EPD_MOSI_PIN, 0);
+	DEV_Digital_Write(EPD_CS_PIN, 0);
+	for(i = 0; i<8; i++)
+	{
+		DEV_Digital_Write(EPD_SCLK_PIN, 0);
+		j = j << 1;
+		if (DEV_Digital_Read(EPD_MOSI_PIN))
+		{
+				j = j | 0x01;
+		}
+		else
+		{
+				j= j & 0xfe;
+		}
+		DEV_Digital_Write(EPD_SCLK_PIN, 1);
+	}
+	DEV_Digital_Write(EPD_SCLK_PIN, 0);
+	DEV_Digital_Write(EPD_CS_PIN, 1);
+	return j;
+}
+
 /******************************************************************************
 function:	Module Initialize, the library and initialize the pins, SPI protocol
 parameter:
@@ -348,7 +414,6 @@ UBYTE DEV_Module_Init(void)
 #elif  USE_LGPIO_LIB
     char buffer[NUM_MAXBUF];
     FILE *fp;
-
     fp = popen("cat /proc/cpuinfo | grep 'Raspberry Pi 5'", "r");
     if (fp == NULL) {
         Debug("It is not possible to determine the model of the Raspberry PI\n");

+ 6 - 0
RaspberryPi_JetsonNano/c/lib/Config/DEV_Config.h

@@ -97,6 +97,8 @@ extern int EPD_DC_PIN;
 extern int EPD_CS_PIN;
 extern int EPD_BUSY_PIN;
 extern int EPD_PWR_PIN;
+extern int EPD_MOSI_PIN;
+extern int EPD_SCLK_PIN;
 
 /*------------------------------------------------------------------------------------------------------*/
 void DEV_Digital_Write(UWORD Pin, UBYTE Value);
@@ -106,6 +108,10 @@ void DEV_SPI_WriteByte(UBYTE Value);
 void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len);
 void DEV_Delay_ms(UDOUBLE xms);
 
+void DEV_SPI_SendData(UBYTE Reg);
+void DEV_SPI_SendnData(UBYTE *Reg);
+UBYTE DEV_SPI_ReadData();
+
 UBYTE DEV_Module_Init(void);
 void DEV_Module_Exit(void);
 

+ 211 - 29
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_4in2b_V2.c

@@ -5,7 +5,7 @@
 * | Info        :
 *----------------
 * |	This version:   V1.0
-* | Date        :   2020-04-23
+* | Date        :   2020-11-25
 * | Info        :
 * -----------------------------------------------------------------------------
 #
@@ -31,6 +31,8 @@
 #include "EPD_4in2b_V2.h"
 #include "Debug.h"
 
+static uint8_t flag=0;
+
 /******************************************************************************
 function :	Software reset
 parameter:
@@ -54,7 +56,7 @@ static void EPD_4IN2B_V2_SendCommand(UBYTE Reg)
 {
     DEV_Digital_Write(EPD_DC_PIN, 0);
     DEV_Digital_Write(EPD_CS_PIN, 0);
-    DEV_SPI_WriteByte(Reg);
+    DEV_SPI_SendData(Reg);
     DEV_Digital_Write(EPD_CS_PIN, 1);
 }
 
@@ -67,7 +69,7 @@ static void EPD_4IN2B_V2_SendData(UBYTE Data)
 {
     DEV_Digital_Write(EPD_DC_PIN, 1);
     DEV_Digital_Write(EPD_CS_PIN, 0);
-    DEV_SPI_WriteByte(Data);
+    DEV_SPI_SendData(Data);
     DEV_Digital_Write(EPD_CS_PIN, 1);
 }
 
@@ -75,48 +77,143 @@ static void EPD_4IN2B_V2_SendData(UBYTE Data)
 function :	Wait until the busy_pin goes LOW
 parameter:
 ******************************************************************************/
-void EPD_4IN2B_V2_ReadBusy(void)
+void EPD_4IN2B_V2_ReadBusy_old(void)
 {
     Debug("e-Paper busy\r\n");
-    do{
-        EPD_4IN2B_V2_SendCommand(0x71);
-		DEV_Delay_ms(50);
-    }while(!(DEV_Digital_Read(EPD_BUSY_PIN)));
+	do{
+		EPD_4IN2B_V2_SendCommand(0x71);
+		DEV_Delay_ms(20);
+	}while(!(DEV_Digital_Read(EPD_BUSY_PIN)));      //0: busy, 1: idle
+    DEV_Delay_ms(20);
+	Debug("e-Paper busy release\r\n");
+}
+
+void EPD_4IN2B_V2_ReadBusy_new(void)
+{
+    Debug("e-Paper busy\r\n");
+    while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) {      //LOW: idle, HIGH: busy
+        DEV_Delay_ms(10);
+    }
     Debug("e-Paper busy release\r\n");
-    DEV_Delay_ms(50);
+}
+
+void EPD_4IN2B_V2_ReadBusy(void)
+{
+    if(flag == 0)
+        EPD_4IN2B_V2_ReadBusy_new();
+    else
+        EPD_4IN2B_V2_ReadBusy_old();
 }
 
 /******************************************************************************
-function :	Turn On Display
+function :	Setting the display window
 parameter:
 ******************************************************************************/
-static void EPD_4IN2B_V2_TurnOnDisplay(void)
+static void EPD_4IN2B_V2_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
 {
-    EPD_4IN2B_V2_SendCommand(0x12); // DISPLAY_REFRESH
-    DEV_Delay_ms(100);
-    EPD_4IN2B_V2_ReadBusy();
+    EPD_4IN2B_V2_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
+    EPD_4IN2B_V2_SendData((Xstart>>3) & 0xFF);
+    EPD_4IN2B_V2_SendData((Xend>>3) & 0xFF);
+	
+    EPD_4IN2B_V2_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
+    EPD_4IN2B_V2_SendData(Ystart & 0xFF);
+    EPD_4IN2B_V2_SendData((Ystart >> 8) & 0xFF);
+    EPD_4IN2B_V2_SendData(Yend & 0xFF);
+    EPD_4IN2B_V2_SendData((Yend >> 8) & 0xFF);
 }
 
+/******************************************************************************
+function :	Set Cursor
+parameter:
+******************************************************************************/
+static void EPD_4IN2B_V2_SetCursor(UWORD Xstart, UWORD Ystart)
+{
+    EPD_4IN2B_V2_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
+    EPD_4IN2B_V2_SendData((Xstart>>3) & 0xFF);
+
+    EPD_4IN2B_V2_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
+    EPD_4IN2B_V2_SendData(Ystart & 0xFF);
+    EPD_4IN2B_V2_SendData((Ystart >> 8) & 0xFF);
+}
+
+
 /******************************************************************************
 function :	Initialize the e-Paper register
 parameter:
 ******************************************************************************/
-void EPD_4IN2B_V2_Init(void)
+void EPD_4IN2B_V2_Init_old(void)
 {
     EPD_4IN2B_V2_Reset();
+
+    EPD_4IN2B_V2_ReadBusy();   
+    EPD_4IN2B_V2_SendCommand(0x04);   // soft  reset
+    EPD_4IN2B_V2_ReadBusy();
     
-    EPD_4IN2B_V2_SendCommand(0x04); 
+    EPD_4IN2B_V2_SendCommand(0x00); //BorderWavefrom
+    EPD_4IN2B_V2_SendData(0x0F);
+}
+
+void EPD_4IN2B_V2_Init_new(void)
+{
+    EPD_4IN2B_V2_Reset();
+
+    EPD_4IN2B_V2_ReadBusy();   
+    EPD_4IN2B_V2_SendCommand(0x12);   // soft  reset
     EPD_4IN2B_V2_ReadBusy();
+	
+    // EPD_4IN2B_V2_SendCommand(0x01); //Driver output control      
+    // EPD_4IN2B_V2_SendData((EPD_4IN2B_V2_HEIGHT-1)%256);   
+    // EPD_4IN2B_V2_SendData((EPD_4IN2B_V2_HEIGHT-1)/256);
+    // EPD_4IN2B_V2_SendData(0x00);
+
+    EPD_4IN2B_V2_SendCommand(0x3C); //BorderWavefrom
+    EPD_4IN2B_V2_SendData(0x05);
+
+    EPD_4IN2B_V2_SendCommand(0x18); //Read built-in temperature sensor
+    EPD_4IN2B_V2_SendData(0x80);	
+	
+    EPD_4IN2B_V2_SendCommand(0x11);	// data  entry  mode
+    EPD_4IN2B_V2_SendData(0x03);		// X-mode   
+		
+	EPD_4IN2B_V2_SetWindows(0, 0, EPD_4IN2B_V2_WIDTH-1, EPD_4IN2B_V2_HEIGHT-1);
+	 
+	EPD_4IN2B_V2_SetCursor(0, 0);
+	
+    EPD_4IN2B_V2_ReadBusy();
+}
+
+void EPD_4IN2B_V2_Init()
+{
+    uint8_t i=0;
+    EPD_4IN2B_V2_Reset();
+
+    DEV_Digital_Write(EPD_DC_PIN, 0);
+    DEV_SPI_SendData(0x2F);
+    DEV_Delay_ms(50);
+    
+    DEV_Digital_Write(EPD_DC_PIN, 1);
+    i = DEV_SPI_ReadData();
+    // printf("%02x\n",i);
 
-    EPD_4IN2B_V2_SendCommand(0x00);
-    EPD_4IN2B_V2_SendData(0x0f);
+    if(i == 0x01)
+    {
+        flag = 0;
+        EPD_4IN2B_V2_Init_new();
+    }
+    else
+    {
+        flag = 1;
+        EPD_4IN2B_V2_Init_old();
+    }
 }
 
+
+
 /******************************************************************************
 function :	Clear screen
 parameter:
 ******************************************************************************/
-void EPD_4IN2B_V2_Clear(void)
+void EPD_4IN2B_V2_Clear_old(void)
 {
     UWORD Width, Height;
     Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
@@ -136,14 +233,51 @@ void EPD_4IN2B_V2_Clear(void)
         }
     }
 
-    EPD_4IN2B_V2_TurnOnDisplay();
+    EPD_4IN2B_V2_SendCommand(0x12);
+    DEV_Delay_ms(100);
+    EPD_4IN2B_V2_ReadBusy();
+}
+
+
+void EPD_4IN2B_V2_Clear_new(void)
+{
+    UWORD Width, Height;
+    Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
+    Height = EPD_4IN2B_V2_HEIGHT;
+
+    EPD_4IN2B_V2_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_4IN2B_V2_SendData(0xFF);
+        }
+    }
+
+    EPD_4IN2B_V2_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_4IN2B_V2_SendData(0x00);
+        }
+    }
+
+    EPD_4IN2B_V2_SendCommand(0x22);
+	EPD_4IN2B_V2_SendData(0xF7);
+    EPD_4IN2B_V2_SendCommand(0x20);
+    EPD_4IN2B_V2_ReadBusy();
+}
+
+void EPD_4IN2B_V2_Clear(void)
+{
+    if(flag == 0)
+        EPD_4IN2B_V2_Clear_new();
+    else
+        EPD_4IN2B_V2_Clear_old();
 }
 
 /******************************************************************************
 function :	Sends the image buffer in RAM to e-Paper and displays
 parameter:
 ******************************************************************************/
-void EPD_4IN2B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage)
+void EPD_4IN2B_V2_Display_old(const UBYTE *blackimage, const UBYTE *ryimage)
 {
     UWORD Width, Height;
     Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
@@ -163,20 +297,68 @@ void EPD_4IN2B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage)
         }
     }
 
-    EPD_4IN2B_V2_TurnOnDisplay();
+    EPD_4IN2B_V2_SendCommand(0x12);
+    DEV_Delay_ms(100);
+    EPD_4IN2B_V2_ReadBusy();
+}
+
+void EPD_4IN2B_V2_Display_new(const UBYTE *blackimage, const UBYTE *ryimage)
+{
+    UWORD Width, Height;
+    Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
+    Height = EPD_4IN2B_V2_HEIGHT;
+
+    EPD_4IN2B_V2_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_4IN2B_V2_SendData(blackimage[i + j * Width]);
+        }
+    }
+
+    EPD_4IN2B_V2_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_4IN2B_V2_SendData(~ryimage[i + j * Width]);
+        }
+    }
+
+    EPD_4IN2B_V2_SendCommand(0x22);
+	EPD_4IN2B_V2_SendData(0xF7);
+    EPD_4IN2B_V2_SendCommand(0x20);
+    EPD_4IN2B_V2_ReadBusy();
+}
+
+void EPD_4IN2B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage)
+{
+    if(flag == 0)
+        EPD_4IN2B_V2_Display_new(blackimage, ryimage);
+    else
+        EPD_4IN2B_V2_Display_old(blackimage, ryimage);
 }
 
 /******************************************************************************
 function :	Enter sleep mode
 parameter:
 ******************************************************************************/
-void EPD_4IN2B_V2_Sleep(void)
+void EPD_4IN2B_V2_Sleep_old(void)
 {
-    EPD_4IN2B_V2_SendCommand(0X50);
-    EPD_4IN2B_V2_SendData(0xf7);		//border floating	
+    EPD_4IN2B_V2_SendCommand(0X50);  	
+    EPD_4IN2B_V2_SendData(0xf7);
+    EPD_4IN2B_V2_SendCommand(0x02);  
+    EPD_4IN2B_V2_ReadBusy();
+    EPD_4IN2B_V2_SendCommand(0x07);  
+    EPD_4IN2B_V2_SendData(0XA5);
+}
+void EPD_4IN2B_V2_Sleep_new(void)
+{
+    EPD_4IN2B_V2_SendCommand(0X10);  	//deep sleep
+    EPD_4IN2B_V2_SendData(0x03);
+}
 
-    EPD_4IN2B_V2_SendCommand(0X02);  	//power off
-    EPD_4IN2B_V2_ReadBusy(); //waiting for the electronic paper IC to release the idle signal
-    EPD_4IN2B_V2_SendCommand(0X07);  	//deep sleep
-    EPD_4IN2B_V2_SendData(0xA5);
+void EPD_4IN2B_V2_Sleep(void)
+{
+    if(flag == 0)
+        EPD_4IN2B_V2_Sleep_new();
+    else
+        EPD_4IN2B_V2_Sleep_old();
 }

+ 1 - 1
RaspberryPi_JetsonNano/c/lib/e-Paper/EPD_4in2b_V2.h

@@ -5,7 +5,7 @@
 * | Info        :
 *----------------
 * |	This version:   V1.0
-* | Date        :   2020-04-23
+* | Date        :   2020-11-25
 * | Info        :
 * -----------------------------------------------------------------------------
 #

+ 0 - 0
RaspberryPi_JetsonNano/python/examples/.lgd-nfy0


+ 1 - 1
RaspberryPi_JetsonNano/python/examples/epd_4in2b_V2_test.py

@@ -36,7 +36,7 @@ try:
     drawblack = ImageDraw.Draw(HBlackimage)
     drawry = ImageDraw.Draw(HRYimage)
     drawblack.text((10, 0), 'hello world', font = font24, fill = 0)
-    drawblack.text((10, 20), '4.2inch e-Paper bc', font = font24, fill = 0)
+    drawblack.text((10, 20), '4.2inch e-Paper b', font = font24, fill = 0)
     drawblack.text((150, 0), u'微雪电子', font = font24, fill = 0)    
     drawblack.line((20, 50, 70, 100), fill = 0)
     drawblack.line((70, 50, 20, 100), fill = 0)

BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/DEV_Config_32.so


BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/DEV_Config_64.so


BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__init__.pyc


BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/__init__.cpython-311.pyc


BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epd2in13_V3.cpython-311.pyc


BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epd2in13_V4.cpython-311.pyc


BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epd4in2b_V2.cpython-37.pyc


BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epd7in5_V2.cpython-311.pyc


BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epdconfig.cpython-311.pyc


BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/__pycache__/epdconfig.cpython-37.pyc


+ 2 - 2
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd2in7_V2.py

@@ -444,7 +444,7 @@ class EPD:
   
     def display_4Gray(self, image):
         self.send_command(0x24)
-        for i in range(0, 48000):                     #5808*4  46464
+        for i in range(0, 5808):                     #5808*4  46464
             temp3=0
             for j in range(0, 2):
                 temp1 = image[i*2+j]
@@ -476,7 +476,7 @@ class EPD:
             self.send_data(temp3)
             
         self.send_command(0x26)	       
-        for i in range(0, 48000):                #5808*4  46464
+        for i in range(0, 5808):                #5808*4  46464
             temp3=0
             for j in range(0, 2):
                 temp1 = image[i*2+j]

+ 138 - 40
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd4in2b_V2.py

@@ -44,6 +44,11 @@ class EPD:
         self.cs_pin = epdconfig.CS_PIN
         self.width = EPD_WIDTH
         self.height = EPD_HEIGHT
+        self.flag = 0
+        
+        if (epdconfig.module_init(cleanup=True) != 0):
+            return -1
+        
 
     # Hardware reset
     def reset(self):
@@ -57,13 +62,13 @@ class EPD:
     def send_command(self, command):
         epdconfig.digital_write(self.dc_pin, 0)
         epdconfig.digital_write(self.cs_pin, 0)
-        epdconfig.spi_writebyte([command])
+        epdconfig.DEV_SPI_write(command)
         epdconfig.digital_write(self.cs_pin, 1)
 
     def send_data(self, data):
         epdconfig.digital_write(self.dc_pin, 1)
         epdconfig.digital_write(self.cs_pin, 0)
-        epdconfig.spi_writebyte([data])
+        epdconfig.DEV_SPI_write(data)
         epdconfig.digital_write(self.cs_pin, 1)
 
     # send a lot of data   
@@ -75,23 +80,77 @@ class EPD:
         
     def ReadBusy(self):
         logger.debug("e-Paper busy")
-        self.send_command(0x71)
-        while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy
-            self.send_command(0x71)
-            epdconfig.delay_ms(20)
+        if(self.flag == 1):
+            while(epdconfig.digital_read(self.busy_pin) == 1): 
+                epdconfig.delay_ms(100) 
+        
+        else:
+            while(epdconfig.digital_read(self.busy_pin) == 0): 
+                epdconfig.delay_ms(100) 
         logger.debug("e-Paper busy release")
+
+    def TurnOnDisplay(self):
+        if(self.flag == 1):
+            self.send_command(0x22)
+            self.send_data(0xF7)	
+            self.send_command(0x20)
+            self.ReadBusy()
+        
+        else:
+            self.send_command(0x12)
+            epdconfig.delay_ms(100) 
+            self.ReadBusy()
             
     def init(self):
-        if (epdconfig.module_init() != 0):
-            return -1
-            
+        i = 0x00
         self.reset()
-        
-        self.send_command(0x04); 
-        self.ReadBusy();
+        self.send_command(0x2F)
+        epdconfig.delay_ms(100)
+        epdconfig.digital_write(self.dc_pin, 1)
+        epdconfig.digital_write(self.cs_pin, 0) 
+        i = epdconfig.DEV_SPI_read()
+        epdconfig.digital_write(self.cs_pin, 1) 
+        # print(i)
+
+        if(i == 0x01):
+            self.flag = 1
+            self.ReadBusy()
+            self.send_command(0x12)
+            self.ReadBusy()
+
+            self.send_command(0x3C)
+            self.send_data(0x05)	
+
+            self.send_command(0x18)
+            self.send_data(0x80)	
 
-        self.send_command(0x00);
-        self.send_data(0x0f);
+            self.send_command(0x11)      
+            self.send_data(0x03)
+
+            self.send_command(0x44) 
+            self.send_data(0x00)
+            self.send_data(self.width//8-1)
+
+            self.send_command(0x45)        
+            self.send_data(0x00)
+            self.send_data(0x00) 
+            self.send_data((self.height-1)%256)    
+            self.send_data((self.height-1)//256)
+
+            self.send_command(0x4E)
+            self.send_data(0x00)
+            self.send_command(0x4F)  
+            self.send_data(0x00)    
+            self.send_data(0x00)
+            self.ReadBusy()
+
+        else:
+            self.flag = 0
+            self.send_command(0x04)  # POWER_ON
+            self.ReadBusy()
+
+            self.send_command(0x00)  # panel setting
+            self.send_data(0x0f)
         
         return 0
 
@@ -120,40 +179,79 @@ class EPD:
         return buf
 
     def display(self, imageblack, imagered):
-        self.send_command(0x10)
-        self.send_data2(imageblack)
+        high = self.height
+        if( self.width % 8 == 0) :
+            wide =  self.width // 8
+        else :
+            wide =  self.width // 8 + 1
         
-        self.send_command(0x13)
-        self.send_data2(imagered)
+        if(self.flag == 1):
+            self.send_command(0x24)
+            for j in range(0, high):
+                for i in range(0, wide):
+                    self.send_data(imageblack[i + j * wide]) 
+                    
+            self.send_command(0x26)
+            for j in range(0, high):
+                for i in range(0, wide):
+                    self.send_data(~imagered[i + j * wide]) 
         
-        self.send_command(0x12) 
-        epdconfig.delay_ms(20)
-        self.ReadBusy()
+        else:
+            self.send_command(0x10)
+            for j in range(0, high):
+                for i in range(0, wide):
+                    self.send_data(imageblack[i + j * wide]) 
+                    
+            self.send_command(0x13)
+            for j in range(0, high):
+                for i in range(0, wide):
+                    self.send_data(imagered[i + j * wide]) 
+
+        self.TurnOnDisplay()
         
     def Clear(self):
-        if self.width%8 == 0:
-            linewidth = int(self.width/8)
-        else:
-            linewidth = int(self.width/8) + 1
+        high = self.height
+        if( self.width % 8 == 0) :
+            wide =  self.width // 8
+        else :
+            wide =  self.width // 8 + 1
 
-        self.send_command(0x10)
-        self.send_data2([0xff] * int(self.height * linewidth))
-            
-        self.send_command(0x13)
-        self.send_data2([0xff] * int(self.height * linewidth))
+        if(self.flag == 1):
+            self.send_command(0x24)
+            for j in range(0, high):
+                for i in range(0, wide):
+                    self.send_data(0xff) 
+                    
+            self.send_command(0x26)
+            for j in range(0, high):
+                for i in range(0, wide):
+                    self.send_data(0x00) 
         
-        self.send_command(0x12) 
-        epdconfig.delay_ms(20)
-        self.ReadBusy()
+        else:
+            self.send_command(0x10)
+            for j in range(0, high):
+                for i in range(0, wide):
+                    self.send_data(0xff) 
+                    
+            self.send_command(0x13)
+            for j in range(0, high):
+                for i in range(0, wide):
+                    self.send_data(0xff) 
 
-    def sleep(self):
-        self.send_command(0X50)
-        self.send_data(0xf7)		#border floating	
+        self.TurnOnDisplay()
 
-        self.send_command(0X02)  	#power off
-        self.ReadBusy() #waiting for the electronic paper IC to release the idle signal
-        self.send_command(0X07)  	#deep sleep
-        self.send_data(0xA5)
+    def sleep(self):
+        if(self.flag == 1):
+            self.send_command(0X10) 
+            self.send_data(0x03)
+        
+        else:
+            self.send_command(0X50) 
+            self.send_data(0xf7)             
+            self.send_command(0X02)
+            self.ReadBusy() 
+            self.send_command(0X07) 
+            self.send_data(0xA5)
         
         epdconfig.delay_ms(2000)
         epdconfig.module_exit()

BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epd4in2b_V2.pyc


+ 57 - 19
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epdconfig.py

@@ -33,6 +33,8 @@ import sys
 import time
 import subprocess
 
+from ctypes import *
+
 logger = logging.getLogger(__name__)
 
 
@@ -43,11 +45,13 @@ class RaspberryPi:
     CS_PIN   = 8
     BUSY_PIN = 24
     PWR_PIN  = 18
+    MOSI_PIN = 10
+    SCLK_PIN = 11
 
     def __init__(self):
         import spidev
         import gpiozero
-
+        
         self.SPI = spidev.SpiDev()
         self.GPIO_RST_PIN    = gpiozero.LED(self.RST_PIN)
         self.GPIO_DC_PIN     = gpiozero.LED(self.DC_PIN)
@@ -55,6 +59,8 @@ class RaspberryPi:
         self.GPIO_PWR_PIN    = gpiozero.LED(self.PWR_PIN)
         self.GPIO_BUSY_PIN   = gpiozero.Button(self.BUSY_PIN, pull_up = False)
 
+        
+
     def digital_write(self, pin, value):
         if pin == self.RST_PIN:
             if value:
@@ -98,30 +104,62 @@ class RaspberryPi:
     def spi_writebyte2(self, data):
         self.SPI.writebytes2(data)
 
-    def module_init(self):
+    def DEV_SPI_write(self, data):
+        self.DEV_SPI.DEV_SPI_SendData(data)
+
+    def DEV_SPI_nwrite(self, data):
+        self.DEV_SPI.DEV_SPI_SendnData(data)
+
+    def DEV_SPI_read(self):
+        return self.DEV_SPI.DEV_SPI_ReadData()
+
+    def module_init(self, cleanup=False):
         self.GPIO_PWR_PIN.on()
+        
+        if cleanup:
+            find_dirs = [
+                os.path.dirname(os.path.realpath(__file__)),
+                '/usr/local/lib',
+                '/usr/lib',
+            ]
+            self.DEV_SPI = None
+            for find_dir in find_dirs:
+                val = int(os.popen('getconf LONG_BIT').read())
+                logging.debug("System is %d bit"%val)
+                if val == 64:
+                    so_filename = os.path.join(find_dir, 'DEV_Config_64.so')
+                else:
+                    so_filename = os.path.join(find_dir, 'DEV_Config_32.so')
+                if os.path.exists(so_filename):
+                    self.DEV_SPI = CDLL(so_filename)
+                    break
+            if self.DEV_SPI is None:
+                RuntimeError('Cannot find DEV_Config.so')
+
+            self.DEV_SPI.DEV_Module_Init()
 
-        # SPI device, bus = 0, device = 0
-        self.SPI.open(0, 0)
-        self.SPI.max_speed_hz = 4000000
-        self.SPI.mode = 0b00
+        else:
+            # SPI device, bus = 0, device = 0
+            self.SPI.open(0, 0)
+            self.SPI.max_speed_hz = 4000000
+            self.SPI.mode = 0b00
         return 0
 
     def module_exit(self, cleanup=False):
-        logger.debug("close 5V, Module enters 0 power consumption ...")
+        logger.debug("spi end")
+        self.SPI.close()
 
-        # logger.debug("spi end")
-        # self.SPI.close()
-        # self.GPIO_RST_PIN.off()
-        # self.GPIO_DC_PIN.off()
-        # self.GPIO_PWR_PIN.off()
-
-        # if cleanup:
-        #     self.GPIO_RST_PIN.close()
-        #     self.GPIO_DC_PIN.close()
-        #     # self.GPIO_CS_PIN.close()
-        #     self.GPIO_PWR_PIN.close()
-        #     self.GPIO_BUSY_PIN.close()
+        self.GPIO_RST_PIN.off()
+        self.GPIO_DC_PIN.off()
+        self.GPIO_PWR_PIN.off()
+        logger.debug("close 5V, Module enters 0 power consumption ...")
+        
+        if cleanup:
+            self.GPIO_RST_PIN.close()
+            self.GPIO_DC_PIN.close()
+            # self.GPIO_CS_PIN.close()
+            self.GPIO_PWR_PIN.close()
+            self.GPIO_BUSY_PIN.close()
 
         
 

BIN
RaspberryPi_JetsonNano/python/lib/waveshare_epd/epdconfig.pyc


+ 4 - 0
STM32/STM32-F103ZET6/Inc/main.h

@@ -68,6 +68,10 @@ void Error_Handler(void);
 #define SPI_CS_GPIO_Port GPIOA
 #define PWR_Pin GPIO_PIN_6
 #define PWR_GPIO_Port GPIOA
+#define DIN_Pin GPIO_PIN_7
+#define DIN_GPIO_Port GPIOA
+#define SCK_Pin GPIO_PIN_5
+#define SCK_GPIO_Port GPIOA
 /* USER CODE BEGIN Private defines */
 
 /* USER CODE END Private defines */

File diff suppressed because it is too large
+ 140 - 140
STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvguix.liuyujian


+ 5 - 5
STM32/STM32-F103ZET6/MDK-ARM/epd-demo.uvoptx

@@ -705,7 +705,7 @@
       <OPTFL>
         <tvExp>1</tvExp>
         <tvExpOptDlg>0</tvExpOptDlg>
-        <IsCurrentTarget>0</IsCurrentTarget>
+        <IsCurrentTarget>1</IsCurrentTarget>
       </OPTFL>
       <CpuCode>18</CpuCode>
       <DebugOpt>
@@ -12540,7 +12540,7 @@
       <OPTFL>
         <tvExp>1</tvExp>
         <tvExpOptDlg>0</tvExpOptDlg>
-        <IsCurrentTarget>1</IsCurrentTarget>
+        <IsCurrentTarget>0</IsCurrentTarget>
       </OPTFL>
       <CpuCode>18</CpuCode>
       <DebugOpt>
@@ -12950,7 +12950,7 @@
 
   <Group>
     <GroupName>Application/User</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -13030,7 +13030,7 @@
 
   <Group>
     <GroupName>Examples</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -14462,7 +14462,7 @@
 
   <Group>
     <GroupName>Config</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>

+ 4 - 4
STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.build_log.htm

@@ -26,10 +26,10 @@ Project File Date:  04/08/2024
 
 <h2>Output:</h2>
 *** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\KEIL\azwz\ARM\ARMCC\Bin'
-Build target 'EPD_13in3b_test'
-compiling EPD_13in3b_test.c...
+Build target 'EPD_1in54_V2_test'
+compiling EPD_1in54_V2_test.c...
 linking...
-Program Size: Code=9980 RO-data=173852 RW-data=68 ZI-data=53428  
+Program Size: Code=24320 RO-data=15372 RW-data=380 ZI-data=53428  
 FromELF: creating hex file...
 "epd-demo\epd-demo.axf" - 0 Error(s), 0 Warning(s).
 
@@ -47,7 +47,7 @@ Package Vendor: Keil
                 STMicroelectronics STM32F1 Series Device Support, Drivers and Examples
 
 <h2>Collection of Component include folders:</h2>
-  .\RTE\_EPD_13in3b_test
+  .\RTE\_EPD_1in54_V2_test
   D:\KEIL\azwz\ARM\PACK\ARM\CMSIS\5.9.0\CMSIS\Core\Include
   D:\KEIL\azwz\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include
 

+ 1494 - 452
STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.htm

@@ -3,19 +3,19 @@
 <title>Static Call Graph - [epd-demo\epd-demo.axf]</title></head>
 <body><HR>
 <H1>Static Call Graph for image epd-demo\epd-demo.axf</H1><HR>
-<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Mon Apr 08 19:50:27 2024
+<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Tue Apr 23 16:53:03 2024
 <BR><P>
-<H3>Maximum Stack Usage =        736 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
+<H3>Maximum Stack Usage =        752 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
 Call chain for Maximum Stack Depth:</H3>
 main &rArr; EPD_test &rArr; Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 <P>
 <H3>
 Mutually Recursive functions
 </H3> <LI><a href="#[1c]">ADC1_2_IRQHandler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[1c]">ADC1_2_IRQHandler</a><BR>
- <LI><a href="#[4]">BusFault_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[4]">BusFault_Handler</a><BR>
+ <LI><a href="#[6a]">Error_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[6a]">Error_Handler</a><BR>
  <LI><a href="#[3]">MemManage_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[3]">MemManage_Handler</a><BR>
+ <LI><a href="#[4]">BusFault_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[4]">BusFault_Handler</a><BR>
  <LI><a href="#[5]">UsageFault_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[5]">UsageFault_Handler</a><BR>
- <LI><a href="#[6e]">Error_Handler</a>&nbsp;&nbsp;&nbsp;&rArr;&nbsp;&nbsp;&nbsp;<a href="#[6e]">Error_Handler</a><BR>
 </UL>
 <P>
 <H3>
@@ -23,7 +23,7 @@ Function Pointers
 </H3><UL>
  <LI><a href="#[1c]">ADC1_2_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[39]">ADC3_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[4]">BusFault_Handler</a> from stm32f1xx_it.o(i.BusFault_Handler) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[4]">BusFault_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[1f]">CAN1_RX1_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[20]">CAN1_SCE_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[15]">DMA1_Channel1_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
@@ -37,7 +37,7 @@ Function Pointers
  <LI><a href="#[43]">DMA2_Channel2_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[44]">DMA2_Channel3_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[45]">DMA2_Channel4_5_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[7]">DebugMon_Handler</a> from stm32f1xx_it.o(i.DebugMon_Handler) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[7]">DebugMon_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[10]">EXTI0_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[32]">EXTI15_10_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[11]">EXTI1_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
@@ -47,15 +47,15 @@ Function Pointers
  <LI><a href="#[21]">EXTI9_5_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[e]">FLASH_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[3a]">FSMC_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[2]">HardFault_Handler</a> from stm32f1xx_it.o(i.HardFault_Handler) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[2]">HardFault_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[2a]">I2C1_ER_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[29]">I2C1_EV_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[2c]">I2C2_ER_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[2b]">I2C2_EV_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[3]">MemManage_Handler</a> from stm32f1xx_it.o(i.MemManage_Handler) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[1]">NMI_Handler</a> from stm32f1xx_it.o(i.NMI_Handler) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[3]">MemManage_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[1]">NMI_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[b]">PVD_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[8]">PendSV_Handler</a> from stm32f1xx_it.o(i.PendSV_Handler) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[8]">PendSV_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[f]">RCC_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[33]">RTC_Alarm_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[d]">RTC_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
@@ -64,9 +64,29 @@ Function Pointers
  <LI><a href="#[2d]">SPI1_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[2e]">SPI2_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[3d]">SPI3_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[6]">SVC_Handler</a> from stm32f1xx_it.o(i.SVC_Handler) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[9]">SysTick_Handler</a> from stm32f1xx_it.o(i.SysTick_Handler) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[47]">SystemInit</a> from system_stm32f1xx.o(i.SystemInit) referenced from startup_stm32f103xe.o(.text)
+ <LI><a href="#[4b]">SPI_2linesRxISR_16BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[4d]">SPI_2linesRxISR_8BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[4c]">SPI_2linesTxISR_16BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[4e]">SPI_2linesTxISR_8BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[59]">SPI_AbortRx_ISR</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[58]">SPI_AbortTx_ISR</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[5c]">SPI_DMAAbortOnError</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[53]">SPI_DMAError</a> from stm32f1xx_hal_spi.o(.text) referenced 2 times from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[56]">SPI_DMAHalfReceiveCplt</a> from stm32f1xx_hal_spi.o(.text) referenced 2 times from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[51]">SPI_DMAHalfTransmitCplt</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[54]">SPI_DMAHalfTransmitReceiveCplt</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[57]">SPI_DMAReceiveCplt</a> from stm32f1xx_hal_spi.o(.text) referenced 2 times from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[5b]">SPI_DMARxAbortCallback</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[52]">SPI_DMATransmitCplt</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[55]">SPI_DMATransmitReceiveCplt</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[5a]">SPI_DMATxAbortCallback</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[4f]">SPI_RxISR_16BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[50]">SPI_RxISR_8BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[49]">SPI_TxISR_16BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[4a]">SPI_TxISR_8BIT</a> from stm32f1xx_hal_spi.o(.text) referenced from stm32f1xx_hal_spi.o(.text)
+ <LI><a href="#[6]">SVC_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[9]">SysTick_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[47]">SystemInit</a> from system_stm32f1xx.o(.text) referenced from startup_stm32f103xe.o(.text)
  <LI><a href="#[c]">TAMPER_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[22]">TIM1_BRK_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[25]">TIM1_CC_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
@@ -84,17 +104,27 @@ Function Pointers
  <LI><a href="#[36]">TIM8_UP_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[3e]">UART4_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[3f]">UART5_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[66]">UART_DMAAbortOnError</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
+ <LI><a href="#[5f]">UART_DMAError</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
+ <LI><a href="#[60]">UART_DMAReceiveCplt</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
+ <LI><a href="#[63]">UART_DMARxAbortCallback</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
+ <LI><a href="#[61]">UART_DMARxHalfCplt</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
+ <LI><a href="#[65]">UART_DMARxOnlyAbortCallback</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
+ <LI><a href="#[5d]">UART_DMATransmitCplt</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
+ <LI><a href="#[62]">UART_DMATxAbortCallback</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
+ <LI><a href="#[5e]">UART_DMATxHalfCplt</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
+ <LI><a href="#[64]">UART_DMATxOnlyAbortCallback</a> from stm32f1xx_hal_uart.o(.text) referenced from stm32f1xx_hal_uart.o(.text)
  <LI><a href="#[2f]">USART1_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[30]">USART2_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[31]">USART3_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[34]">USBWakeUp_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[1d]">USB_HP_CAN1_TX_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[1e]">USB_LP_CAN1_RX0_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
- <LI><a href="#[5]">UsageFault_Handler</a> from stm32f1xx_it.o(i.UsageFault_Handler) referenced from startup_stm32f103xe.o(RESET)
+ <LI><a href="#[5]">UsageFault_Handler</a> from stm32f1xx_it.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[a]">WWDG_IRQHandler</a> from startup_stm32f103xe.o(.text) referenced from startup_stm32f103xe.o(RESET)
  <LI><a href="#[48]">__main</a> from entry.o(.ARM.Collect$$$$00000000) referenced from startup_stm32f103xe.o(.text)
- <LI><a href="#[49]">fputc</a> from usart.o(i.fputc) referenced from printf3.o(i.__0printf$3)
- <LI><a href="#[46]">main</a> from main.o(i.main) referenced from entry9a.o(.ARM.Collect$$$$0000000B)
+ <LI><a href="#[67]">fputc</a> from usart.o(.text) referenced from printf3.o(i.__0printf$3)
+ <LI><a href="#[46]">main</a> from main.o(.text) referenced from entry9a.o(.ARM.Collect$$$$0000000B)
 </UL>
 <P>
 <H3>
@@ -103,25 +133,25 @@ Global Symbols
 <P><STRONG><a name="[48]"></a>__main</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry.o(.ARM.Collect$$$$00000000))
 <BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(.text)
 </UL>
-<P><STRONG><a name="[91]"></a>_main_stk</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))
+<P><STRONG><a name="[117]"></a>_main_stk</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001))
 
-<P><STRONG><a name="[4a]"></a>_main_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
-<BR><BR>[Calls]<UL><LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
+<P><STRONG><a name="[68]"></a>_main_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
+<BR><BR>[Calls]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
 </UL>
 
-<P><STRONG><a name="[4f]"></a>__main_after_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
-<BR><BR>[Called By]<UL><LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
+<P><STRONG><a name="[113]"></a>__main_after_scatterload</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004))
+<BR><BR>[Called By]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__scatterload
 </UL>
 
-<P><STRONG><a name="[92]"></a>_main_clock</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008))
+<P><STRONG><a name="[118]"></a>_main_clock</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008))
 
-<P><STRONG><a name="[93]"></a>_main_cpp_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A))
+<P><STRONG><a name="[119]"></a>_main_cpp_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A))
 
-<P><STRONG><a name="[94]"></a>_main_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B))
+<P><STRONG><a name="[11a]"></a>_main_init</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B))
 
-<P><STRONG><a name="[95]"></a>__rt_final_cpp</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D))
+<P><STRONG><a name="[11b]"></a>__rt_final_cpp</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000D))
 
-<P><STRONG><a name="[96]"></a>__rt_final_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F))
+<P><STRONG><a name="[11c]"></a>__rt_final_exit</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$0000000F))
 
 <P><STRONG><a name="[0]"></a>Reset_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, startup_stm32f103xe.o(.text))
 <BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
@@ -310,683 +340,1695 @@ Global Symbols
 <P><STRONG><a name="[a]"></a>WWDG_IRQHandler</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, startup_stm32f103xe.o(.text))
 <BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<P><STRONG><a name="[4d]"></a>__aeabi_memset</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_memset$wrapper
-<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
+<P><STRONG><a name="[6a]"></a>Error_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, main.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 24 + In Cycle
+<LI>Call Chain = Error_Handler &rArr;  Error_Handler (Cycle)
 </UL>
-
-<P><STRONG><a name="[97]"></a>__aeabi_memset4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
-
-<P><STRONG><a name="[98]"></a>__aeabi_memset8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
-
-<P><STRONG><a name="[4c]"></a>__aeabi_memclr</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
+<BR>[Calls]<UL><LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-
-<P><STRONG><a name="[88]"></a>__aeabi_memclr4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text))
-<BR><BR>[Called By]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
-<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
+<LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
+<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
 </UL>
 
-<P><STRONG><a name="[99]"></a>__aeabi_memclr8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
-
-<P><STRONG><a name="[4e]"></a>_memset$wrapper</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, memseta.o(.text), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
+<P><STRONG><a name="[6c]"></a>SystemClock_Config</STRONG> (Thumb, 88 bytes, Stack size 72 bytes, main.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 136<LI>Call Chain = SystemClock_Config &rArr; HAL_RCC_ClockConfig &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
+</UL>
+<BR>[Calls]<UL><LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_OscConfig
+<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
+<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
+</UL>
+<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[9a]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
+<P><STRONG><a name="[46]"></a>main</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, main.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 752<LI>Call Chain = main &rArr; EPD_test &rArr; Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
+</UL>
+<BR>[Calls]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
+<LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
+<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
+<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
+<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> entry9a.o(.ARM.Collect$$$$0000000B)
+</UL>
+<P><STRONG><a name="[71]"></a>MX_GPIO_Init</STRONG> (Thumb, 86 bytes, Stack size 32 bytes, gpio.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = MX_GPIO_Init &rArr; HAL_GPIO_Init
+</UL>
+<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+<LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
+</UL>
+<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
+</UL>
 
-<P><STRONG><a name="[90]"></a>__aeabi_uidivmod</STRONG> (Thumb, 44 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
-<BR><BR>[Called By]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
+<P><STRONG><a name="[73]"></a>MX_SPI1_Init</STRONG> (Thumb, 62 bytes, Stack size 8 bytes, spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = MX_SPI1_Init &rArr; HAL_SPI_Init &rArr; HAL_SPI_MspInit &rArr; HAL_GPIO_Init
+</UL>
+<BR>[Calls]<UL><LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Init
+<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+</UL>
+<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[4b]"></a>__scatterload</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, init.o(.text))
-<BR><BR>[Calls]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__main_after_scatterload
+<P><STRONG><a name="[79]"></a>HAL_SPI_MspInit</STRONG> (Thumb, 80 bytes, Stack size 24 bytes, spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = HAL_SPI_MspInit &rArr; HAL_GPIO_Init
 </UL>
-<BR>[Called By]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_main_scatterload
+<BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
+</UL>
+<BR>[Called By]<UL><LI><a href="#[a6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_Init
+<LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Init
 </UL>
 
-<P><STRONG><a name="[9b]"></a>__scatterload_rt2</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)
+<P><STRONG><a name="[7a]"></a>HAL_SPI_MspDeInit</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[7b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_DeInit
+</UL>
+<BR>[Called By]<UL><LI><a href="#[a5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_GPIO_Init
+<LI><a href="#[b6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_DeInit
+</UL>
 
-<P><STRONG><a name="[4]"></a>BusFault_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.BusFault_Handler))
-<BR><BR>[Calls]<UL><LI><a href="#[4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BusFault_Handler
+<P><STRONG><a name="[72]"></a>MX_USART1_UART_Init</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, usart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 96<LI>Call Chain = MX_USART1_UART_Init &rArr; HAL_UART_Init &rArr; HAL_UART_MspInit &rArr; HAL_GPIO_Init
 </UL>
-<BR>[Called By]<UL><LI><a href="#[4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BusFault_Handler
+<BR>[Calls]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
+<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
 </UL>
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
+<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
-<P><STRONG><a name="[50]"></a>DEV_Module_Exit</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, dev_config.o(i.DEV_Module_Exit))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = DEV_Module_Exit
+
+<P><STRONG><a name="[7d]"></a>HAL_UART_MspInit</STRONG> (Thumb, 100 bytes, Stack size 32 bytes, usart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = HAL_UART_MspInit &rArr; HAL_GPIO_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+<BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
+<LI><a href="#[ee]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_MultiProcessor_Init
+<LI><a href="#[ed]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_LIN_Init
+<LI><a href="#[ec]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_HalfDuplex_Init
 </UL>
 
-<P><STRONG><a name="[52]"></a>DEV_Module_Init</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, dev_config.o(i.DEV_Module_Init))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = DEV_Module_Init
+<P><STRONG><a name="[7e]"></a>HAL_UART_MspDeInit</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, usart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[7b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_DeInit
 </UL>
-<BR>[Calls]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
-</UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[ef]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_DeInit
 </UL>
 
-<P><STRONG><a name="[53]"></a>DEV_SPI_WriteByte</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, dev_config.o(i.DEV_SPI_WriteByte))
-<BR><BR>[Stack]<UL><LI>Max Depth = 96<LI>Call Chain = DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[67]"></a>fputc</STRONG> (Thumb, 20 bytes, Stack size 16 bytes, usart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = fputc &rArr; HAL_UART_Transmit &rArr; UART_WaitOnFlagUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
+<BR>[Calls]<UL><LI><a href="#[7f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
 </UL>
-<BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
-<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
+<BR>[Address Reference Count : 1]<UL><LI> printf3.o(i.__0printf$3)
 </UL>
-
-<P><STRONG><a name="[7]"></a>DebugMon_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.DebugMon_Handler))
+<P><STRONG><a name="[1]"></a>NMI_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
 <BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<P><STRONG><a name="[55]"></a>EPD_13IN3B_Clear</STRONG> (Thumb, 82 bytes, Stack size 24 bytes, epd_13in3b.o(i.EPD_13IN3B_Clear))
-<BR><BR>[Stack]<UL><LI>Max Depth = 144<LI>Call Chain = EPD_13IN3B_Clear &rArr; EPD_13IN3B_TurnOnDisplay &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[2]"></a>HardFault_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = HardFault_Handler &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
-<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
+<BR>[Calls]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-
-<P><STRONG><a name="[59]"></a>EPD_13IN3B_Display_Base</STRONG> (Thumb, 156 bytes, Stack size 32 bytes, epd_13in3b.o(i.EPD_13IN3B_Display_Base))
-<BR><BR>[Stack]<UL><LI>Max Depth = 152<LI>Call Chain = EPD_13IN3B_Display_Base &rArr; EPD_13IN3B_TurnOnDisplay &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[3]"></a>MemManage_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
+<BR><BR>[Calls]<UL><LI><a href="#[3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MemManage_Handler
 </UL>
-<BR>[Calls]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
-<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
+<BR>[Called By]<UL><LI><a href="#[3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MemManage_Handler
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-
-<P><STRONG><a name="[5a]"></a>EPD_13IN3B_Display_WritePicture</STRONG> (Thumb, 206 bytes, Stack size 32 bytes, epd_13in3b.o(i.EPD_13IN3B_Display_WritePicture))
-<BR><BR>[Stack]<UL><LI>Max Depth = 152<LI>Call Chain = EPD_13IN3B_Display_WritePicture &rArr; EPD_13IN3B_TurnOnDisplay &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[4]"></a>BusFault_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
+<BR><BR>[Calls]<UL><LI><a href="#[4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BusFault_Handler
 </UL>
-<BR>[Calls]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
-<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
+<BR>[Called By]<UL><LI><a href="#[4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;BusFault_Handler
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-
-<P><STRONG><a name="[5b]"></a>EPD_13IN3B_Init</STRONG> (Thumb, 274 bytes, Stack size 8 bytes, epd_13in3b.o(i.EPD_13IN3B_Init))
-<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_13IN3B_Init &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[5]"></a>UsageFault_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
+<BR><BR>[Calls]<UL><LI><a href="#[5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UsageFault_Handler
 </UL>
-<BR>[Calls]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_ReadBusy
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
-<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
-<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
-<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+<BR>[Called By]<UL><LI><a href="#[5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UsageFault_Handler
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-
-<P><STRONG><a name="[5d]"></a>EPD_13IN3B_ReadBusy</STRONG> (Thumb, 46 bytes, Stack size 8 bytes, epd_13in3b.o(i.EPD_13IN3B_ReadBusy))
-<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = EPD_13IN3B_ReadBusy &rArr; __2printf
+<P><STRONG><a name="[6]"></a>SVC_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<BR>[Calls]<UL><LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_ReadPin
-<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<P><STRONG><a name="[7]"></a>DebugMon_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
-<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
+<P><STRONG><a name="[8]"></a>PendSV_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-
-<P><STRONG><a name="[60]"></a>EPD_13IN3B_Sleep</STRONG> (Thumb, 24 bytes, Stack size 8 bytes, epd_13in3b.o(i.EPD_13IN3B_Sleep))
-<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_13IN3B_Sleep &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[9]"></a>SysTick_Handler</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_it.o(.text))
+<BR><BR>[Calls]<UL><LI><a href="#[80]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_IncTick
 </UL>
-<BR>[Calls]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
-<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
-<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<P><STRONG><a name="[d8]"></a>HAL_MspInit</STRONG> (Thumb, 52 bytes, Stack size 8 bytes, stm32f1xx_hal_msp.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = HAL_MspInit
 </UL>
-
-<P><STRONG><a name="[61]"></a>EPD_test</STRONG> (Thumb, 578 bytes, Stack size 32 bytes, epd_13in3b_test.o(i.EPD_test))
-<BR><BR>[Stack]<UL><LI>Max Depth = 736<LI>Call Chain = EPD_test &rArr; Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
+<BR>[Called By]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SelectImage
-<LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_NewImage
-<LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
-<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_CN
-<LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
-<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
-<LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
-<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
-<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_Clear
-<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Sleep
-<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
-<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_WritePicture
-<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_Base
-<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Clear
-<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Init
-<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Exit
-<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
-<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+
+<P><STRONG><a name="[74]"></a>EPD_test</STRONG> (Thumb, 654 bytes, Stack size 48 bytes, epd_1in54_v2_test.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 752<LI>Call Chain = EPD_test &rArr; Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
+</UL>
+<BR>[Calls]<UL><LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SelectImage
+<LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_NewImage
+<LI><a href="#[94]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawTime
+<LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
+<LI><a href="#[90]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_CN
+<LI><a href="#[8c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
+<LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
+<LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
+<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
+<LI><a href="#[8d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
+<LI><a href="#[88]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawBitMap
+<LI><a href="#[93]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_ClearWindows
+<LI><a href="#[87]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_Clear
+<LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Sleep
+<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init_Partial
+<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init
+<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_DisplayPartBaseImage
+<LI><a href="#[95]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_DisplayPart
+<LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Display
+<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Clear
+<LI><a href="#[81]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Init
+<LI><a href="#[98]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Exit
+<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;malloc
+<LI><a href="#[97]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;free
 </UL>
 <BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[6e]"></a>Error_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, main.o(i.Error_Handler))
-<BR><BR>[Stack]<UL><LI>Max Depth = 24 + In Cycle
-<LI>Call Chain = Error_Handler &rArr;  Error_Handler (Cycle)
+<P><STRONG><a name="[82]"></a>EPD_1IN54_V2_Init</STRONG> (Thumb, 190 bytes, Stack size 8 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 136<LI>Call Chain = EPD_1IN54_V2_Init &rArr; EPD_1IN54_V2_SetLut &rArr; EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Calls]<UL><LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
+<LI><a href="#[9c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SetLut
+<LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_ReadBusy
+<LI><a href="#[99]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Reset
 </UL>
-<BR>[Called By]<UL><LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
-<LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
-<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[5c]"></a>HAL_Delay</STRONG> (Thumb, 32 bytes, Stack size 16 bytes, stm32f1xx_hal.o(i.HAL_Delay))
-<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = HAL_Delay
+<P><STRONG><a name="[92]"></a>EPD_1IN54_V2_Init_Partial</STRONG> (Thumb, 120 bytes, Stack size 8 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 136<LI>Call Chain = EPD_1IN54_V2_Init_Partial &rArr; EPD_1IN54_V2_SetLut &rArr; EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<BR>[Calls]<UL><LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
+<LI><a href="#[9c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SetLut
+<LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_ReadBusy
+<LI><a href="#[99]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Reset
 </UL>
-<BR>[Called By]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_ReadBusy
-<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Sleep
-<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
-<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-<LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[7c]"></a>HAL_GPIO_Init</STRONG> (Thumb, 462 bytes, Stack size 40 bytes, stm32f1xx_hal_gpio.o(i.HAL_GPIO_Init))
-<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_GPIO_Init
+<P><STRONG><a name="[83]"></a>EPD_1IN54_V2_Clear</STRONG> (Thumb, 80 bytes, Stack size 24 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 144<LI>Call Chain = EPD_1IN54_V2_Clear &rArr; EPD_1IN54_V2_TurnOnDisplay &rArr; EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Called By]<UL><LI><a href="#[7f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
-<LI><a href="#[7b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspInit
-<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
+<BR>[Calls]<UL><LI><a href="#[9f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_TurnOnDisplay
+<LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
 </UL>
-
-<P><STRONG><a name="[5f]"></a>HAL_GPIO_ReadPin</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(i.HAL_GPIO_ReadPin))
-<BR><BR>[Called By]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_ReadBusy
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[51]"></a>HAL_GPIO_WritePin</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(i.HAL_GPIO_WritePin))
-<BR><BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
-<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
-<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
-<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Init
-<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Exit
-<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
+<P><STRONG><a name="[89]"></a>EPD_1IN54_V2_Display</STRONG> (Thumb, 58 bytes, Stack size 24 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 144<LI>Call Chain = EPD_1IN54_V2_Display &rArr; EPD_1IN54_V2_TurnOnDisplay &rArr; EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-
-<P><STRONG><a name="[6f]"></a>HAL_GetTick</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal.o(i.HAL_GetTick))
-<BR><BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
-<LI><a href="#[81]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
-<LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_OscConfig
-<LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
-<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-<LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_WaitFlagStateUntilTimeout
-<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_WaitOnFlagUntilTimeout
+<BR>[Calls]<UL><LI><a href="#[9f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_TurnOnDisplay
+<LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
 </UL>
-
-<P><STRONG><a name="[8a]"></a>HAL_IncTick</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(i.HAL_IncTick))
-<BR><BR>[Called By]<UL><LI><a href="#[9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SysTick_Handler
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[70]"></a>HAL_Init</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, stm32f1xx_hal.o(i.HAL_Init))
-<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_Init &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
+<P><STRONG><a name="[91]"></a>EPD_1IN54_V2_DisplayPartBaseImage</STRONG> (Thumb, 94 bytes, Stack size 24 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 144<LI>Call Chain = EPD_1IN54_V2_DisplayPartBaseImage &rArr; EPD_1IN54_V2_TurnOnDisplayPart &rArr; EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_MspInit
-<LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
-<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriorityGrouping
+<BR>[Calls]<UL><LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_TurnOnDisplayPart
+<LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
 </UL>
-<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[72]"></a>HAL_InitTick</STRONG> (Thumb, 54 bytes, Stack size 16 bytes, stm32f1xx_hal.o(i.HAL_InitTick))
-<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = HAL_InitTick &rArr; HAL_NVIC_SetPriority
+<P><STRONG><a name="[95]"></a>EPD_1IN54_V2_DisplayPart</STRONG> (Thumb, 58 bytes, Stack size 24 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 144<LI>Call Chain = EPD_1IN54_V2_DisplayPart &rArr; EPD_1IN54_V2_TurnOnDisplayPart &rArr; EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_Config
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriority
+<BR>[Calls]<UL><LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_TurnOnDisplayPart
+<LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
 </UL>
-<BR>[Called By]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
-<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[73]"></a>HAL_MspInit</STRONG> (Thumb, 52 bytes, Stack size 8 bytes, stm32f1xx_hal_msp.o(i.HAL_MspInit))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = HAL_MspInit
+<P><STRONG><a name="[96]"></a>EPD_1IN54_V2_Sleep</STRONG> (Thumb, 24 bytes, Stack size 8 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_1IN54_V2_Sleep &rArr; EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Called By]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
+<BR>[Calls]<UL><LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
+<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+</UL>
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[75]"></a>HAL_NVIC_SetPriority</STRONG> (Thumb, 60 bytes, Stack size 16 bytes, stm32f1xx_hal_cortex.o(i.HAL_NVIC_SetPriority))
-<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = HAL_NVIC_SetPriority
+<P><STRONG><a name="[a1]"></a>DEV_SPI_WriteByte</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, dev_config.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 96<LI>Call Chain = DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__NVIC_SetPriority
+<BR>[Calls]<UL><LI><a href="#[a2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
 </UL>
-<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+<BR>[Called By]<UL><LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
 </UL>
 
-<P><STRONG><a name="[71]"></a>HAL_NVIC_SetPriorityGrouping</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(i.HAL_NVIC_SetPriorityGrouping))
-<BR><BR>[Called By]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
+<P><STRONG><a name="[a3]"></a>DEV_SPI_Write_nByte</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, dev_config.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[a2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
 </UL>
 
-<P><STRONG><a name="[77]"></a>HAL_RCC_ClockConfig</STRONG> (Thumb, 280 bytes, Stack size 32 bytes, stm32f1xx_hal_rcc.o(i.HAL_RCC_ClockConfig))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = HAL_RCC_ClockConfig &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
-</UL>
-<BR>[Calls]<UL><LI><a href="#[78]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetSysClockFreq
-<LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
-<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<P><STRONG><a name="[a4]"></a>DEV_GPIO_Mode</STRONG> (Thumb, 40 bytes, Stack size 24 bytes, dev_config.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
 </UL>
-<BR>[Called By]<UL><LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+<BR>[Called By]<UL><LI><a href="#[a8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_ReadData
+<LI><a href="#[a7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_SendData
 </UL>
 
-<P><STRONG><a name="[8d]"></a>HAL_RCC_GetPCLK1Freq</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(i.HAL_RCC_GetPCLK1Freq))
-<BR><BR>[Called By]<UL><LI><a href="#[80]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+<P><STRONG><a name="[a5]"></a>DEV_GPIO_Init</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, dev_config.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspDeInit
 </UL>
 
-<P><STRONG><a name="[8c]"></a>HAL_RCC_GetPCLK2Freq</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(i.HAL_RCC_GetPCLK2Freq))
-<BR><BR>[Called By]<UL><LI><a href="#[80]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+<P><STRONG><a name="[a6]"></a>DEV_SPI_Init</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, dev_config.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspInit
 </UL>
 
-<P><STRONG><a name="[78]"></a>HAL_RCC_GetSysClockFreq</STRONG> (Thumb, 74 bytes, Stack size 20 bytes, stm32f1xx_hal_rcc.o(i.HAL_RCC_GetSysClockFreq))
-<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = HAL_RCC_GetSysClockFreq
+<P><STRONG><a name="[a7]"></a>DEV_SPI_SendData</STRONG> (Thumb, 112 bytes, Stack size 16 bytes, dev_config.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[a4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_GPIO_Mode
+<LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
 </UL>
-<BR>[Called By]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
+
+<P><STRONG><a name="[a8]"></a>DEV_SPI_ReadData</STRONG> (Thumb, 114 bytes, Stack size 16 bytes, dev_config.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[a4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_GPIO_Mode
+<LI><a href="#[9b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_ReadPin
+<LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
 </UL>
 
-<P><STRONG><a name="[79]"></a>HAL_RCC_OscConfig</STRONG> (Thumb, 778 bytes, Stack size 40 bytes, stm32f1xx_hal_rcc.o(i.HAL_RCC_OscConfig))
-<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_RCC_OscConfig
+<P><STRONG><a name="[81]"></a>DEV_Module_Init</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, dev_config.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = DEV_Module_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
 </UL>
-<BR>[Called By]<UL><LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[7a]"></a>HAL_SPI_Init</STRONG> (Thumb, 178 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(i.HAL_SPI_Init))
-<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = HAL_SPI_Init &rArr; HAL_SPI_MspInit &rArr; HAL_GPIO_Init
+<P><STRONG><a name="[98]"></a>DEV_Module_Exit</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, dev_config.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = DEV_Module_Exit
 </UL>
-<BR>[Calls]<UL><LI><a href="#[7b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspInit
+<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
 </UL>
-<BR>[Called By]<UL><LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[7b]"></a>HAL_SPI_MspInit</STRONG> (Thumb, 80 bytes, Stack size 24 bytes, spi.o(i.HAL_SPI_MspInit))
-<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = HAL_SPI_MspInit &rArr; HAL_GPIO_Init
+<P><STRONG><a name="[85]"></a>Paint_NewImage</STRONG> (Thumb, 56 bytes, Stack size 16 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = Paint_NewImage
 </UL>
-<BR>[Calls]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
-<BR>[Called By]<UL><LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Init
+
+<P><STRONG><a name="[86]"></a>Paint_SelectImage</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, gui_paint.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[54]"></a>HAL_SPI_Transmit</STRONG> (Thumb, 358 bytes, Stack size 40 bytes, stm32f1xx_hal_spi.o(i.HAL_SPI_Transmit))
-<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[a9]"></a>Paint_SetRotate</STRONG> (Thumb, 44 bytes, Stack size 8 bytes, gui_paint.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-<LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
+
+<P><STRONG><a name="[aa]"></a>Paint_SetScale</STRONG> (Thumb, 80 bytes, Stack size 8 bytes, gui_paint.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
+
+<P><STRONG><a name="[ab]"></a>Paint_SetMirroring</STRONG> (Thumb, 62 bytes, Stack size 8 bytes, gui_paint.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
 
-<P><STRONG><a name="[74]"></a>HAL_SYSTICK_Config</STRONG> (Thumb, 40 bytes, Stack size 8 bytes, stm32f1xx_hal_cortex.o(i.HAL_SYSTICK_Config))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = HAL_SYSTICK_Config
+<P><STRONG><a name="[ac]"></a>Paint_SetPixel</STRONG> (Thumb, 238 bytes, Stack size 16 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__NVIC_SetPriority
+<BR>[Calls]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+<BR>[Called By]<UL><LI><a href="#[b5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawBitMap_Paste
+<LI><a href="#[ad]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
+<LI><a href="#[90]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_CN
+<LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
+<LI><a href="#[93]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_ClearWindows
 </UL>
 
-<P><STRONG><a name="[7e]"></a>HAL_UART_Init</STRONG> (Thumb, 98 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(i.HAL_UART_Init))
-<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = HAL_UART_Init &rArr; HAL_UART_MspInit &rArr; HAL_GPIO_Init
+<P><STRONG><a name="[87]"></a>Paint_Clear</STRONG> (Thumb, 156 bytes, Stack size 12 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 12<LI>Call Chain = Paint_Clear
+</UL>
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+</UL>
+
+<P><STRONG><a name="[93]"></a>Paint_ClearWindows</STRONG> (Thumb, 52 bytes, Stack size 32 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = Paint_ClearWindows &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[7f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
-<LI><a href="#[80]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+<BR>[Calls]<UL><LI><a href="#[ac]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
 </UL>
-<BR>[Called By]<UL><LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[7f]"></a>HAL_UART_MspInit</STRONG> (Thumb, 100 bytes, Stack size 32 bytes, usart.o(i.HAL_UART_MspInit))
-<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = HAL_UART_MspInit &rArr; HAL_GPIO_Init
+<P><STRONG><a name="[8a]"></a>Paint_DrawPoint</STRONG> (Thumb, 180 bytes, Stack size 40 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
+<BR>[Calls]<UL><LI><a href="#[ac]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
+<BR>[Called By]<UL><LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
+<LI><a href="#[8d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
+<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[81]"></a>HAL_UART_Transmit</STRONG> (Thumb, 178 bytes, Stack size 32 bytes, stm32f1xx_hal_uart.o(i.HAL_UART_Transmit))
-<BR><BR>[Stack]<UL><LI>Max Depth = 56<LI>Call Chain = HAL_UART_Transmit &rArr; UART_WaitOnFlagUntilTimeout
+<P><STRONG><a name="[8b]"></a>Paint_DrawLine</STRONG> (Thumb, 662 bytes, Stack size 48 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 128<LI>Call Chain = Paint_DrawLine &rArr; Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
-<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_WaitOnFlagUntilTimeout
+<BR>[Calls]<UL><LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fputc
+<BR>[Called By]<UL><LI><a href="#[8c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
+<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[2]"></a>HardFault_Handler</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.HardFault_Handler))
-<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = HardFault_Handler &rArr; __2printf
+<P><STRONG><a name="[8c]"></a>Paint_DrawRectangle</STRONG> (Thumb, 170 bytes, Stack size 48 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 176<LI>Call Chain = Paint_DrawRectangle &rArr; Paint_DrawLine &rArr; Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Calls]<UL><LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
-<P><STRONG><a name="[83]"></a>MX_GPIO_Init</STRONG> (Thumb, 86 bytes, Stack size 32 bytes, gpio.o(i.MX_GPIO_Init))
-<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = MX_GPIO_Init &rArr; HAL_GPIO_Init
+
+<P><STRONG><a name="[8d]"></a>Paint_DrawCircle</STRONG> (Thumb, 528 bytes, Stack size 72 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 152<LI>Call Chain = Paint_DrawCircle &rArr; Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
-<LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
+<BR>[Calls]<UL><LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[84]"></a>MX_SPI1_Init</STRONG> (Thumb, 62 bytes, Stack size 8 bytes, spi.o(i.MX_SPI1_Init))
-<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = MX_SPI1_Init &rArr; HAL_SPI_Init &rArr; HAL_SPI_MspInit &rArr; HAL_GPIO_Init
+<P><STRONG><a name="[ad]"></a>Paint_DrawChar</STRONG> (Thumb, 172 bytes, Stack size 40 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Init
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+<BR>[Calls]<UL><LI><a href="#[ac]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
+<BR>[Called By]<UL><LI><a href="#[94]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawTime
+<LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
 </UL>
 
-<P><STRONG><a name="[85]"></a>MX_USART1_UART_Init</STRONG> (Thumb, 48 bytes, Stack size 8 bytes, usart.o(i.MX_USART1_UART_Init))
-<BR><BR>[Stack]<UL><LI>Max Depth = 96<LI>Call Chain = MX_USART1_UART_Init &rArr; HAL_UART_Init &rArr; HAL_UART_MspInit &rArr; HAL_GPIO_Init
+<P><STRONG><a name="[8e]"></a>Paint_DrawString_EN</STRONG> (Thumb, 116 bytes, Stack size 48 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 128<LI>Call Chain = Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+<BR>[Calls]<UL><LI><a href="#[ad]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
+<BR>[Called By]<UL><LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+<LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
+<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[3]"></a>MemManage_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.MemManage_Handler))
-<BR><BR>[Calls]<UL><LI><a href="#[3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MemManage_Handler
+<P><STRONG><a name="[90]"></a>Paint_DrawString_CN</STRONG> (Thumb, 518 bytes, Stack size 40 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = Paint_DrawString_CN &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Called By]<UL><LI><a href="#[3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MemManage_Handler
+<BR>[Calls]<UL><LI><a href="#[ac]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
 </UL>
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
-<P><STRONG><a name="[1]"></a>NMI_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.NMI_Handler))
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
+
+<P><STRONG><a name="[8f]"></a>Paint_DrawNum</STRONG> (Thumb, 140 bytes, Stack size 576 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 704<LI>Call Chain = Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<P><STRONG><a name="[65]"></a>Paint_Clear</STRONG> (Thumb, 158 bytes, Stack size 12 bytes, gui_paint.o(i.Paint_Clear))
-<BR><BR>[Stack]<UL><LI>Max Depth = 12<LI>Call Chain = Paint_Clear
+<BR>[Calls]<UL><LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[86]"></a>Paint_DrawChar</STRONG> (Thumb, 176 bytes, Stack size 40 bytes, gui_paint.o(i.Paint_DrawChar))
-<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
+<P><STRONG><a name="[ae]"></a>Paint_DrawNumDecimals</STRONG> (Thumb, 258 bytes, Stack size 592 bytes, gui_paint.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[b0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_i2d
+<LI><a href="#[b3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_fmul
+<LI><a href="#[b4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_f2iz
+<LI><a href="#[b1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_drsub
+<LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2iz
+<LI><a href="#[b2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2f
+<LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<LI><a href="#[6d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
+</UL>
+
+<P><STRONG><a name="[94]"></a>Paint_DrawTime</STRONG> (Thumb, 282 bytes, Stack size 72 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 152<LI>Call Chain = Paint_DrawTime &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
 </UL>
-<BR>[Calls]<UL><LI><a href="#[87]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Calls]<UL><LI><a href="#[ad]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
 </UL>
-<BR>[Called By]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
 
-<P><STRONG><a name="[6c]"></a>Paint_DrawCircle</STRONG> (Thumb, 532 bytes, Stack size 72 bytes, gui_paint.o(i.Paint_DrawCircle))
-<BR><BR>[Stack]<UL><LI>Max Depth = 152<LI>Call Chain = Paint_DrawCircle &rArr; Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
+<P><STRONG><a name="[88]"></a>Paint_DrawBitMap</STRONG> (Thumb, 44 bytes, Stack size 16 bytes, gui_paint.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = Paint_DrawBitMap
 </UL>
-<BR>[Calls]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+
+<P><STRONG><a name="[b5]"></a>Paint_DrawBitMap_Paste</STRONG> (Thumb, 198 bytes, Stack size 56 bytes, gui_paint.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[ac]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
 </UL>
 
-<P><STRONG><a name="[67]"></a>Paint_DrawLine</STRONG> (Thumb, 200 bytes, Stack size 48 bytes, gui_paint.o(i.Paint_DrawLine))
-<BR><BR>[Stack]<UL><LI>Max Depth = 128<LI>Call Chain = Paint_DrawLine &rArr; Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
+<P><STRONG><a name="[11d]"></a>Paint_DrawBitMap_Block</STRONG> (Thumb, 54 bytes, Stack size 20 bytes, gui_paint.o(.text), UNUSED)
+
+<P><STRONG><a name="[47]"></a>SystemInit</STRONG> (Thumb, 60 bytes, Stack size 0 bytes, system_stm32f1xx.o(.text))
+<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(.text)
+</UL>
+<P><STRONG><a name="[11e]"></a>SystemCoreClockUpdate</STRONG> (Thumb, 108 bytes, Stack size 0 bytes, system_stm32f1xx.o(.text), UNUSED)
+
+<P><STRONG><a name="[78]"></a>HAL_SPI_Init</STRONG> (Thumb, 178 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = HAL_SPI_Init &rArr; HAL_SPI_MspInit &rArr; HAL_GPIO_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Calls]<UL><LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspInit
 </UL>
-<BR>[Called By]<UL><LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
-<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[73]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
 </UL>
 
-<P><STRONG><a name="[6b]"></a>Paint_DrawNum</STRONG> (Thumb, 140 bytes, Stack size 576 bytes, gui_paint.o(i.Paint_DrawNum))
-<BR><BR>[Stack]<UL><LI>Max Depth = 704<LI>Call Chain = Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
+<P><STRONG><a name="[b6]"></a>HAL_SPI_DeInit</STRONG> (Thumb, 46 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspDeInit
+</UL>
+
+<P><STRONG><a name="[a2]"></a>HAL_SPI_Transmit</STRONG> (Thumb, 358 bytes, Stack size 40 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Calls]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
-<LI><a href="#[88]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
+<BR>[Calls]<UL><LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[a3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_Write_nByte
+<LI><a href="#[a1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
 </UL>
 
-<P><STRONG><a name="[66]"></a>Paint_DrawPoint</STRONG> (Thumb, 178 bytes, Stack size 40 bytes, gui_paint.o(i.Paint_DrawPoint))
-<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
+<P><STRONG><a name="[bb]"></a>HAL_SPI_TransmitReceive</STRONG> (Thumb, 484 bytes, Stack size 40 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
 </UL>
-<BR>[Calls]<UL><LI><a href="#[87]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+<BR>[Called By]<UL><LI><a href="#[bc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive
 </UL>
-<BR>[Called By]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
-<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
-<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+
+<P><STRONG><a name="[bc]"></a>HAL_SPI_Receive</STRONG> (Thumb, 344 bytes, Stack size 40 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive
+<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTransaction
 </UL>
 
-<P><STRONG><a name="[68]"></a>Paint_DrawRectangle</STRONG> (Thumb, 172 bytes, Stack size 48 bytes, gui_paint.o(i.Paint_DrawRectangle))
-<BR><BR>[Stack]<UL><LI>Max Depth = 176<LI>Call Chain = Paint_DrawRectangle &rArr; Paint_DrawLine &rArr; Paint_DrawPoint &rArr; Paint_SetPixel &rArr; __2printf
+<P><STRONG><a name="[bf]"></a>HAL_SPI_TxCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitCplt
+<LI><a href="#[bd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
 </UL>
-<BR>[Calls]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+
+<P><STRONG><a name="[be]"></a>HAL_SPI_ErrorCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[d3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_IRQHandler
+<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAAbortOnError
+<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitReceiveCplt
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAReceiveCplt
+<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitCplt
+<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAError
+<LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
+<LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
+<LI><a href="#[bd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+
+<P><STRONG><a name="[11f]"></a>HAL_SPI_Transmit_IT</STRONG> (Thumb, 140 bytes, Stack size 12 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+
+<P><STRONG><a name="[c1]"></a>HAL_SPI_RxCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAReceiveCplt
+<LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
+<LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
 </UL>
 
-<P><STRONG><a name="[6a]"></a>Paint_DrawString_CN</STRONG> (Thumb, 398 bytes, Stack size 40 bytes, gui_paint.o(i.Paint_DrawString_CN))
-<BR><BR>[Stack]<UL><LI>Max Depth = 80<LI>Call Chain = Paint_DrawString_CN &rArr; Paint_SetPixel &rArr; __2printf
+<P><STRONG><a name="[c3]"></a>HAL_SPI_TxRxCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitReceiveCplt
+<LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
 </UL>
-<BR>[Calls]<UL><LI><a href="#[87]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
+
+<P><STRONG><a name="[c5]"></a>HAL_SPI_TransmitReceive_IT</STRONG> (Thumb, 146 bytes, Stack size 20 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[c4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive_IT
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+
+<P><STRONG><a name="[c4]"></a>HAL_SPI_Receive_IT</STRONG> (Thumb, 192 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[c5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive_IT
 </UL>
 
-<P><STRONG><a name="[69]"></a>Paint_DrawString_EN</STRONG> (Thumb, 116 bytes, Stack size 48 bytes, gui_paint.o(i.Paint_DrawString_EN))
-<BR><BR>[Stack]<UL><LI>Max Depth = 128<LI>Call Chain = Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
+<P><STRONG><a name="[c6]"></a>HAL_SPI_TxHalfCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAHalfTransmitCplt
+</UL>
+
+<P><STRONG><a name="[c7]"></a>HAL_SPI_Transmit_DMA</STRONG> (Thumb, 202 bytes, Stack size 24 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[c8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
 </UL>
-<BR>[Calls]<UL><LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
-<LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+
+<P><STRONG><a name="[c9]"></a>HAL_SPI_RxHalfCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAHalfReceiveCplt
 </UL>
-<BR>[Called By]<UL><LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
-<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+
+<P><STRONG><a name="[ca]"></a>HAL_SPI_TxRxHalfCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAHalfTransmitReceiveCplt
 </UL>
 
-<P><STRONG><a name="[63]"></a>Paint_NewImage</STRONG> (Thumb, 56 bytes, Stack size 16 bytes, gui_paint.o(i.Paint_NewImage))
-<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = Paint_NewImage
+<P><STRONG><a name="[cb]"></a>HAL_SPI_TransmitReceive_DMA</STRONG> (Thumb, 268 bytes, Stack size 24 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[c8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[cc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive_DMA
 </UL>
 
-<P><STRONG><a name="[64]"></a>Paint_SelectImage</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, gui_paint.o(i.Paint_SelectImage))
-<BR><BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<P><STRONG><a name="[cc]"></a>HAL_SPI_Receive_DMA</STRONG> (Thumb, 262 bytes, Stack size 24 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[c8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
+<LI><a href="#[cb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive_DMA
 </UL>
 
-<P><STRONG><a name="[87]"></a>Paint_SetPixel</STRONG> (Thumb, 238 bytes, Stack size 16 bytes, gui_paint.o(i.Paint_SetPixel))
-<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = Paint_SetPixel &rArr; __2printf
+<P><STRONG><a name="[cd]"></a>HAL_SPI_Abort</STRONG> (Thumb, 274 bytes, Stack size 32 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[ce]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
 </UL>
-<BR>[Calls]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+
+<P><STRONG><a name="[cf]"></a>HAL_SPI_AbortCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[d0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Abort_IT
+<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATxAbortCallback
+<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMARxAbortCallback
 </UL>
-<BR>[Called By]<UL><LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_CN
-<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
-<LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
+
+<P><STRONG><a name="[d0]"></a>HAL_SPI_Abort_IT</STRONG> (Thumb, 264 bytes, Stack size 32 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[cf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_AbortCpltCallback
+<LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
 </UL>
 
-<P><STRONG><a name="[8]"></a>PendSV_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.PendSV_Handler))
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
+<P><STRONG><a name="[120]"></a>HAL_SPI_DMAPause</STRONG> (Thumb, 38 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+
+<P><STRONG><a name="[121]"></a>HAL_SPI_DMAResume</STRONG> (Thumb, 72 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+
+<P><STRONG><a name="[d2]"></a>HAL_SPI_DMAStop</STRONG> (Thumb, 66 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[ce]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
 </UL>
-<P><STRONG><a name="[6]"></a>SVC_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.SVC_Handler))
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
+
+<P><STRONG><a name="[d3]"></a>HAL_SPI_IRQHandler</STRONG> (Thumb, 220 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
+<LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+</UL>
+
+<P><STRONG><a name="[122]"></a>HAL_SPI_GetState</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+
+<P><STRONG><a name="[123]"></a>HAL_SPI_GetError</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text), UNUSED)
+
+<P><STRONG><a name="[d4]"></a>HAL_InitTick</STRONG> (Thumb, 54 bytes, Stack size 16 bytes, stm32f1xx_hal.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = HAL_InitTick &rArr; HAL_NVIC_SetPriority
 </UL>
-<P><STRONG><a name="[9]"></a>SysTick_Handler</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.SysTick_Handler))
-<BR><BR>[Calls]<UL><LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_IncTick
+<BR>[Calls]<UL><LI><a href="#[d5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_Config
+<LI><a href="#[d6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriority
 </UL>
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
+<BR>[Called By]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
+<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
+<LI><a href="#[dc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_DeInit
+<LI><a href="#[db]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SetTickFreq
 </UL>
-<P><STRONG><a name="[8b]"></a>SystemClock_Config</STRONG> (Thumb, 88 bytes, Stack size 72 bytes, main.o(i.SystemClock_Config))
-<BR><BR>[Stack]<UL><LI>Max Depth = 136<LI>Call Chain = SystemClock_Config &rArr; HAL_RCC_ClockConfig &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
+
+<P><STRONG><a name="[70]"></a>HAL_Init</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, stm32f1xx_hal.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_Init &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
 </UL>
-<BR>[Calls]<UL><LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_OscConfig
-<LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
-<LI><a href="#[88]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr4
+<BR>[Calls]<UL><LI><a href="#[d8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_MspInit
+<LI><a href="#[d4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+<LI><a href="#[d7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriorityGrouping
 </UL>
 <BR>[Called By]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[47]"></a>SystemInit</STRONG> (Thumb, 60 bytes, Stack size 0 bytes, system_stm32f1xx.o(i.SystemInit))
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(.text)
+<P><STRONG><a name="[da]"></a>HAL_MspDeInit</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[d9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DeInit
 </UL>
-<P><STRONG><a name="[5]"></a>UsageFault_Handler</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_it.o(i.UsageFault_Handler))
-<BR><BR>[Calls]<UL><LI><a href="#[5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UsageFault_Handler
+
+<P><STRONG><a name="[d9]"></a>HAL_DeInit</STRONG> (Thumb, 26 bytes, Stack size 8 bytes, stm32f1xx_hal.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[da]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_MspDeInit
 </UL>
-<BR>[Called By]<UL><LI><a href="#[5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UsageFault_Handler
+
+<P><STRONG><a name="[80]"></a>HAL_IncTick</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SysTick_Handler
 </UL>
-<BR>[Address Reference Count : 1]<UL><LI> startup_stm32f103xe.o(RESET)
+
+<P><STRONG><a name="[b8]"></a>HAL_GetTick</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[a2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
+<LI><a href="#[7f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
+<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_OscConfig
+<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
+<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+<LI><a href="#[f1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Receive
+<LI><a href="#[f0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_WaitOnFlagUntilTimeout
+<LI><a href="#[e5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_PollForTransfer
+<LI><a href="#[dc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_DeInit
+<LI><a href="#[bc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive
+<LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive
+<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMARxAbortCallback
+<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitReceiveCplt
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAReceiveCplt
+<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitCplt
+<LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
+<LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
+<LI><a href="#[bd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
+<LI><a href="#[b7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_WaitFlagStateUntilTimeout
 </UL>
-<P><STRONG><a name="[8e]"></a>__0printf$3</STRONG> (Thumb, 22 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
+
+<P><STRONG><a name="[124]"></a>HAL_GetTickPrio</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[db]"></a>HAL_SetTickFreq</STRONG> (Thumb, 30 bytes, Stack size 16 bytes, stm32f1xx_hal.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[d4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
 </UL>
 
-<P><STRONG><a name="[9c]"></a>__1printf$3</STRONG> (Thumb, 0 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3), UNUSED)
+<P><STRONG><a name="[125]"></a>HAL_GetTickFreq</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
 
-<P><STRONG><a name="[5e]"></a>__2printf</STRONG> (Thumb, 0 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3))
-<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = __2printf
+<P><STRONG><a name="[75]"></a>HAL_Delay</STRONG> (Thumb, 32 bytes, Stack size 16 bytes, stm32f1xx_hal.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = HAL_Delay
 </UL>
-<BR>[Called By]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_ReadBusy
-<LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
-<LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
-<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
-<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
-<LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
-<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
-<LI><a href="#[2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HardFault_Handler
-<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-<LI><a href="#[6e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
-<LI><a href="#[87]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
-<LI><a href="#[86]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
+<BR>[Calls]<UL><LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+</UL>
+<BR>[Called By]<UL><LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_ReadBusy
+<LI><a href="#[99]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Reset
+<LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Sleep
+<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
 </UL>
 
-<P><STRONG><a name="[9d]"></a>__scatterload_copy</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED)
+<P><STRONG><a name="[126]"></a>HAL_SuspendTick</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
 
-<P><STRONG><a name="[9e]"></a>__scatterload_null</STRONG> (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED)
+<P><STRONG><a name="[127]"></a>HAL_ResumeTick</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
 
-<P><STRONG><a name="[9f]"></a>__scatterload_zeroinit</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED)
+<P><STRONG><a name="[128]"></a>HAL_GetHalVersion</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
 
-<P><STRONG><a name="[49]"></a>fputc</STRONG> (Thumb, 20 bytes, Stack size 16 bytes, usart.o(i.fputc))
-<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = fputc &rArr; HAL_UART_Transmit &rArr; UART_WaitOnFlagUntilTimeout
-</UL>
-<BR>[Calls]<UL><LI><a href="#[81]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
+<P><STRONG><a name="[129]"></a>HAL_GetREVID</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[12a]"></a>HAL_GetDEVID</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[12b]"></a>HAL_GetUIDw0</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[12c]"></a>HAL_GetUIDw1</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[12d]"></a>HAL_GetUIDw2</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[12e]"></a>HAL_DBGMCU_EnableDBGSleepMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[12f]"></a>HAL_DBGMCU_DisableDBGSleepMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[130]"></a>HAL_DBGMCU_EnableDBGStopMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[131]"></a>HAL_DBGMCU_DisableDBGStopMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[132]"></a>HAL_DBGMCU_EnableDBGStandbyMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[133]"></a>HAL_DBGMCU_DisableDBGStandbyMode</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, stm32f1xx_hal.o(.text), UNUSED)
+
+<P><STRONG><a name="[dc]"></a>HAL_RCC_DeInit</STRONG> (Thumb, 202 bytes, Stack size 24 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[d4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
 </UL>
-<BR>[Address Reference Count : 1]<UL><LI> printf3.o(i.__0printf$3)
+
+<P><STRONG><a name="[6e]"></a>HAL_RCC_OscConfig</STRONG> (Thumb, 776 bytes, Stack size 40 bytes, stm32f1xx_hal_rcc.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_RCC_OscConfig
 </UL>
-<P><STRONG><a name="[6d]"></a>free</STRONG> (Thumb, 76 bytes, Stack size 8 bytes, malloc.o(i.free))
-<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = free
+<BR>[Calls]<UL><LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Called By]<UL><LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
 </UL>
 
-<P><STRONG><a name="[46]"></a>main</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, main.o(i.main))
-<BR><BR>[Stack]<UL><LI>Max Depth = 736<LI>Call Chain = main &rArr; EPD_test &rArr; Paint_DrawNum &rArr; Paint_DrawString_EN &rArr; Paint_DrawChar &rArr; Paint_SetPixel &rArr; __2printf
-</UL>
-<BR>[Calls]<UL><LI><a href="#[85]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
-<LI><a href="#[84]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_SPI1_Init
-<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
-<LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
-<LI><a href="#[5c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
-<LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
-<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+<P><STRONG><a name="[dd]"></a>HAL_RCC_GetSysClockFreq</STRONG> (Thumb, 124 bytes, Stack size 20 bytes, stm32f1xx_hal_rcc.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = HAL_RCC_GetSysClockFreq
 </UL>
-<BR>[Address Reference Count : 1]<UL><LI> entry9a.o(.ARM.Collect$$$$0000000B)
+<BR>[Called By]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_ClockConfig
 </UL>
-<P><STRONG><a name="[62]"></a>malloc</STRONG> (Thumb, 92 bytes, Stack size 20 bytes, malloc.o(i.malloc))
-<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = malloc
+
+<P><STRONG><a name="[6f]"></a>HAL_RCC_ClockConfig</STRONG> (Thumb, 282 bytes, Stack size 32 bytes, stm32f1xx_hal_rcc.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = HAL_RCC_ClockConfig &rArr; HAL_InitTick &rArr; HAL_NVIC_SetPriority
 </UL>
-<BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<BR>[Calls]<UL><LI><a href="#[dd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetSysClockFreq
+<LI><a href="#[d4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
 </UL>
-<P>
-<H3>
-Local Symbols
-</H3>
-<P><STRONG><a name="[56]"></a>EPD_13IN3B_SendCommand</STRONG> (Thumb, 46 bytes, Stack size 16 bytes, epd_13in3b.o(i.EPD_13IN3B_SendCommand))
-<BR><BR>[Stack]<UL><LI>Max Depth = 112<LI>Call Chain = EPD_13IN3B_SendCommand &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<BR>[Called By]<UL><LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
 </UL>
-<BR>[Calls]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
-<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+
+<P><STRONG><a name="[de]"></a>HAL_RCC_MCOConfig</STRONG> (Thumb, 64 bytes, Stack size 32 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[77]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_Init
 </UL>
-<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
-<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Sleep
-<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
-<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_WritePicture
-<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_Base
-<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Clear
+
+<P><STRONG><a name="[134]"></a>HAL_RCC_EnableCSS</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
+
+<P><STRONG><a name="[135]"></a>HAL_RCC_DisableCSS</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
+
+<P><STRONG><a name="[136]"></a>HAL_RCC_GetHCLKFreq</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
+
+<P><STRONG><a name="[eb]"></a>HAL_RCC_GetPCLK1Freq</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[e9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
 </UL>
 
-<P><STRONG><a name="[57]"></a>EPD_13IN3B_SendData</STRONG> (Thumb, 46 bytes, Stack size 16 bytes, epd_13in3b.o(i.EPD_13IN3B_SendData))
-<BR><BR>[Stack]<UL><LI>Max Depth = 112<LI>Call Chain = EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[ea]"></a>HAL_RCC_GetPCLK2Freq</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[e9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
 </UL>
-<BR>[Calls]<UL><LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
-<LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+
+<P><STRONG><a name="[137]"></a>HAL_RCC_GetOscConfig</STRONG> (Thumb, 140 bytes, Stack size 8 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
+
+<P><STRONG><a name="[138]"></a>HAL_RCC_GetClockConfig</STRONG> (Thumb, 54 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
+
+<P><STRONG><a name="[e0]"></a>HAL_RCC_CSSCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[df]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_NMI_IRQHandler
 </UL>
-<BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_TurnOnDisplay
-<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Sleep
-<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Init
-<LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_WritePicture
-<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_Base
-<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Clear
+
+<P><STRONG><a name="[df]"></a>HAL_RCC_NMI_IRQHandler</STRONG> (Thumb, 20 bytes, Stack size 8 bytes, stm32f1xx_hal_rcc.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[e0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_CSSCallback
 </UL>
 
-<P><STRONG><a name="[58]"></a>EPD_13IN3B_TurnOnDisplay</STRONG> (Thumb, 28 bytes, Stack size 8 bytes, epd_13in3b.o(i.EPD_13IN3B_TurnOnDisplay))
-<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_13IN3B_TurnOnDisplay &rArr; EPD_13IN3B_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[77]"></a>HAL_GPIO_Init</STRONG> (Thumb, 462 bytes, Stack size 40 bytes, stm32f1xx_hal_gpio.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = HAL_GPIO_Init
+</UL>
+<BR>[Called By]<UL><LI><a href="#[a4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_GPIO_Mode
+<LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
+<LI><a href="#[79]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspInit
+<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
+<LI><a href="#[de]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_MCOConfig
 </UL>
-<BR>[Calls]<UL><LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_ReadBusy
-<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendData
-<LI><a href="#[56]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_SendCommand
+
+<P><STRONG><a name="[7b]"></a>HAL_GPIO_DeInit</STRONG> (Thumb, 256 bytes, Stack size 28 bytes, stm32f1xx_hal_gpio.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspDeInit
+<LI><a href="#[7a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_MspDeInit
 </UL>
-<BR>[Called By]<UL><LI><a href="#[5a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_WritePicture
-<LI><a href="#[59]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Display_Base
-<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_13IN3B_Clear
+
+<P><STRONG><a name="[9b]"></a>HAL_GPIO_ReadPin</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[a8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_ReadData
+<LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_ReadBusy
 </UL>
 
-<P><STRONG><a name="[7d]"></a>SPI_EndRxTxTransaction</STRONG> (Thumb, 32 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(i.SPI_EndRxTxTransaction))
-<BR><BR>[Stack]<UL><LI>Max Depth = 48<LI>Call Chain = SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[76]"></a>HAL_GPIO_WritePin</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[a8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_ReadData
+<LI><a href="#[a7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_SendData
+<LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
+<LI><a href="#[99]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Reset
+<LI><a href="#[81]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Init
+<LI><a href="#[98]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_Module_Exit
+<LI><a href="#[71]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_GPIO_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_WaitFlagStateUntilTimeout
+
+<P><STRONG><a name="[139]"></a>HAL_GPIO_TogglePin</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(.text), UNUSED)
+
+<P><STRONG><a name="[13a]"></a>HAL_GPIO_LockPin</STRONG> (Thumb, 34 bytes, Stack size 8 bytes, stm32f1xx_hal_gpio.o(.text), UNUSED)
+
+<P><STRONG><a name="[e2]"></a>HAL_GPIO_EXTI_Callback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_gpio.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[e1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_EXTI_IRQHandler
 </UL>
-<BR>[Called By]<UL><LI><a href="#[54]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
+
+<P><STRONG><a name="[e1]"></a>HAL_GPIO_EXTI_IRQHandler</STRONG> (Thumb, 20 bytes, Stack size 8 bytes, stm32f1xx_hal_gpio.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[e2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_EXTI_Callback
 </UL>
 
-<P><STRONG><a name="[89]"></a>SPI_WaitFlagStateUntilTimeout</STRONG> (Thumb, 180 bytes, Stack size 32 bytes, stm32f1xx_hal_spi.o(i.SPI_WaitFlagStateUntilTimeout))
-<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = SPI_WaitFlagStateUntilTimeout
+<P><STRONG><a name="[13b]"></a>HAL_DMA_Init</STRONG> (Thumb, 112 bytes, Stack size 12 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+
+<P><STRONG><a name="[13c]"></a>HAL_DMA_DeInit</STRONG> (Thumb, 116 bytes, Stack size 8 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+
+<P><STRONG><a name="[e3]"></a>HAL_DMA_Start</STRONG> (Thumb, 80 bytes, Stack size 16 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DMA_SetConfig
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+
+<P><STRONG><a name="[c8]"></a>HAL_DMA_Start_IT</STRONG> (Thumb, 112 bytes, Stack size 16 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[e4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DMA_SetConfig
 </UL>
-<BR>[Called By]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
+<BR>[Called By]<UL><LI><a href="#[fa]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Receive_DMA
+<LI><a href="#[f7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit_DMA
+<LI><a href="#[cc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive_DMA
+<LI><a href="#[cb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive_DMA
+<LI><a href="#[c7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit_DMA
 </UL>
 
-<P><STRONG><a name="[76]"></a>__NVIC_SetPriority</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(i.__NVIC_SetPriority))
-<BR><BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_Config
-<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriority
+<P><STRONG><a name="[ce]"></a>HAL_DMA_Abort</STRONG> (Thumb, 70 bytes, Stack size 8 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[ff]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceive
+<LI><a href="#[fe]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmit
+<LI><a href="#[fc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Abort
+<LI><a href="#[fb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_DMAStop
+<LI><a href="#[d2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_DMAStop
+<LI><a href="#[cd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Abort
 </UL>
 
-<P><STRONG><a name="[80]"></a>UART_SetConfig</STRONG> (Thumb, 178 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(i.UART_SetConfig))
-<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = UART_SetConfig
+<P><STRONG><a name="[d1]"></a>HAL_DMA_Abort_IT</STRONG> (Thumb, 296 bytes, Stack size 40 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[107]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_IRQHandler
+<LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceive_IT
+<LI><a href="#[103]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmit_IT
+<LI><a href="#[101]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Abort_IT
+<LI><a href="#[d3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_IRQHandler
+<LI><a href="#[d0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Abort_IT
 </UL>
-<BR>[Calls]<UL><LI><a href="#[8c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetPCLK2Freq
-<LI><a href="#[8d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetPCLK1Freq
+
+<P><STRONG><a name="[e5]"></a>HAL_DMA_PollForTransfer</STRONG> (Thumb, 996 bytes, Stack size 56 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
 </UL>
-<BR>[Called By]<UL><LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
+
+<P><STRONG><a name="[13d]"></a>HAL_DMA_IRQHandler</STRONG> (Thumb, 572 bytes, Stack size 40 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+
+<P><STRONG><a name="[13e]"></a>HAL_DMA_RegisterCallback</STRONG> (Thumb, 74 bytes, Stack size 8 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+
+<P><STRONG><a name="[13f]"></a>HAL_DMA_UnRegisterCallback</STRONG> (Thumb, 82 bytes, Stack size 8 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+
+<P><STRONG><a name="[140]"></a>HAL_DMA_GetState</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+
+<P><STRONG><a name="[fd]"></a>HAL_DMA_GetError</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[ff]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceive
+<LI><a href="#[fe]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmit
+<LI><a href="#[fc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Abort
 </UL>
 
-<P><STRONG><a name="[82]"></a>UART_WaitOnFlagUntilTimeout</STRONG> (Thumb, 100 bytes, Stack size 24 bytes, stm32f1xx_hal_uart.o(i.UART_WaitOnFlagUntilTimeout))
-<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = UART_WaitOnFlagUntilTimeout
+<P><STRONG><a name="[d7]"></a>HAL_NVIC_SetPriorityGrouping</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Init
 </UL>
-<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+
+<P><STRONG><a name="[d6]"></a>HAL_NVIC_SetPriority</STRONG> (Thumb, 60 bytes, Stack size 16 bytes, stm32f1xx_hal_cortex.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = HAL_NVIC_SetPriority
+</UL>
+<BR>[Calls]<UL><LI><a href="#[e6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__NVIC_SetPriority
+</UL>
+<BR>[Called By]<UL><LI><a href="#[d4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+</UL>
+
+<P><STRONG><a name="[141]"></a>HAL_NVIC_EnableIRQ</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+
+<P><STRONG><a name="[142]"></a>HAL_NVIC_DisableIRQ</STRONG> (Thumb, 34 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+
+<P><STRONG><a name="[143]"></a>HAL_NVIC_SystemReset</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+
+<P><STRONG><a name="[d5]"></a>HAL_SYSTICK_Config</STRONG> (Thumb, 40 bytes, Stack size 8 bytes, stm32f1xx_hal_cortex.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = HAL_SYSTICK_Config
+</UL>
+<BR>[Calls]<UL><LI><a href="#[e6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__NVIC_SetPriority
+</UL>
+<BR>[Called By]<UL><LI><a href="#[d4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_InitTick
+</UL>
+
+<P><STRONG><a name="[144]"></a>HAL_NVIC_GetPriorityGrouping</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+
+<P><STRONG><a name="[145]"></a>HAL_NVIC_GetPriority</STRONG> (Thumb, 82 bytes, Stack size 16 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+
+<P><STRONG><a name="[146]"></a>HAL_NVIC_SetPendingIRQ</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+
+<P><STRONG><a name="[147]"></a>HAL_NVIC_GetPendingIRQ</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+
+<P><STRONG><a name="[148]"></a>HAL_NVIC_ClearPendingIRQ</STRONG> (Thumb, 26 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+
+<P><STRONG><a name="[149]"></a>HAL_NVIC_GetActive</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+
+<P><STRONG><a name="[14a]"></a>HAL_SYSTICK_CLKSourceConfig</STRONG> (Thumb, 24 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+
+<P><STRONG><a name="[e8]"></a>HAL_SYSTICK_Callback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[e7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_IRQHandler
+</UL>
+
+<P><STRONG><a name="[e7]"></a>HAL_SYSTICK_IRQHandler</STRONG> (Thumb, 8 bytes, Stack size 8 bytes, stm32f1xx_hal_cortex.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[e8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_Callback
+</UL>
+
+<P><STRONG><a name="[7c]"></a>HAL_UART_Init</STRONG> (Thumb, 98 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 88<LI>Call Chain = HAL_UART_Init &rArr; HAL_UART_MspInit &rArr; HAL_GPIO_Init
+</UL>
+<BR>[Calls]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
+<LI><a href="#[e9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+</UL>
+<BR>[Called By]<UL><LI><a href="#[72]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MX_USART1_UART_Init
+</UL>
+
+<P><STRONG><a name="[ec]"></a>HAL_HalfDuplex_Init</STRONG> (Thumb, 108 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
+<LI><a href="#[e9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+</UL>
+
+<P><STRONG><a name="[ed]"></a>HAL_LIN_Init</STRONG> (Thumb, 128 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
+<LI><a href="#[e9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+</UL>
+
+<P><STRONG><a name="[ee]"></a>HAL_MultiProcessor_Init</STRONG> (Thumb, 142 bytes, Stack size 24 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[7d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspInit
+<LI><a href="#[e9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_SetConfig
+</UL>
+
+<P><STRONG><a name="[ef]"></a>HAL_UART_DeInit</STRONG> (Thumb, 50 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[7e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_MspDeInit
+</UL>
+
+<P><STRONG><a name="[7f]"></a>HAL_UART_Transmit</STRONG> (Thumb, 176 bytes, Stack size 32 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 56<LI>Call Chain = HAL_UART_Transmit &rArr; UART_WaitOnFlagUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[f0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_WaitOnFlagUntilTimeout
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+</UL>
+<BR>[Called By]<UL><LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fputc
+</UL>
+
+<P><STRONG><a name="[f1]"></a>HAL_UART_Receive</STRONG> (Thumb, 198 bytes, Stack size 40 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[f0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_WaitOnFlagUntilTimeout
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+</UL>
+
+<P><STRONG><a name="[14b]"></a>HAL_UART_Transmit_IT</STRONG> (Thumb, 62 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[14c]"></a>HAL_UART_Receive_IT</STRONG> (Thumb, 82 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[f4]"></a>HAL_UART_ErrorCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[107]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_IRQHandler
+<LI><a href="#[66]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMAAbortOnError
+<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMAError
+</UL>
+
+<P><STRONG><a name="[f5]"></a>HAL_UART_TxHalfCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMATxHalfCplt
+</UL>
+
+<P><STRONG><a name="[f6]"></a>HAL_UART_TxCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[107]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_IRQHandler
+<LI><a href="#[5d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMATransmitCplt
+</UL>
+
+<P><STRONG><a name="[f7]"></a>HAL_UART_Transmit_DMA</STRONG> (Thumb, 114 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[c8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
+</UL>
+
+<P><STRONG><a name="[f8]"></a>HAL_UART_RxHalfCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[61]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMARxHalfCplt
+</UL>
+
+<P><STRONG><a name="[f9]"></a>HAL_UART_RxCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[106]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_Receive_IT
+<LI><a href="#[60]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMAReceiveCplt
+</UL>
+
+<P><STRONG><a name="[fa]"></a>HAL_UART_Receive_DMA</STRONG> (Thumb, 138 bytes, Stack size 24 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[c8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
+</UL>
+
+<P><STRONG><a name="[14d]"></a>HAL_UART_DMAPause</STRONG> (Thumb, 102 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[14e]"></a>HAL_UART_DMAResume</STRONG> (Thumb, 94 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[fb]"></a>HAL_UART_DMAStop</STRONG> (Thumb, 88 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[f2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_EndTxTransfer
+<LI><a href="#[f3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_EndRxTransfer
+<LI><a href="#[ce]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
+</UL>
+
+<P><STRONG><a name="[fc]"></a>HAL_UART_Abort</STRONG> (Thumb, 138 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[fd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_GetError
+<LI><a href="#[ce]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
+</UL>
+
+<P><STRONG><a name="[fe]"></a>HAL_UART_AbortTransmit</STRONG> (Thumb, 78 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[fd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_GetError
+<LI><a href="#[ce]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
+</UL>
+
+<P><STRONG><a name="[ff]"></a>HAL_UART_AbortReceive</STRONG> (Thumb, 88 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[fd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_GetError
+<LI><a href="#[ce]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort
+</UL>
+
+<P><STRONG><a name="[100]"></a>HAL_UART_AbortCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[101]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Abort_IT
+<LI><a href="#[62]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMATxAbortCallback
+<LI><a href="#[63]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMARxAbortCallback
+</UL>
+
+<P><STRONG><a name="[101]"></a>HAL_UART_Abort_IT</STRONG> (Thumb, 188 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[100]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortCpltCallback
+<LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+</UL>
+
+<P><STRONG><a name="[102]"></a>HAL_UART_AbortTransmitCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[103]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmit_IT
+<LI><a href="#[64]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMATxOnlyAbortCallback
+</UL>
+
+<P><STRONG><a name="[103]"></a>HAL_UART_AbortTransmit_IT</STRONG> (Thumb, 78 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[102]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmitCpltCallback
+<LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+</UL>
+
+<P><STRONG><a name="[104]"></a>HAL_UART_AbortReceiveCpltCallback</STRONG> (Thumb, 2 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[105]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceive_IT
+<LI><a href="#[65]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMARxOnlyAbortCallback
+</UL>
+
+<P><STRONG><a name="[105]"></a>HAL_UART_AbortReceive_IT</STRONG> (Thumb, 88 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[104]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceiveCpltCallback
+<LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+</UL>
+
+<P><STRONG><a name="[107]"></a>HAL_UART_IRQHandler</STRONG> (Thumb, 342 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[f6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_TxCpltCallback
+<LI><a href="#[f4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_ErrorCallback
+<LI><a href="#[f3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_EndRxTransfer
+<LI><a href="#[106]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_Receive_IT
+<LI><a href="#[d1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Abort_IT
+</UL>
+
+<P><STRONG><a name="[14f]"></a>HAL_LIN_SendBreak</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[150]"></a>HAL_MultiProcessor_EnterMuteMode</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[151]"></a>HAL_MultiProcessor_ExitMuteMode</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[152]"></a>HAL_HalfDuplex_EnableTransmitter</STRONG> (Thumb, 66 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[153]"></a>HAL_HalfDuplex_EnableReceiver</STRONG> (Thumb, 50 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[154]"></a>HAL_UART_GetState</STRONG> (Thumb, 10 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[155]"></a>HAL_UART_GetError</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+
+<P><STRONG><a name="[111]"></a>__aeabi_llsr</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, llushr.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[af]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2iz
+<LI><a href="#[10e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
+</UL>
+
+<P><STRONG><a name="[156]"></a>_ll_ushift_r</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, llushr.o(.text), UNUSED)
+
+<P><STRONG><a name="[109]"></a>__aeabi_memset</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[10a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_memset$wrapper
+<LI><a href="#[108]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memclr
+</UL>
+
+<P><STRONG><a name="[157]"></a>__aeabi_memset4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
+
+<P><STRONG><a name="[158]"></a>__aeabi_memset8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
+
+<P><STRONG><a name="[108]"></a>__aeabi_memclr</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[109]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
+</UL>
+
+<P><STRONG><a name="[6d]"></a>__aeabi_memclr4</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+<LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
+<LI><a href="#[6c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SystemClock_Config
+</UL>
+
+<P><STRONG><a name="[159]"></a>__aeabi_memclr8</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED)
+
+<P><STRONG><a name="[10a]"></a>_memset$wrapper</STRONG> (Thumb, 18 bytes, Stack size 8 bytes, memseta.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[109]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_memset
+</UL>
+
+<P><STRONG><a name="[b3]"></a>__aeabi_fmul</STRONG> (Thumb, 100 bytes, Stack size 8 bytes, fmul.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+</UL>
+
+<P><STRONG><a name="[10b]"></a>__aeabi_dadd</STRONG> (Thumb, 322 bytes, Stack size 48 bytes, dadd.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[10d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_lasr
+<LI><a href="#[10c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsl
+<LI><a href="#[10f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_round
+<LI><a href="#[10e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
+</UL>
+<BR>[Called By]<UL><LI><a href="#[b1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_drsub
+<LI><a href="#[110]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dsub
+</UL>
+
+<P><STRONG><a name="[110]"></a>__aeabi_dsub</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, dadd.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[10b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+</UL>
+
+<P><STRONG><a name="[b1]"></a>__aeabi_drsub</STRONG> (Thumb, 6 bytes, Stack size 0 bytes, dadd.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[10b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+</UL>
+<BR>[Called By]<UL><LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+</UL>
+
+<P><STRONG><a name="[b0]"></a>__aeabi_i2d</STRONG> (Thumb, 34 bytes, Stack size 16 bytes, dflti.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[10e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
+</UL>
+<BR>[Called By]<UL><LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+</UL>
+
+<P><STRONG><a name="[b4]"></a>__aeabi_f2iz</STRONG> (Thumb, 50 bytes, Stack size 0 bytes, ffixi.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+</UL>
+
+<P><STRONG><a name="[af]"></a>__aeabi_d2iz</STRONG> (Thumb, 62 bytes, Stack size 16 bytes, dfixi.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[111]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsr
+</UL>
+<BR>[Called By]<UL><LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+</UL>
+
+<P><STRONG><a name="[b2]"></a>__aeabi_d2f</STRONG> (Thumb, 56 bytes, Stack size 8 bytes, d2f.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[112]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_float_round
+</UL>
+<BR>[Called By]<UL><LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+</UL>
+
+<P><STRONG><a name="[15a]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
+
+<P><STRONG><a name="[116]"></a>__aeabi_uidivmod</STRONG> (Thumb, 44 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[115]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
+</UL>
+
+<P><STRONG><a name="[10c]"></a>__aeabi_llsl</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, llshl.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[10e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
+<LI><a href="#[10b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+</UL>
+
+<P><STRONG><a name="[15b]"></a>_ll_shift_l</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, llshl.o(.text), UNUSED)
+
+<P><STRONG><a name="[10d]"></a>__aeabi_lasr</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, llsshr.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[10b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+</UL>
+
+<P><STRONG><a name="[15c]"></a>_ll_sshift_r</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, llsshr.o(.text), UNUSED)
+
+<P><STRONG><a name="[15d]"></a>__I$use$fp</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, iusefp.o(.text), UNUSED)
+
+<P><STRONG><a name="[112]"></a>_float_round</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, fepilogue.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[b2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_d2f
+</UL>
+
+<P><STRONG><a name="[15e]"></a>_float_epilogue</STRONG> (Thumb, 92 bytes, Stack size 4 bytes, fepilogue.o(.text), UNUSED)
+
+<P><STRONG><a name="[10f]"></a>_double_round</STRONG> (Thumb, 30 bytes, Stack size 8 bytes, depilogue.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[10e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_epilogue
+<LI><a href="#[10b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+</UL>
+
+<P><STRONG><a name="[10e]"></a>_double_epilogue</STRONG> (Thumb, 156 bytes, Stack size 32 bytes, depilogue.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[111]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsr
+<LI><a href="#[10c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_llsl
+<LI><a href="#[10f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_double_round
+</UL>
+<BR>[Called By]<UL><LI><a href="#[b0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_i2d
+<LI><a href="#[10b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_dadd
+</UL>
+
+<P><STRONG><a name="[69]"></a>__scatterload</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, init.o(.text))
+<BR><BR>[Calls]<UL><LI><a href="#[113]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__main_after_scatterload
+</UL>
+<BR>[Called By]<UL><LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_main_scatterload
+</UL>
+
+<P><STRONG><a name="[15f]"></a>__scatterload_rt2</STRONG> (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED)
+
+<P><STRONG><a name="[160]"></a>__decompress</STRONG> (Thumb, 0 bytes, Stack size unknown bytes, __dczerorl2.o(.text), UNUSED)
+
+<P><STRONG><a name="[161]"></a>__decompress1</STRONG> (Thumb, 86 bytes, Stack size unknown bytes, __dczerorl2.o(.text), UNUSED)
+
+<P><STRONG><a name="[114]"></a>__0printf$3</STRONG> (Thumb, 22 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[115]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
+</UL>
+
+<P><STRONG><a name="[162]"></a>__1printf$3</STRONG> (Thumb, 0 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3), UNUSED)
+
+<P><STRONG><a name="[6b]"></a>__2printf</STRONG> (Thumb, 0 bytes, Stack size 24 bytes, printf3.o(i.__0printf$3))
+<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = __2printf
+</UL>
+<BR>[Called By]<UL><LI><a href="#[ae]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNumDecimals
+<LI><a href="#[ad]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawChar
+<LI><a href="#[ac]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetPixel
+<LI><a href="#[ab]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetMirroring
+<LI><a href="#[aa]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetScale
+<LI><a href="#[a9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_SetRotate
+<LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_ReadBusy
+<LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawString_EN
+<LI><a href="#[8c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawRectangle
+<LI><a href="#[8a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawPoint
+<LI><a href="#[8f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawNum
+<LI><a href="#[8b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawLine
+<LI><a href="#[8d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Paint_DrawCircle
+<LI><a href="#[2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HardFault_Handler
+<LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Error_Handler
+</UL>
+
+<P><STRONG><a name="[163]"></a>__scatterload_copy</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED)
+
+<P><STRONG><a name="[164]"></a>__scatterload_null</STRONG> (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED)
+
+<P><STRONG><a name="[165]"></a>__scatterload_zeroinit</STRONG> (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED)
+
+<P><STRONG><a name="[97]"></a>free</STRONG> (Thumb, 76 bytes, Stack size 8 bytes, malloc.o(i.free))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = free
+</UL>
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+</UL>
+
+<P><STRONG><a name="[84]"></a>malloc</STRONG> (Thumb, 92 bytes, Stack size 20 bytes, malloc.o(i.malloc))
+<BR><BR>[Stack]<UL><LI>Max Depth = 20<LI>Call Chain = malloc
+</UL>
+<BR>[Called By]<UL><LI><a href="#[74]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_test
+</UL>
+<P>
+<H3>
+Local Symbols
+</H3>
+<P><STRONG><a name="[99]"></a>EPD_1IN54_V2_Reset</STRONG> (Thumb, 56 bytes, Stack size 8 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = EPD_1IN54_V2_Reset &rArr; HAL_Delay
+</UL>
+<BR>[Calls]<UL><LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+</UL>
+<BR>[Called By]<UL><LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init_Partial
+<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init
+</UL>
+
+<P><STRONG><a name="[9a]"></a>EPD_1IN54_V2_ReadBusy</STRONG> (Thumb, 40 bytes, Stack size 8 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = EPD_1IN54_V2_ReadBusy &rArr; __2printf
+</UL>
+<BR>[Calls]<UL><LI><a href="#[9b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_ReadPin
+<LI><a href="#[75]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_Delay
+<LI><a href="#[6b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
+</UL>
+<BR>[Called By]<UL><LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_TurnOnDisplayPart
+<LI><a href="#[9f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_TurnOnDisplay
+<LI><a href="#[9c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SetLut
+<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init_Partial
+<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init
+</UL>
+
+<P><STRONG><a name="[9c]"></a>EPD_1IN54_V2_SetLut</STRONG> (Thumb, 96 bytes, Stack size 16 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 128<LI>Call Chain = EPD_1IN54_V2_SetLut &rArr; EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
+<LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_ReadBusy
+</UL>
+<BR>[Called By]<UL><LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init_Partial
+<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init
+</UL>
+
+<P><STRONG><a name="[9d]"></a>EPD_1IN54_V2_SendCommand</STRONG> (Thumb, 46 bytes, Stack size 16 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 112<LI>Call Chain = EPD_1IN54_V2_SendCommand &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[a1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
+<LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+</UL>
+<BR>[Called By]<UL><LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_TurnOnDisplayPart
+<LI><a href="#[9f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_TurnOnDisplay
+<LI><a href="#[9c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SetLut
+<LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Sleep
+<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init_Partial
+<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init
+<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_DisplayPartBaseImage
+<LI><a href="#[95]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_DisplayPart
+<LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Display
+<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Clear
+</UL>
+
+<P><STRONG><a name="[9e]"></a>EPD_1IN54_V2_SendData</STRONG> (Thumb, 46 bytes, Stack size 16 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 112<LI>Call Chain = EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[a1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;DEV_SPI_WriteByte
+<LI><a href="#[76]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GPIO_WritePin
+</UL>
+<BR>[Called By]<UL><LI><a href="#[a0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_TurnOnDisplayPart
+<LI><a href="#[9f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_TurnOnDisplay
+<LI><a href="#[9c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SetLut
+<LI><a href="#[96]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Sleep
+<LI><a href="#[92]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init_Partial
+<LI><a href="#[82]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Init
+<LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_DisplayPartBaseImage
+<LI><a href="#[95]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_DisplayPart
+<LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Display
+<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Clear
+</UL>
+
+<P><STRONG><a name="[9f]"></a>EPD_1IN54_V2_TurnOnDisplay</STRONG> (Thumb, 26 bytes, Stack size 8 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_1IN54_V2_TurnOnDisplay &rArr; EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
+<LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_ReadBusy
+</UL>
+<BR>[Called By]<UL><LI><a href="#[89]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Display
+<LI><a href="#[83]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_Clear
+</UL>
+
+<P><STRONG><a name="[a0]"></a>EPD_1IN54_V2_TurnOnDisplayPart</STRONG> (Thumb, 26 bytes, Stack size 8 bytes, epd_1in54_v2.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 120<LI>Call Chain = EPD_1IN54_V2_TurnOnDisplayPart &rArr; EPD_1IN54_V2_SendData &rArr; DEV_SPI_WriteByte &rArr; HAL_SPI_Transmit &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[9e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendData
+<LI><a href="#[9d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_SendCommand
+<LI><a href="#[9a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_ReadBusy
+</UL>
+<BR>[Called By]<UL><LI><a href="#[91]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_DisplayPartBaseImage
+<LI><a href="#[95]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EPD_1IN54_V2_DisplayPart
+</UL>
+
+<P><STRONG><a name="[b7]"></a>SPI_WaitFlagStateUntilTimeout</STRONG> (Thumb, 180 bytes, Stack size 32 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+</UL>
+<BR>[Called By]<UL><LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
+<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTransaction
+</UL>
+
+<P><STRONG><a name="[ba]"></a>SPI_EndRxTransaction</STRONG> (Thumb, 92 bytes, Stack size 24 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 56<LI>Call Chain = SPI_EndRxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[b7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Called By]<UL><LI><a href="#[bc]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Receive
+<LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMAReceiveCplt
+<LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
+</UL>
+
+<P><STRONG><a name="[bd]"></a>SPI_CloseTx_ISR</STRONG> (Thumb, 120 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_CloseTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
+<LI><a href="#[bf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxCpltCallback
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
+</UL>
+<BR>[Called By]<UL><LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_TxISR_16BIT
+<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_TxISR_8BIT
+</UL>
+
+<P><STRONG><a name="[4a]"></a>SPI_TxISR_8BIT</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_TxISR_8BIT &rArr; SPI_CloseTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[bd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[49]"></a>SPI_TxISR_16BIT</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_TxISR_16BIT &rArr; SPI_CloseTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[bd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[c0]"></a>SPI_CloseRx_ISR</STRONG> (Thumb, 76 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = SPI_CloseRx_ISR &rArr; SPI_EndRxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_RxCpltCallback
+<LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTransaction
+</UL>
+<BR>[Called By]<UL><LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_RxISR_16BIT
+<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_RxISR_8BIT
+</UL>
+
+<P><STRONG><a name="[50]"></a>SPI_RxISR_8BIT</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = SPI_RxISR_8BIT &rArr; SPI_CloseRx_ISR &rArr; SPI_EndRxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[4f]"></a>SPI_RxISR_16BIT</STRONG> (Thumb, 30 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = SPI_RxISR_16BIT &rArr; SPI_CloseRx_ISR &rArr; SPI_EndRxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c0]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRx_ISR
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[c2]"></a>SPI_CloseRxTx_ISR</STRONG> (Thumb, 140 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_CloseRxTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxRxCpltCallback
+<LI><a href="#[c1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_RxCpltCallback
+<LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
+</UL>
+<BR>[Called By]<UL><LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_2linesRxISR_16BIT
+<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_2linesTxISR_16BIT
+<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_2linesRxISR_8BIT
+<LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_2linesTxISR_8BIT
+</UL>
+
+<P><STRONG><a name="[4e]"></a>SPI_2linesTxISR_8BIT</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_2linesTxISR_8BIT &rArr; SPI_CloseRxTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[4d]"></a>SPI_2linesRxISR_8BIT</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_2linesRxISR_8BIT &rArr; SPI_CloseRxTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[4c]"></a>SPI_2linesTxISR_16BIT</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_2linesTxISR_16BIT &rArr; SPI_CloseRxTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[4b]"></a>SPI_2linesRxISR_16BIT</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_2linesRxISR_16BIT &rArr; SPI_CloseRxTx_ISR &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[53]"></a>SPI_DMAError</STRONG> (Thumb, 34 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMAError
+</UL>
+<BR>[Calls]<UL><LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[52]"></a>SPI_DMATransmitCplt</STRONG> (Thumb, 100 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_DMATransmitCplt &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
 </UL>
-<BR>[Called By]<UL><LI><a href="#[81]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
+<BR>[Calls]<UL><LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
+<LI><a href="#[bf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxCpltCallback
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[51]"></a>SPI_DMAHalfTransmitCplt</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMAHalfTransmitCplt
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxHalfCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[57]"></a>SPI_DMAReceiveCplt</STRONG> (Thumb, 106 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 72<LI>Call Chain = SPI_DMAReceiveCplt &rArr; SPI_EndRxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_RxCpltCallback
+<LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[ba]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTransaction
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[56]"></a>SPI_DMAHalfReceiveCplt</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMAHalfReceiveCplt
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_RxHalfCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[55]"></a>SPI_DMATransmitReceiveCplt</STRONG> (Thumb, 90 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_DMATransmitReceiveCplt &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[c3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxRxCpltCallback
+<LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[54]"></a>SPI_DMAHalfTransmitReceiveCplt</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMAHalfTransmitReceiveCplt
+</UL>
+<BR>[Calls]<UL><LI><a href="#[ca]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TxRxHalfCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[59]"></a>SPI_AbortRx_ISR</STRONG> (Thumb, 76 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_AbortRx_ISR
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[58]"></a>SPI_AbortTx_ISR</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f1xx_hal_spi.o(.text))
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[5b]"></a>SPI_DMARxAbortCallback</STRONG> (Thumb, 98 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = SPI_DMARxAbortCallback &rArr; SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[cf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_AbortCpltCallback
+<LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+<LI><a href="#[b9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_EndRxTxTransaction
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[5a]"></a>SPI_DMATxAbortCallback</STRONG> (Thumb, 106 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMATxAbortCallback
+</UL>
+<BR>[Calls]<UL><LI><a href="#[cf]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_AbortCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[5c]"></a>SPI_DMAAbortOnError</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = SPI_DMAAbortOnError
+</UL>
+<BR>[Calls]<UL><LI><a href="#[be]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_ErrorCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_spi.o(.text)
+</UL>
+<P><STRONG><a name="[b9]"></a>SPI_EndRxTxTransaction</STRONG> (Thumb, 32 bytes, Stack size 16 bytes, stm32f1xx_hal_spi.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 48<LI>Call Chain = SPI_EndRxTxTransaction &rArr; SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[b7]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_WaitFlagStateUntilTimeout
+</UL>
+<BR>[Called By]<UL><LI><a href="#[a2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_Transmit
+<LI><a href="#[bb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SPI_TransmitReceive
+<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMARxAbortCallback
+<LI><a href="#[55]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitReceiveCplt
+<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_DMATransmitCplt
+<LI><a href="#[c2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseRxTx_ISR
+<LI><a href="#[bd]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;SPI_CloseTx_ISR
+</UL>
+
+<P><STRONG><a name="[e4]"></a>DMA_SetConfig</STRONG> (Thumb, 42 bytes, Stack size 12 bytes, stm32f1xx_hal_dma.o(.text), UNUSED)
+<BR><BR>[Called By]<UL><LI><a href="#[e3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start
+<LI><a href="#[c8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_DMA_Start_IT
+</UL>
+
+<P><STRONG><a name="[e6]"></a>__NVIC_SetPriority</STRONG> (Thumb, 32 bytes, Stack size 0 bytes, stm32f1xx_hal_cortex.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[d5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_SYSTICK_Config
+<LI><a href="#[d6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_NVIC_SetPriority
+</UL>
+
+<P><STRONG><a name="[e9]"></a>UART_SetConfig</STRONG> (Thumb, 178 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = UART_SetConfig
+</UL>
+<BR>[Calls]<UL><LI><a href="#[ea]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetPCLK2Freq
+<LI><a href="#[eb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_RCC_GetPCLK1Freq
+</UL>
+<BR>[Called By]<UL><LI><a href="#[7c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Init
+<LI><a href="#[ee]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_MultiProcessor_Init
+<LI><a href="#[ed]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_LIN_Init
+<LI><a href="#[ec]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_HalfDuplex_Init
+</UL>
+
+<P><STRONG><a name="[f0]"></a>UART_WaitOnFlagUntilTimeout</STRONG> (Thumb, 98 bytes, Stack size 24 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = UART_WaitOnFlagUntilTimeout
+</UL>
+<BR>[Calls]<UL><LI><a href="#[b8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_GetTick
+</UL>
+<BR>[Called By]<UL><LI><a href="#[7f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Transmit
+<LI><a href="#[f1]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_Receive
+</UL>
+
+<P><STRONG><a name="[5f]"></a>UART_DMAError</STRONG> (Thumb, 74 bytes, Stack size 16 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 16<LI>Call Chain = UART_DMAError
+</UL>
+<BR>[Calls]<UL><LI><a href="#[f4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_ErrorCallback
+<LI><a href="#[f2]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_EndTxTransfer
+<LI><a href="#[f3]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_EndRxTransfer
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+</UL>
+<P><STRONG><a name="[5e]"></a>UART_DMATxHalfCplt</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMATxHalfCplt
+</UL>
+<BR>[Calls]<UL><LI><a href="#[f5]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_TxHalfCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+</UL>
+<P><STRONG><a name="[5d]"></a>UART_DMATransmitCplt</STRONG> (Thumb, 46 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMATransmitCplt
+</UL>
+<BR>[Calls]<UL><LI><a href="#[f6]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_TxCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+</UL>
+<P><STRONG><a name="[61]"></a>UART_DMARxHalfCplt</STRONG> (Thumb, 10 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMARxHalfCplt
+</UL>
+<BR>[Calls]<UL><LI><a href="#[f8]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_RxHalfCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+</UL>
+<P><STRONG><a name="[60]"></a>UART_DMAReceiveCplt</STRONG> (Thumb, 60 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMAReceiveCplt
+</UL>
+<BR>[Calls]<UL><LI><a href="#[f9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_RxCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+</UL>
+<P><STRONG><a name="[63]"></a>UART_DMARxAbortCallback</STRONG> (Thumb, 42 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMARxAbortCallback
+</UL>
+<BR>[Calls]<UL><LI><a href="#[100]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+</UL>
+<P><STRONG><a name="[62]"></a>UART_DMATxAbortCallback</STRONG> (Thumb, 42 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMATxAbortCallback
+</UL>
+<BR>[Calls]<UL><LI><a href="#[100]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+</UL>
+<P><STRONG><a name="[64]"></a>UART_DMATxOnlyAbortCallback</STRONG> (Thumb, 20 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMATxOnlyAbortCallback
+</UL>
+<BR>[Calls]<UL><LI><a href="#[102]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortTransmitCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+</UL>
+<P><STRONG><a name="[65]"></a>UART_DMARxOnlyAbortCallback</STRONG> (Thumb, 20 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMARxOnlyAbortCallback
+</UL>
+<BR>[Calls]<UL><LI><a href="#[104]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_AbortReceiveCpltCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+</UL>
+<P><STRONG><a name="[66]"></a>UART_DMAAbortOnError</STRONG> (Thumb, 16 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = UART_DMAAbortOnError
+</UL>
+<BR>[Calls]<UL><LI><a href="#[f4]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_ErrorCallback
+</UL>
+<BR>[Address Reference Count : 1]<UL><LI> stm32f1xx_hal_uart.o(.text)
+</UL>
+<P><STRONG><a name="[106]"></a>UART_Receive_IT</STRONG> (Thumb, 140 bytes, Stack size 8 bytes, stm32f1xx_hal_uart.o(.text), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[f9]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_RxCpltCallback
+</UL>
+<BR>[Called By]<UL><LI><a href="#[107]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_IRQHandler
+</UL>
+
+<P><STRONG><a name="[f3]"></a>UART_EndRxTransfer</STRONG> (Thumb, 28 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[107]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_IRQHandler
+<LI><a href="#[fb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_DMAStop
+<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMAError
+</UL>
+
+<P><STRONG><a name="[f2]"></a>UART_EndTxTransfer</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, stm32f1xx_hal_uart.o(.text))
+<BR><BR>[Called By]<UL><LI><a href="#[fb]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;HAL_UART_DMAStop
+<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_DMAError
 </UL>
 
-<P><STRONG><a name="[8f]"></a>_printf_core</STRONG> (Thumb, 436 bytes, Stack size 96 bytes, printf3.o(i._printf_core), UNUSED)
-<BR><BR>[Calls]<UL><LI><a href="#[90]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
+<P><STRONG><a name="[115]"></a>_printf_core</STRONG> (Thumb, 436 bytes, Stack size 96 bytes, printf3.o(i._printf_core), UNUSED)
+<BR><BR>[Calls]<UL><LI><a href="#[116]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
 </UL>
-<BR>[Called By]<UL><LI><a href="#[8e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0printf$3
+<BR>[Called By]<UL><LI><a href="#[114]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0printf$3
 </UL>
 <P>
 <H3>

File diff suppressed because it is too large
+ 188 - 675
STM32/STM32-F103ZET6/MDK-ARM/epd-demo/epd-demo.map


+ 5 - 5
STM32/STM32-F103ZET6/MDK-ARM/startup_stm32f103xe.lst

@@ -580,17 +580,17 @@ ARM Macro Assembler    Page 9
               00000000 
 Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
 ork --depend=epd-demo\startup_stm32f103xe.d -oepd-demo\startup_stm32f103xe.o -I
-.\RTE\_EPD_13in3b_test -ID:\KEIL\azwz\ARM\PACK\ARM\CMSIS\5.9.0\CMSIS\Core\Inclu
-de -ID:\KEIL\azwz\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include --predefine=
-"__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 526" --predefine="_RTE_
+.\RTE\_EPD_1in54_V2_test -ID:\KEIL\azwz\ARM\PACK\ARM\CMSIS\5.9.0\CMSIS\Core\Inc
+lude -ID:\KEIL\azwz\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include --predefin
+e="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 526" --predefine="_RT
 
 
 
 ARM Macro Assembler    Page 10 
 
 
- SETA 1" --predefine="STM32F10X_HD SETA 1" --list=startup_stm32f103xe.lst start
-up_stm32f103xe.s
+E_ SETA 1" --predefine="STM32F10X_HD SETA 1" --list=startup_stm32f103xe.lst sta
+rtup_stm32f103xe.s
 
 
 

+ 87 - 1
STM32/STM32-F103ZET6/User/Config/DEV_Config.c

@@ -43,13 +43,99 @@ void DEV_SPI_Write_nByte(UBYTE *value, UDOUBLE len)
     HAL_SPI_Transmit(&hspi1, value, len, 1000);
 }
 
+void DEV_GPIO_Mode(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, UWORD Mode)
+{
+    
+    GPIO_InitTypeDef GPIO_InitStruct = {0};
+    if(Mode == 0) {
+        GPIO_InitStruct.Pin = GPIO_Pin;
+        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+        GPIO_InitStruct.Pull = GPIO_PULLUP;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+	} else {
+		GPIO_InitStruct.Pin = GPIO_Pin;
+        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+		// Debug (" %d OUT \r\n",Pin);
+	}
+}
+
+void DEV_GPIO_Init()
+{
+    HAL_SPI_MspDeInit(&hspi1);
+    
+    //HAL_SPI_DeInit(&hspi1); 
+//    __HAL_RCC_SPI1_CLK_DISABLE();
+//    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_7);
+}
+
+void DEV_SPI_Init()
+{
+    HAL_SPI_MspInit(&hspi1);
+    //HAL_SPI_DeInit(&hspi1); 
+//    __HAL_RCC_SPI1_CLK_DISABLE();
+//    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_7);
+}
+
+
+void DEV_SPI_SendData(UBYTE Reg)
+{
+	UBYTE i,j=Reg;
+	DEV_GPIO_Mode(EPD_MOSI_PIN, 1);
+    DEV_GPIO_Mode(EPD_SCLK_PIN, 1);
+	DEV_Digital_Write(EPD_CS_PIN, 0);
+	for(i = 0; i<8; i++)
+    {
+        DEV_Digital_Write(EPD_SCLK_PIN, 0);     
+        if (j & 0x80)
+        {
+            DEV_Digital_Write(EPD_MOSI_PIN, 1);
+        }
+        else
+        {
+            DEV_Digital_Write(EPD_MOSI_PIN, 0);
+        }
+        
+        DEV_Digital_Write(EPD_SCLK_PIN, 1);
+        j = j << 1;
+    }
+	DEV_Digital_Write(EPD_SCLK_PIN, 0);
+	DEV_Digital_Write(EPD_CS_PIN, 1);
+}
+
+UBYTE DEV_SPI_ReadData()
+{
+	UBYTE i,j=0xff;
+	DEV_GPIO_Mode(EPD_MOSI_PIN, 0);
+    DEV_GPIO_Mode(EPD_SCLK_PIN, 1);
+	DEV_Digital_Write(EPD_CS_PIN, 0);
+	for(i = 0; i<8; i++)
+	{
+		DEV_Digital_Write(EPD_SCLK_PIN, 0);
+		j = j << 1;
+		if (DEV_Digital_Read(EPD_MOSI_PIN))
+		{
+            j = j | 0x01;
+		}
+		else
+		{
+            j= j & 0xfe;
+		}
+		DEV_Digital_Write(EPD_SCLK_PIN, 1);
+	}
+	DEV_Digital_Write(EPD_SCLK_PIN, 0);
+	DEV_Digital_Write(EPD_CS_PIN, 1);
+	return j;
+}
+
 int DEV_Module_Init(void)
 {
     DEV_Digital_Write(EPD_DC_PIN, 0);
     DEV_Digital_Write(EPD_CS_PIN, 0);
 	DEV_Digital_Write(EPD_PWR_PIN, 1);
     DEV_Digital_Write(EPD_RST_PIN, 1);
-		return 0;
+    return 0;
 }
 
 void DEV_Module_Exit(void)

+ 6 - 0
STM32/STM32-F103ZET6/User/Config/DEV_Config.h

@@ -69,6 +69,8 @@
 #define EPD_PWR_PIN     PWR_GPIO_Port, PWR_Pin
 #define EPD_CS_PIN      SPI_CS_GPIO_Port, SPI_CS_Pin
 #define EPD_BUSY_PIN    BUSY_GPIO_Port, BUSY_Pin
+#define EPD_MOSI_PIN    DIN_GPIO_Port, DIN_Pin
+#define EPD_SCLK_PIN    SCK_GPIO_Port, SCK_Pin
 
 /**
  * GPIO read and write
@@ -86,4 +88,8 @@ void DEV_SPI_Write_nByte(UBYTE *value, UDOUBLE len);
 
 int DEV_Module_Init(void);
 void DEV_Module_Exit(void);
+void DEV_GPIO_Init(void);
+void DEV_SPI_Init(void);
+void DEV_SPI_SendData(UBYTE Reg);
+UBYTE DEV_SPI_ReadData(void);
 #endif

+ 2 - 2
STM32/STM32-F103ZET6/User/Examples/EPD_1in54_V2_test.c

@@ -86,8 +86,8 @@ int EPD_test(void)
     Paint_DrawString_EN(5, 85, "waveshare", &Font20, BLACK, WHITE);
     Paint_DrawNum(5, 110, 123456789, &Font20, BLACK, WHITE);
 
-    Paint_DrawString_CN(5, 135,"���abc", &Font12CN, BLACK, WHITE);
-    Paint_DrawString_CN(5, 155, "΢ѩ����", &Font24CN, WHITE, BLACK);
+    Paint_DrawString_CN(5, 135,"ÄãºÃabc", &Font12CN, BLACK, WHITE);
+    Paint_DrawString_CN(5, 155, "΢ѩµç×Ó", &Font24CN, WHITE, BLACK);
 
     EPD_1IN54_V2_Display(BlackImage);
     DEV_Delay_ms(2000);

+ 210 - 28
STM32/STM32-F103ZET6/User/e-Paper/EPD_4in2b_V2.c

@@ -31,6 +31,8 @@
 #include "EPD_4in2b_V2.h"
 #include "Debug.h"
 
+static uint8_t flag=0;
+
 /******************************************************************************
 function :	Software reset
 parameter:
@@ -75,50 +77,145 @@ static void EPD_4IN2B_V2_SendData(UBYTE Data)
 function :	Wait until the busy_pin goes LOW
 parameter:
 ******************************************************************************/
-void EPD_4IN2B_V2_ReadBusy(void)
+void EPD_4IN2B_V2_ReadBusy_old(void)
 {
     Debug("e-Paper busy\r\n");
-    unsigned char busy;
-    do{
-        EPD_4IN2B_V2_SendCommand(0x71);
-		busy = DEV_Digital_Read(EPD_BUSY_PIN);
-		busy =!(busy & 0x01); 
-    }while(busy);
+	do{
+		EPD_4IN2B_V2_SendCommand(0x71);
+		DEV_Delay_ms(20);
+	}while(!(DEV_Digital_Read(EPD_BUSY_PIN)));      //0: busy, 1: idle
+    DEV_Delay_ms(20);
+	Debug("e-Paper busy release\r\n");
+}
+
+void EPD_4IN2B_V2_ReadBusy_new(void)
+{
+    Debug("e-Paper busy\r\n");
+    while(DEV_Digital_Read(EPD_BUSY_PIN) == 1) {      //LOW: idle, HIGH: busy
+        DEV_Delay_ms(10);
+    }
     Debug("e-Paper busy release\r\n");
-    DEV_Delay_ms(200);
+}
+
+void EPD_4IN2B_V2_ReadBusy(void)
+{
+    if(flag == 0)
+        EPD_4IN2B_V2_ReadBusy_new();
+    else
+        EPD_4IN2B_V2_ReadBusy_old();
 }
 
 /******************************************************************************
-function :	Turn On Display
+function :	Setting the display window
 parameter:
 ******************************************************************************/
-static void EPD_4IN2B_V2_TurnOnDisplay(void)
+static void EPD_4IN2B_V2_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend)
 {
-    EPD_4IN2B_V2_SendCommand(0x12); // DISPLAY_REFRESH
-    DEV_Delay_ms(100);
-    EPD_4IN2B_V2_ReadBusy();
+    EPD_4IN2B_V2_SendCommand(0x44); // SET_RAM_X_ADDRESS_START_END_POSITION
+    EPD_4IN2B_V2_SendData((Xstart>>3) & 0xFF);
+    EPD_4IN2B_V2_SendData((Xend>>3) & 0xFF);
+	
+    EPD_4IN2B_V2_SendCommand(0x45); // SET_RAM_Y_ADDRESS_START_END_POSITION
+    EPD_4IN2B_V2_SendData(Ystart & 0xFF);
+    EPD_4IN2B_V2_SendData((Ystart >> 8) & 0xFF);
+    EPD_4IN2B_V2_SendData(Yend & 0xFF);
+    EPD_4IN2B_V2_SendData((Yend >> 8) & 0xFF);
 }
 
+/******************************************************************************
+function :	Set Cursor
+parameter:
+******************************************************************************/
+static void EPD_4IN2B_V2_SetCursor(UWORD Xstart, UWORD Ystart)
+{
+    EPD_4IN2B_V2_SendCommand(0x4E); // SET_RAM_X_ADDRESS_COUNTER
+    EPD_4IN2B_V2_SendData((Xstart>>3) & 0xFF);
+
+    EPD_4IN2B_V2_SendCommand(0x4F); // SET_RAM_Y_ADDRESS_COUNTER
+    EPD_4IN2B_V2_SendData(Ystart & 0xFF);
+    EPD_4IN2B_V2_SendData((Ystart >> 8) & 0xFF);
+}
+
+
 /******************************************************************************
 function :	Initialize the e-Paper register
 parameter:
 ******************************************************************************/
-void EPD_4IN2B_V2_Init(void)
+void EPD_4IN2B_V2_Init_old(void)
 {
     EPD_4IN2B_V2_Reset();
+
+    EPD_4IN2B_V2_ReadBusy();   
+    EPD_4IN2B_V2_SendCommand(0x04);   // soft  reset
+    EPD_4IN2B_V2_ReadBusy();
     
-    EPD_4IN2B_V2_SendCommand(0x04); 
+    EPD_4IN2B_V2_SendCommand(0x00); //BorderWavefrom
+    EPD_4IN2B_V2_SendData(0x0F);
+}
+
+void EPD_4IN2B_V2_Init_new(void)
+{
+    EPD_4IN2B_V2_Reset();
+
+    EPD_4IN2B_V2_ReadBusy();   
+    EPD_4IN2B_V2_SendCommand(0x12);   // soft  reset
     EPD_4IN2B_V2_ReadBusy();
+	
+    // EPD_4IN2B_V2_SendCommand(0x01); //Driver output control      
+    // EPD_4IN2B_V2_SendData((EPD_4IN2B_V2_HEIGHT-1)%256);   
+    // EPD_4IN2B_V2_SendData((EPD_4IN2B_V2_HEIGHT-1)/256);
+    // EPD_4IN2B_V2_SendData(0x00);
+
+    EPD_4IN2B_V2_SendCommand(0x3C); //BorderWavefrom
+    EPD_4IN2B_V2_SendData(0x05);
+
+    EPD_4IN2B_V2_SendCommand(0x18); //Read built-in temperature sensor
+    EPD_4IN2B_V2_SendData(0x80);	
+	
+    EPD_4IN2B_V2_SendCommand(0x11);	// data  entry  mode
+    EPD_4IN2B_V2_SendData(0x03);		// X-mode   
+		
+	EPD_4IN2B_V2_SetWindows(0, 0, EPD_4IN2B_V2_WIDTH-1, EPD_4IN2B_V2_HEIGHT-1);
+	 
+	EPD_4IN2B_V2_SetCursor(0, 0);
+	
+    EPD_4IN2B_V2_ReadBusy();
+}
 
-    EPD_4IN2B_V2_SendCommand(0x00);
-    EPD_4IN2B_V2_SendData(0x0f);
+void EPD_4IN2B_V2_Init()
+{
+    uint8_t i=0;
+    EPD_4IN2B_V2_Reset();
+    
+    DEV_GPIO_Init();
+    DEV_Digital_Write(EPD_DC_PIN, 0);
+    DEV_SPI_SendData(0x2F);
+    DEV_Delay_ms(50);
+    
+    DEV_Digital_Write(EPD_DC_PIN, 1);
+    i = DEV_SPI_ReadData();
+    printf("%02x\n",i);
+    
+    DEV_SPI_Init();
+    if(i == 0x01)
+    {
+        flag = 0;
+        EPD_4IN2B_V2_Init_new();
+    }
+    else
+    {
+        flag = 1;
+        EPD_4IN2B_V2_Init_old();
+    }
 }
 
+
+
 /******************************************************************************
 function :	Clear screen
 parameter:
 ******************************************************************************/
-void EPD_4IN2B_V2_Clear(void)
+void EPD_4IN2B_V2_Clear_old(void)
 {
     UWORD Width, Height;
     Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
@@ -138,14 +235,51 @@ void EPD_4IN2B_V2_Clear(void)
         }
     }
 
-    EPD_4IN2B_V2_TurnOnDisplay();
+    EPD_4IN2B_V2_SendCommand(0x12);
+    DEV_Delay_ms(100);
+    EPD_4IN2B_V2_ReadBusy();
+}
+
+
+void EPD_4IN2B_V2_Clear_new(void)
+{
+    UWORD Width, Height;
+    Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
+    Height = EPD_4IN2B_V2_HEIGHT;
+
+    EPD_4IN2B_V2_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_4IN2B_V2_SendData(0xFF);
+        }
+    }
+
+    EPD_4IN2B_V2_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_4IN2B_V2_SendData(0x00);
+        }
+    }
+
+    EPD_4IN2B_V2_SendCommand(0x22);
+	EPD_4IN2B_V2_SendData(0xF7);
+    EPD_4IN2B_V2_SendCommand(0x20);
+    EPD_4IN2B_V2_ReadBusy();
+}
+
+void EPD_4IN2B_V2_Clear(void)
+{
+    if(flag == 0)
+        EPD_4IN2B_V2_Clear_new();
+    else
+        EPD_4IN2B_V2_Clear_old();
 }
 
 /******************************************************************************
 function :	Sends the image buffer in RAM to e-Paper and displays
 parameter:
 ******************************************************************************/
-void EPD_4IN2B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage)
+void EPD_4IN2B_V2_Display_old(const UBYTE *blackimage, const UBYTE *ryimage)
 {
     UWORD Width, Height;
     Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
@@ -165,20 +299,68 @@ void EPD_4IN2B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage)
         }
     }
 
-    EPD_4IN2B_V2_TurnOnDisplay();
+    EPD_4IN2B_V2_SendCommand(0x12);
+    DEV_Delay_ms(100);
+    EPD_4IN2B_V2_ReadBusy();
+}
+
+void EPD_4IN2B_V2_Display_new(const UBYTE *blackimage, const UBYTE *ryimage)
+{
+    UWORD Width, Height;
+    Width = (EPD_4IN2B_V2_WIDTH % 8 == 0)? (EPD_4IN2B_V2_WIDTH / 8 ): (EPD_4IN2B_V2_WIDTH / 8 + 1);
+    Height = EPD_4IN2B_V2_HEIGHT;
+
+    EPD_4IN2B_V2_SendCommand(0x24);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_4IN2B_V2_SendData(blackimage[i + j * Width]);
+        }
+    }
+
+    EPD_4IN2B_V2_SendCommand(0x26);
+    for (UWORD j = 0; j < Height; j++) {
+        for (UWORD i = 0; i < Width; i++) {
+            EPD_4IN2B_V2_SendData(~ryimage[i + j * Width]);
+        }
+    }
+
+    EPD_4IN2B_V2_SendCommand(0x22);
+	EPD_4IN2B_V2_SendData(0xF7);
+    EPD_4IN2B_V2_SendCommand(0x20);
+    EPD_4IN2B_V2_ReadBusy();
+}
+
+void EPD_4IN2B_V2_Display(const UBYTE *blackimage, const UBYTE *ryimage)
+{
+    if(flag == 0)
+        EPD_4IN2B_V2_Display_new(blackimage, ryimage);
+    else
+        EPD_4IN2B_V2_Display_old(blackimage, ryimage);
 }
 
 /******************************************************************************
 function :	Enter sleep mode
 parameter:
 ******************************************************************************/
-void EPD_4IN2B_V2_Sleep(void)
+void EPD_4IN2B_V2_Sleep_old(void)
 {
-    EPD_4IN2B_V2_SendCommand(0X50);
-    EPD_4IN2B_V2_SendData(0xf7);		//border floating	
+    EPD_4IN2B_V2_SendCommand(0X50);  	
+    EPD_4IN2B_V2_SendData(0xf7);
+    EPD_4IN2B_V2_SendCommand(0x02);  
+    EPD_4IN2B_V2_ReadBusy();
+    EPD_4IN2B_V2_SendCommand(0x07);  
+    EPD_4IN2B_V2_SendData(0XA5);
+}
+void EPD_4IN2B_V2_Sleep_new(void)
+{
+    EPD_4IN2B_V2_SendCommand(0X10);  	//deep sleep
+    EPD_4IN2B_V2_SendData(0x03);
+}
 
-    EPD_4IN2B_V2_SendCommand(0X02);  	//power off
-    EPD_4IN2B_V2_ReadBusy(); //waiting for the electronic paper IC to release the idle signal
-    EPD_4IN2B_V2_SendCommand(0X07);  	//deep sleep
-    EPD_4IN2B_V2_SendData(0xA5);
+void EPD_4IN2B_V2_Sleep(void)
+{
+    if(flag == 0)
+        EPD_4IN2B_V2_Sleep_new();
+    else
+        EPD_4IN2B_V2_Sleep_old();
 }

+ 3 - 1
Version_CN.txt

@@ -44,4 +44,6 @@
 2023-12-21:添加新程序2.66inch e-Paper (G)例程。
 2023-12-21:添加新程序2.9inch e-Paper V4 (B)例程。
 2023-12-21:添加2.9V2的快刷代码、7.5的快刷、局刷代码(Arduino除外)
-2024-03-06:添加新程序5.79inch e-Paper、5.79inch e-Paper (B)例程
+2024-03-06:添加新程序5.79inch e-Paper、5.79inch e-Paper (B)例程
+2024-04-10:添加新程序13.3inch e-Paper (B)例程,添加 13.3inch e-Paper (K) 的局刷显示及四灰度显示,修复部分程序问题
+2024-04-22:更新 4.2inch e-Paper (B) V2的例程

+ 3 - 1
Version_EN.txt

@@ -43,4 +43,6 @@
 2023-12-21: New program 2.66inch e-Paper (G) routine added.
 2023-12-21: Add new program 2.9inch e-Paper V4 (B) routine.
 2023-12-21: Add 2.9V2 fast brush code, 7.5 fast brush code, local brush code (except Arduino)
-2023-12-21: New program 5.79inch e-Paper、5.79inch e-Paper (B) routine added.
+2023-12-21: New program 5.79inch e-Paper、5.79inch e-Paper (B) routine added.
+2024-04-10: Add new program 13.3inch e-Paper (B) routine, add 13.3inch e-Paper (K) local brush display and four grayscale display, fix some program problems
+2024-04-22: Update 4.2inch e-Paper (B) V2 routine.

Some files were not shown because too many files changed in this diff