├── firmware-multimeter
├── Objects
│ ├── ExtDll.iex
│ ├── startup_stm32f373xc.d
│ ├── adc.o
│ ├── i2c.o
│ ├── 5110.o
│ ├── adc.crf
│ ├── at24c.o
│ ├── ctest.o
│ ├── delay.o
│ ├── draw.o
│ ├── i2c.crf
│ ├── init.o
│ ├── main.o
│ ├── sdadc.o
│ ├── uart.o
│ ├── 5110.crf
│ ├── at24c.crf
│ ├── ctest.crf
│ ├── delay.crf
│ ├── draw.crf
│ ├── init.crf
│ ├── main.crf
│ ├── sdadc.crf
│ ├── sdadc3.crf
│ ├── sdadc3.o
│ ├── uart.crf
│ ├── interrupt.o
│ ├── OL_DVM_v14.axf
│ ├── interrupt.crf
│ ├── system_stm32f3xx.crf
│ ├── system_stm32f3xx.o
│ ├── startup_stm32f373xc.o
│ ├── OL_DVM_v14.build_log.htm
│ ├── OL_DVM_v14.sct
│ ├── OL_DVM_v14.lnp
│ ├── delay.d
│ ├── i2c.d
│ ├── adc.d
│ ├── at24c.d
│ ├── init.d
│ ├── system_stm32f3xx.d
│ ├── uart.d
│ ├── sdadc.d
│ ├── main.d
│ ├── sdadc3.d
│ ├── interrupt.d
│ ├── ctest.d
│ ├── 5110.d
│ └── draw.d
├── sdadc.h
├── Listings
│ ├── init.lst
│ ├── main.lst
│ ├── system_stm32f3xx.lst
│ ├── init.txt
│ └── main.txt
├── sdadc3.h
├── interrupt.h
├── uart.h
├── ctest.h
├── delay.h
├── init.h
├── adc.h
├── map.txt
├── i2c.h
├── draw.h
├── EventRecorderStub.scvd
├── RTE
│ ├── _V14
│ │ └── RTE_Components.h
│ ├── _rev1.5
│ │ └── RTE_Components.h
│ └── _Target_1
│ │ └── RTE_Components.h
├── at24c.h
├── main.cpp
├── sdadc3.cpp
├── adc.cpp
├── uart.cpp
├── delay.cpp
├── i2c.cpp
├── at24c.cpp
├── interrupt.cpp
├── lcd_5110
│ ├── 5110.h
│ └── Fonts
│ │ ├── Picopixel.h
│ │ ├── Tiny3x3a2pt7b
│ │ ├── Org_01.h
│ │ ├── Dialog_7pt.h
│ │ └── Dialog_9pt.h
├── config.h
├── init.cpp
├── ctest.cpp
└── sdadc.cpp
├── firmware-calibration
├── Objects
│ ├── ExtDll.iex
│ ├── startup_stm32f373xc.d
│ ├── 5110.o
│ ├── draw.o
│ ├── i2c.o
│ ├── init.o
│ ├── main.o
│ ├── uart.o
│ ├── 5110.crf
│ ├── at24c.crf
│ ├── at24c.o
│ ├── delay.crf
│ ├── delay.o
│ ├── draw.crf
│ ├── i2c.crf
│ ├── init.crf
│ ├── main.crf
│ ├── sdadc.crf
│ ├── sdadc.o
│ ├── sdadc3.o
│ ├── uart.crf
│ ├── interrupt.o
│ ├── sdadc3.crf
│ ├── OL_DVM_v14.axf
│ ├── interrupt.crf
│ ├── system_stm32f3xx.o
│ ├── startup_stm32f373xc.o
│ ├── system_stm32f3xx.crf
│ ├── OL_DVM_v14.build_log.htm
│ ├── OL_DVM_v14.lnp
│ ├── OL_DVM_v14.sct
│ ├── delay.d
│ ├── i2c.d
│ ├── init.d
│ ├── at24c.d
│ ├── system_stm32f3xx.d
│ ├── interrupt.d
│ ├── uart.d
│ ├── sdadc.d
│ ├── sdadc3.d
│ ├── draw.d
│ ├── main.d
│ └── 5110.d
├── sdadc.h
├── Listings
│ ├── init.lst
│ ├── main.lst
│ ├── system_stm32f3xx.lst
│ ├── init.txt
│ └── main.txt
├── calibration.xlsx
├── sdadc3.h
├── interrupt.h
├── uart.h
├── init.h
├── map.txt
├── delay.h
├── i2c.h
├── draw.h
├── EventRecorderStub.scvd
├── RTE
│ ├── _V14
│ │ └── RTE_Components.h
│ ├── _Target_1
│ │ └── RTE_Components.h
│ ├── _rev1.5
│ │ └── RTE_Components.h
│ └── _EEPROM_writer
│ │ └── RTE_Components.h
├── at24c.h
├── sdadc3.cpp
├── uart.cpp
├── delay.cpp
├── i2c.cpp
├── config.h
├── at24c.cpp
├── init.cpp
├── main.cpp
├── lcd_5110
│ ├── 5110.h
│ └── Fonts
│ │ ├── Picopixel.h
│ │ ├── Tiny3x3a2pt7b
│ │ ├── Org_01.h
│ │ ├── Dialog_7pt.h
│ │ ├── Dialog_9pt.h
│ │ └── Lato_9pt.h
├── interrupt.cpp
└── sdadc.cpp
├── .gitattributes
├── README.md
├── case
├── case.JPG
├── STLs
│ ├── body.STL
│ ├── top.STL
│ ├── bottom.STL
│ ├── distancer.STL
│ ├── bottom_leg.STL
│ ├── slide_attachment.STL
│ ├── button_attachment.STL
│ └── button_round_attachment.STL
├── case_exploded.JPG
├── SolidWorks
│ ├── body.SLDPRT
│ ├── set.SLDASM
│ ├── top.SLDPRT
│ ├── bottom.SLDPRT
│ ├── bottom_leg.SLDPRT
│ ├── distancer.SLDPRT
│ ├── button_attachment.SLDPRT
│ ├── slide_attachment.SLDPRT
│ └── button_round_attachment.SLDPRT
└── set.JPG.uid-zps
├── new_dmm_rev15.JPG
├── old_dmm_rev12.JPG
├── old_dmm_rev13.JPG
├── hardware
├── schematics_sheet1.png
├── schematics_sheet2.png
└── schematics_USB_isolator.png
└── LICENSE
/firmware-multimeter/Objects/ExtDll.iex:
--------------------------------------------------------------------------------
1 | [EXTDLL]
2 | Count=0
3 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/ExtDll.iex:
--------------------------------------------------------------------------------
1 | [EXTDLL]
2 | Count=0
3 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/README.md
--------------------------------------------------------------------------------
/case/case.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/case.JPG
--------------------------------------------------------------------------------
/case/STLs/body.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/STLs/body.STL
--------------------------------------------------------------------------------
/case/STLs/top.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/STLs/top.STL
--------------------------------------------------------------------------------
/new_dmm_rev15.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/new_dmm_rev15.JPG
--------------------------------------------------------------------------------
/old_dmm_rev12.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/old_dmm_rev12.JPG
--------------------------------------------------------------------------------
/old_dmm_rev13.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/old_dmm_rev13.JPG
--------------------------------------------------------------------------------
/case/STLs/bottom.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/STLs/bottom.STL
--------------------------------------------------------------------------------
/case/STLs/distancer.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/STLs/distancer.STL
--------------------------------------------------------------------------------
/case/case_exploded.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/case_exploded.JPG
--------------------------------------------------------------------------------
/case/STLs/bottom_leg.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/STLs/bottom_leg.STL
--------------------------------------------------------------------------------
/case/SolidWorks/body.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/SolidWorks/body.SLDPRT
--------------------------------------------------------------------------------
/case/SolidWorks/set.SLDASM:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/SolidWorks/set.SLDASM
--------------------------------------------------------------------------------
/case/SolidWorks/top.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/SolidWorks/top.SLDPRT
--------------------------------------------------------------------------------
/case/set.JPG.uid-zps:
--------------------------------------------------------------------------------
1 | { E 0 3 7 5 1 B F - A 1 4 F - 4 8 B D - 9 B 1 3 - A 7 D A 6 A 3 C 7 9 9 1 } , 0 0 0 0 0 0 0 0 0 0 0 0 0 0 E 1
--------------------------------------------------------------------------------
/firmware-calibration/Objects/startup_stm32f373xc.d:
--------------------------------------------------------------------------------
1 | .\objects\startup_stm32f373xc.o: RTE\Device\STM32F373CC\startup_stm32f373xc.s
2 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/startup_stm32f373xc.d:
--------------------------------------------------------------------------------
1 | .\objects\startup_stm32f373xc.o: RTE\Device\STM32F373CC\startup_stm32f373xc.s
2 |
--------------------------------------------------------------------------------
/case/STLs/slide_attachment.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/STLs/slide_attachment.STL
--------------------------------------------------------------------------------
/case/SolidWorks/bottom.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/SolidWorks/bottom.SLDPRT
--------------------------------------------------------------------------------
/hardware/schematics_sheet1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/hardware/schematics_sheet1.png
--------------------------------------------------------------------------------
/hardware/schematics_sheet2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/hardware/schematics_sheet2.png
--------------------------------------------------------------------------------
/case/STLs/button_attachment.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/STLs/button_attachment.STL
--------------------------------------------------------------------------------
/case/SolidWorks/bottom_leg.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/SolidWorks/bottom_leg.SLDPRT
--------------------------------------------------------------------------------
/case/SolidWorks/distancer.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/SolidWorks/distancer.SLDPRT
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/adc.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/adc.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/i2c.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/i2c.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/5110.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/5110.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/draw.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/draw.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/i2c.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/i2c.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/init.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/init.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/main.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/main.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/uart.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/uart.o
--------------------------------------------------------------------------------
/firmware-calibration/sdadc.h:
--------------------------------------------------------------------------------
1 | #ifndef _SDADC_H
2 | #define _SDADC_H
3 |
4 | void SDADC_init(void);
5 | void SDADC_start(void);
6 |
7 | #endif
8 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/5110.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/5110.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/adc.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/adc.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/at24c.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/at24c.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/ctest.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/ctest.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/delay.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/delay.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/draw.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/draw.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/i2c.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/i2c.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/init.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/init.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/main.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/main.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/sdadc.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/sdadc.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/uart.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/uart.o
--------------------------------------------------------------------------------
/firmware-multimeter/sdadc.h:
--------------------------------------------------------------------------------
1 | #ifndef _SDADC_H
2 | #define _SDADC_H
3 |
4 | void SDADC_init(void);
5 | void SDADC_start(void);
6 |
7 | #endif
8 |
--------------------------------------------------------------------------------
/case/STLs/button_round_attachment.STL:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/STLs/button_round_attachment.STL
--------------------------------------------------------------------------------
/firmware-calibration/Listings/init.lst:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Listings/init.lst
--------------------------------------------------------------------------------
/firmware-calibration/Listings/main.lst:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Listings/main.lst
--------------------------------------------------------------------------------
/firmware-calibration/Objects/5110.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/5110.crf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/at24c.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/at24c.crf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/at24c.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/at24c.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/delay.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/delay.crf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/delay.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/delay.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/draw.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/draw.crf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/i2c.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/i2c.crf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/init.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/init.crf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/main.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/main.crf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/sdadc.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/sdadc.crf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/sdadc.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/sdadc.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/sdadc3.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/sdadc3.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/uart.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/uart.crf
--------------------------------------------------------------------------------
/firmware-calibration/calibration.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/calibration.xlsx
--------------------------------------------------------------------------------
/firmware-calibration/sdadc3.h:
--------------------------------------------------------------------------------
1 | #ifndef _SDADC3_H
2 | #define _SDADC3_H
3 |
4 | void SDADC3_init(void);
5 | void SDADC3_start(void);
6 |
7 | #endif
8 |
--------------------------------------------------------------------------------
/firmware-multimeter/Listings/init.lst:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Listings/init.lst
--------------------------------------------------------------------------------
/firmware-multimeter/Listings/main.lst:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Listings/main.lst
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/5110.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/5110.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/at24c.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/at24c.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/ctest.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/ctest.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/delay.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/delay.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/draw.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/draw.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/init.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/init.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/main.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/main.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/sdadc.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/sdadc.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/sdadc3.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/sdadc3.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/sdadc3.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/sdadc3.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/uart.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/uart.crf
--------------------------------------------------------------------------------
/firmware-multimeter/sdadc3.h:
--------------------------------------------------------------------------------
1 | #ifndef _SDADC3_H
2 | #define _SDADC3_H
3 |
4 | void SDADC3_init(void);
5 | void SDADC3_start(void);
6 |
7 | #endif
8 |
--------------------------------------------------------------------------------
/hardware/schematics_USB_isolator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/hardware/schematics_USB_isolator.png
--------------------------------------------------------------------------------
/case/SolidWorks/button_attachment.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/SolidWorks/button_attachment.SLDPRT
--------------------------------------------------------------------------------
/case/SolidWorks/slide_attachment.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/SolidWorks/slide_attachment.SLDPRT
--------------------------------------------------------------------------------
/firmware-calibration/Objects/interrupt.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/interrupt.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/sdadc3.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/sdadc3.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/interrupt.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/interrupt.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/OL_DVM_v14.axf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/OL_DVM_v14.axf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/interrupt.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/interrupt.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/OL_DVM_v14.axf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/OL_DVM_v14.axf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/interrupt.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/interrupt.crf
--------------------------------------------------------------------------------
/firmware-calibration/interrupt.h:
--------------------------------------------------------------------------------
1 | #ifndef INTERRUPT_H
2 | #define INTERRUPT_H
3 |
4 | void setVoltageRange(void);
5 | void setCurrentRange(void);
6 |
7 | #endif
8 |
--------------------------------------------------------------------------------
/firmware-multimeter/interrupt.h:
--------------------------------------------------------------------------------
1 | #ifndef INTERRUPT_H
2 | #define INTERRUPT_H
3 |
4 | void setVoltageRange(void);
5 | void setCurrentRange(void);
6 |
7 | #endif
8 |
--------------------------------------------------------------------------------
/case/SolidWorks/button_round_attachment.SLDPRT:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/case/SolidWorks/button_round_attachment.SLDPRT
--------------------------------------------------------------------------------
/firmware-calibration/Objects/system_stm32f3xx.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/system_stm32f3xx.o
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/system_stm32f3xx.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/system_stm32f3xx.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/system_stm32f3xx.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/system_stm32f3xx.o
--------------------------------------------------------------------------------
/firmware-calibration/Listings/system_stm32f3xx.lst:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Listings/system_stm32f3xx.lst
--------------------------------------------------------------------------------
/firmware-calibration/Objects/startup_stm32f373xc.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/startup_stm32f373xc.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/system_stm32f3xx.crf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/system_stm32f3xx.crf
--------------------------------------------------------------------------------
/firmware-multimeter/Listings/system_stm32f3xx.lst:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Listings/system_stm32f3xx.lst
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/startup_stm32f373xc.o:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/startup_stm32f373xc.o
--------------------------------------------------------------------------------
/firmware-calibration/Objects/OL_DVM_v14.build_log.htm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-calibration/Objects/OL_DVM_v14.build_log.htm
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/OL_DVM_v14.build_log.htm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MartinD-CZ/STM32F1-open-source-multimeter/HEAD/firmware-multimeter/Objects/OL_DVM_v14.build_log.htm
--------------------------------------------------------------------------------
/firmware-calibration/uart.h:
--------------------------------------------------------------------------------
1 | #ifndef _UART_H
2 | #define _UART_H
3 |
4 | void uart_init(void);
5 | void uart_char(char ch);
6 | void uart_print(char *msg);
7 | void uart_printf(char *szFormat, ...);
8 |
9 | #endif
10 |
--------------------------------------------------------------------------------
/firmware-multimeter/uart.h:
--------------------------------------------------------------------------------
1 | #ifndef _UART_H
2 | #define _UART_H
3 |
4 | void uart_init(void);
5 | void uart_char(char ch);
6 | void uart_print(char *msg);
7 | void uart_printf(char *szFormat, ...);
8 |
9 | #endif
10 |
--------------------------------------------------------------------------------
/firmware-calibration/init.h:
--------------------------------------------------------------------------------
1 | #ifndef _INIT_H
2 | #define _INIT_H
3 |
4 | void init_RCC(void);
5 | void init_GPIO(void);
6 | void init_EXTI(void);
7 | void init_TIM3(void);
8 | void init_BKP(void);
9 |
10 |
11 | #endif
12 |
--------------------------------------------------------------------------------
/firmware-calibration/map.txt:
--------------------------------------------------------------------------------
1 | TIMER MAP:
2 | - timer 3: screen update
3 | - timer 4: delay
4 |
5 | INTERRUPT (priority) MAP:
6 | - EXTI15_10 (7) - buttons
7 | - DMA2_Channel3 - SDADC data transfer
8 | - TIM3 - screen update
9 |
10 | DMA MAP:
--------------------------------------------------------------------------------
/firmware-multimeter/ctest.h:
--------------------------------------------------------------------------------
1 | #ifndef _CTEST_H
2 | #define _CTEST_H
3 |
4 | #define PART_NONE 0
5 | #define PART_RESISTOR 1
6 | #define PART_DIODE 2
7 | #define PART_CAPACITOR 3
8 |
9 |
10 | void componentTest();
11 |
12 | #endif
13 |
--------------------------------------------------------------------------------
/firmware-calibration/delay.h:
--------------------------------------------------------------------------------
1 | #ifndef DELAY_H
2 | #define DELAY_H
3 |
4 | void _delay_ms(uint16_t ms);
5 | void _delay_us(uint16_t us);
6 | void _delay_init(void);
7 | void _count_us_start(void);
8 | uint16_t _count_us_stop(void);
9 |
10 | #endif
11 |
--------------------------------------------------------------------------------
/firmware-multimeter/delay.h:
--------------------------------------------------------------------------------
1 | #ifndef DELAY_H
2 | #define DELAY_H
3 |
4 | void _delay_ms(uint16_t ms);
5 | void _delay_us(uint16_t us);
6 | void _delay_init(void);
7 | void _count_us_start(void);
8 | uint16_t _count_us_stop(void);
9 |
10 | #endif
11 |
--------------------------------------------------------------------------------
/firmware-multimeter/init.h:
--------------------------------------------------------------------------------
1 | #ifndef _INIT_H
2 | #define _INIT_H
3 |
4 | void init_RCC(void);
5 | void init_GPIO(void);
6 | void init_EXTI(void);
7 | void init_TIM3(void);
8 | void init_BKP(void);
9 | void init_TIM2(void);
10 |
11 |
12 | #endif
13 |
--------------------------------------------------------------------------------
/firmware-multimeter/adc.h:
--------------------------------------------------------------------------------
1 | #ifndef ADC_H
2 | #define ADC_H
3 |
4 | #define VBAT 0
5 | #define TP1 2
6 | #define TP2 1
7 | #define REF 9
8 |
9 | void adc1_init(void);
10 | uint16_t adc1_getReading(uint8_t channel, uint8_t oversamplig = 8);
11 |
12 | #endif
13 |
--------------------------------------------------------------------------------
/firmware-multimeter/map.txt:
--------------------------------------------------------------------------------
1 | TIMER MAP:
2 | - timer 2_ frequency counting
3 | - timer 3: screen update
4 | - timer 4: delay
5 |
6 | INTERRUPT (priority) MAP:
7 | - EXTI15_10 (7) - buttons
8 | - DMA2_Channel3 - SDADC data transfer
9 | - TIM3 - screen update
10 |
11 | DMA MAP:
--------------------------------------------------------------------------------
/firmware-multimeter/i2c.h:
--------------------------------------------------------------------------------
1 | #ifndef _I2C_H
2 | #define _I2C_H
3 |
4 | #define TX_BUFFER_SIZE 12
5 | #define RX_BUFFER_SIZE 12
6 |
7 | void i2c_init();
8 | void i2c_setSlaveAddress(uint8_t add);
9 | void i2c_writeBuffer(uint8_t data);
10 | void i2c_transmit();
11 | void i2c_request(uint8_t bytes);
12 | uint8_t i2c_readBuffer(uint8_t pos);
13 |
14 | #endif
15 |
--------------------------------------------------------------------------------
/firmware-calibration/i2c.h:
--------------------------------------------------------------------------------
1 | #ifndef _I2C_H
2 | #define _I2C_H
3 |
4 | #define TX_BUFFER_SIZE 12
5 | #define RX_BUFFER_SIZE 12
6 |
7 | void i2c_init();
8 | void i2c_setSlaveAddress(uint8_t add);
9 | void i2c_writeBuffer(uint8_t data);
10 | void i2c_transmit();
11 | void i2c_request(uint8_t bytes);
12 | uint8_t i2c_readBuffer(uint8_t pos);
13 |
14 | #endif
15 |
--------------------------------------------------------------------------------
/firmware-calibration/draw.h:
--------------------------------------------------------------------------------
1 | #ifndef DRAW_H
2 | #define DRAW_H
3 |
4 | void drawSplashScreen(void);
5 | void drawScreen(void);
6 |
7 | void drawVoltScreen(void);
8 | void drawCurrScreen(void);
9 | void drawPowerScreen(void);
10 | void drawContScreen(void);
11 | void drawCompTestScreen(void);
12 | void drawAboutScreen(void);
13 | void drawAboutScreen(void);
14 |
15 | #endif
16 |
--------------------------------------------------------------------------------
/firmware-multimeter/draw.h:
--------------------------------------------------------------------------------
1 | #ifndef DRAW_H
2 | #define DRAW_H
3 |
4 | void drawSplashScreen(void);
5 | void drawScreen(void);
6 |
7 | void drawVoltScreen(void);
8 | void drawCurrScreen(void);
9 | void drawPowerScreen(void);
10 | void drawContScreen(void);
11 | void drawCompTestScreen(void);
12 | void drawAboutScreen(void);
13 | void drawFreqScreen(void);
14 |
15 | #endif
16 |
--------------------------------------------------------------------------------
/firmware-multimeter/EventRecorderStub.scvd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/firmware-calibration/EventRecorderStub.scvd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/firmware-calibration/RTE/_V14/RTE_Components.h:
--------------------------------------------------------------------------------
1 |
2 | /*
3 | * Auto generated Run-Time-Environment Component Configuration File
4 | * *** Do not modify ! ***
5 | *
6 | * Project: 'OL_DVM_v15'
7 | * Target: 'V14'
8 | */
9 |
10 | #ifndef RTE_COMPONENTS_H
11 | #define RTE_COMPONENTS_H
12 |
13 |
14 | /*
15 | * Define the Device Header File:
16 | */
17 | #define CMSIS_device_header "stm32f3xx.h"
18 |
19 |
20 | #endif /* RTE_COMPONENTS_H */
21 |
--------------------------------------------------------------------------------
/firmware-multimeter/RTE/_V14/RTE_Components.h:
--------------------------------------------------------------------------------
1 |
2 | /*
3 | * Auto generated Run-Time-Environment Component Configuration File
4 | * *** Do not modify ! ***
5 | *
6 | * Project: 'OL_DVM_v15'
7 | * Target: 'V14'
8 | */
9 |
10 | #ifndef RTE_COMPONENTS_H
11 | #define RTE_COMPONENTS_H
12 |
13 |
14 | /*
15 | * Define the Device Header File:
16 | */
17 | #define CMSIS_device_header "stm32f3xx.h"
18 |
19 |
20 | #endif /* RTE_COMPONENTS_H */
21 |
--------------------------------------------------------------------------------
/firmware-multimeter/RTE/_rev1.5/RTE_Components.h:
--------------------------------------------------------------------------------
1 |
2 | /*
3 | * Auto generated Run-Time-Environment Component Configuration File
4 | * *** Do not modify ! ***
5 | *
6 | * Project: 'OL_DVM_v15'
7 | * Target: 'rev1.5'
8 | */
9 |
10 | #ifndef RTE_COMPONENTS_H
11 | #define RTE_COMPONENTS_H
12 |
13 |
14 | /*
15 | * Define the Device Header File:
16 | */
17 | #define CMSIS_device_header "stm32f3xx.h"
18 |
19 |
20 | #endif /* RTE_COMPONENTS_H */
21 |
--------------------------------------------------------------------------------
/firmware-calibration/RTE/_Target_1/RTE_Components.h:
--------------------------------------------------------------------------------
1 |
2 | /*
3 | * Auto generated Run-Time-Environment Component Configuration File
4 | * *** Do not modify ! ***
5 | *
6 | * Project: 'OL_DVM_v14'
7 | * Target: 'Target 1'
8 | */
9 |
10 | #ifndef RTE_COMPONENTS_H
11 | #define RTE_COMPONENTS_H
12 |
13 |
14 | /*
15 | * Define the Device Header File:
16 | */
17 | #define CMSIS_device_header "stm32f3xx.h"
18 |
19 |
20 | #endif /* RTE_COMPONENTS_H */
21 |
--------------------------------------------------------------------------------
/firmware-multimeter/RTE/_Target_1/RTE_Components.h:
--------------------------------------------------------------------------------
1 |
2 | /*
3 | * Auto generated Run-Time-Environment Component Configuration File
4 | * *** Do not modify ! ***
5 | *
6 | * Project: 'OL_DVM_v14'
7 | * Target: 'Target 1'
8 | */
9 |
10 | #ifndef RTE_COMPONENTS_H
11 | #define RTE_COMPONENTS_H
12 |
13 |
14 | /*
15 | * Define the Device Header File:
16 | */
17 | #define CMSIS_device_header "stm32f3xx.h"
18 |
19 |
20 | #endif /* RTE_COMPONENTS_H */
21 |
--------------------------------------------------------------------------------
/firmware-calibration/RTE/_rev1.5/RTE_Components.h:
--------------------------------------------------------------------------------
1 |
2 | /*
3 | * Auto generated Run-Time-Environment Component Configuration File
4 | * *** Do not modify ! ***
5 | *
6 | * Project: 'OL_DVM_v15_EEPROM'
7 | * Target: 'rev1.5'
8 | */
9 |
10 | #ifndef RTE_COMPONENTS_H
11 | #define RTE_COMPONENTS_H
12 |
13 |
14 | /*
15 | * Define the Device Header File:
16 | */
17 | #define CMSIS_device_header "stm32f3xx.h"
18 |
19 |
20 | #endif /* RTE_COMPONENTS_H */
21 |
--------------------------------------------------------------------------------
/firmware-calibration/at24c.h:
--------------------------------------------------------------------------------
1 | #ifndef _AT24C_H
2 | #define _AT24C_H
3 |
4 | void at24c_init(uint8_t dev_adress);
5 | void at24c_write_byte(uint8_t address, uint8_t data);
6 | void at24c_write_page(uint8_t address, uint8_t data[8]);
7 | uint8_t at24c_read_byte(uint8_t address);
8 | uint8_t* at24c_read_page(uint8_t address);
9 |
10 | void eeprom_save_floats(uint8_t address, float f0, float f1);
11 | void eeprom_read_floats(uint8_t address, float& f0, float& f1);
12 |
13 | #endif
14 |
--------------------------------------------------------------------------------
/firmware-multimeter/at24c.h:
--------------------------------------------------------------------------------
1 | #ifndef _AT24C_H
2 | #define _AT24C_H
3 |
4 | void at24c_init(uint8_t dev_adress);
5 | void at24c_write_byte(uint8_t address, uint8_t data);
6 | void at24c_write_page(uint8_t address, uint8_t data[8]);
7 | uint8_t at24c_read_byte(uint8_t address);
8 | uint8_t* at24c_read_page(uint8_t address);
9 |
10 | void eeprom_save_floats(uint8_t address, float f0, float f1);
11 | void eeprom_read_floats(uint8_t address, float& f0, float& f1);
12 |
13 | #endif
14 |
--------------------------------------------------------------------------------
/firmware-calibration/RTE/_EEPROM_writer/RTE_Components.h:
--------------------------------------------------------------------------------
1 |
2 | /*
3 | * Auto generated Run-Time-Environment Component Configuration File
4 | * *** Do not modify ! ***
5 | *
6 | * Project: 'OL_DVM_v15_EEPROM'
7 | * Target: 'EEPROM_writer'
8 | */
9 |
10 | #ifndef RTE_COMPONENTS_H
11 | #define RTE_COMPONENTS_H
12 |
13 |
14 | /*
15 | * Define the Device Header File:
16 | */
17 | #define CMSIS_device_header "stm32f3xx.h"
18 |
19 |
20 | #endif /* RTE_COMPONENTS_H */
21 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/OL_DVM_v14.lnp:
--------------------------------------------------------------------------------
1 | --cpu=Cortex-M4.fp
2 | ".\objects\main.o"
3 | ".\objects\init.o"
4 | ".\objects\5110.o"
5 | ".\objects\delay.o"
6 | ".\objects\uart.o"
7 | ".\objects\i2c.o"
8 | ".\objects\at24c.o"
9 | ".\objects\startup_stm32f373xc.o"
10 | ".\objects\system_stm32f3xx.o"
11 | --strict --scatter ".\Objects\OL_DVM_v14.sct"
12 | --summary_stderr --info summarysizes --map --xref --callgraph --symbols
13 | --info sizes --info totals --info unused --info veneers
14 | --list ".\Listings\OL_DVM_v14.map" -o .\Objects\OL_DVM_v14.axf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/OL_DVM_v14.sct:
--------------------------------------------------------------------------------
1 | ; *************************************************************
2 | ; *** Scatter-Loading Description File generated by uVision ***
3 | ; *************************************************************
4 |
5 | LR_IROM1 0x08000000 0x00040000 { ; load region size_region
6 | ER_IROM1 0x08000000 0x00040000 { ; load address = execution address
7 | *.o (RESET, +First)
8 | *(InRoot$$Sections)
9 | .ANY (+RO)
10 | }
11 | RW_IRAM1 0x20000000 0x00008000 { ; RW data
12 | .ANY (+RW +ZI)
13 | }
14 | }
15 |
16 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/OL_DVM_v14.sct:
--------------------------------------------------------------------------------
1 | ; *************************************************************
2 | ; *** Scatter-Loading Description File generated by uVision ***
3 | ; *************************************************************
4 |
5 | LR_IROM1 0x08000000 0x00040000 { ; load region size_region
6 | ER_IROM1 0x08000000 0x00040000 { ; load address = execution address
7 | *.o (RESET, +First)
8 | *(InRoot$$Sections)
9 | .ANY (+RO)
10 | }
11 | RW_IRAM1 0x20000000 0x00008000 { ; RW data
12 | .ANY (+RW +ZI)
13 | }
14 | }
15 |
16 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/OL_DVM_v14.lnp:
--------------------------------------------------------------------------------
1 | --cpu=Cortex-M4.fp
2 | ".\objects\main.o"
3 | ".\objects\init.o"
4 | ".\objects\interrupt.o"
5 | ".\objects\sdadc.o"
6 | ".\objects\adc.o"
7 | ".\objects\5110.o"
8 | ".\objects\draw.o"
9 | ".\objects\delay.o"
10 | ".\objects\uart.o"
11 | ".\objects\at24c.o"
12 | ".\objects\i2c.o"
13 | ".\objects\ctest.o"
14 | ".\objects\startup_stm32f373xc.o"
15 | ".\objects\system_stm32f3xx.o"
16 | --strict --scatter ".\Objects\OL_DVM_v14.sct"
17 | --summary_stderr --info summarysizes --map --xref --callgraph --symbols
18 | --info sizes --info totals --info unused --info veneers
19 | --list ".\Listings\OL_DVM_v14.map" -o .\Objects\OL_DVM_v14.axf
--------------------------------------------------------------------------------
/firmware-calibration/Objects/delay.d:
--------------------------------------------------------------------------------
1 | .\objects\delay.o: delay.cpp
2 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\delay.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\delay.o: delay.h
10 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/delay.d:
--------------------------------------------------------------------------------
1 | .\objects\delay.o: delay.cpp
2 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\delay.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\delay.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\delay.o: delay.h
10 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/i2c.d:
--------------------------------------------------------------------------------
1 | .\objects\i2c.o: i2c.cpp
2 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\i2c.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\i2c.o: i2c.h
10 | .\objects\i2c.o: delay.h
11 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/i2c.d:
--------------------------------------------------------------------------------
1 | .\objects\i2c.o: i2c.cpp
2 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\i2c.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\i2c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\i2c.o: i2c.h
10 | .\objects\i2c.o: delay.h
11 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/adc.d:
--------------------------------------------------------------------------------
1 | .\objects\adc.o: adc.cpp
2 | .\objects\adc.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\adc.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\adc.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\adc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\adc.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\adc.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\adc.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\adc.o: adc.h
10 | .\objects\adc.o: config.h
11 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/init.d:
--------------------------------------------------------------------------------
1 | .\objects\init.o: init.cpp
2 | .\objects\init.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\init.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\init.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\init.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\init.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\init.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\init.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\init.o: init.h
10 | .\objects\init.o: config.h
11 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/at24c.d:
--------------------------------------------------------------------------------
1 | .\objects\at24c.o: at24c.cpp
2 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\at24c.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\at24c.o: at24c.h
10 | .\objects\at24c.o: i2c.h
11 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/init.d:
--------------------------------------------------------------------------------
1 | .\objects\init.o: init.cpp
2 | .\objects\init.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\init.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\init.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\init.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\init.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\init.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\init.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\init.o: init.h
10 | .\objects\init.o: config.h
11 | .\objects\init.o: interrupt.h
12 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/at24c.d:
--------------------------------------------------------------------------------
1 | .\objects\at24c.o: at24c.cpp
2 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\at24c.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\at24c.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\at24c.o: at24c.h
10 | .\objects\at24c.o: i2c.h
11 | .\objects\at24c.o: delay.h
12 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/system_stm32f3xx.d:
--------------------------------------------------------------------------------
1 | .\objects\system_stm32f3xx.o: RTE\Device\STM32F373CC\system_stm32f3xx.c
2 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/system_stm32f3xx.d:
--------------------------------------------------------------------------------
1 | .\objects\system_stm32f3xx.o: RTE\Device\STM32F373CC\system_stm32f3xx.c
2 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\system_stm32f3xx.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/interrupt.d:
--------------------------------------------------------------------------------
1 | .\objects\interrupt.o: interrupt.cpp
2 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\interrupt.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\interrupt.o: interrupt.h
10 | .\objects\interrupt.o: config.h
11 | .\objects\interrupt.o: uart.h
12 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/uart.d:
--------------------------------------------------------------------------------
1 | .\objects\uart.o: uart.cpp
2 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\uart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\uart.o: uart.h
10 | .\objects\uart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
11 | .\objects\uart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdarg.h
12 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/uart.d:
--------------------------------------------------------------------------------
1 | .\objects\uart.o: uart.cpp
2 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\uart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\uart.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\uart.o: uart.h
10 | .\objects\uart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
11 | .\objects\uart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdarg.h
12 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/sdadc.d:
--------------------------------------------------------------------------------
1 | .\objects\sdadc.o: sdadc.cpp
2 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\sdadc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\sdadc.o: sdadc.h
10 | .\objects\sdadc.o: delay.h
11 | .\objects\sdadc.o: config.h
12 | .\objects\sdadc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
13 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/sdadc.d:
--------------------------------------------------------------------------------
1 | .\objects\sdadc.o: sdadc.cpp
2 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\sdadc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\sdadc.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\sdadc.o: sdadc.h
10 | .\objects\sdadc.o: delay.h
11 | .\objects\sdadc.o: config.h
12 | .\objects\sdadc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
13 |
--------------------------------------------------------------------------------
/firmware-multimeter/main.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "init.h"
9 | #include "delay.h"
10 | #include "sdadc.h"
11 | #include "interrupt.h"
12 | #include "config.h"
13 | #include "draw.h"
14 |
15 | int main(void)
16 | {
17 | init_RCC();
18 | init_GPIO();
19 | LED_NONE;
20 | init_EXTI();
21 | _delay_init();
22 | SDADC_init();
23 | init_TIM3();
24 | init_BKP();
25 | init_TIM2();
26 |
27 | drawSplashScreen(); //this function also contains init for UART, EEPROM and ADC1
28 | _delay_ms(SPLASH_SCREEN_DUR);
29 |
30 | SDADC_start();
31 |
32 | while (1)
33 | {
34 | drawScreen();
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/sdadc3.d:
--------------------------------------------------------------------------------
1 | .\objects\sdadc3.o: sdadc3.cpp
2 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\sdadc3.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\sdadc3.o: sdadc3.h
10 | .\objects\sdadc3.o: delay.h
11 | .\objects\sdadc3.o: config.h
12 | .\objects\sdadc3.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
13 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/main.d:
--------------------------------------------------------------------------------
1 | .\objects\main.o: main.cpp
2 | .\objects\main.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\main.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\main.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\main.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\main.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\main.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\main.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\main.o: init.h
10 | .\objects\main.o: delay.h
11 | .\objects\main.o: sdadc.h
12 | .\objects\main.o: interrupt.h
13 | .\objects\main.o: config.h
14 | .\objects\main.o: draw.h
15 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/sdadc3.d:
--------------------------------------------------------------------------------
1 | .\objects\sdadc3.o: sdadc3.cpp
2 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\sdadc3.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\sdadc3.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\sdadc3.o: sdadc3.h
10 | .\objects\sdadc3.o: delay.h
11 | .\objects\sdadc3.o: config.h
12 | .\objects\sdadc3.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
13 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/interrupt.d:
--------------------------------------------------------------------------------
1 | .\objects\interrupt.o: interrupt.cpp
2 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\interrupt.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\interrupt.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\interrupt.o: interrupt.h
10 | .\objects\interrupt.o: config.h
11 | .\objects\interrupt.o: uart.h
12 | .\objects\interrupt.o: delay.h
13 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/ctest.d:
--------------------------------------------------------------------------------
1 | .\objects\ctest.o: ctest.cpp
2 | .\objects\ctest.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\ctest.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\ctest.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\ctest.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\ctest.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\ctest.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\ctest.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\ctest.o: config.h
10 | .\objects\ctest.o: ctest.h
11 | .\objects\ctest.o: delay.h
12 | .\objects\ctest.o: adc.h
13 | .\objects\ctest.o: uart.h
14 | .\objects\ctest.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
15 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/draw.d:
--------------------------------------------------------------------------------
1 | .\objects\draw.o: draw.cpp
2 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\draw.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\draw.o: draw.h
10 | .\objects\draw.o: delay.h
11 | .\objects\draw.o: config.h
12 | .\objects\draw.o: uart.h
13 | .\objects\draw.o: lcd_5110/5110.h
14 | .\objects\draw.o: lcd_5110/fonts/lato_9pt.h
15 | .\objects\draw.o: lcd_5110/fonts/Lato_Heavy_16.h
16 | .\objects\draw.o: lcd_5110/fonts/Lato_Heavy_28.h
17 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/main.d:
--------------------------------------------------------------------------------
1 | .\objects\main.o: main.cpp
2 | .\objects\main.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\main.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\main.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\main.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\main.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\main.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\main.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\main.o: init.h
10 | .\objects\main.o: delay.h
11 | .\objects\main.o: config.h
12 | .\objects\main.o: uart.h
13 | .\objects\main.o: at24c.h
14 | .\objects\main.o: lcd_5110/5110.h
15 | .\objects\main.o: lcd_5110/fonts/lato_9pt.h
16 | .\objects\main.o: lcd_5110/fonts/Lato_Heavy_16.h
17 | .\objects\main.o: lcd_5110/fonts/Lato_Heavy_28.h
18 |
--------------------------------------------------------------------------------
/firmware-calibration/Objects/5110.d:
--------------------------------------------------------------------------------
1 | .\objects\5110.o: lcd_5110\5110.cpp
2 | .\objects\5110.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h
3 | .\objects\5110.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
4 | .\objects\5110.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
5 | .\objects\5110.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdarg.h
6 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
7 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
8 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
9 | .\objects\5110.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
10 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
11 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
12 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
13 | .\objects\5110.o: lcd_5110\5110.h
14 | .\objects\5110.o: lcd_5110\..\delay.h
15 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/5110.d:
--------------------------------------------------------------------------------
1 | .\objects\5110.o: lcd_5110\5110.cpp
2 | .\objects\5110.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h
3 | .\objects\5110.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h
4 | .\objects\5110.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
5 | .\objects\5110.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdarg.h
6 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
7 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
8 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
9 | .\objects\5110.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
10 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
11 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
12 | .\objects\5110.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
13 | .\objects\5110.o: lcd_5110\5110.h
14 | .\objects\5110.o: lcd_5110\..\delay.h
15 |
--------------------------------------------------------------------------------
/firmware-multimeter/Objects/draw.d:
--------------------------------------------------------------------------------
1 | .\objects\draw.o: draw.cpp
2 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f3xx.h
3 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\stm32f373xc.h
4 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\core_cm4.h
5 | .\objects\draw.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
6 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_compiler.h
7 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include\cmsis_armcc.h
8 | .\objects\draw.o: C:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include\system_stm32f3xx.h
9 | .\objects\draw.o: draw.h
10 | .\objects\draw.o: delay.h
11 | .\objects\draw.o: config.h
12 | .\objects\draw.o: adc.h
13 | .\objects\draw.o: ctest.h
14 | .\objects\draw.o: uart.h
15 | .\objects\draw.o: at24c.h
16 | .\objects\draw.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
17 | .\objects\draw.o: lcd_5110/5110.h
18 | .\objects\draw.o: lcd_5110/fonts/lato_9pt.h
19 | .\objects\draw.o: lcd_5110/fonts/Lato_Heavy_16.h
20 | .\objects\draw.o: lcd_5110/fonts/Lato_Heavy_28.h
21 |
--------------------------------------------------------------------------------
/firmware-calibration/sdadc3.cpp:
--------------------------------------------------------------------------------
1 | #include "stm32f3xx.h"
2 | #include "sdadc3.h"
3 | #include "delay.h"
4 | #include "config.h"
5 | #include "math.h"
6 |
7 | void SDADC3_init(void)
8 | {
9 | RCC->APB2ENR |= RCC_APB2ENR_SDADC3EN;
10 | PWR->CR |= PWR_CR_SDADC3EN;
11 |
12 | //setup GPIO for analogue mode
13 | GPIOB->MODER |= GPIO_MODER_MODER14 | GPIO_MODER_MODER15;
14 |
15 | //turn on
16 | SDADC3->CR2 |= SDADC_CR2_ADON;
17 |
18 | _delay_us(100);
19 |
20 | //enter init mode
21 | SDADC3->CR1 |= SDADC_CR1_INIT;
22 |
23 | _delay_us(100);
24 |
25 | SDADC3->CR2 |= SDADC_CR2_RCONT; //continuous mode
26 |
27 | SDADC3->CR2 |= (8 << 16); //select channel 8 (voltage) for SDADC1
28 |
29 | SDADC3->CR2 |= SDADC_CR2_FAST; //FAST mode
30 |
31 | SDADC3->CONF0R |= SDADC_CONF0R_COMMON0_0; //set common mode for calibration
32 |
33 | //exit initialization mode
34 | SDADC3->CR1 &= ~SDADC_CR1_INIT;
35 |
36 | //start calibration
37 | SDADC3->CR2 |= SDADC_CR2_STARTCALIB;
38 | while (SDADC3->ISR & SDADC_ISR_CALIBIP);
39 | }
40 |
41 | void SDADC3_start(void)
42 | {
43 | SDADC3->CR2 |= SDADC_CR2_RSWSTART;
44 | }
45 |
--------------------------------------------------------------------------------
/firmware-multimeter/sdadc3.cpp:
--------------------------------------------------------------------------------
1 | #include "stm32f3xx.h"
2 | #include "sdadc3.h"
3 | #include "delay.h"
4 | #include "config.h"
5 | #include "math.h"
6 |
7 | void SDADC3_init(void)
8 | {
9 | RCC->APB2ENR |= RCC_APB2ENR_SDADC3EN;
10 | PWR->CR |= PWR_CR_SDADC3EN;
11 |
12 | //setup GPIO for analogue mode
13 | GPIOB->MODER |= GPIO_MODER_MODER14 | GPIO_MODER_MODER15;
14 |
15 | //turn on
16 | SDADC3->CR2 |= SDADC_CR2_ADON;
17 |
18 | _delay_us(100);
19 |
20 | //enter init mode
21 | SDADC3->CR1 |= SDADC_CR1_INIT;
22 |
23 | _delay_us(100);
24 |
25 | SDADC3->CR2 |= SDADC_CR2_RCONT; //continuous mode
26 |
27 | SDADC3->CR2 |= (8 << 16); //select channel 8 (voltage) for SDADC1
28 |
29 | SDADC3->CR2 |= SDADC_CR2_FAST; //FAST mode
30 |
31 | SDADC3->CONF0R |= SDADC_CONF0R_COMMON0_0; //set common mode for calibration
32 |
33 | //exit initialization mode
34 | SDADC3->CR1 &= ~SDADC_CR1_INIT;
35 |
36 | //start calibration
37 | SDADC3->CR2 |= SDADC_CR2_STARTCALIB;
38 | while (SDADC3->ISR & SDADC_ISR_CALIBIP);
39 | }
40 |
41 | void SDADC3_start(void)
42 | {
43 | SDADC3->CR2 |= SDADC_CR2_RSWSTART;
44 | }
45 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Martin Danek
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/firmware-multimeter/adc.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "adc.h"
9 | #include "config.h"
10 |
11 | void adc1_init(void)
12 | {
13 | //enable ADC clock
14 | RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
15 |
16 | //pins PA0:2, PB1 as analog
17 | GPIOA->MODER |= GPIO_MODER_MODER0 | GPIO_MODER_MODER1 | GPIO_MODER_MODER2;
18 | GPIOB->MODER |= GPIO_MODER_MODER1;
19 |
20 | //sample time 239.5 cycles for channels 0:2
21 | ADC1->SMPR2 |= (7 << 0) | (7 << 3) | (7 << 6) | (7 << 24);
22 |
23 | //wake up ADC
24 | ADC1->CR2 |= ADC_CR2_ADON;
25 |
26 | //clear ADC calibration
27 | ADC1->CR2 |= ADC_CR2_RSTCAL;
28 |
29 | //launch ADC calibration
30 | ADC1->CR2 |= ADC_CR2_CAL;
31 |
32 | //wait for calibration complete
33 | while ((ADC1->CR2 & ADC_CR2_CAL) == ADC_CR2_CAL);
34 | }
35 |
36 | uint16_t adc1_getReading(uint8_t channel, uint8_t oversamplig)
37 | {
38 | uint32_t data = 0;
39 |
40 | ADC1->SQR3 = channel;
41 |
42 | for (uint8_t i = 0; i < oversamplig; i ++)
43 | {
44 | ADC1->CR2 |= ADC_CR2_ADON; //second ADON write = start conversion
45 | while ((ADC1->SR & ADC_SR_EOC) != ADC_SR_EOC); //wait for conversion complete
46 | data += ADC1->DR; //get data
47 | }
48 |
49 | return (data / oversamplig);
50 | }
51 |
--------------------------------------------------------------------------------
/firmware-calibration/uart.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "uart.h"
9 | #include
10 | #include
11 |
12 | #define UART_MSG_MAXLEN 128
13 | char bufferTX[UART_MSG_MAXLEN];
14 | volatile uint8_t TXPos;
15 | volatile bool TX;
16 |
17 | void uart_init(void)
18 | {
19 | //enable clock
20 | RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
21 |
22 | //setup GPIO: PA9 as TX, PA10 as RX
23 | GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1;
24 | GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR10;
25 | GPIOA->AFR[1] |= (7 << 4) | (7 << 8);
26 |
27 | USART1->BRR = (468 << 4) | (12 << 0); //BAUD 9600 @ F_CPU 72 Mhz
28 | //72000000 : (16 * 9600)
29 |
30 | //enable the USART, transmitter and receiver, and also the interrupt vector
31 | USART1->CR1 |= USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
32 | }
33 |
34 | void uart_char(char ch)
35 | {
36 | USART1->TDR = ch;
37 |
38 | while ((USART1->ISR & USART_ISR_TXE) != USART_ISR_TXE);
39 | }
40 |
41 | void uart_print(char *msg)
42 | {
43 | while(*msg) uart_char(*msg++);
44 | }
45 |
46 | void uart_printf(char *szFormat, ...)
47 | {
48 | while (TX);
49 | va_list pArgs;
50 | va_start(pArgs, szFormat);
51 | vsnprintf(bufferTX, UART_MSG_MAXLEN - 1, szFormat, pArgs);
52 | va_end(pArgs);
53 |
54 | uart_print(bufferTX);
55 | }
56 |
--------------------------------------------------------------------------------
/firmware-multimeter/uart.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "uart.h"
9 | #include
10 | #include
11 |
12 | #define UART_MSG_MAXLEN 128
13 | char bufferTX[UART_MSG_MAXLEN];
14 | volatile uint8_t TXPos;
15 | volatile bool TX;
16 |
17 | void uart_init(void)
18 | {
19 | //enable clock
20 | RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
21 |
22 | //setup GPIO: PA9 as TX, PA10 as RX
23 | GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1;
24 | GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR10;
25 | GPIOA->AFR[1] |= (7 << 4) | (7 << 8);
26 |
27 | USART1->BRR = (468 << 4) | (12 << 0); //BAUD 9600 @ F_CPU 72 Mhz
28 | //72000000 : (16 * 9600)
29 |
30 | //enable the USART, transmitter and receiver, and also the interrupt vector
31 | USART1->CR1 |= USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
32 | }
33 |
34 | void uart_char(char ch)
35 | {
36 | USART1->TDR = ch;
37 |
38 | while ((USART1->ISR & USART_ISR_TXE) != USART_ISR_TXE);
39 | }
40 |
41 | void uart_print(char *msg)
42 | {
43 | while(*msg) uart_char(*msg++);
44 | }
45 |
46 | void uart_printf(char *szFormat, ...)
47 | {
48 | while (TX);
49 | va_list pArgs;
50 | va_start(pArgs, szFormat);
51 | vsnprintf(bufferTX, UART_MSG_MAXLEN - 1, szFormat, pArgs);
52 | va_end(pArgs);
53 |
54 | uart_print(bufferTX);
55 | }
56 |
--------------------------------------------------------------------------------
/firmware-calibration/delay.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "delay.h"
9 |
10 | void _delay_ms(uint16_t ms)
11 | {
12 | ms *= 10;
13 |
14 | //set prescaler (7199 + 1)
15 | TIM4->PSC = 7199;
16 |
17 | //update registers
18 | TIM4->EGR |= TIM_EGR_UG;
19 |
20 | //zero the counter
21 | TIM4->CNT = 0x00;
22 |
23 | //enable timer
24 | TIM4->CR1 |= TIM_CR1_CEN;
25 |
26 | //wait for compare
27 | while (ms > TIM4->CNT);
28 |
29 | //disable timer
30 | TIM4->CR1 &=~TIM_CR1_CEN;
31 | }
32 |
33 | void _delay_us(uint16_t us)
34 | {
35 | //set prescaler (71 + 1)
36 | TIM4->PSC = 71;
37 |
38 | //update registers
39 | TIM4->EGR |= TIM_EGR_UG;
40 |
41 | //zero the counter
42 | TIM4->CNT = 0x00;
43 |
44 | //enable timer
45 | TIM4->CR1 |= TIM_CR1_CEN;
46 |
47 | //wait for compare
48 | while (us > TIM4->CNT);
49 |
50 | //disable timer
51 | TIM4->CR1 &=~TIM_CR1_CEN;
52 | }
53 |
54 | void _delay_init(void)
55 | {
56 | //enable clock to Timer 4
57 | RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
58 | }
59 |
60 | void _count_us_start(void)
61 | {
62 | //set prescaler (63 + 1)
63 | TIM4->PSC = 72;
64 |
65 | //update registers
66 | TIM4->EGR |= TIM_EGR_UG;
67 |
68 | //zero the counter
69 | TIM4->CNT = 0x00;
70 |
71 | //enable timer
72 | TIM4->CR1 |= TIM_CR1_CEN;
73 | }
74 |
75 | uint16_t _count_us_stop(void)
76 | {
77 | //disable timer
78 | TIM4->CR1 &=~TIM_CR1_CEN;
79 |
80 | return TIM4->CNT;
81 | }
82 |
--------------------------------------------------------------------------------
/firmware-multimeter/delay.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "delay.h"
9 |
10 | void _delay_ms(uint16_t ms)
11 | {
12 | ms *= 10;
13 |
14 | //set prescaler (7199 + 1)
15 | TIM4->PSC = 7199;
16 |
17 | //update registers
18 | TIM4->EGR |= TIM_EGR_UG;
19 |
20 | //zero the counter
21 | TIM4->CNT = 0x00;
22 |
23 | //enable timer
24 | TIM4->CR1 |= TIM_CR1_CEN;
25 |
26 | //wait for compare
27 | while (ms > TIM4->CNT);
28 |
29 | //disable timer
30 | TIM4->CR1 &=~TIM_CR1_CEN;
31 | }
32 |
33 | void _delay_us(uint16_t us)
34 | {
35 | //set prescaler (71 + 1)
36 | TIM4->PSC = 71;
37 |
38 | //update registers
39 | TIM4->EGR |= TIM_EGR_UG;
40 |
41 | //zero the counter
42 | TIM4->CNT = 0x00;
43 |
44 | //enable timer
45 | TIM4->CR1 |= TIM_CR1_CEN;
46 |
47 | //wait for compare
48 | while (us > TIM4->CNT);
49 |
50 | //disable timer
51 | TIM4->CR1 &=~TIM_CR1_CEN;
52 | }
53 |
54 | void _delay_init(void)
55 | {
56 | //enable clock to Timer 4
57 | RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
58 | }
59 |
60 | void _count_us_start(void)
61 | {
62 | //set prescaler (63 + 1)
63 | TIM4->PSC = 72;
64 |
65 | //update registers
66 | TIM4->EGR |= TIM_EGR_UG;
67 |
68 | //zero the counter
69 | TIM4->CNT = 0x00;
70 |
71 | //enable timer
72 | TIM4->CR1 |= TIM_CR1_CEN;
73 | }
74 |
75 | uint16_t _count_us_stop(void)
76 | {
77 | //disable timer
78 | TIM4->CR1 &=~TIM_CR1_CEN;
79 |
80 | return TIM4->CNT;
81 | }
82 |
--------------------------------------------------------------------------------
/firmware-multimeter/i2c.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "i2c.h"
9 | #include "delay.h"
10 |
11 | uint8_t TXbuffer[TX_BUFFER_SIZE];
12 | uint8_t TXpos;
13 | uint8_t RXbuffer[RX_BUFFER_SIZE];
14 |
15 | void i2c_init()
16 | {
17 | //enable clock
18 | RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
19 |
20 | //set GPIO to alternate mode, high speed, open drain
21 | GPIOB->MODER |= GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1;
22 | GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR9;
23 | GPIOB->AFR[1] |= (4 << 0) | (4 << 4);
24 | GPIOB->OTYPER |= GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_9;
25 |
26 | //set timings (SCLL, SCLH, SDADEL, SCLDEL)
27 | I2C1->TIMINGR = (0x9 << 0) | (0x3 << 8) | (0x1 << 16) | (0x3 << 20);
28 |
29 | //enable peripheral
30 | I2C1->CR1 |= I2C_CR1_PE;
31 | }
32 |
33 | void i2c_setSlaveAddress(uint8_t add)
34 | {
35 | I2C1->CR2 = ((add & 0x7F) << 1);
36 | }
37 |
38 | void i2c_writeBuffer(uint8_t data)
39 | {
40 | TXbuffer[TXpos++] = data;
41 | }
42 |
43 | void i2c_transmit()
44 | {
45 | //set the NBYTES
46 | I2C1->CR2 |= (TXpos << 16) | (I2C_CR2_AUTOEND);
47 |
48 | //send start & address
49 | I2C1->CR2 |= I2C_CR2_START;
50 |
51 | //send data
52 | for (uint8_t pos = 0; pos < TXpos; pos++)
53 | {
54 | I2C1->TXDR = TXbuffer[pos];
55 |
56 | while ((I2C1->ISR & I2C_ISR_TXE) == 0);
57 | }
58 |
59 | TXpos = 0;
60 | }
61 |
62 | void i2c_request(uint8_t bytes)
63 | {
64 | //set the NBYTES
65 | I2C1->CR2 |= (bytes << 16) | (I2C_CR2_AUTOEND) | (I2C_CR2_RD_WRN);
66 |
67 | //send start & address
68 | I2C1->CR2 |= I2C_CR2_START;
69 |
70 | //receive data
71 | for (uint8_t pos = 0; pos < bytes; pos++)
72 | {
73 | while ((I2C1->ISR & I2C_ISR_RXNE) == 0);
74 |
75 | RXbuffer[pos] = I2C1->RXDR;
76 | }
77 | }
78 |
79 | uint8_t i2c_readBuffer(uint8_t pos)
80 | {
81 | return RXbuffer[pos];
82 | }
83 |
--------------------------------------------------------------------------------
/firmware-calibration/i2c.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "i2c.h"
9 | #include "delay.h"
10 |
11 | uint8_t TXbuffer[TX_BUFFER_SIZE];
12 | uint8_t TXpos;
13 | uint8_t RXbuffer[RX_BUFFER_SIZE];
14 |
15 | void i2c_init()
16 | {
17 | //enable clock
18 | RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
19 |
20 | //set GPIO to alternate mode, high speed, open drain
21 | GPIOB->MODER |= GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1;
22 | GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8 | GPIO_OSPEEDER_OSPEEDR9;
23 | GPIOB->AFR[1] |= (4 << 0) | (4 << 4);
24 | GPIOB->OTYPER |= GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_9;
25 |
26 | //set timings (SCLL, SCLH, SDADEL, SCLDEL)
27 | I2C1->TIMINGR = (0x9 << 0) | (0x3 << 8) | (0x1 << 16) | (0x3 << 20);
28 |
29 | //enable peripheral
30 | I2C1->CR1 |= I2C_CR1_PE;
31 | }
32 |
33 | void i2c_setSlaveAddress(uint8_t add)
34 | {
35 | I2C1->CR2 = ((add & 0x7F) << 1);
36 | }
37 |
38 | void i2c_writeBuffer(uint8_t data)
39 | {
40 | TXbuffer[TXpos++] = data;
41 | }
42 |
43 | void i2c_transmit()
44 | {
45 | //set the NBYTES
46 | I2C1->CR2 |= (TXpos << 16) | (I2C_CR2_AUTOEND);
47 |
48 | //send start & address
49 | I2C1->CR2 |= I2C_CR2_START;
50 |
51 | //send data
52 | for (uint8_t pos = 0; pos < TXpos; pos++)
53 | {
54 | I2C1->TXDR = TXbuffer[pos];
55 |
56 | while ((I2C1->ISR & I2C_ISR_TXE) == 0);
57 | }
58 |
59 | TXpos = 0;
60 | }
61 |
62 | void i2c_request(uint8_t bytes)
63 | {
64 | //set the NBYTES
65 | I2C1->CR2 |= (bytes << 16) | (I2C_CR2_AUTOEND) | (I2C_CR2_RD_WRN);
66 |
67 | //send start & address
68 | I2C1->CR2 |= I2C_CR2_START;
69 |
70 | //receive data
71 | for (uint8_t pos = 0; pos < bytes; pos++)
72 | {
73 | while ((I2C1->ISR & I2C_ISR_RXNE) == 0);
74 |
75 | RXbuffer[pos] = I2C1->RXDR;
76 | }
77 | }
78 |
79 | uint8_t i2c_readBuffer(uint8_t pos)
80 | {
81 | return RXbuffer[pos];
82 | }
83 |
--------------------------------------------------------------------------------
/firmware-calibration/Listings/init.txt:
--------------------------------------------------------------------------------
1 | ; generated by Component: ARM Compiler 5.06 update 4 (build 422) Tool: ArmCC [4d3604]
2 | ; commandline ArmCC [--cpp --list --split_sections --debug -c --asm --interleave -o.\objects\init.o --asm_dir=.\Listings\ --list_dir=.\Listings\ --depend=.\objects\init.d --cpu=Cortex-M4.fp --apcs=interwork -O0 --diag_suppress=9931 -IC:\Users\marti\Documents\STM32CubeMX\OL_DVM_v14\RTE\_V14 -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include -D__UVISION_VERSION=522 -D_RTE_ -DSTM32F373xC --omf_browse=.\objects\init.crf init.cpp]
3 | THUMB
4 |
5 | AREA ||i._Z8init_RCCv||, CODE, READONLY, ALIGN=1
6 |
7 | _Z8init_RCCv PROC ; init_RCC()
8 | ;;;3
9 | ;;;4 void init_RCC(void)
10 | 000000 4770 BX lr
11 | ;;;5 {
12 | ;;;6
13 | ;;;7 }
14 | ENDP
15 |
16 |
17 | AREA ||.ARM.exidx||, LINKORDER=||i._Z8init_RCCv||, DATA, READONLY, SECTYPE={SHT_ARM_EXIDX}, ALIGN=2
18 |
19 | DCD 0x00000000
20 | RELOC 42, ||i._Z8init_RCCv||
21 | DCD 0x00000001
22 |
23 | ;*** Start embedded assembler ***
24 |
25 | #line 1 "init.cpp"
26 | AREA ||.rev16_text||, CODE
27 | THUMB
28 | EXPORT |__asm___8_init_cpp_a49ae38c___Z7__REV16j|
29 | #line 441 "C:\\Keil_v5\\ARM\\PACK\\ARM\\CMSIS\\5.0.0\\CMSIS\\Include\\cmsis_armcc.h"
30 | |__asm___8_init_cpp_a49ae38c___Z7__REV16j| PROC
31 | #line 442
32 |
33 | rev16 r0, r0
34 | bx lr
35 | ENDP
36 | AREA ||.revsh_text||, CODE
37 | THUMB
38 | EXPORT |__asm___8_init_cpp_a49ae38c___Z7__REVSHi|
39 | #line 456
40 | |__asm___8_init_cpp_a49ae38c___Z7__REVSHi| PROC
41 | #line 457
42 |
43 | revsh r0, r0
44 | bx lr
45 | ENDP
46 | AREA ||.rrx_text||, CODE
47 | THUMB
48 | EXPORT |__asm___8_init_cpp_a49ae38c___Z5__RRXj|
49 | #line 643
50 | |__asm___8_init_cpp_a49ae38c___Z5__RRXj| PROC
51 | #line 644
52 |
53 | rrx r0, r0
54 | bx lr
55 | ENDP
56 |
57 | ;*** End embedded assembler ***
58 |
--------------------------------------------------------------------------------
/firmware-multimeter/Listings/init.txt:
--------------------------------------------------------------------------------
1 | ; generated by Component: ARM Compiler 5.06 update 4 (build 422) Tool: ArmCC [4d3604]
2 | ; commandline ArmCC [--cpp --list --split_sections --debug -c --asm --interleave -o.\objects\init.o --asm_dir=.\Listings\ --list_dir=.\Listings\ --depend=.\objects\init.d --cpu=Cortex-M4.fp --apcs=interwork -O0 --diag_suppress=9931 -IC:\Users\marti\Documents\STM32CubeMX\OL_DVM_v14\RTE\_V14 -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include -D__UVISION_VERSION=522 -D_RTE_ -DSTM32F373xC --omf_browse=.\objects\init.crf init.cpp]
3 | THUMB
4 |
5 | AREA ||i._Z8init_RCCv||, CODE, READONLY, ALIGN=1
6 |
7 | _Z8init_RCCv PROC ; init_RCC()
8 | ;;;3
9 | ;;;4 void init_RCC(void)
10 | 000000 4770 BX lr
11 | ;;;5 {
12 | ;;;6
13 | ;;;7 }
14 | ENDP
15 |
16 |
17 | AREA ||.ARM.exidx||, LINKORDER=||i._Z8init_RCCv||, DATA, READONLY, SECTYPE={SHT_ARM_EXIDX}, ALIGN=2
18 |
19 | DCD 0x00000000
20 | RELOC 42, ||i._Z8init_RCCv||
21 | DCD 0x00000001
22 |
23 | ;*** Start embedded assembler ***
24 |
25 | #line 1 "init.cpp"
26 | AREA ||.rev16_text||, CODE
27 | THUMB
28 | EXPORT |__asm___8_init_cpp_a49ae38c___Z7__REV16j|
29 | #line 441 "C:\\Keil_v5\\ARM\\PACK\\ARM\\CMSIS\\5.0.0\\CMSIS\\Include\\cmsis_armcc.h"
30 | |__asm___8_init_cpp_a49ae38c___Z7__REV16j| PROC
31 | #line 442
32 |
33 | rev16 r0, r0
34 | bx lr
35 | ENDP
36 | AREA ||.revsh_text||, CODE
37 | THUMB
38 | EXPORT |__asm___8_init_cpp_a49ae38c___Z7__REVSHi|
39 | #line 456
40 | |__asm___8_init_cpp_a49ae38c___Z7__REVSHi| PROC
41 | #line 457
42 |
43 | revsh r0, r0
44 | bx lr
45 | ENDP
46 | AREA ||.rrx_text||, CODE
47 | THUMB
48 | EXPORT |__asm___8_init_cpp_a49ae38c___Z5__RRXj|
49 | #line 643
50 | |__asm___8_init_cpp_a49ae38c___Z5__RRXj| PROC
51 | #line 644
52 |
53 | rrx r0, r0
54 | bx lr
55 | ENDP
56 |
57 | ;*** End embedded assembler ***
58 |
--------------------------------------------------------------------------------
/firmware-calibration/Listings/main.txt:
--------------------------------------------------------------------------------
1 | ; generated by Component: ARM Compiler 5.06 update 4 (build 422) Tool: ArmCC [4d3604]
2 | ; commandline ArmCC [--cpp --list --split_sections --debug -c --asm --interleave -o.\objects\main.o --asm_dir=.\Listings\ --list_dir=.\Listings\ --depend=.\objects\main.d --cpu=Cortex-M4.fp --apcs=interwork -O0 --diag_suppress=9931 -IC:\Users\marti\Documents\STM32CubeMX\OL_DVM_v14\RTE\_V14 -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include -D__UVISION_VERSION=522 -D_RTE_ -DSTM32F373xC --omf_browse=.\objects\main.crf main.cpp]
3 | THUMB
4 |
5 | AREA ||i.main||, CODE, READONLY, ALIGN=1
6 |
7 | main PROC
8 | ;;;3
9 | ;;;4 int main(void)
10 | 000000 bf00 NOP
11 | |L1.2|
12 | ;;;5 {
13 | ;;;6
14 | ;;;7
15 | ;;;8 while (1)
16 | 000002 e7fe B |L1.2|
17 | ;;;9 {
18 | ;;;10
19 | ;;;11 }
20 | ;;;12 }
21 | ENDP
22 |
23 |
24 | AREA ||.ARM.exidx||, LINKORDER=||i.main||, DATA, READONLY, SECTYPE={SHT_ARM_EXIDX}, ALIGN=2
25 |
26 | DCD 0x00000000
27 | RELOC 42, ||i.main||
28 | DCD 0x00000001
29 |
30 | ;*** Start embedded assembler ***
31 |
32 | #line 1 "main.cpp"
33 | AREA ||.rev16_text||, CODE
34 | THUMB
35 | EXPORT |__asm___8_main_cpp_main___Z7__REV16j|
36 | #line 441 "C:\\Keil_v5\\ARM\\PACK\\ARM\\CMSIS\\5.0.0\\CMSIS\\Include\\cmsis_armcc.h"
37 | |__asm___8_main_cpp_main___Z7__REV16j| PROC
38 | #line 442
39 |
40 | rev16 r0, r0
41 | bx lr
42 | ENDP
43 | AREA ||.revsh_text||, CODE
44 | THUMB
45 | EXPORT |__asm___8_main_cpp_main___Z7__REVSHi|
46 | #line 456
47 | |__asm___8_main_cpp_main___Z7__REVSHi| PROC
48 | #line 457
49 |
50 | revsh r0, r0
51 | bx lr
52 | ENDP
53 | AREA ||.rrx_text||, CODE
54 | THUMB
55 | EXPORT |__asm___8_main_cpp_main___Z5__RRXj|
56 | #line 643
57 | |__asm___8_main_cpp_main___Z5__RRXj| PROC
58 | #line 644
59 |
60 | rrx r0, r0
61 | bx lr
62 | ENDP
63 |
64 | ;*** End embedded assembler ***
65 |
66 | __ARM_use_no_argv EQU 0
67 |
--------------------------------------------------------------------------------
/firmware-calibration/config.h:
--------------------------------------------------------------------------------
1 | #ifndef _CONFIG_H
2 | #define _CONFIG_H
3 |
4 | //==========================================================================
5 | // USER SETTINGS - modify as you wish
6 | #define SCREEN_TRANSISTION_TIME 1000 //in ms, how long the intro to each screen is displayed
7 | #define SCREEN_UPDATE_RATE 2 //in Hz, how often is the measurement (V, I or P) screen refreshed
8 | #define CONTINUITY_REFRESH 10 //in Hz, how often is the continuity screen refreshed
9 |
10 | #define VREF 1.8f
11 |
12 | #define LED_RED GPIOB->BSRR = GPIO_BSRR_BS_6 | GPIO_BSRR_BR_7
13 | #define LED_GREEN GPIOB->BSRR = GPIO_BSRR_BR_6 | GPIO_BSRR_BS_7
14 | #define LED_NONE GPIOB->BSRR = GPIO_BSRR_BS_6 | GPIO_BSRR_BS_7
15 |
16 | //==========================================================================
17 | // SYSTEM SETTINGS - do not modify, unless you know what you're doing
18 | #define BUZZER_ON GPIOA->BSRR = GPIO_BSRR_BS_8
19 | #define BUZZER_OFF GPIOA->BSRR = GPIO_BSRR_BR_8
20 |
21 | #define VSEL0_LOW GPIOF->BSRR = GPIO_BSRR_BR_6
22 | #define VSEL0_HIGH GPIOF->BSRR = GPIO_BSRR_BS_6
23 | #define VSEL1_LOW GPIOF->BSRR = GPIO_BSRR_BR_7
24 | #define VSEL1_HIGH GPIOF->BSRR = GPIO_BSRR_BS_7
25 |
26 | #define ISEL_HIGH GPIOB->BSRR = GPIO_BSRR_BS_2
27 | #define ISEL_LOW GPIOB->BSRR = GPIO_BSRR_BR_2
28 |
29 | #define OFSEL_GND GPIOA->BSRR = GPIO_BSRR_BS_12
30 | #define OFSEL_VREF2 GPIOA->BSRR = GPIO_BSRR_BR_12
31 |
32 | #define MODE_VOLTAGE 0
33 | #define MODE_CURRENT 1
34 | #define MODE_POWER 2
35 | #define MODE_CONT 3
36 | #define MODE_COMPTEST 4
37 | #define MODE_ABOUT 5
38 | #define MODES 6
39 |
40 | #define DATA_SAVED 0xC0
41 |
42 | //==========================================================================
43 | // DEBUG SETTINGS - used mostly for development
44 | #define DEBUG_IO
45 |
46 | #ifdef DEBUG_IO
47 | #define PB8_LOW GPIOB->BSRR = GPIO_BSRR_BR_8
48 | #define PB8_HIGH GPIOB->BSRR = GPIO_BSRR_BS_8
49 | #define PB9_LOW GPIOB->BSRR = GPIO_BSRR_BR_9
50 | #define PB9_HIGH GPIOB->BSRR = GPIO_BSRR_BS_9
51 | #else
52 | #define PB8_LOW
53 | #define PB8_HIGH
54 | #define PB9_LOW
55 | #define PB9_HIGH
56 | #endif
57 |
58 | #endif
59 |
--------------------------------------------------------------------------------
/firmware-multimeter/Listings/main.txt:
--------------------------------------------------------------------------------
1 | ; generated by Component: ARM Compiler 5.06 update 4 (build 422) Tool: ArmCC [4d3604]
2 | ; commandline ArmCC [--cpp --list --split_sections --debug -c --asm --interleave -o.\objects\main.o --asm_dir=.\Listings\ --list_dir=.\Listings\ --depend=.\objects\main.d --cpu=Cortex-M4.fp --apcs=interwork -O0 --diag_suppress=9931 -IC:\Users\marti\Documents\STM32CubeMX\OL_DVM_v14\RTE\_V14 -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F3xx_DFP\1.3.0\Device\Include -D__UVISION_VERSION=522 -D_RTE_ -DSTM32F373xC --omf_browse=.\objects\main.crf main.cpp]
3 | THUMB
4 |
5 | AREA ||i.main||, CODE, READONLY, ALIGN=1
6 |
7 | main PROC
8 | ;;;3
9 | ;;;4 int main(void)
10 | 000000 bf00 NOP
11 | |L1.2|
12 | ;;;5 {
13 | ;;;6
14 | ;;;7
15 | ;;;8 while (1)
16 | 000002 e7fe B |L1.2|
17 | ;;;9 {
18 | ;;;10
19 | ;;;11 }
20 | ;;;12 }
21 | ENDP
22 |
23 |
24 | AREA ||.ARM.exidx||, LINKORDER=||i.main||, DATA, READONLY, SECTYPE={SHT_ARM_EXIDX}, ALIGN=2
25 |
26 | DCD 0x00000000
27 | RELOC 42, ||i.main||
28 | DCD 0x00000001
29 |
30 | ;*** Start embedded assembler ***
31 |
32 | #line 1 "main.cpp"
33 | AREA ||.rev16_text||, CODE
34 | THUMB
35 | EXPORT |__asm___8_main_cpp_main___Z7__REV16j|
36 | #line 441 "C:\\Keil_v5\\ARM\\PACK\\ARM\\CMSIS\\5.0.0\\CMSIS\\Include\\cmsis_armcc.h"
37 | |__asm___8_main_cpp_main___Z7__REV16j| PROC
38 | #line 442
39 |
40 | rev16 r0, r0
41 | bx lr
42 | ENDP
43 | AREA ||.revsh_text||, CODE
44 | THUMB
45 | EXPORT |__asm___8_main_cpp_main___Z7__REVSHi|
46 | #line 456
47 | |__asm___8_main_cpp_main___Z7__REVSHi| PROC
48 | #line 457
49 |
50 | revsh r0, r0
51 | bx lr
52 | ENDP
53 | AREA ||.rrx_text||, CODE
54 | THUMB
55 | EXPORT |__asm___8_main_cpp_main___Z5__RRXj|
56 | #line 643
57 | |__asm___8_main_cpp_main___Z5__RRXj| PROC
58 | #line 644
59 |
60 | rrx r0, r0
61 | bx lr
62 | ENDP
63 |
64 | ;*** End embedded assembler ***
65 |
66 | __ARM_use_no_argv EQU 0
67 |
--------------------------------------------------------------------------------
/firmware-multimeter/at24c.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "at24c.h"
9 | #include "i2c.h"
10 |
11 | uint8_t eeprom_address;
12 |
13 | void at24c_init(uint8_t dev_adress)
14 | {
15 | eeprom_address = dev_adress;
16 |
17 | i2c_init();
18 | }
19 |
20 | void at24c_write_byte(uint8_t address, uint8_t data)
21 | {
22 | i2c_setSlaveAddress(eeprom_address);
23 | i2c_writeBuffer(address);
24 | i2c_writeBuffer(data);
25 | i2c_transmit();
26 | }
27 |
28 | void at24c_write_page(uint8_t address, uint8_t data[8])
29 | {
30 | i2c_setSlaveAddress(eeprom_address);
31 | i2c_writeBuffer(address);
32 |
33 | for (uint8_t i = 0; i < 8; i ++)
34 | i2c_writeBuffer(data[i]);
35 |
36 | i2c_transmit();
37 | }
38 |
39 | uint8_t at24c_read_byte(uint8_t address)
40 | {
41 | i2c_setSlaveAddress(eeprom_address);
42 | i2c_writeBuffer(address);
43 | i2c_transmit();
44 |
45 | i2c_setSlaveAddress(eeprom_address);
46 | i2c_request(1);
47 |
48 | return i2c_readBuffer(0);
49 | }
50 |
51 | uint8_t* at24c_read_page(uint8_t address)
52 | {
53 | i2c_setSlaveAddress(eeprom_address);
54 | i2c_writeBuffer(address);
55 | i2c_transmit();
56 |
57 | i2c_setSlaveAddress(eeprom_address);
58 | i2c_request(8);
59 |
60 | static uint8_t page[8];
61 | for (uint8_t i = 0; i < 8; i ++)
62 | page[i] = i2c_readBuffer(i);
63 |
64 | return page;
65 | }
66 |
67 | void eeprom_save_floats(uint8_t address, float f0, float f1)
68 | {
69 | uint8_t *f0_ptr, *f1_ptr;
70 | uint8_t data[8], i;
71 |
72 | f0_ptr = (uint8_t*)&f0;
73 | f1_ptr = (uint8_t*)&f1;
74 | for (i = 0; i < 4; i ++)
75 | data[i] = (*f0_ptr++);
76 | for (; i < 8; i ++)
77 | data[i] = (*f1_ptr++);
78 |
79 | at24c_write_page(address, data);
80 | }
81 |
82 | void eeprom_read_floats(uint8_t address, float& f0, float& f1)
83 | {
84 | uint8_t* result_address;
85 | uint8_t i;
86 |
87 | result_address = at24c_read_page(address);
88 |
89 | for (i = 0; i < 4; i ++)
90 | *((uint8_t*)(&f0) + i) = *(result_address + i);
91 | for (i = 0; i < 4; i ++)
92 | *((uint8_t*)(&f1) + i) = *(result_address + i + 4);
93 |
94 | }
95 |
96 |
97 |
98 |
--------------------------------------------------------------------------------
/firmware-calibration/at24c.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "at24c.h"
9 | #include "i2c.h"
10 | #include "delay.h"
11 |
12 | uint8_t eeprom_address;
13 |
14 | void at24c_init(uint8_t dev_adress)
15 | {
16 | eeprom_address = dev_adress;
17 |
18 | i2c_init();
19 | }
20 |
21 | void at24c_write_byte(uint8_t address, uint8_t data)
22 | {
23 | i2c_setSlaveAddress(eeprom_address);
24 | i2c_writeBuffer(address);
25 | i2c_writeBuffer(data);
26 | i2c_transmit();
27 |
28 | _delay_ms(5);
29 | }
30 |
31 | void at24c_write_page(uint8_t address, uint8_t data[8])
32 | {
33 | i2c_setSlaveAddress(eeprom_address);
34 | i2c_writeBuffer(address);
35 |
36 | for (uint8_t i = 0; i < 8; i ++)
37 | i2c_writeBuffer(data[i]);
38 |
39 | i2c_transmit();
40 | }
41 |
42 | uint8_t at24c_read_byte(uint8_t address)
43 | {
44 | i2c_setSlaveAddress(eeprom_address);
45 | i2c_writeBuffer(address);
46 | i2c_transmit();
47 |
48 | i2c_setSlaveAddress(eeprom_address);
49 | i2c_request(1);
50 |
51 | return i2c_readBuffer(0);
52 | }
53 |
54 | uint8_t* at24c_read_page(uint8_t address)
55 | {
56 | i2c_setSlaveAddress(eeprom_address);
57 | i2c_writeBuffer(address);
58 | i2c_transmit();
59 |
60 | i2c_setSlaveAddress(eeprom_address);
61 | i2c_request(8);
62 |
63 | static uint8_t page[8];
64 | for (uint8_t i = 0; i < 8; i ++)
65 | page[i] = i2c_readBuffer(i);
66 |
67 | return page;
68 | }
69 |
70 | void eeprom_save_floats(uint8_t address, float f0, float f1)
71 | {
72 | uint8_t *f0_ptr, *f1_ptr;
73 | uint8_t data[8], i;
74 |
75 | f0_ptr = (uint8_t*)&f0;
76 | f1_ptr = (uint8_t*)&f1;
77 | for (i = 0; i < 4; i ++)
78 | data[i] = (*f0_ptr++);
79 | for (; i < 8; i ++)
80 | data[i] = (*f1_ptr++);
81 |
82 | at24c_write_page(address, data);
83 |
84 | _delay_ms(10);
85 | }
86 |
87 | void eeprom_read_floats(uint8_t address, float& f0, float& f1)
88 | {
89 | uint8_t* result_address;
90 | uint8_t i;
91 |
92 | result_address = at24c_read_page(address);
93 |
94 | for (i = 0; i < 4; i ++)
95 | *((uint8_t*)(&f0) + i) = *(result_address + i);
96 | for (i = 0; i < 4; i ++)
97 | *((uint8_t*)(&f1) + i) = *(result_address + i + 4);
98 |
99 | }
100 |
101 |
102 |
103 |
--------------------------------------------------------------------------------
/firmware-multimeter/interrupt.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "interrupt.h"
9 | #include "config.h"
10 | #include "uart.h"
11 | #include "delay.h"
12 |
13 | extern volatile bool aquisition, hold, rangeI;
14 | extern volatile uint8_t mode, screen_update;
15 | extern volatile uint8_t rangeV;
16 |
17 | extern "C"
18 | {
19 | void EXTI15_10_IRQHandler(void)
20 | {
21 | if ((EXTI->PR & EXTI_PR_PR11) != 0) //PA11 - button 'mode'
22 | {
23 | mode++;
24 | screen_update = true;
25 |
26 | if (mode >= MODES)
27 | mode = 0;
28 |
29 | RTC->BKP1R = mode;
30 | EXTI->PR |= EXTI_PR_PR11;
31 | }
32 |
33 | if ((EXTI->PR & EXTI_PR_PR13) != 0) //PC13 - button 'hold/stop'
34 | {
35 | hold = !hold;
36 |
37 | if (hold)
38 | LED_RED;
39 | else
40 | LED_GREEN;
41 |
42 | EXTI->PR |= EXTI_PR_PR13;
43 | }
44 |
45 | if ((EXTI->PR & EXTI_PR_PR14) != 0) //PC12 - button 'range'
46 | {
47 | if (mode == MODE_VOLTAGE)
48 | {
49 | rangeV++;
50 |
51 | if (rangeV > 3) rangeV = 0;
52 |
53 | setVoltageRange();
54 |
55 | RTC->BKP2R = rangeV;
56 | }
57 | else if (mode == MODE_CURRENT)
58 | {
59 | rangeI = !rangeI;
60 |
61 | setCurrentRange();
62 |
63 | RTC->BKP3R = rangeI;
64 | }
65 |
66 | EXTI->PR |= EXTI_PR_PR14;
67 | }
68 |
69 | if ((EXTI->PR & EXTI_PR_PR15) != 0) //PC11 - button 'DC/RMS'
70 | {
71 | aquisition = !aquisition;
72 |
73 | RTC->BKP4R = aquisition;
74 | EXTI->PR |= EXTI_PR_PR15;
75 | }
76 | }
77 | }
78 |
79 | void setVoltageRange(void)
80 | {
81 | switch (rangeV)
82 | {
83 | case 0: //60 V range
84 | VSEL0_LOW;
85 | VSEL1_LOW;
86 | SDADC2->CR2 &=~SDADC_CR2_ADON;
87 | SDADC2->CONFCHR2 = 0x00;
88 | SDADC2->CR2 |= SDADC_CR2_ADON;
89 | _delay_us(150);
90 | SDADC2->CR2 |= SDADC_CR2_RSWSTART;
91 | break;
92 | case 1: //6 V range
93 | VSEL0_HIGH;
94 | VSEL1_LOW;
95 | break;
96 | case 2: //600 mV range
97 | VSEL0_LOW;
98 | VSEL1_HIGH;
99 | break;
100 | case 3: //60 mV range
101 | VSEL0_LOW;
102 | VSEL1_HIGH;
103 | SDADC2->CR2 &=~SDADC_CR2_ADON;
104 | SDADC2->CONFCHR2 = 0x01;
105 | SDADC2->CR2 |= SDADC_CR2_ADON;
106 | _delay_us(150);
107 | SDADC2->CR2 |= SDADC_CR2_RSWSTART;
108 | break;
109 | default: break;
110 | }
111 | }
112 |
113 | void setCurrentRange(void)
114 | {
115 | if (rangeI)
116 | ISEL_HIGH;
117 | else
118 | ISEL_LOW;
119 | }
120 |
--------------------------------------------------------------------------------
/firmware-calibration/init.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "init.h"
9 | #include "config.h"
10 |
11 | void init_RCC(void)
12 | {
13 | RCC->CFGR |= RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR_PLLMUL9 | RCC_CFGR_PPRE1_DIV2;
14 | RCC->CR |= RCC_CR_HSEON | RCC_CR_PLLON;
15 | FLASH->ACR |= FLASH_ACR_LATENCY_1;
16 |
17 | while (!(RCC->CR & RCC_CR_PLLRDY));
18 |
19 | RCC->CFGR |= RCC_CFGR_SW_PLL;
20 | }
21 |
22 | void init_GPIO(void)
23 | {
24 | //enable GPIO clocks
25 | RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIODEN | RCC_AHBENR_GPIOEEN| RCC_AHBENR_GPIOFEN;
26 |
27 | //enable OFSEL on PA12
28 | GPIOA->MODER |= GPIO_MODER_MODER12_0;
29 | GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12;
30 |
31 | //enable buzzer on PA8
32 | GPIOA->MODER |= GPIO_MODER_MODER8_0;
33 | GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8;
34 |
35 | //enable VSEL on PF6:7
36 | GPIOF->MODER |= GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0;
37 | GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6 | GPIO_OSPEEDER_OSPEEDR7;
38 |
39 | //enable ISEL on PB2
40 | GPIOB->MODER |= GPIO_MODER_MODER2_0;
41 | GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2;
42 |
43 | //enable LED on PB6:7
44 | GPIOB->MODER |= GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0;
45 | GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6 | GPIO_OSPEEDER_OSPEEDR7;
46 | }
47 |
48 | void init_EXTI(void)
49 | {
50 | //button pins (PC13:15, PA11) - inputs with pullups
51 | GPIOC->PUPDR |= GPIO_PUPDR_PUPDR13_0 | GPIO_PUPDR_PUPDR14_0 | GPIO_PUPDR_PUPDR15_0;
52 | GPIOA->PUPDR |= GPIO_PUPDR_PUPDR11_0;
53 |
54 | RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
55 | SYSCFG->EXTICR[2] |= SYSCFG_EXTICR3_EXTI11_PA;
56 | SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI13_PC | SYSCFG_EXTICR4_EXTI14_PC | SYSCFG_EXTICR4_EXTI15_PC;
57 |
58 | EXTI->IMR |= EXTI_IMR_MR11 | EXTI_IMR_MR13 | EXTI_IMR_MR14 | EXTI_IMR_MR15;
59 | EXTI->FTSR |= EXTI_FTSR_TR11 | EXTI_FTSR_TR13 | EXTI_FTSR_TR14 | EXTI_FTSR_TR15;
60 |
61 | NVIC_SetPriority(EXTI15_10_IRQn, 7);
62 |
63 | NVIC_EnableIRQ(EXTI15_10_IRQn);
64 | }
65 |
66 | void init_TIM3(void) //used to update data
67 | {
68 | //enable clock to Timer 3
69 | RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
70 |
71 | //set prescaler (7.2k - 1)
72 | TIM3->PSC = 7199;
73 |
74 | //set auto-reload register
75 | TIM3->ARR = (10000/SCREEN_UPDATE_RATE);
76 |
77 | //update registers
78 | TIM3->EGR |= TIM_EGR_UG;
79 |
80 | //zero the counter
81 | TIM3->CNT = 0x00;
82 |
83 | //enable interrupt on timer overflow (aka update event)
84 | TIM3->DIER |= TIM_DIER_UIE;
85 |
86 | NVIC_SetPriority(TIM3_IRQn, 1);
87 | NVIC_EnableIRQ(TIM3_IRQn);
88 |
89 | //enable timer
90 | TIM3->CR1 |= TIM_CR1_CEN;
91 | }
92 |
93 |
--------------------------------------------------------------------------------
/firmware-calibration/main.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "init.h"
9 | #include "delay.h"
10 | #include "config.h"
11 | #include "uart.h"
12 | #include "at24c.h"
13 |
14 | #include "lcd_5110/5110.h"
15 | #include "lcd_5110/fonts/lato_9pt.h"
16 | #include "lcd_5110/fonts/Lato_Heavy_16.h"
17 | #include "lcd_5110/fonts/Lato_Heavy_28.h"
18 | LCD_5110 lcd;
19 |
20 | #define DATA_SAVED 0xC0
21 |
22 | uint8_t calibration_day = 21, calibration_month = 9, calibration_year = 19, calibration_temperature = 20;
23 |
24 | /*float gainV[4] = {0.00179685383230002, 0.00020376070289328, 0.02661292851990090, 0.00329895192147729};
25 | float offsetV[4] = {-0.11050651068644900, -0.00463333146790479, 0.15401938337034100, 2.11392447180170000};
26 | float gainI[2] = {0.00001887419809107, 0.00000413386486215};
27 | float offsetI[2] = {-0.00301374198091053, -0.00102421359418443};*/
28 |
29 | /*float gainV[4] = {0.00179558550639711, 0.00020388615216201, 0.02659555023843940, 0.00330470588235294};
30 | float offsetV[4] = {0.08580134778786430, 0.02470935960591180, -4.37169466460630000, -6.01810588235295000};
31 | float gainI[2] = {0.00009859652019566, 0.00941860465116279};
32 | float offsetI[2] = {-0.01055825266764380, -0.72674418604651300};*/
33 |
34 | float gainV[4] = {0.00179558550639711, 0.00020388615216201, 0.02659555023843940, 0.00330470588235294};
35 | float offsetV[4] = {0.08580134778786430, -0.00470935960591180, -6.32169466460630000, -8.01810588235295000};
36 | float gainI[2] = {0.00009859652019566, 0.00941860465116279};
37 | float offsetI[2] = {-0.01055825266764380, -0.72674418604651300};
38 |
39 | int main(void)
40 | {
41 | init_RCC();
42 | init_GPIO();
43 | LED_NONE;
44 | _delay_init();
45 | lcd.begin(80, 8);
46 | lcd.clearDisplay();
47 | lcd.setFont(&Lato_Heavy_16);
48 | lcd.printxy((char*)"EEPROM", 6, 14);
49 | lcd.printxy((char*)"WRITER", 9, 29);
50 | lcd.display();
51 |
52 | at24c_init(0x50);
53 |
54 | for (uint8_t i = 0; i < 4; i ++)
55 | eeprom_save_floats(8 + 8 * i, gainV[i], offsetV[i]);
56 | for (uint8_t i = 0; i < 2; i ++)
57 | eeprom_save_floats(40 + 8 * i, gainI[i], offsetI[i]);
58 |
59 | at24c_write_byte(0, DATA_SAVED);
60 | at24c_write_byte(1, calibration_day);
61 | at24c_write_byte(2, calibration_month);
62 | at24c_write_byte(3, calibration_year);
63 | at24c_write_byte(4, calibration_temperature);
64 |
65 | _delay_ms(1000);
66 |
67 | uint8_t check = at24c_read_byte(0);
68 |
69 | if (check == DATA_SAVED)
70 | {
71 | LED_GREEN;
72 | lcd.printxy((char*)"DONE", 16, 44);
73 | }
74 | else
75 | {
76 | LED_RED;
77 | lcd.printxy((char*)"ERROR", 11, 44);
78 | }
79 | lcd.display();
80 |
81 | while (1)
82 | {
83 |
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/firmware-calibration/lcd_5110/5110.h:
--------------------------------------------------------------------------------
1 | #ifndef _ADAFRUIT_PCD8544_H
2 | #define _ADAFRUIT_PCD8544_H
3 |
4 | #include "stdint.h"
5 |
6 | #define BLACK 1
7 | #define WHITE 0
8 |
9 | #define LCDWIDTH 84
10 | #define LCDHEIGHT 48
11 |
12 | #define PCD8544_POWERDOWN 0x04
13 | #define PCD8544_ENTRYMODE 0x02
14 | #define PCD8544_EXTENDEDINSTRUCTION 0x01
15 |
16 | #define PCD8544_DISPLAYBLANK 0x0
17 | #define PCD8544_DISPLAYNORMAL 0x4
18 | #define PCD8544_DISPLAYALLON 0x1
19 | #define PCD8544_DISPLAYINVERTED 0x5
20 |
21 | // H = 0
22 | #define PCD8544_FUNCTIONSET 0x20
23 | #define PCD8544_DISPLAYCONTROL 0x08
24 | #define PCD8544_SETYADDR 0x40
25 | #define PCD8544_SETXADDR 0x80
26 |
27 | // H = 1
28 | #define PCD8544_SETTEMP 0x04
29 | #define PCD8544_SETBIAS 0x10
30 | #define PCD8544_SETVOP 0x80
31 |
32 | //PIN DEFINITIONS
33 | #define RST_HIGH GPIOA->BSRR = GPIO_BSRR_BS_15
34 | #define RST_LOW GPIOA->BSRR = GPIO_BSRR_BR_15
35 | #define CE_HIGH
36 | #define CE_LOW
37 | #define DC_HIGH GPIOB->BSRR = GPIO_BSRR_BS_4
38 | #define DC_LOW GPIOB->BSRR = GPIO_BSRR_BR_4
39 |
40 |
41 | typedef struct { // Data stored PER GLYPH
42 | uint16_t bitmapOffset; // Pointer into GFXfont->bitmap
43 | uint8_t width, height; // Bitmap dimensions in pixels
44 | uint8_t xAdvance; // Distance to advance cursor (x axis)
45 | int8_t xOffset, yOffset; // Dist from cursor pos to UL corner
46 | } GFXglyph;
47 |
48 | typedef struct { // Data stored for FONT AS A WHOLE:
49 | uint8_t *bitmap; // Glyph bitmaps, concatenated
50 | GFXglyph *glyph; // Glyph array
51 | uint8_t first, last; // ASCII extents
52 | uint8_t yAdvance; // Newline distance (y axis)
53 | } GFXfont;
54 |
55 | class LCD_5110 /*public Adafruit_GFX */
56 | {
57 | public:
58 | void begin(uint8_t contrast = 40, uint8_t bias = 0x04);
59 |
60 | void command(uint8_t c);
61 | void data(uint8_t c);
62 |
63 | void setContrast(uint8_t val);
64 | void clearDisplay(void);
65 | void display();
66 |
67 | void drawPixel(int16_t x, int16_t y, uint16_t color);
68 | uint8_t getPixel(int8_t x, int8_t y);
69 |
70 | //generic draw API
71 | void drawFillRect(int16_t x, int16_t y, int16_t w, int16_t h, bool color);
72 | void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, bool color);
73 | void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, bool color);
74 | void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, bool color);
75 |
76 | void setFont(const GFXfont *f);
77 | void drawChar(int16_t x, int16_t y, unsigned char c, bool color, bool bg, uint8_t size);
78 | void setCursor(uint8_t x, uint8_t y);
79 | void setTextColor(bool c);
80 | void setTextColor(uint16_t c, uint16_t bg);
81 | void setTextSize(uint8_t s);
82 | void print(char *txt);
83 | void printxy(char *txt, uint8_t x, uint8_t y);
84 | void printf(char *szFormat, ...);
85 |
86 | private:
87 | void spiWrite(uint8_t c);
88 |
89 | };
90 |
91 | #endif
92 |
--------------------------------------------------------------------------------
/firmware-multimeter/lcd_5110/5110.h:
--------------------------------------------------------------------------------
1 | #ifndef _ADAFRUIT_PCD8544_H
2 | #define _ADAFRUIT_PCD8544_H
3 |
4 | #include "stdint.h"
5 |
6 | #define BLACK 1
7 | #define WHITE 0
8 |
9 | #define LCDWIDTH 84
10 | #define LCDHEIGHT 48
11 |
12 | #define PCD8544_POWERDOWN 0x04
13 | #define PCD8544_ENTRYMODE 0x02
14 | #define PCD8544_EXTENDEDINSTRUCTION 0x01
15 |
16 | #define PCD8544_DISPLAYBLANK 0x0
17 | #define PCD8544_DISPLAYNORMAL 0x4
18 | #define PCD8544_DISPLAYALLON 0x1
19 | #define PCD8544_DISPLAYINVERTED 0x5
20 |
21 | // H = 0
22 | #define PCD8544_FUNCTIONSET 0x20
23 | #define PCD8544_DISPLAYCONTROL 0x08
24 | #define PCD8544_SETYADDR 0x40
25 | #define PCD8544_SETXADDR 0x80
26 |
27 | // H = 1
28 | #define PCD8544_SETTEMP 0x04
29 | #define PCD8544_SETBIAS 0x10
30 | #define PCD8544_SETVOP 0x80
31 |
32 | //PIN DEFINITIONS
33 | #define RST_HIGH GPIOA->BSRR = GPIO_BSRR_BS_15
34 | #define RST_LOW GPIOA->BSRR = GPIO_BSRR_BR_15
35 | #define CE_HIGH
36 | #define CE_LOW
37 | #define DC_HIGH GPIOB->BSRR = GPIO_BSRR_BS_4
38 | #define DC_LOW GPIOB->BSRR = GPIO_BSRR_BR_4
39 |
40 |
41 | typedef struct { // Data stored PER GLYPH
42 | uint16_t bitmapOffset; // Pointer into GFXfont->bitmap
43 | uint8_t width, height; // Bitmap dimensions in pixels
44 | uint8_t xAdvance; // Distance to advance cursor (x axis)
45 | int8_t xOffset, yOffset; // Dist from cursor pos to UL corner
46 | } GFXglyph;
47 |
48 | typedef struct { // Data stored for FONT AS A WHOLE:
49 | uint8_t *bitmap; // Glyph bitmaps, concatenated
50 | GFXglyph *glyph; // Glyph array
51 | uint8_t first, last; // ASCII extents
52 | uint8_t yAdvance; // Newline distance (y axis)
53 | } GFXfont;
54 |
55 | class LCD_5110 /*public Adafruit_GFX */
56 | {
57 | public:
58 | void begin(uint8_t contrast = 40, uint8_t bias = 0x04);
59 |
60 | void command(uint8_t c);
61 | void data(uint8_t c);
62 |
63 | void setContrast(uint8_t val);
64 | void clearDisplay(void);
65 | void display();
66 |
67 | void drawPixel(int16_t x, int16_t y, uint16_t color);
68 | uint8_t getPixel(int8_t x, int8_t y);
69 |
70 | //generic draw API
71 | void drawFillRect(int16_t x, int16_t y, int16_t w, int16_t h, bool color);
72 | void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, bool color);
73 | void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, bool color);
74 | void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, bool color);
75 |
76 | void setFont(const GFXfont *f);
77 | void drawChar(int16_t x, int16_t y, unsigned char c, bool color, bool bg, uint8_t size);
78 | void setCursor(uint8_t x, uint8_t y);
79 | void setTextColor(bool c);
80 | void setTextColor(uint16_t c, uint16_t bg);
81 | void setTextSize(uint8_t s);
82 | void print(char *txt);
83 | void printxy(char *txt, uint8_t x, uint8_t y);
84 | void printf(char *szFormat, ...);
85 |
86 | private:
87 | void spiWrite(uint8_t c);
88 |
89 | };
90 |
91 | #endif
92 |
--------------------------------------------------------------------------------
/firmware-calibration/interrupt.cpp:
--------------------------------------------------------------------------------
1 | //====================================================
2 | // STM32 OPEN SOURCE MULTIMETER
3 | // embedblog.eu/dmm
4 | // CC BY-NC-SA 4.0 International
5 | // ===================================================
6 |
7 | #include "stm32f3xx.h"
8 | #include "interrupt.h"
9 | #include "config.h"
10 | #include "uart.h"
11 |
12 | extern volatile bool aquisition, hold, rangeI;
13 | extern volatile uint8_t mode, screen_update;
14 | extern volatile uint8_t rangeV;
15 |
16 | extern "C"
17 | {
18 | void EXTI15_10_IRQHandler(void)
19 | {
20 | if ((EXTI->PR & EXTI_PR_PR11) != 0) //PA11 - button 'mode'
21 | {
22 | mode++;
23 | screen_update = true;
24 |
25 | if (mode >= MODES)
26 | mode = 0;
27 |
28 | RTC->BKP1R = mode;
29 | EXTI->PR |= EXTI_PR_PR11;
30 | }
31 |
32 | if ((EXTI->PR & EXTI_PR_PR13) != 0) //PC13 - button 'hold/stop'
33 | {
34 | hold = !hold;
35 |
36 | EXTI->PR |= EXTI_PR_PR13;
37 | }
38 |
39 | if ((EXTI->PR & EXTI_PR_PR14) != 0) //PC12 - button 'range'
40 | {
41 | if (mode == MODE_VOLTAGE)
42 | {
43 | rangeV++;
44 |
45 | if (rangeV > 3) rangeV = 0;
46 |
47 | setVoltageRange();
48 | }
49 | else if (mode == MODE_CURRENT)
50 | {
51 | rangeI = !rangeI;
52 |
53 | setCurrentRange();
54 | }
55 | else if (mode == MODE_POWER)
56 | {
57 | if (rangeV == false & rangeI == false)
58 | {
59 | rangeV = true;
60 | //RANGE_60V;
61 | }
62 | else if (rangeV == true & rangeI == false)
63 | {
64 | rangeV = false;
65 | //RANGE_6V;
66 | rangeI = true;
67 | ISEL_HIGH;
68 | }
69 | else if (rangeV == false & rangeI == true)
70 | {
71 | rangeV = true;
72 | //RANGE_60V;
73 | }
74 | else
75 | {
76 | rangeV = false;
77 | //RANGE_6V;
78 | rangeI = false;
79 | ISEL_LOW;
80 | }
81 | }
82 |
83 | EXTI->PR |= EXTI_PR_PR14;
84 | }
85 |
86 | if ((EXTI->PR & EXTI_PR_PR15) != 0) //PC11 - button 'DC/RMS'
87 | {
88 | aquisition = !aquisition;
89 |
90 | RTC->BKP4R = aquisition;
91 | EXTI->PR |= EXTI_PR_PR15;
92 | }
93 | }
94 | }
95 |
96 | void setVoltageRange(void)
97 | {
98 | switch (rangeV)
99 | {
100 | case 0: //60 V range
101 | VSEL0_LOW;
102 | VSEL1_LOW;
103 | break;
104 | case 1: //6 V range
105 | VSEL0_HIGH;
106 | VSEL1_LOW;
107 | break;
108 | case 2: //600 mV range
109 | VSEL0_LOW;
110 | VSEL1_HIGH;
111 | break;
112 | case 3: //60 mV range
113 | VSEL0_LOW;
114 | VSEL1_HIGH;
115 | SDADC2->CR2 &=~SDADC_CR2_ADON;
116 | SDADC2->CONFCHR2 = 0x01;
117 | SDADC2->CR2 |= SDADC_CR2_ADON;
118 | break;
119 | default: break;
120 | }
121 |
122 | RTC->BKP2R = rangeV;
123 | }
124 |
125 | void setCurrentRange(void)
126 | {
127 | if (rangeI)
128 | ISEL_HIGH;
129 | else
130 | ISEL_LOW;
131 |
132 | RTC->BKP3R = rangeI;
133 | }
134 |
--------------------------------------------------------------------------------
/firmware-multimeter/config.h:
--------------------------------------------------------------------------------
1 | #ifndef _CONFIG_H
2 | #define _CONFIG_H
3 |
4 | //==========================================================================
5 | // USER SETTINGS - modify as you wish
6 | #define SCREEN_TRANSISTION_DUR 1000 //in ms, how long the intro to each screen is displayed
7 | #define SPLASH_SCREEN_DUR 2000 //in ms, how long the start up screen is displayed
8 | #define SCREEN_UPDATE_RATE 2 //in Hz, how often is the measurement (V, I or P) screen refreshed
9 | #define CONTINUITY_REFRESH 10 //in Hz, how often is the continuity screen refreshed
10 |
11 | #define CONTINUITY_BUZZER 50 //in ohms, below this value the buzzer is sounded
12 | #define IO_COMPENSATION 23
13 |
14 | #define VREF 1.8f
15 | #define VSUP 2.99f //TODO: add to EEPROM
16 |
17 | //#define RAW_OUTPUT
18 |
19 | //==========================================================================
20 | // SYSTEM SETTINGS - do not modify, unless you know what you're doing
21 | #define BUZZER_ON GPIOA->BSRR = GPIO_BSRR_BS_8
22 | #define BUZZER_OFF GPIOA->BSRR = GPIO_BSRR_BR_8
23 |
24 | #define VSEL0_LOW GPIOF->BSRR = GPIO_BSRR_BR_6
25 | #define VSEL0_HIGH GPIOF->BSRR = GPIO_BSRR_BS_6
26 | #define VSEL1_LOW GPIOF->BSRR = GPIO_BSRR_BR_7
27 | #define VSEL1_HIGH GPIOF->BSRR = GPIO_BSRR_BS_7
28 |
29 | #define ISEL_HIGH GPIOB->BSRR = GPIO_BSRR_BS_2
30 | #define ISEL_LOW GPIOB->BSRR = GPIO_BSRR_BR_2
31 |
32 | #define OFSEL_GND GPIOA->BSRR = GPIO_BSRR_BS_12
33 | #define OFSEL_VREF2 GPIOA->BSRR = GPIO_BSRR_BR_12
34 |
35 | #define LED_RED GPIOB->BSRR = GPIO_BSRR_BS_6 | GPIO_BSRR_BR_7
36 | #define LED_GREEN GPIOB->BSRR = GPIO_BSRR_BR_6 | GPIO_BSRR_BS_7
37 | #define LED_NONE GPIOB->BSRR = GPIO_BSRR_BS_6 | GPIO_BSRR_BS_7
38 |
39 | #define MODE_VOLTAGE 0
40 | #define MODE_CURRENT 1
41 | #define MODE_POWER 2
42 | #define MODE_CONT 3
43 | #define MODE_COMPTEST 4
44 | #define MODE_FREQUENCY 5
45 | #define MODES 6
46 |
47 | #define DATA_SAVED 0xC0
48 |
49 | //==========================================================================
50 | // COMPONENT TEST IO
51 | #define TP1L_HIGHZ GPIOB->MODER &=~ GPIO_MODER_MODER14
52 | #define TP1L_LOW GPIOB->MODER |= GPIO_MODER_MODER14_0; GPIOB->BSRR = GPIO_BSRR_BR_14
53 | #define TP1L_HIGH GPIOB->MODER |= GPIO_MODER_MODER14_0; GPIOB->BSRR = GPIO_BSRR_BS_14
54 |
55 | #define TP1M_HIGHZ GPIOA->MODER &=~ GPIO_MODER_MODER6
56 | #define TP1M_LOW GPIOA->MODER |= GPIO_MODER_MODER6_0; GPIOA->BSRR = GPIO_BSRR_BR_6
57 | #define TP1M_HIGH GPIOA->MODER |= GPIO_MODER_MODER6_0; GPIOA->BSRR = GPIO_BSRR_BS_6
58 |
59 | #define TP1H_HIGHZ GPIOB->MODER &=~ GPIO_MODER_MODER15
60 | #define TP1H_LOW GPIOB->MODER |= GPIO_MODER_MODER15_0; GPIOB->BSRR = GPIO_BSRR_BR_15
61 | #define TP1H_HIGH GPIOB->MODER |= GPIO_MODER_MODER15_0; GPIOB->BSRR = GPIO_BSRR_BS_15
62 |
63 | #define TP1A_ANALOG GPIOA->MODER |= GPIO_MODER_MODER2
64 | #define TP1A_LOW GPIOA->MODER &=~GPIO_MODER_MODER2_1; GPIOB->BSRR = GPIO_BSRR_BR_2
65 | #define TP1A_HIGH GPIOA->MODER &=~GPIO_MODER_MODER2_1; GPIOB->BSRR = GPIO_BSRR_BS_2
66 |
67 | #define TP2L_HIGHZ GPIOA->MODER &=~ GPIO_MODER_MODER5
68 | #define TP2L_LOW GPIOA->MODER |= GPIO_MODER_MODER5_0; GPIOA->BSRR = GPIO_BSRR_BR_5
69 | #define TP2L_HIGH GPIOA->MODER |= GPIO_MODER_MODER5_0; GPIOA->BSRR = GPIO_BSRR_BS_5
70 |
71 | #define TP2M_HIGHZ GPIOA->MODER &=~ GPIO_MODER_MODER4
72 | #define TP2M_LOW GPIOA->MODER |= GPIO_MODER_MODER4_0; GPIOA->BSRR = GPIO_BSRR_BR_4
73 | #define TP2M_HIGH GPIOA->MODER |= GPIO_MODER_MODER4_0; GPIOA->BSRR = GPIO_BSRR_BS_4
74 |
75 | #define TP2H_HIGHZ GPIOA->MODER &=~ GPIO_MODER_MODER3
76 | #define TP2H_LOW GPIOA->MODER |= GPIO_MODER_MODER3_0; GPIOA->BSRR = GPIO_BSRR_BR_3
77 | #define TP2H_HIGH GPIOA->MODER |= GPIO_MODER_MODER3_0; GPIOA->BSRR = GPIO_BSRR_BS_3
78 |
79 | #define TP2A_ANALOG GPIOA->MODER |= GPIO_MODER_MODER1
80 | #define TP2A_LOW GPIOA->MODER &=~GPIO_MODER_MODER1_1; GPIOB->BSRR = GPIO_BSRR_BR_1
81 | #define TP2A_HIGH GPIOA->MODER &=~GPIO_MODER_MODER1_1; GPIOB->BSRR = GPIO_BSRR_BS_1
82 |
83 | #endif
84 |
--------------------------------------------------------------------------------
/firmware-multimeter/init.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "init.h"
9 | #include "config.h"
10 | #include "interrupt.h"
11 |
12 | extern volatile uint8_t mode, rangeV;
13 | extern volatile bool rangeI, aquisition;
14 |
15 | void init_RCC(void)
16 | {
17 | //init RCC to external crystal, PLL x9;
18 | RCC->CFGR |= RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR_PLLMUL9 | RCC_CFGR_PPRE1_DIV2;
19 | RCC->CR |= RCC_CR_HSEON | RCC_CR_PLLON;
20 | FLASH->ACR |= FLASH_ACR_LATENCY_1;
21 |
22 | while (!(RCC->CR & RCC_CR_PLLRDY));
23 |
24 | RCC->CFGR |= RCC_CFGR_SW_PLL;
25 | }
26 |
27 | void init_GPIO(void)
28 | {
29 | //enable GPIO clocks
30 | RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIODEN | RCC_AHBENR_GPIOEEN| RCC_AHBENR_GPIOFEN;
31 |
32 | //enable OFSEL on PA12
33 | GPIOA->MODER |= GPIO_MODER_MODER12_0;
34 | GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12;
35 |
36 | //enable buzzer on PA8
37 | GPIOA->MODER |= GPIO_MODER_MODER8_0;
38 | GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8;
39 |
40 | //enable VSEL on PF6:7
41 | GPIOF->MODER |= GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0;
42 | GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6 | GPIO_OSPEEDER_OSPEEDR7;
43 |
44 | //enable ISEL on PB2
45 | GPIOB->MODER |= GPIO_MODER_MODER2_0;
46 | GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2;
47 |
48 | //enable LED on PB6:7
49 | GPIOB->MODER |= GPIO_MODER_MODER6_0 | GPIO_MODER_MODER7_0;
50 | GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6 | GPIO_OSPEEDER_OSPEEDR7;
51 |
52 | //se PA3:6, PB14:15 to high speed (used later for component testing/continuity)
53 | GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR3 | GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR5 | GPIO_OSPEEDER_OSPEEDR6;
54 | GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14 | GPIO_OSPEEDER_OSPEEDR15;
55 | }
56 |
57 | void init_EXTI(void)
58 | {
59 | //button pins (PC13:15, PA11) - inputs with pullups
60 | GPIOC->PUPDR |= GPIO_PUPDR_PUPDR13_0 | GPIO_PUPDR_PUPDR14_0 | GPIO_PUPDR_PUPDR15_0;
61 | GPIOA->PUPDR |= GPIO_PUPDR_PUPDR11_0;
62 |
63 | RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
64 | SYSCFG->EXTICR[2] |= SYSCFG_EXTICR3_EXTI11_PA;
65 | SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI13_PC | SYSCFG_EXTICR4_EXTI14_PC | SYSCFG_EXTICR4_EXTI15_PC;
66 |
67 | EXTI->IMR |= EXTI_IMR_MR11 | EXTI_IMR_MR13 | EXTI_IMR_MR14 | EXTI_IMR_MR15;
68 | EXTI->FTSR |= EXTI_FTSR_TR11 | EXTI_FTSR_TR13 | EXTI_FTSR_TR14 | EXTI_FTSR_TR15;
69 |
70 | NVIC_SetPriority(EXTI15_10_IRQn, 7);
71 |
72 | NVIC_EnableIRQ(EXTI15_10_IRQn);
73 | }
74 |
75 | void init_TIM3(void) //used to update data
76 | {
77 | //enable clock to Timer 3
78 | RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
79 |
80 | //set prescaler (7.2k - 1)
81 | TIM3->PSC = 7199;
82 |
83 | //set auto-reload register
84 | TIM3->ARR = (10000/SCREEN_UPDATE_RATE);
85 |
86 | //update registers
87 | TIM3->EGR |= TIM_EGR_UG;
88 |
89 | //zero the counter
90 | TIM3->CNT = 0x00;
91 |
92 | //enable interrupt on timer overflow (aka update event)
93 | TIM3->DIER |= TIM_DIER_UIE;
94 |
95 | NVIC_SetPriority(TIM3_IRQn, 1);
96 | NVIC_EnableIRQ(TIM3_IRQn);
97 |
98 | //enable timer
99 | TIM3->CR1 |= TIM_CR1_CEN;
100 | }
101 |
102 | void init_BKP(void)
103 | {
104 | //disable write protection
105 | PWR->CR |= PWR_CR_DBP;
106 |
107 | if (RTC->BKP0R == DATA_SAVED)
108 | {
109 | mode = RTC->BKP1R;
110 | rangeV = RTC->BKP2R;
111 | rangeI = RTC->BKP3R;
112 | aquisition = RTC->BKP4R;
113 | }
114 | else
115 | {
116 | RTC->BKP0R = DATA_SAVED;
117 | }
118 |
119 | setVoltageRange();
120 | setCurrentRange();
121 |
122 | OFSEL_VREF2;
123 | }
124 |
125 | void init_TIM2(void)
126 | {
127 | //enable clock to Timer 2
128 | RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
129 |
130 | //write into SMCR - prescaler /1; no filter; rising edge; clock mode 2
131 | TIM2->SMCR = TIM_SMCR_ECE;
132 |
133 | //enable counter
134 | TIM2->CR1 |= TIM_CR1_CEN;
135 | }
136 |
137 |
--------------------------------------------------------------------------------
/firmware-multimeter/ctest.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "config.h"
9 | #include "ctest.h"
10 | #include "delay.h"
11 | #include "adc.h"
12 | #include "uart.h"
13 | #include
14 |
15 | float param;
16 | uint8_t cathode, anode;
17 | uint8_t partDetected;
18 |
19 | void componentTest()
20 | {
21 | uart_print((char*)"COMPONENT TEST STARTED\n");
22 |
23 | //first, we determine the supply voltage
24 | float vsup = 4096 * VREF / (2 * adc1_getReading(REF, 32));
25 | uart_printf((char*)"Supply voltage: %4.2f V\n", vsup);
26 |
27 | //then we discharge both sides to make sure there is no charge left
28 | TP1L_LOW;
29 | TP1M_HIGHZ;
30 | TP1H_HIGHZ;
31 | TP1A_ANALOG;
32 |
33 | TP2L_LOW;
34 | TP2M_HIGHZ;
35 | TP2H_HIGHZ;
36 | TP2A_ANALOG;
37 |
38 | _delay_ms(100);
39 |
40 | TP1L_HIGHZ;
41 | TP2L_HIGHZ;
42 | //connect side 1 to ground and charge side 2 thru a 2k2 resistor
43 | TP1A_LOW;
44 | TP2M_HIGH;
45 |
46 | _delay_ms(100);
47 |
48 | //now we will put TP2 into high impedance, wait a short while and then decide if its a resistor or something with some energy storage (capacitor)
49 | TP2M_HIGHZ;
50 |
51 | _delay_us(1000);
52 |
53 | uint16_t volt = adc1_getReading(TP2, 16);
54 |
55 | uart_printf((char*)"Voltage on TP2: %4d ADC ->", volt);
56 |
57 | if (volt > 500) //there's some voltage left, so we are assuming a capacitor
58 | {
59 | uart_print((char*)" LC\n");
60 | //first, we measure tau (time constant RC) - again, first discharge the device
61 | TP2L_LOW;
62 |
63 | _delay_ms(100);
64 |
65 | TP2L_HIGHZ;
66 | TP2A_LOW;
67 |
68 | //now start charging
69 | TP2A_ANALOG;
70 | TP2M_HIGH;
71 | _count_us_start();
72 |
73 | //wait for voltage to rise
74 | while (adc1_getReading(TP2, 1) < 2580);
75 |
76 | uint16_t tau = _count_us_stop();
77 | uart_printf((char*)"time constant: %5d us\n", tau);
78 | float capacity = tau / 2200.0f;
79 | uart_printf((char*)"Capacitor with a capacity of %6.2f uF\n", capacity);
80 |
81 | partDetected = PART_CAPACITOR;
82 | param = capacity;
83 | }
84 | else //the voltage collapsed very fast, so it must be a diode, a resistor or nothing
85 | {
86 | uart_print((char*)" RD\n");
87 |
88 | //now we need to decide if it is a diode or a resistor - we simply measure resistance both ways
89 | float rAB, rBA, vAB, vBA, temp;
90 | TP2M_HIGH;
91 |
92 | vAB = adc1_getReading(TP2, 16) * (vsup / 4096);
93 | rAB = (2200 * vAB) / (vsup - vAB);
94 | uart_printf((char*)"voltage on pin TP2: %5.3f V\n", vAB);
95 | uart_printf((char*)"resistance rAB: %5.0f Ohm\n", rAB);
96 |
97 | TP2A_LOW;
98 | TP1A_ANALOG;
99 | TP2M_HIGHZ;
100 | TP1M_HIGH;
101 |
102 | vBA = adc1_getReading(TP1, 16) * (vsup / 4096);
103 | rBA = (2200 * vBA) / (vsup - vBA);
104 | uart_printf((char*)"voltage on pin TP1: %5.3f V\n", vBA);
105 | uart_printf((char*)"resistance rBA: %5.0f Ohm\n", rBA);
106 |
107 | temp = (rAB + rBA) / 2;
108 | if ((vAB > 2.4f) & (vBA > 2.4f))
109 | {
110 | //nothing
111 | uart_print((char*)"No connection between pins\n");
112 | }
113 | else if (abs(rAB - rBA) < (temp * 0.25f))
114 | {
115 | //resistances are less different than 25 % - it's a resistor!
116 | uart_printf((char*)"Resistor with a resistance of %5.0f Ohm\n", temp);
117 | partDetected = PART_RESISTOR;
118 | param = temp;
119 | //TODO: in case of a high resistance (> 50k) do the test again with the 470k resistors
120 | }
121 | else
122 | {
123 | //so it is a diode
124 | uart_printf((char*)"Diode with a forward voltage drop of %5.3f V\n", vAB > vBA ? vBA : vAB);
125 | partDetected = PART_DIODE;
126 | param = vAB > vBA ? vBA : vAB;
127 | /*cathode = vAB > vBA ? pinB : pinA;
128 | anode = vAB > vBA ? pinA : pinB;*/
129 | }
130 | }
131 |
132 | uart_print((char*)"TEST FINISHED\n");
133 | TP1M_HIGHZ;
134 | TP1A_ANALOG;
135 | TP2A_ANALOG;
136 | }
137 |
--------------------------------------------------------------------------------
/firmware-multimeter/sdadc.cpp:
--------------------------------------------------------------------------------
1 | /* ====================================================
2 | * STM32 OPEN SOURCE MULTIMETER
3 | * embedblog.eu/dmm
4 | * license: CC BY-NC-SA 4.0
5 | * ==================================================== */
6 |
7 | #include "stm32f3xx.h"
8 | #include "sdadc.h"
9 | #include "delay.h"
10 | #include "config.h"
11 | #include "math.h"
12 |
13 | volatile uint32_t SDADC_data[1000];
14 |
15 | volatile int64_t sdadc_V_avg;
16 | volatile int64_t sdadc_I_avg;
17 | volatile uint64_t sdadc_V_rms;
18 | volatile uint64_t sdadc_I_rms;
19 | volatile uint16_t sdadc_samples;
20 |
21 | volatile float sdadc_result_V_avg;
22 | volatile float sdadc_result_V_rms;
23 | volatile float sdadc_result_I_avg;
24 | volatile float sdadc_result_I_rms;
25 | volatile uint16_t sdadc_result_samples;
26 |
27 | extern volatile bool screen_update, rangeI, aquisition;
28 | extern volatile uint8_t rangeV;
29 |
30 | volatile uint64_t frequency;
31 |
32 | void SDADC_init(void)
33 | {
34 | //enable clock & power
35 | RCC->CFGR |= RCC_CFGR_SDADCPRE_DIV12;
36 | RCC->APB2ENR |= RCC_APB2ENR_SDADC1EN | RCC_APB2ENR_SDADC2EN;
37 | RCC->APB1ENR |= RCC_APB1ENR_PWREN;
38 | PWR->CR |= PWR_CR_SDADC1EN | PWR_CR_SDADC2EN;
39 |
40 | //setup GPIO for analogue mode
41 | GPIOE->MODER |= GPIO_MODER_MODER8 | GPIO_MODER_MODER9;
42 | GPIOB->MODER |= GPIO_MODER_MODER0 | GPIO_MODER_MODER1;
43 |
44 | //turn on
45 | SDADC1->CR2 |= SDADC_CR2_ADON;
46 | SDADC2->CR2 |= SDADC_CR2_ADON;
47 |
48 | _delay_us(100);
49 |
50 | //enter init mode
51 | SDADC1->CR1 |= SDADC_CR1_INIT;
52 | SDADC2->CR1 |= SDADC_CR1_INIT;
53 |
54 | _delay_us(100);
55 |
56 | SDADC1->CR2 |= SDADC_CR2_RCONT; //continuous mode
57 | SDADC2->CR2 |= SDADC_CR2_RCONT;
58 |
59 | SDADC1->CR1 |= SDADC_CR1_RDMAEN; //DMA mode
60 | //SDADC2->CR1 |= SDADC_CR1_RDMAEN;
61 |
62 | SDADC2->CR1 |= SDADC_CR1_RSYNC; //launch SDADC1 and 2 simulataneously
63 |
64 | SDADC1->CR2 |= (6 << 16); //select channel 8 (current) for SDADC1
65 | SDADC2->CR2 |= (8 << 16); //select channel 6 (voltage) for SDADC2
66 |
67 | SDADC1->CR2 |= SDADC_CR2_FAST; //FAST mode
68 | SDADC2->CR2 |= SDADC_CR2_FAST;
69 |
70 | //setup SDADC2 CONF1 for 8x gain (60 mV voltage range)
71 | SDADC2->CONF1R |= SDADC_CONF1R_GAIN1_0 | SDADC_CONF1R_GAIN1_1;
72 |
73 | //exit initialization mode
74 | SDADC1->CR1 &= ~SDADC_CR1_INIT;
75 | SDADC2->CR1 &= ~SDADC_CR1_INIT;
76 |
77 | //setup DMA2 CH3
78 | //====================================================================================
79 | RCC->AHBENR |= RCC_AHBENR_DMA2EN; //enable clock
80 |
81 | DMA2_Channel3->CCR |= DMA_CCR_PL_0 | DMA_CCR_PL_1; //set priority to very high
82 |
83 | //enable DMA1 TC INT
84 | DMA2_Channel3->CCR |= DMA_CCR_TCIE;
85 |
86 | //set memory size to 32 bits
87 | DMA2_Channel3->CCR |= DMA_CCR_MSIZE_1;
88 |
89 | //set peripheral size to 32 bits
90 | DMA2_Channel3->CCR |= DMA_CCR_PSIZE_1;
91 |
92 | //increment memory
93 | DMA2_Channel3->CCR |= DMA_CCR_MINC;
94 |
95 | //set circular mode
96 | DMA2_Channel3->CCR |= DMA_CCR_CIRC;
97 |
98 | //1000 transfers
99 | DMA2_Channel3->CNDTR = 1000;
100 |
101 | //peripheral (source) address
102 | DMA2_Channel3->CPAR = (uint32_t)(&(SDADC1->RDATA12R));
103 |
104 | //memory (destination) address
105 | DMA2_Channel3->CMAR = (uint32_t)(SDADC_data);
106 |
107 | NVIC_SetPriority(DMA2_Channel3_IRQn, 2);
108 | }
109 |
110 | void SDADC_start(void)
111 | {
112 | DMA2_Channel3->CCR |= DMA_CCR_EN;
113 | SDADC1->CR2 |= SDADC_CR2_RSWSTART;
114 | //SDADC2->CR2 |= SDADC_CR2_RSWSTART;
115 | NVIC_EnableIRQ(DMA2_Channel3_IRQn);
116 | }
117 |
118 | extern "C"
119 | {
120 | void DMA2_Channel3_IRQHandler()
121 | {
122 | sdadc_samples++;
123 |
124 | for (uint16_t i = 0; i < 1000; i ++)
125 | {
126 | /*int16_t volt = (SDADC_data[i] & 0xFFFF);
127 | int16_t amp = (SDADC_data[i] >> 16) & 0xFFFF;*/
128 | int16_t amp = (SDADC_data[i] & 0xFFFF);
129 | int16_t volt = (SDADC_data[i] >> 16) & 0xFFFF;
130 |
131 | sdadc_V_avg += volt;
132 | sdadc_V_rms += volt * volt;
133 | sdadc_I_avg += amp;
134 | sdadc_I_rms += amp * amp;
135 | }
136 |
137 | DMA2->IFCR = DMA_IFCR_CTCIF3;
138 | }
139 |
140 | void TIM3_IRQHandler(void)
141 | {
142 | sdadc_result_samples = sdadc_samples * 1000;
143 |
144 | if (aquisition)
145 | {
146 | sdadc_result_V_avg = (float)sdadc_V_avg / sdadc_result_samples;
147 | sdadc_result_I_avg = (float)sdadc_I_avg / sdadc_result_samples;
148 | }
149 | else
150 | {
151 | sdadc_result_V_rms = sqrt((float)sdadc_V_rms / sdadc_result_samples);
152 | sdadc_result_I_rms = sqrt((float)sdadc_I_rms / sdadc_result_samples);
153 | }
154 |
155 | sdadc_V_avg = 0;
156 | sdadc_I_avg = 0;
157 | sdadc_V_rms = 0;
158 | sdadc_I_rms = 0;
159 | sdadc_samples = 0;
160 |
161 | frequency = TIM2->CNT * SCREEN_UPDATE_RATE;
162 | TIM2->CNT = 0x00;
163 |
164 | screen_update = true;
165 |
166 | TIM3->SR &=~TIM_SR_UIF;
167 | }
168 | }
169 |
--------------------------------------------------------------------------------
/firmware-calibration/sdadc.cpp:
--------------------------------------------------------------------------------
1 | #include "stm32f3xx.h"
2 | #include "sdadc.h"
3 | #include "delay.h"
4 | #include "config.h"
5 | #include "math.h"
6 |
7 | volatile uint32_t SDADC_data[1000];
8 |
9 | volatile int64_t sdadc_V_avg;
10 | volatile int64_t sdadc_I_avg;
11 | volatile uint64_t sdadc_V_rms;
12 | volatile uint64_t sdadc_I_rms;
13 | volatile uint16_t sdadc_samples;
14 |
15 | volatile float sdadc_result_V_avg;
16 | volatile float sdadc_result_V_rms;
17 | volatile float sdadc_result_I_avg;
18 | volatile float sdadc_result_I_rms;
19 | volatile uint16_t sdadc_result_samples;
20 |
21 | extern volatile bool screen_update, rangeI, aquisition;
22 | extern volatile uint8_t rangeV;
23 |
24 | void SDADC_init(void)
25 | {
26 | //enable clock & power
27 | RCC->CFGR |= RCC_CFGR_SDADCPRE_DIV12;
28 | RCC->APB2ENR |= RCC_APB2ENR_SDADC1EN | RCC_APB2ENR_SDADC2EN;
29 | RCC->APB1ENR |= RCC_APB1ENR_PWREN;
30 | PWR->CR |= PWR_CR_SDADC1EN | PWR_CR_SDADC2EN;
31 |
32 | //setup GPIO for analogue mode
33 | GPIOE->MODER |= GPIO_MODER_MODER8 | GPIO_MODER_MODER9;
34 | GPIOB->MODER |= GPIO_MODER_MODER0 | GPIO_MODER_MODER1;
35 |
36 | //turn on
37 | SDADC1->CR2 |= SDADC_CR2_ADON;
38 | SDADC2->CR2 |= SDADC_CR2_ADON;
39 |
40 | _delay_us(100);
41 |
42 | //enter init mode
43 | SDADC1->CR1 |= SDADC_CR1_INIT;
44 | SDADC2->CR1 |= SDADC_CR1_INIT;
45 |
46 | _delay_us(100);
47 |
48 | SDADC1->CR2 |= SDADC_CR2_RCONT; //continuous mode
49 | SDADC2->CR2 |= SDADC_CR2_RCONT;
50 |
51 | SDADC1->CR1 |= SDADC_CR1_RDMAEN; //DMA mode
52 | //SDADC2->CR1 |= SDADC_CR1_RDMAEN;
53 |
54 | SDADC2->CR1 |= SDADC_CR1_RSYNC; //launch SDADC1 and 2 simulataneously
55 |
56 | SDADC1->CR2 |= (6 << 16); //select channel 8 (voltage) for SDADC1
57 | SDADC2->CR2 |= (8 << 16); //select channel 6 (current) for SDADC2
58 |
59 | SDADC1->CR2 |= SDADC_CR2_FAST; //FAST mode
60 | SDADC2->CR2 |= SDADC_CR2_FAST;
61 |
62 | /*SDADC1->CONF0R |= SDADC_CONF0R_COMMON0_0; //set common mode for calibration
63 | SDADC2->CONF0R |= SDADC_CONF0R_COMMON0_0;*/
64 |
65 | //CONF0 - no changes needed
66 |
67 | //setup SDADC2 CONF1 for 8x gain (60 mV voltage range)
68 | SDADC2->CONF1R |= SDADC_CONF1R_GAIN1_0 | SDADC_CONF1R_GAIN1_1;
69 |
70 | //exit initialization mode
71 | SDADC1->CR1 &= ~SDADC_CR1_INIT;
72 | SDADC2->CR1 &= ~SDADC_CR1_INIT;
73 |
74 | //start calibration
75 | /*SDADC1->CR2 |= SDADC_CR2_STARTCALIB;
76 | while (SDADC1->ISR & SDADC_ISR_CALIBIP);
77 |
78 | SDADC2->CR2 |= SDADC_CR2_STARTCALIB;
79 | while (SDADC2->ISR & SDADC_ISR_CALIBIP);*/
80 |
81 |
82 | //setup DMA2 CH3
83 | //====================================================================================
84 | RCC->AHBENR |= RCC_AHBENR_DMA2EN; //enable clock
85 |
86 | DMA2_Channel3->CCR |= DMA_CCR_PL_0 | DMA_CCR_PL_1; //set priority to very high
87 |
88 | //enable DMA1 TC INT
89 | DMA2_Channel3->CCR |= DMA_CCR_TCIE;
90 |
91 | //set memory size to 32 bits
92 | DMA2_Channel3->CCR |= DMA_CCR_MSIZE_1;
93 |
94 | //set peripheral size to 32 bits
95 | DMA2_Channel3->CCR |= DMA_CCR_PSIZE_1;
96 |
97 | //increment memory
98 | DMA2_Channel3->CCR |= DMA_CCR_MINC;
99 |
100 | //set circular mode
101 | DMA2_Channel3->CCR |= DMA_CCR_CIRC;
102 |
103 | //1000 transfers
104 | DMA2_Channel3->CNDTR = 1000;
105 |
106 | //peripheral (source) address
107 | DMA2_Channel3->CPAR = (uint32_t)(&(SDADC1->RDATA12R));
108 |
109 | //memory (destination) address
110 | DMA2_Channel3->CMAR = (uint32_t)(SDADC_data);
111 |
112 | NVIC_SetPriority(DMA2_Channel3_IRQn, 2);
113 | }
114 |
115 | void SDADC_start(void)
116 | {
117 | DMA2_Channel3->CCR |= DMA_CCR_EN;
118 | SDADC1->CR2 |= SDADC_CR2_RSWSTART;
119 | //SDADC2->CR2 |= SDADC_CR2_RSWSTART;
120 | NVIC_EnableIRQ(DMA2_Channel3_IRQn);
121 | }
122 |
123 | extern "C"
124 | {
125 | void DMA2_Channel3_IRQHandler()
126 | {
127 | PB8_HIGH;
128 | sdadc_samples++;
129 |
130 | for (uint16_t i = 0; i < 1000; i ++)
131 | {
132 | /*int16_t volt = (SDADC_data[i] & 0xFFFF);
133 | int16_t amp = (SDADC_data[i] >> 16) & 0xFFFF;*/
134 | int16_t amp = (SDADC_data[i] & 0xFFFF);
135 | int16_t volt = (SDADC_data[i] >> 16) & 0xFFFF;
136 |
137 | sdadc_V_avg += volt;
138 | sdadc_V_rms += volt * volt;
139 | sdadc_I_avg += amp;
140 | sdadc_I_rms += amp * amp;
141 | }
142 |
143 | DMA2->IFCR = DMA_IFCR_CTCIF3;
144 | PB8_LOW;
145 | }
146 |
147 | void TIM3_IRQHandler(void)
148 | {
149 | PB9_HIGH;
150 | sdadc_result_samples = sdadc_samples * 1000;
151 |
152 | if (aquisition)
153 | {
154 | sdadc_result_V_avg = (float)sdadc_V_avg / sdadc_result_samples;
155 | sdadc_result_I_avg = (float)sdadc_I_avg / sdadc_result_samples;
156 | }
157 | else
158 | {
159 | sdadc_result_V_rms = sqrt((float)sdadc_V_rms / sdadc_result_samples);
160 | sdadc_result_I_rms = sqrt((float)sdadc_I_rms / sdadc_result_samples);
161 | }
162 |
163 | sdadc_V_avg = 0;
164 | sdadc_I_avg = 0;
165 | sdadc_V_rms = 0;
166 | sdadc_I_rms = 0;
167 | sdadc_samples = 0;
168 |
169 | screen_update = true;
170 |
171 | TIM3->SR &=~TIM_SR_UIF;
172 | PB9_LOW;
173 | }
174 | }
175 |
--------------------------------------------------------------------------------
/firmware-calibration/lcd_5110/Fonts/Picopixel.h:
--------------------------------------------------------------------------------
1 | // Picopixel by Sebastian Weber. A tiny font
2 | // with all characters within a 6 pixel height.
3 |
4 | const static uint8_t PicopixelBitmaps[] = {
5 | 0xE8, 0xB4, 0x57, 0xD5, 0xF5, 0x00, 0x4E, 0x3E, 0x80, 0xA5, 0x4A, 0x4A,
6 | 0x5A, 0x50, 0xC0, 0x6A, 0x40, 0x95, 0x80, 0xAA, 0x80, 0x5D, 0x00, 0x60,
7 | 0xE0, 0x80, 0x25, 0x48, 0x56, 0xD4, 0x75, 0x40, 0xC5, 0x4E, 0xC5, 0x1C,
8 | 0x97, 0x92, 0xF3, 0x1C, 0x53, 0x54, 0xE5, 0x48, 0x55, 0x54, 0x55, 0x94,
9 | 0xA0, 0x46, 0x64, 0xE3, 0x80, 0x98, 0xC5, 0x04, 0x56, 0xC6, 0x57, 0xDA,
10 | 0xD7, 0x5C, 0x72, 0x46, 0xD6, 0xDC, 0xF3, 0xCE, 0xF3, 0x48, 0x72, 0xD4,
11 | 0xB7, 0xDA, 0xF8, 0x24, 0xD4, 0xBB, 0x5A, 0x92, 0x4E, 0x8E, 0xEB, 0x58,
12 | 0x80, 0x9D, 0xB9, 0x90, 0x56, 0xD4, 0xD7, 0x48, 0x56, 0xD4, 0x40, 0xD7,
13 | 0x5A, 0x71, 0x1C, 0xE9, 0x24, 0xB6, 0xD4, 0xB6, 0xA4, 0x8C, 0x6B, 0x55,
14 | 0x00, 0xB5, 0x5A, 0xB5, 0x24, 0xE5, 0x4E, 0xEA, 0xC0, 0x91, 0x12, 0xD5,
15 | 0xC0, 0x54, 0xF0, 0x90, 0xC7, 0xF0, 0x93, 0x5E, 0x71, 0x80, 0x25, 0xDE,
16 | 0x5E, 0x30, 0x6E, 0x80, 0x77, 0x9C, 0x93, 0x5A, 0xB8, 0x45, 0x60, 0x92,
17 | 0xEA, 0xAA, 0x40, 0xD5, 0x6A, 0xD6, 0x80, 0x55, 0x00, 0xD7, 0x40, 0x75,
18 | 0x90, 0xE8, 0x71, 0xE0, 0xBA, 0x40, 0xB5, 0x80, 0xB5, 0x00, 0x8D, 0x54,
19 | 0xAA, 0x80, 0xAC, 0xE0, 0xE5, 0x70, 0x6A, 0x26, 0xFC, 0xC8, 0xAC, 0x5A };
20 |
21 | const static GFXglyph PicopixelGlyphs[] = {
22 | { 0, 0, 0, 2, 0, 1 }, // 0x20 ' '
23 | { 0, 1, 5, 2, 0, -4 }, // 0x21 '!'
24 | { 1, 3, 2, 4, 0, -4 }, // 0x22 '"'
25 | { 2, 5, 5, 6, 0, -4 }, // 0x23 '#'
26 | { 6, 3, 6, 4, 0, -4 }, // 0x24 '$'
27 | { 9, 3, 5, 4, 0, -4 }, // 0x25 '%'
28 | { 11, 4, 5, 5, 0, -4 }, // 0x26 '&'
29 | { 14, 1, 2, 2, 0, -4 }, // 0x27 '''
30 | { 15, 2, 5, 3, 0, -4 }, // 0x28 '('
31 | { 17, 2, 5, 3, 0, -4 }, // 0x29 ')'
32 | { 19, 3, 3, 4, 0, -3 }, // 0x2A '*'
33 | { 21, 3, 3, 4, 0, -3 }, // 0x2B '+'
34 | { 23, 2, 2, 3, 0, 0 }, // 0x2C ','
35 | { 24, 3, 1, 4, 0, -2 }, // 0x2D '-'
36 | { 25, 1, 1, 2, 0, 0 }, // 0x2E '.'
37 | { 26, 3, 5, 4, 0, -4 }, // 0x2F '/'
38 | { 28, 3, 5, 4, 0, -4 }, // 0x30 '0'
39 | { 30, 2, 5, 3, 0, -4 }, // 0x31 '1'
40 | { 32, 3, 5, 4, 0, -4 }, // 0x32 '2'
41 | { 34, 3, 5, 4, 0, -4 }, // 0x33 '3'
42 | { 36, 3, 5, 4, 0, -4 }, // 0x34 '4'
43 | { 38, 3, 5, 4, 0, -4 }, // 0x35 '5'
44 | { 40, 3, 5, 4, 0, -4 }, // 0x36 '6'
45 | { 42, 3, 5, 4, 0, -4 }, // 0x37 '7'
46 | { 44, 3, 5, 4, 0, -4 }, // 0x38 '8'
47 | { 46, 3, 5, 4, 0, -4 }, // 0x39 '9'
48 | { 48, 1, 3, 2, 0, -3 }, // 0x3A ':'
49 | { 49, 2, 4, 3, 0, -3 }, // 0x3B ';'
50 | { 50, 2, 3, 3, 0, -3 }, // 0x3C '<'
51 | { 51, 3, 3, 4, 0, -3 }, // 0x3D '='
52 | { 53, 2, 3, 3, 0, -3 }, // 0x3E '>'
53 | { 54, 3, 5, 4, 0, -4 }, // 0x3F '?'
54 | { 56, 3, 5, 4, 0, -4 }, // 0x40 '@'
55 | { 58, 3, 5, 4, 0, -4 }, // 0x41 'A'
56 | { 60, 3, 5, 4, 0, -4 }, // 0x42 'B'
57 | { 62, 3, 5, 4, 0, -4 }, // 0x43 'C'
58 | { 64, 3, 5, 4, 0, -4 }, // 0x44 'D'
59 | { 66, 3, 5, 4, 0, -4 }, // 0x45 'E'
60 | { 68, 3, 5, 4, 0, -4 }, // 0x46 'F'
61 | { 70, 3, 5, 4, 0, -4 }, // 0x47 'G'
62 | { 72, 3, 5, 4, 0, -4 }, // 0x48 'H'
63 | { 74, 1, 5, 2, 0, -4 }, // 0x49 'I'
64 | { 75, 3, 5, 4, 0, -4 }, // 0x4A 'J'
65 | { 77, 3, 5, 4, 0, -4 }, // 0x4B 'K'
66 | { 79, 3, 5, 4, 0, -4 }, // 0x4C 'L'
67 | { 81, 5, 5, 6, 0, -4 }, // 0x4D 'M'
68 | { 85, 4, 5, 5, 0, -4 }, // 0x4E 'N'
69 | { 88, 3, 5, 4, 0, -4 }, // 0x4F 'O'
70 | { 90, 3, 5, 4, 0, -4 }, // 0x50 'P'
71 | { 92, 3, 6, 4, 0, -4 }, // 0x51 'Q'
72 | { 95, 3, 5, 4, 0, -4 }, // 0x52 'R'
73 | { 97, 3, 5, 4, 0, -4 }, // 0x53 'S'
74 | { 99, 3, 5, 4, 0, -4 }, // 0x54 'T'
75 | { 101, 3, 5, 4, 0, -4 }, // 0x55 'U'
76 | { 103, 3, 5, 4, 0, -4 }, // 0x56 'V'
77 | { 105, 5, 5, 6, 0, -4 }, // 0x57 'W'
78 | { 109, 3, 5, 4, 0, -4 }, // 0x58 'X'
79 | { 111, 3, 5, 4, 0, -4 }, // 0x59 'Y'
80 | { 113, 3, 5, 4, 0, -4 }, // 0x5A 'Z'
81 | { 115, 2, 5, 3, 0, -4 }, // 0x5B '['
82 | { 117, 3, 5, 4, 0, -4 }, // 0x5C '\'
83 | { 119, 2, 5, 3, 0, -4 }, // 0x5D ']'
84 | { 121, 3, 2, 4, 0, -4 }, // 0x5E '^'
85 | { 122, 4, 1, 4, 0, 1 }, // 0x5F '_'
86 | { 123, 2, 2, 3, 0, -4 }, // 0x60 '`'
87 | { 124, 3, 4, 4, 0, -3 }, // 0x61 'a'
88 | { 126, 3, 5, 4, 0, -4 }, // 0x62 'b'
89 | { 128, 3, 3, 4, 0, -2 }, // 0x63 'c'
90 | { 130, 3, 5, 4, 0, -4 }, // 0x64 'd'
91 | { 132, 3, 4, 4, 0, -3 }, // 0x65 'e'
92 | { 134, 2, 5, 3, 0, -4 }, // 0x66 'f'
93 | { 136, 3, 5, 4, 0, -3 }, // 0x67 'g'
94 | { 138, 3, 5, 4, 0, -4 }, // 0x68 'h'
95 | { 140, 1, 5, 2, 0, -4 }, // 0x69 'i'
96 | { 141, 2, 6, 3, 0, -4 }, // 0x6A 'j'
97 | { 143, 3, 5, 4, 0, -4 }, // 0x6B 'k'
98 | { 145, 2, 5, 3, 0, -4 }, // 0x6C 'l'
99 | { 147, 5, 3, 6, 0, -2 }, // 0x6D 'm'
100 | { 149, 3, 3, 4, 0, -2 }, // 0x6E 'n'
101 | { 151, 3, 3, 4, 0, -2 }, // 0x6F 'o'
102 | { 153, 3, 4, 4, 0, -2 }, // 0x70 'p'
103 | { 155, 3, 4, 4, 0, -2 }, // 0x71 'q'
104 | { 157, 2, 3, 3, 0, -2 }, // 0x72 'r'
105 | { 158, 3, 4, 4, 0, -3 }, // 0x73 's'
106 | { 160, 2, 5, 3, 0, -4 }, // 0x74 't'
107 | { 162, 3, 3, 4, 0, -2 }, // 0x75 'u'
108 | { 164, 3, 3, 4, 0, -2 }, // 0x76 'v'
109 | { 166, 5, 3, 6, 0, -2 }, // 0x77 'w'
110 | { 168, 3, 3, 4, 0, -2 }, // 0x78 'x'
111 | { 170, 3, 4, 4, 0, -2 }, // 0x79 'y'
112 | { 172, 3, 4, 4, 0, -3 }, // 0x7A 'z'
113 | { 174, 3, 5, 4, 0, -4 }, // 0x7B '{'
114 | { 176, 1, 6, 2, 0, -4 }, // 0x7C '|'
115 | { 177, 3, 5, 4, 0, -4 }, // 0x7D '}'
116 | { 179, 4, 2, 5, 0, -3 } }; // 0x7E '~'
117 |
118 | const static GFXfont Picopixel = {
119 | (uint8_t *)PicopixelBitmaps,
120 | (GFXglyph *)PicopixelGlyphs,
121 | 0x20, 0x7E, 7 };
122 |
123 | // Approx. 852 bytes
124 |
--------------------------------------------------------------------------------
/firmware-multimeter/lcd_5110/Fonts/Picopixel.h:
--------------------------------------------------------------------------------
1 | // Picopixel by Sebastian Weber. A tiny font
2 | // with all characters within a 6 pixel height.
3 |
4 | const static uint8_t PicopixelBitmaps[] = {
5 | 0xE8, 0xB4, 0x57, 0xD5, 0xF5, 0x00, 0x4E, 0x3E, 0x80, 0xA5, 0x4A, 0x4A,
6 | 0x5A, 0x50, 0xC0, 0x6A, 0x40, 0x95, 0x80, 0xAA, 0x80, 0x5D, 0x00, 0x60,
7 | 0xE0, 0x80, 0x25, 0x48, 0x56, 0xD4, 0x75, 0x40, 0xC5, 0x4E, 0xC5, 0x1C,
8 | 0x97, 0x92, 0xF3, 0x1C, 0x53, 0x54, 0xE5, 0x48, 0x55, 0x54, 0x55, 0x94,
9 | 0xA0, 0x46, 0x64, 0xE3, 0x80, 0x98, 0xC5, 0x04, 0x56, 0xC6, 0x57, 0xDA,
10 | 0xD7, 0x5C, 0x72, 0x46, 0xD6, 0xDC, 0xF3, 0xCE, 0xF3, 0x48, 0x72, 0xD4,
11 | 0xB7, 0xDA, 0xF8, 0x24, 0xD4, 0xBB, 0x5A, 0x92, 0x4E, 0x8E, 0xEB, 0x58,
12 | 0x80, 0x9D, 0xB9, 0x90, 0x56, 0xD4, 0xD7, 0x48, 0x56, 0xD4, 0x40, 0xD7,
13 | 0x5A, 0x71, 0x1C, 0xE9, 0x24, 0xB6, 0xD4, 0xB6, 0xA4, 0x8C, 0x6B, 0x55,
14 | 0x00, 0xB5, 0x5A, 0xB5, 0x24, 0xE5, 0x4E, 0xEA, 0xC0, 0x91, 0x12, 0xD5,
15 | 0xC0, 0x54, 0xF0, 0x90, 0xC7, 0xF0, 0x93, 0x5E, 0x71, 0x80, 0x25, 0xDE,
16 | 0x5E, 0x30, 0x6E, 0x80, 0x77, 0x9C, 0x93, 0x5A, 0xB8, 0x45, 0x60, 0x92,
17 | 0xEA, 0xAA, 0x40, 0xD5, 0x6A, 0xD6, 0x80, 0x55, 0x00, 0xD7, 0x40, 0x75,
18 | 0x90, 0xE8, 0x71, 0xE0, 0xBA, 0x40, 0xB5, 0x80, 0xB5, 0x00, 0x8D, 0x54,
19 | 0xAA, 0x80, 0xAC, 0xE0, 0xE5, 0x70, 0x6A, 0x26, 0xFC, 0xC8, 0xAC, 0x5A };
20 |
21 | const static GFXglyph PicopixelGlyphs[] = {
22 | { 0, 0, 0, 2, 0, 1 }, // 0x20 ' '
23 | { 0, 1, 5, 2, 0, -4 }, // 0x21 '!'
24 | { 1, 3, 2, 4, 0, -4 }, // 0x22 '"'
25 | { 2, 5, 5, 6, 0, -4 }, // 0x23 '#'
26 | { 6, 3, 6, 4, 0, -4 }, // 0x24 '$'
27 | { 9, 3, 5, 4, 0, -4 }, // 0x25 '%'
28 | { 11, 4, 5, 5, 0, -4 }, // 0x26 '&'
29 | { 14, 1, 2, 2, 0, -4 }, // 0x27 '''
30 | { 15, 2, 5, 3, 0, -4 }, // 0x28 '('
31 | { 17, 2, 5, 3, 0, -4 }, // 0x29 ')'
32 | { 19, 3, 3, 4, 0, -3 }, // 0x2A '*'
33 | { 21, 3, 3, 4, 0, -3 }, // 0x2B '+'
34 | { 23, 2, 2, 3, 0, 0 }, // 0x2C ','
35 | { 24, 3, 1, 4, 0, -2 }, // 0x2D '-'
36 | { 25, 1, 1, 2, 0, 0 }, // 0x2E '.'
37 | { 26, 3, 5, 4, 0, -4 }, // 0x2F '/'
38 | { 28, 3, 5, 4, 0, -4 }, // 0x30 '0'
39 | { 30, 2, 5, 3, 0, -4 }, // 0x31 '1'
40 | { 32, 3, 5, 4, 0, -4 }, // 0x32 '2'
41 | { 34, 3, 5, 4, 0, -4 }, // 0x33 '3'
42 | { 36, 3, 5, 4, 0, -4 }, // 0x34 '4'
43 | { 38, 3, 5, 4, 0, -4 }, // 0x35 '5'
44 | { 40, 3, 5, 4, 0, -4 }, // 0x36 '6'
45 | { 42, 3, 5, 4, 0, -4 }, // 0x37 '7'
46 | { 44, 3, 5, 4, 0, -4 }, // 0x38 '8'
47 | { 46, 3, 5, 4, 0, -4 }, // 0x39 '9'
48 | { 48, 1, 3, 2, 0, -3 }, // 0x3A ':'
49 | { 49, 2, 4, 3, 0, -3 }, // 0x3B ';'
50 | { 50, 2, 3, 3, 0, -3 }, // 0x3C '<'
51 | { 51, 3, 3, 4, 0, -3 }, // 0x3D '='
52 | { 53, 2, 3, 3, 0, -3 }, // 0x3E '>'
53 | { 54, 3, 5, 4, 0, -4 }, // 0x3F '?'
54 | { 56, 3, 5, 4, 0, -4 }, // 0x40 '@'
55 | { 58, 3, 5, 4, 0, -4 }, // 0x41 'A'
56 | { 60, 3, 5, 4, 0, -4 }, // 0x42 'B'
57 | { 62, 3, 5, 4, 0, -4 }, // 0x43 'C'
58 | { 64, 3, 5, 4, 0, -4 }, // 0x44 'D'
59 | { 66, 3, 5, 4, 0, -4 }, // 0x45 'E'
60 | { 68, 3, 5, 4, 0, -4 }, // 0x46 'F'
61 | { 70, 3, 5, 4, 0, -4 }, // 0x47 'G'
62 | { 72, 3, 5, 4, 0, -4 }, // 0x48 'H'
63 | { 74, 1, 5, 2, 0, -4 }, // 0x49 'I'
64 | { 75, 3, 5, 4, 0, -4 }, // 0x4A 'J'
65 | { 77, 3, 5, 4, 0, -4 }, // 0x4B 'K'
66 | { 79, 3, 5, 4, 0, -4 }, // 0x4C 'L'
67 | { 81, 5, 5, 6, 0, -4 }, // 0x4D 'M'
68 | { 85, 4, 5, 5, 0, -4 }, // 0x4E 'N'
69 | { 88, 3, 5, 4, 0, -4 }, // 0x4F 'O'
70 | { 90, 3, 5, 4, 0, -4 }, // 0x50 'P'
71 | { 92, 3, 6, 4, 0, -4 }, // 0x51 'Q'
72 | { 95, 3, 5, 4, 0, -4 }, // 0x52 'R'
73 | { 97, 3, 5, 4, 0, -4 }, // 0x53 'S'
74 | { 99, 3, 5, 4, 0, -4 }, // 0x54 'T'
75 | { 101, 3, 5, 4, 0, -4 }, // 0x55 'U'
76 | { 103, 3, 5, 4, 0, -4 }, // 0x56 'V'
77 | { 105, 5, 5, 6, 0, -4 }, // 0x57 'W'
78 | { 109, 3, 5, 4, 0, -4 }, // 0x58 'X'
79 | { 111, 3, 5, 4, 0, -4 }, // 0x59 'Y'
80 | { 113, 3, 5, 4, 0, -4 }, // 0x5A 'Z'
81 | { 115, 2, 5, 3, 0, -4 }, // 0x5B '['
82 | { 117, 3, 5, 4, 0, -4 }, // 0x5C '\'
83 | { 119, 2, 5, 3, 0, -4 }, // 0x5D ']'
84 | { 121, 3, 2, 4, 0, -4 }, // 0x5E '^'
85 | { 122, 4, 1, 4, 0, 1 }, // 0x5F '_'
86 | { 123, 2, 2, 3, 0, -4 }, // 0x60 '`'
87 | { 124, 3, 4, 4, 0, -3 }, // 0x61 'a'
88 | { 126, 3, 5, 4, 0, -4 }, // 0x62 'b'
89 | { 128, 3, 3, 4, 0, -2 }, // 0x63 'c'
90 | { 130, 3, 5, 4, 0, -4 }, // 0x64 'd'
91 | { 132, 3, 4, 4, 0, -3 }, // 0x65 'e'
92 | { 134, 2, 5, 3, 0, -4 }, // 0x66 'f'
93 | { 136, 3, 5, 4, 0, -3 }, // 0x67 'g'
94 | { 138, 3, 5, 4, 0, -4 }, // 0x68 'h'
95 | { 140, 1, 5, 2, 0, -4 }, // 0x69 'i'
96 | { 141, 2, 6, 3, 0, -4 }, // 0x6A 'j'
97 | { 143, 3, 5, 4, 0, -4 }, // 0x6B 'k'
98 | { 145, 2, 5, 3, 0, -4 }, // 0x6C 'l'
99 | { 147, 5, 3, 6, 0, -2 }, // 0x6D 'm'
100 | { 149, 3, 3, 4, 0, -2 }, // 0x6E 'n'
101 | { 151, 3, 3, 4, 0, -2 }, // 0x6F 'o'
102 | { 153, 3, 4, 4, 0, -2 }, // 0x70 'p'
103 | { 155, 3, 4, 4, 0, -2 }, // 0x71 'q'
104 | { 157, 2, 3, 3, 0, -2 }, // 0x72 'r'
105 | { 158, 3, 4, 4, 0, -3 }, // 0x73 's'
106 | { 160, 2, 5, 3, 0, -4 }, // 0x74 't'
107 | { 162, 3, 3, 4, 0, -2 }, // 0x75 'u'
108 | { 164, 3, 3, 4, 0, -2 }, // 0x76 'v'
109 | { 166, 5, 3, 6, 0, -2 }, // 0x77 'w'
110 | { 168, 3, 3, 4, 0, -2 }, // 0x78 'x'
111 | { 170, 3, 4, 4, 0, -2 }, // 0x79 'y'
112 | { 172, 3, 4, 4, 0, -3 }, // 0x7A 'z'
113 | { 174, 3, 5, 4, 0, -4 }, // 0x7B '{'
114 | { 176, 1, 6, 2, 0, -4 }, // 0x7C '|'
115 | { 177, 3, 5, 4, 0, -4 }, // 0x7D '}'
116 | { 179, 4, 2, 5, 0, -3 } }; // 0x7E '~'
117 |
118 | const static GFXfont Picopixel = {
119 | (uint8_t *)PicopixelBitmaps,
120 | (GFXglyph *)PicopixelGlyphs,
121 | 0x20, 0x7E, 7 };
122 |
123 | // Approx. 852 bytes
124 |
--------------------------------------------------------------------------------
/firmware-calibration/lcd_5110/Fonts/Tiny3x3a2pt7b:
--------------------------------------------------------------------------------
1 | /**
2 | ** The FontStruction “Tiny3x3a”
3 | ** (https://fontstruct.com/fontstructions/show/670512) by “Michaelangel007” is
4 | ** licensed under a Creative Commons Attribution Non-commercial Share Alike license
5 | ** (http://creativecommons.org/licenses/by-nc-sa/3.0/).
6 | ** “Tiny3x3a” was originally cloned (copied) from the FontStruction
7 | ** “CHECKER” (https://fontstruct.com/fontstructions/show/2391) by Wolf grant
8 | ** Grant, which is licensed under a Creative Commons Attribution Non-commercial
9 | ** Share Alike license (http://creativecommons.org/licenses/by-nc-sa/3.0/).
10 | *
11 | * Converted by eadmaster with fontconvert
12 | **/
13 |
14 | const uint8_t Tiny3x3a2pt7bBitmaps[] PROGMEM = {
15 | 0xC0, 0xB4, 0xBF, 0x80, 0x6B, 0x00, 0xDD, 0x80, 0x59, 0x80, 0x80, 0x64,
16 | 0x98, 0xF0, 0x5D, 0x00, 0xC0, 0xE0, 0x80, 0x2A, 0x00, 0x55, 0x00, 0x94,
17 | 0xC9, 0x80, 0xEF, 0x80, 0xBC, 0x80, 0x6B, 0x00, 0x9F, 0x80, 0xE4, 0x80,
18 | 0x7F, 0x00, 0xFC, 0x80, 0xA0, 0x58, 0x64, 0xE3, 0x80, 0x98, 0xD8, 0xD8,
19 | 0x80, 0x5E, 0x80, 0xDF, 0x80, 0x71, 0x80, 0xD7, 0x00, 0xFB, 0x80, 0xFA,
20 | 0x00, 0xD7, 0x80, 0xBE, 0x80, 0xE0, 0x27, 0x00, 0xBA, 0x80, 0x93, 0x80,
21 | 0xFE, 0x80, 0xF6, 0x80, 0xF7, 0x80, 0xFE, 0x00, 0xF7, 0x00, 0xDE, 0x80,
22 | 0x6B, 0x00, 0xE9, 0x00, 0xB7, 0x80, 0xB5, 0x00, 0xBF, 0x80, 0xAA, 0x80,
23 | 0xA9, 0x00, 0xEB, 0x80, 0xEC, 0x88, 0x80, 0xDC, 0x54, 0xE0, 0x90, 0x70,
24 | 0xBC, 0xF0, 0x7C, 0xB0, 0x68, 0xFC, 0xBC, 0xC0, 0x58, 0x9A, 0x80, 0xA4,
25 | 0xDC, 0xD4, 0xF0, 0xF8, 0xF4, 0xE0, 0x60, 0x59, 0x80, 0xBC, 0xA8, 0xEC,
26 | 0xF0, 0xAC, 0x80, 0x90, 0x79, 0x80, 0xF0, 0xCF, 0x00, 0x78 };
27 |
28 | const GFXglyph Tiny3x3a2pt7bGlyphs[] PROGMEM = {
29 | { 0, 0, 0, 4, 0, 1 }, // 0x20 ' '
30 | { 0, 1, 2, 3, 1, -2 }, // 0x21 '!'
31 | { 1, 3, 2, 4, 0, -2 }, // 0x22 '"'
32 | { 2, 3, 3, 4, 0, -2 }, // 0x23 '#'
33 | { 4, 3, 3, 4, 0, -2 }, // 0x24 '$'
34 | { 6, 3, 3, 4, 0, -2 }, // 0x25 '%'
35 | { 8, 3, 3, 4, 0, -2 }, // 0x26 '&'
36 | { 10, 1, 1, 3, 1, -2 }, // 0x27 '''
37 | { 11, 2, 3, 3, 0, -2 }, // 0x28 '('
38 | { 12, 2, 3, 4, 1, -2 }, // 0x29 ')'
39 | { 13, 2, 2, 4, 1, -2 }, // 0x2A '*'
40 | { 14, 3, 3, 4, 0, -2 }, // 0x2B '+'
41 | { 16, 1, 2, 2, 0, 0 }, // 0x2C ','
42 | { 17, 3, 1, 4, 0, -1 }, // 0x2D '-'
43 | { 18, 1, 1, 2, 0, 0 }, // 0x2E '.'
44 | { 19, 3, 3, 4, 0, -2 }, // 0x2F '/'
45 | { 21, 3, 3, 4, 0, -2 }, // 0x30 '0'
46 | { 23, 2, 3, 3, 0, -2 }, // 0x31 '1'
47 | { 24, 3, 3, 4, 0, -2 }, // 0x32 '2'
48 | { 26, 3, 3, 4, 0, -2 }, // 0x33 '3'
49 | { 28, 3, 3, 4, 0, -2 }, // 0x34 '4'
50 | { 30, 3, 3, 4, 0, -2 }, // 0x35 '5'
51 | { 32, 3, 3, 4, 0, -2 }, // 0x36 '6'
52 | { 34, 3, 3, 4, 0, -2 }, // 0x37 '7'
53 | { 36, 3, 3, 4, 0, -2 }, // 0x38 '8'
54 | { 38, 3, 3, 4, 0, -2 }, // 0x39 '9'
55 | { 40, 1, 3, 3, 1, -2 }, // 0x3A ':'
56 | { 41, 2, 3, 3, 0, -1 }, // 0x3B ';'
57 | { 42, 2, 3, 3, 0, -2 }, // 0x3C '<'
58 | { 43, 3, 3, 4, 0, -2 }, // 0x3D '='
59 | { 45, 2, 3, 4, 1, -2 }, // 0x3E '>'
60 | { 46, 2, 3, 4, 1, -2 }, // 0x3F '?'
61 | { 47, 3, 3, 4, 0, -2 }, // 0x40 '@'
62 | { 49, 3, 3, 4, 0, -2 }, // 0x41 'A'
63 | { 51, 3, 3, 4, 0, -2 }, // 0x42 'B'
64 | { 53, 3, 3, 4, 0, -2 }, // 0x43 'C'
65 | { 55, 3, 3, 4, 0, -2 }, // 0x44 'D'
66 | { 57, 3, 3, 4, 0, -2 }, // 0x45 'E'
67 | { 59, 3, 3, 4, 0, -2 }, // 0x46 'F'
68 | { 61, 3, 3, 4, 0, -2 }, // 0x47 'G'
69 | { 63, 3, 3, 4, 0, -2 }, // 0x48 'H'
70 | { 65, 1, 3, 3, 1, -2 }, // 0x49 'I'
71 | { 66, 3, 3, 4, 0, -2 }, // 0x4A 'J'
72 | { 68, 3, 3, 4, 0, -2 }, // 0x4B 'K'
73 | { 70, 3, 3, 4, 0, -2 }, // 0x4C 'L'
74 | { 72, 3, 3, 4, 0, -2 }, // 0x4D 'M'
75 | { 74, 3, 3, 4, 0, -2 }, // 0x4E 'N'
76 | { 76, 3, 3, 4, 0, -2 }, // 0x4F 'O'
77 | { 78, 3, 3, 4, 0, -2 }, // 0x50 'P'
78 | { 80, 3, 3, 4, 0, -2 }, // 0x51 'Q'
79 | { 82, 3, 3, 4, 0, -2 }, // 0x52 'R'
80 | { 84, 3, 3, 4, 0, -2 }, // 0x53 'S'
81 | { 86, 3, 3, 4, 0, -2 }, // 0x54 'T'
82 | { 88, 3, 3, 4, 0, -2 }, // 0x55 'U'
83 | { 90, 3, 3, 4, 0, -2 }, // 0x56 'V'
84 | { 92, 3, 3, 4, 0, -2 }, // 0x57 'W'
85 | { 94, 3, 3, 4, 0, -2 }, // 0x58 'X'
86 | { 96, 3, 3, 4, 0, -2 }, // 0x59 'Y'
87 | { 98, 3, 3, 4, 0, -2 }, // 0x5A 'Z'
88 | { 100, 2, 3, 3, 0, -2 }, // 0x5B '['
89 | { 101, 3, 3, 4, 0, -2 }, // 0x5C '\'
90 | { 103, 2, 3, 4, 1, -2 }, // 0x5D ']'
91 | { 104, 3, 2, 4, 0, -2 }, // 0x5E '^'
92 | { 105, 3, 1, 4, 0, 0 }, // 0x5F '_'
93 | { 106, 2, 2, 3, 0, -2 }, // 0x60 '`'
94 | { 107, 2, 2, 3, 0, -1 }, // 0x61 'a'
95 | { 108, 2, 3, 3, 0, -2 }, // 0x62 'b'
96 | { 109, 2, 2, 3, 0, -1 }, // 0x63 'c'
97 | { 110, 2, 3, 3, 0, -2 }, // 0x64 'd'
98 | { 111, 2, 2, 3, 0, -1 }, // 0x65 'e'
99 | { 112, 2, 3, 3, 0, -2 }, // 0x66 'f'
100 | { 113, 2, 3, 3, 0, -1 }, // 0x67 'g'
101 | { 114, 2, 3, 3, 0, -2 }, // 0x68 'h'
102 | { 115, 1, 2, 2, 0, -1 }, // 0x69 'i'
103 | { 116, 2, 3, 3, 0, -1 }, // 0x6A 'j'
104 | { 117, 3, 3, 4, 0, -2 }, // 0x6B 'k'
105 | { 119, 2, 3, 3, 0, -2 }, // 0x6C 'l'
106 | { 120, 3, 2, 4, 0, -1 }, // 0x6D 'm'
107 | { 121, 3, 2, 4, 0, -1 }, // 0x6E 'n'
108 | { 122, 2, 2, 3, 0, -1 }, // 0x6F 'o'
109 | { 123, 2, 3, 3, 0, -1 }, // 0x70 'p'
110 | { 124, 2, 3, 3, 0, -1 }, // 0x71 'q'
111 | { 125, 2, 2, 3, 0, -1 }, // 0x72 'r'
112 | { 126, 2, 2, 3, 0, -1 }, // 0x73 's'
113 | { 127, 3, 3, 4, 0, -2 }, // 0x74 't'
114 | { 129, 3, 2, 4, 0, -1 }, // 0x75 'u'
115 | { 130, 3, 2, 4, 0, -1 }, // 0x76 'v'
116 | { 131, 3, 2, 4, 0, -1 }, // 0x77 'w'
117 | { 132, 2, 2, 3, 0, -1 }, // 0x78 'x'
118 | { 133, 3, 3, 4, 0, -1 }, // 0x79 'y'
119 | { 135, 2, 2, 3, 0, -1 }, // 0x7A 'z'
120 | { 136, 3, 3, 4, 0, -2 }, // 0x7B '{'
121 | { 138, 1, 4, 3, 1, -2 }, // 0x7C '|'
122 | { 139, 3, 3, 4, 0, -2 }, // 0x7D '}'
123 | { 141, 3, 2, 4, 0, -2 } }; // 0x7E '~'
124 |
125 | const GFXfont Tiny3x3a2pt7b PROGMEM = {
126 | (uint8_t *)Tiny3x3a2pt7bBitmaps,
127 | (GFXglyph *)Tiny3x3a2pt7bGlyphs,
128 | 0x20, 0x7E, 4 };
129 |
130 | // Approx. 814 bytes
131 |
--------------------------------------------------------------------------------
/firmware-multimeter/lcd_5110/Fonts/Tiny3x3a2pt7b:
--------------------------------------------------------------------------------
1 | /**
2 | ** The FontStruction “Tiny3x3a”
3 | ** (https://fontstruct.com/fontstructions/show/670512) by “Michaelangel007” is
4 | ** licensed under a Creative Commons Attribution Non-commercial Share Alike license
5 | ** (http://creativecommons.org/licenses/by-nc-sa/3.0/).
6 | ** “Tiny3x3a” was originally cloned (copied) from the FontStruction
7 | ** “CHECKER” (https://fontstruct.com/fontstructions/show/2391) by Wolf grant
8 | ** Grant, which is licensed under a Creative Commons Attribution Non-commercial
9 | ** Share Alike license (http://creativecommons.org/licenses/by-nc-sa/3.0/).
10 | *
11 | * Converted by eadmaster with fontconvert
12 | **/
13 |
14 | const uint8_t Tiny3x3a2pt7bBitmaps[] PROGMEM = {
15 | 0xC0, 0xB4, 0xBF, 0x80, 0x6B, 0x00, 0xDD, 0x80, 0x59, 0x80, 0x80, 0x64,
16 | 0x98, 0xF0, 0x5D, 0x00, 0xC0, 0xE0, 0x80, 0x2A, 0x00, 0x55, 0x00, 0x94,
17 | 0xC9, 0x80, 0xEF, 0x80, 0xBC, 0x80, 0x6B, 0x00, 0x9F, 0x80, 0xE4, 0x80,
18 | 0x7F, 0x00, 0xFC, 0x80, 0xA0, 0x58, 0x64, 0xE3, 0x80, 0x98, 0xD8, 0xD8,
19 | 0x80, 0x5E, 0x80, 0xDF, 0x80, 0x71, 0x80, 0xD7, 0x00, 0xFB, 0x80, 0xFA,
20 | 0x00, 0xD7, 0x80, 0xBE, 0x80, 0xE0, 0x27, 0x00, 0xBA, 0x80, 0x93, 0x80,
21 | 0xFE, 0x80, 0xF6, 0x80, 0xF7, 0x80, 0xFE, 0x00, 0xF7, 0x00, 0xDE, 0x80,
22 | 0x6B, 0x00, 0xE9, 0x00, 0xB7, 0x80, 0xB5, 0x00, 0xBF, 0x80, 0xAA, 0x80,
23 | 0xA9, 0x00, 0xEB, 0x80, 0xEC, 0x88, 0x80, 0xDC, 0x54, 0xE0, 0x90, 0x70,
24 | 0xBC, 0xF0, 0x7C, 0xB0, 0x68, 0xFC, 0xBC, 0xC0, 0x58, 0x9A, 0x80, 0xA4,
25 | 0xDC, 0xD4, 0xF0, 0xF8, 0xF4, 0xE0, 0x60, 0x59, 0x80, 0xBC, 0xA8, 0xEC,
26 | 0xF0, 0xAC, 0x80, 0x90, 0x79, 0x80, 0xF0, 0xCF, 0x00, 0x78 };
27 |
28 | const GFXglyph Tiny3x3a2pt7bGlyphs[] PROGMEM = {
29 | { 0, 0, 0, 4, 0, 1 }, // 0x20 ' '
30 | { 0, 1, 2, 3, 1, -2 }, // 0x21 '!'
31 | { 1, 3, 2, 4, 0, -2 }, // 0x22 '"'
32 | { 2, 3, 3, 4, 0, -2 }, // 0x23 '#'
33 | { 4, 3, 3, 4, 0, -2 }, // 0x24 '$'
34 | { 6, 3, 3, 4, 0, -2 }, // 0x25 '%'
35 | { 8, 3, 3, 4, 0, -2 }, // 0x26 '&'
36 | { 10, 1, 1, 3, 1, -2 }, // 0x27 '''
37 | { 11, 2, 3, 3, 0, -2 }, // 0x28 '('
38 | { 12, 2, 3, 4, 1, -2 }, // 0x29 ')'
39 | { 13, 2, 2, 4, 1, -2 }, // 0x2A '*'
40 | { 14, 3, 3, 4, 0, -2 }, // 0x2B '+'
41 | { 16, 1, 2, 2, 0, 0 }, // 0x2C ','
42 | { 17, 3, 1, 4, 0, -1 }, // 0x2D '-'
43 | { 18, 1, 1, 2, 0, 0 }, // 0x2E '.'
44 | { 19, 3, 3, 4, 0, -2 }, // 0x2F '/'
45 | { 21, 3, 3, 4, 0, -2 }, // 0x30 '0'
46 | { 23, 2, 3, 3, 0, -2 }, // 0x31 '1'
47 | { 24, 3, 3, 4, 0, -2 }, // 0x32 '2'
48 | { 26, 3, 3, 4, 0, -2 }, // 0x33 '3'
49 | { 28, 3, 3, 4, 0, -2 }, // 0x34 '4'
50 | { 30, 3, 3, 4, 0, -2 }, // 0x35 '5'
51 | { 32, 3, 3, 4, 0, -2 }, // 0x36 '6'
52 | { 34, 3, 3, 4, 0, -2 }, // 0x37 '7'
53 | { 36, 3, 3, 4, 0, -2 }, // 0x38 '8'
54 | { 38, 3, 3, 4, 0, -2 }, // 0x39 '9'
55 | { 40, 1, 3, 3, 1, -2 }, // 0x3A ':'
56 | { 41, 2, 3, 3, 0, -1 }, // 0x3B ';'
57 | { 42, 2, 3, 3, 0, -2 }, // 0x3C '<'
58 | { 43, 3, 3, 4, 0, -2 }, // 0x3D '='
59 | { 45, 2, 3, 4, 1, -2 }, // 0x3E '>'
60 | { 46, 2, 3, 4, 1, -2 }, // 0x3F '?'
61 | { 47, 3, 3, 4, 0, -2 }, // 0x40 '@'
62 | { 49, 3, 3, 4, 0, -2 }, // 0x41 'A'
63 | { 51, 3, 3, 4, 0, -2 }, // 0x42 'B'
64 | { 53, 3, 3, 4, 0, -2 }, // 0x43 'C'
65 | { 55, 3, 3, 4, 0, -2 }, // 0x44 'D'
66 | { 57, 3, 3, 4, 0, -2 }, // 0x45 'E'
67 | { 59, 3, 3, 4, 0, -2 }, // 0x46 'F'
68 | { 61, 3, 3, 4, 0, -2 }, // 0x47 'G'
69 | { 63, 3, 3, 4, 0, -2 }, // 0x48 'H'
70 | { 65, 1, 3, 3, 1, -2 }, // 0x49 'I'
71 | { 66, 3, 3, 4, 0, -2 }, // 0x4A 'J'
72 | { 68, 3, 3, 4, 0, -2 }, // 0x4B 'K'
73 | { 70, 3, 3, 4, 0, -2 }, // 0x4C 'L'
74 | { 72, 3, 3, 4, 0, -2 }, // 0x4D 'M'
75 | { 74, 3, 3, 4, 0, -2 }, // 0x4E 'N'
76 | { 76, 3, 3, 4, 0, -2 }, // 0x4F 'O'
77 | { 78, 3, 3, 4, 0, -2 }, // 0x50 'P'
78 | { 80, 3, 3, 4, 0, -2 }, // 0x51 'Q'
79 | { 82, 3, 3, 4, 0, -2 }, // 0x52 'R'
80 | { 84, 3, 3, 4, 0, -2 }, // 0x53 'S'
81 | { 86, 3, 3, 4, 0, -2 }, // 0x54 'T'
82 | { 88, 3, 3, 4, 0, -2 }, // 0x55 'U'
83 | { 90, 3, 3, 4, 0, -2 }, // 0x56 'V'
84 | { 92, 3, 3, 4, 0, -2 }, // 0x57 'W'
85 | { 94, 3, 3, 4, 0, -2 }, // 0x58 'X'
86 | { 96, 3, 3, 4, 0, -2 }, // 0x59 'Y'
87 | { 98, 3, 3, 4, 0, -2 }, // 0x5A 'Z'
88 | { 100, 2, 3, 3, 0, -2 }, // 0x5B '['
89 | { 101, 3, 3, 4, 0, -2 }, // 0x5C '\'
90 | { 103, 2, 3, 4, 1, -2 }, // 0x5D ']'
91 | { 104, 3, 2, 4, 0, -2 }, // 0x5E '^'
92 | { 105, 3, 1, 4, 0, 0 }, // 0x5F '_'
93 | { 106, 2, 2, 3, 0, -2 }, // 0x60 '`'
94 | { 107, 2, 2, 3, 0, -1 }, // 0x61 'a'
95 | { 108, 2, 3, 3, 0, -2 }, // 0x62 'b'
96 | { 109, 2, 2, 3, 0, -1 }, // 0x63 'c'
97 | { 110, 2, 3, 3, 0, -2 }, // 0x64 'd'
98 | { 111, 2, 2, 3, 0, -1 }, // 0x65 'e'
99 | { 112, 2, 3, 3, 0, -2 }, // 0x66 'f'
100 | { 113, 2, 3, 3, 0, -1 }, // 0x67 'g'
101 | { 114, 2, 3, 3, 0, -2 }, // 0x68 'h'
102 | { 115, 1, 2, 2, 0, -1 }, // 0x69 'i'
103 | { 116, 2, 3, 3, 0, -1 }, // 0x6A 'j'
104 | { 117, 3, 3, 4, 0, -2 }, // 0x6B 'k'
105 | { 119, 2, 3, 3, 0, -2 }, // 0x6C 'l'
106 | { 120, 3, 2, 4, 0, -1 }, // 0x6D 'm'
107 | { 121, 3, 2, 4, 0, -1 }, // 0x6E 'n'
108 | { 122, 2, 2, 3, 0, -1 }, // 0x6F 'o'
109 | { 123, 2, 3, 3, 0, -1 }, // 0x70 'p'
110 | { 124, 2, 3, 3, 0, -1 }, // 0x71 'q'
111 | { 125, 2, 2, 3, 0, -1 }, // 0x72 'r'
112 | { 126, 2, 2, 3, 0, -1 }, // 0x73 's'
113 | { 127, 3, 3, 4, 0, -2 }, // 0x74 't'
114 | { 129, 3, 2, 4, 0, -1 }, // 0x75 'u'
115 | { 130, 3, 2, 4, 0, -1 }, // 0x76 'v'
116 | { 131, 3, 2, 4, 0, -1 }, // 0x77 'w'
117 | { 132, 2, 2, 3, 0, -1 }, // 0x78 'x'
118 | { 133, 3, 3, 4, 0, -1 }, // 0x79 'y'
119 | { 135, 2, 2, 3, 0, -1 }, // 0x7A 'z'
120 | { 136, 3, 3, 4, 0, -2 }, // 0x7B '{'
121 | { 138, 1, 4, 3, 1, -2 }, // 0x7C '|'
122 | { 139, 3, 3, 4, 0, -2 }, // 0x7D '}'
123 | { 141, 3, 2, 4, 0, -2 } }; // 0x7E '~'
124 |
125 | const GFXfont Tiny3x3a2pt7b PROGMEM = {
126 | (uint8_t *)Tiny3x3a2pt7bBitmaps,
127 | (GFXglyph *)Tiny3x3a2pt7bGlyphs,
128 | 0x20, 0x7E, 4 };
129 |
130 | // Approx. 814 bytes
131 |
--------------------------------------------------------------------------------
/firmware-calibration/lcd_5110/Fonts/Org_01.h:
--------------------------------------------------------------------------------
1 | // Org_v01 by Orgdot (www.orgdot.com/aliasfonts). A tiny,
2 | // stylized font with all characters within a 6 pixel height.
3 |
4 | const static uint8_t Org_01Bitmaps[] = {
5 | 0xE8, 0xA0, 0x57, 0xD5, 0xF5, 0x00, 0xFD, 0x3E, 0x5F, 0x80, 0x88, 0x88,
6 | 0x88, 0x80, 0xF4, 0xBF, 0x2E, 0x80, 0x80, 0x6A, 0x40, 0x95, 0x80, 0xAA,
7 | 0x80, 0x5D, 0x00, 0xC0, 0xF0, 0x80, 0x08, 0x88, 0x88, 0x00, 0xFC, 0x63,
8 | 0x1F, 0x80, 0xF8, 0xF8, 0x7F, 0x0F, 0x80, 0xF8, 0x7E, 0x1F, 0x80, 0x8C,
9 | 0x7E, 0x10, 0x80, 0xFC, 0x3E, 0x1F, 0x80, 0xFC, 0x3F, 0x1F, 0x80, 0xF8,
10 | 0x42, 0x10, 0x80, 0xFC, 0x7F, 0x1F, 0x80, 0xFC, 0x7E, 0x1F, 0x80, 0x90,
11 | 0xB0, 0x2A, 0x22, 0xF0, 0xF0, 0x88, 0xA8, 0xF8, 0x4E, 0x02, 0x00, 0xFD,
12 | 0x6F, 0x0F, 0x80, 0xFC, 0x7F, 0x18, 0x80, 0xF4, 0x7D, 0x1F, 0x00, 0xFC,
13 | 0x21, 0x0F, 0x80, 0xF4, 0x63, 0x1F, 0x00, 0xFC, 0x3F, 0x0F, 0x80, 0xFC,
14 | 0x3F, 0x08, 0x00, 0xFC, 0x2F, 0x1F, 0x80, 0x8C, 0x7F, 0x18, 0x80, 0xF9,
15 | 0x08, 0x4F, 0x80, 0x78, 0x85, 0x2F, 0x80, 0x8D, 0xB1, 0x68, 0x80, 0x84,
16 | 0x21, 0x0F, 0x80, 0xFD, 0x6B, 0x5A, 0x80, 0xFC, 0x63, 0x18, 0x80, 0xFC,
17 | 0x63, 0x1F, 0x80, 0xFC, 0x7F, 0x08, 0x00, 0xFC, 0x63, 0x3F, 0x80, 0xFC,
18 | 0x7F, 0x29, 0x00, 0xFC, 0x3E, 0x1F, 0x80, 0xF9, 0x08, 0x42, 0x00, 0x8C,
19 | 0x63, 0x1F, 0x80, 0x8C, 0x62, 0xA2, 0x00, 0xAD, 0x6B, 0x5F, 0x80, 0x8A,
20 | 0x88, 0xA8, 0x80, 0x8C, 0x54, 0x42, 0x00, 0xF8, 0x7F, 0x0F, 0x80, 0xEA,
21 | 0xC0, 0x82, 0x08, 0x20, 0x80, 0xD5, 0xC0, 0x54, 0xF8, 0x80, 0xF1, 0xFF,
22 | 0x8F, 0x99, 0xF0, 0xF8, 0x8F, 0x1F, 0x99, 0xF0, 0xFF, 0x8F, 0x6B, 0xA4,
23 | 0xF9, 0x9F, 0x10, 0x8F, 0x99, 0x90, 0xF0, 0x55, 0xC0, 0x8A, 0xF9, 0x90,
24 | 0xF8, 0xFD, 0x63, 0x10, 0xF9, 0x99, 0xF9, 0x9F, 0xF9, 0x9F, 0x80, 0xF9,
25 | 0x9F, 0x20, 0xF8, 0x88, 0x47, 0x1F, 0x27, 0xC8, 0x42, 0x00, 0x99, 0x9F,
26 | 0x99, 0x97, 0x8C, 0x6B, 0xF0, 0x96, 0x69, 0x99, 0x9F, 0x10, 0x2E, 0x8F,
27 | 0x2B, 0x22, 0xF8, 0x89, 0xA8, 0x0F, 0xE0 };
28 |
29 | const static GFXglyph Org_01Glyphs[] = {
30 | { 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
31 | { 0, 1, 5, 2, 0, -4 }, // 0x21 '!'
32 | { 1, 3, 1, 4, 0, -4 }, // 0x22 '"'
33 | { 2, 5, 5, 6, 0, -4 }, // 0x23 '#'
34 | { 6, 5, 5, 6, 0, -4 }, // 0x24 '$'
35 | { 10, 5, 5, 6, 0, -4 }, // 0x25 '%'
36 | { 14, 5, 5, 6, 0, -4 }, // 0x26 '&'
37 | { 18, 1, 1, 2, 0, -4 }, // 0x27 '''
38 | { 19, 2, 5, 3, 0, -4 }, // 0x28 '('
39 | { 21, 2, 5, 3, 0, -4 }, // 0x29 ')'
40 | { 23, 3, 3, 4, 0, -3 }, // 0x2A '*'
41 | { 25, 3, 3, 4, 0, -3 }, // 0x2B '+'
42 | { 27, 1, 2, 2, 0, 0 }, // 0x2C ','
43 | { 28, 4, 1, 5, 0, -2 }, // 0x2D '-'
44 | { 29, 1, 1, 2, 0, 0 }, // 0x2E '.'
45 | { 30, 5, 5, 6, 0, -4 }, // 0x2F '/'
46 | { 34, 5, 5, 6, 0, -4 }, // 0x30 '0'
47 | { 38, 1, 5, 2, 0, -4 }, // 0x31 '1'
48 | { 39, 5, 5, 6, 0, -4 }, // 0x32 '2'
49 | { 43, 5, 5, 6, 0, -4 }, // 0x33 '3'
50 | { 47, 5, 5, 6, 0, -4 }, // 0x34 '4'
51 | { 51, 5, 5, 6, 0, -4 }, // 0x35 '5'
52 | { 55, 5, 5, 6, 0, -4 }, // 0x36 '6'
53 | { 59, 5, 5, 6, 0, -4 }, // 0x37 '7'
54 | { 63, 5, 5, 6, 0, -4 }, // 0x38 '8'
55 | { 67, 5, 5, 6, 0, -4 }, // 0x39 '9'
56 | { 71, 1, 4, 2, 0, -3 }, // 0x3A ':'
57 | { 72, 1, 4, 2, 0, -3 }, // 0x3B ';'
58 | { 73, 3, 5, 4, 0, -4 }, // 0x3C '<'
59 | { 75, 4, 3, 5, 0, -3 }, // 0x3D '='
60 | { 77, 3, 5, 4, 0, -4 }, // 0x3E '>'
61 | { 79, 5, 5, 6, 0, -4 }, // 0x3F '?'
62 | { 83, 5, 5, 6, 0, -4 }, // 0x40 '@'
63 | { 87, 5, 5, 6, 0, -4 }, // 0x41 'A'
64 | { 91, 5, 5, 6, 0, -4 }, // 0x42 'B'
65 | { 95, 5, 5, 6, 0, -4 }, // 0x43 'C'
66 | { 99, 5, 5, 6, 0, -4 }, // 0x44 'D'
67 | { 103, 5, 5, 6, 0, -4 }, // 0x45 'E'
68 | { 107, 5, 5, 6, 0, -4 }, // 0x46 'F'
69 | { 111, 5, 5, 6, 0, -4 }, // 0x47 'G'
70 | { 115, 5, 5, 6, 0, -4 }, // 0x48 'H'
71 | { 119, 5, 5, 6, 0, -4 }, // 0x49 'I'
72 | { 123, 5, 5, 6, 0, -4 }, // 0x4A 'J'
73 | { 127, 5, 5, 6, 0, -4 }, // 0x4B 'K'
74 | { 131, 5, 5, 6, 0, -4 }, // 0x4C 'L'
75 | { 135, 5, 5, 6, 0, -4 }, // 0x4D 'M'
76 | { 139, 5, 5, 6, 0, -4 }, // 0x4E 'N'
77 | { 143, 5, 5, 6, 0, -4 }, // 0x4F 'O'
78 | { 147, 5, 5, 6, 0, -4 }, // 0x50 'P'
79 | { 151, 5, 5, 6, 0, -4 }, // 0x51 'Q'
80 | { 155, 5, 5, 6, 0, -4 }, // 0x52 'R'
81 | { 159, 5, 5, 6, 0, -4 }, // 0x53 'S'
82 | { 163, 5, 5, 6, 0, -4 }, // 0x54 'T'
83 | { 167, 5, 5, 6, 0, -4 }, // 0x55 'U'
84 | { 171, 5, 5, 6, 0, -4 }, // 0x56 'V'
85 | { 175, 5, 5, 6, 0, -4 }, // 0x57 'W'
86 | { 179, 5, 5, 6, 0, -4 }, // 0x58 'X'
87 | { 183, 5, 5, 6, 0, -4 }, // 0x59 'Y'
88 | { 187, 5, 5, 6, 0, -4 }, // 0x5A 'Z'
89 | { 191, 2, 5, 3, 0, -4 }, // 0x5B '['
90 | { 193, 5, 5, 6, 0, -4 }, // 0x5C '\'
91 | { 197, 2, 5, 3, 0, -4 }, // 0x5D ']'
92 | { 199, 3, 2, 4, 0, -4 }, // 0x5E '^'
93 | { 200, 5, 1, 6, 0, 1 }, // 0x5F '_'
94 | { 201, 1, 1, 2, 0, -4 }, // 0x60 '`'
95 | { 202, 4, 4, 5, 0, -3 }, // 0x61 'a'
96 | { 204, 4, 5, 5, 0, -4 }, // 0x62 'b'
97 | { 207, 4, 4, 5, 0, -3 }, // 0x63 'c'
98 | { 209, 4, 5, 5, 0, -4 }, // 0x64 'd'
99 | { 212, 4, 4, 5, 0, -3 }, // 0x65 'e'
100 | { 214, 3, 5, 4, 0, -4 }, // 0x66 'f'
101 | { 216, 4, 5, 5, 0, -3 }, // 0x67 'g'
102 | { 219, 4, 5, 5, 0, -4 }, // 0x68 'h'
103 | { 222, 1, 4, 2, 0, -3 }, // 0x69 'i'
104 | { 223, 2, 5, 3, 0, -3 }, // 0x6A 'j'
105 | { 225, 4, 5, 5, 0, -4 }, // 0x6B 'k'
106 | { 228, 1, 5, 2, 0, -4 }, // 0x6C 'l'
107 | { 229, 5, 4, 6, 0, -3 }, // 0x6D 'm'
108 | { 232, 4, 4, 5, 0, -3 }, // 0x6E 'n'
109 | { 234, 4, 4, 5, 0, -3 }, // 0x6F 'o'
110 | { 236, 4, 5, 5, 0, -3 }, // 0x70 'p'
111 | { 239, 4, 5, 5, 0, -3 }, // 0x71 'q'
112 | { 242, 4, 4, 5, 0, -3 }, // 0x72 'r'
113 | { 244, 4, 4, 5, 0, -3 }, // 0x73 's'
114 | { 246, 5, 5, 6, 0, -4 }, // 0x74 't'
115 | { 250, 4, 4, 5, 0, -3 }, // 0x75 'u'
116 | { 252, 4, 4, 5, 0, -3 }, // 0x76 'v'
117 | { 254, 5, 4, 6, 0, -3 }, // 0x77 'w'
118 | { 257, 4, 4, 5, 0, -3 }, // 0x78 'x'
119 | { 259, 4, 5, 5, 0, -3 }, // 0x79 'y'
120 | { 262, 4, 4, 5, 0, -3 }, // 0x7A 'z'
121 | { 264, 3, 5, 4, 0, -4 }, // 0x7B '{'
122 | { 266, 1, 5, 2, 0, -4 }, // 0x7C '|'
123 | { 267, 3, 5, 4, 0, -4 }, // 0x7D '}'
124 | { 269, 5, 3, 6, 0, -3 } }; // 0x7E '~'
125 |
126 | const static GFXfont Org_01 = {
127 | (uint8_t *)Org_01Bitmaps,
128 | (GFXglyph *)Org_01Glyphs,
129 | 0x20, 0x7E, 7 };
130 |
131 | // Approx. 943 bytes
132 |
--------------------------------------------------------------------------------
/firmware-multimeter/lcd_5110/Fonts/Org_01.h:
--------------------------------------------------------------------------------
1 | // Org_v01 by Orgdot (www.orgdot.com/aliasfonts). A tiny,
2 | // stylized font with all characters within a 6 pixel height.
3 |
4 | const static uint8_t Org_01Bitmaps[] = {
5 | 0xE8, 0xA0, 0x57, 0xD5, 0xF5, 0x00, 0xFD, 0x3E, 0x5F, 0x80, 0x88, 0x88,
6 | 0x88, 0x80, 0xF4, 0xBF, 0x2E, 0x80, 0x80, 0x6A, 0x40, 0x95, 0x80, 0xAA,
7 | 0x80, 0x5D, 0x00, 0xC0, 0xF0, 0x80, 0x08, 0x88, 0x88, 0x00, 0xFC, 0x63,
8 | 0x1F, 0x80, 0xF8, 0xF8, 0x7F, 0x0F, 0x80, 0xF8, 0x7E, 0x1F, 0x80, 0x8C,
9 | 0x7E, 0x10, 0x80, 0xFC, 0x3E, 0x1F, 0x80, 0xFC, 0x3F, 0x1F, 0x80, 0xF8,
10 | 0x42, 0x10, 0x80, 0xFC, 0x7F, 0x1F, 0x80, 0xFC, 0x7E, 0x1F, 0x80, 0x90,
11 | 0xB0, 0x2A, 0x22, 0xF0, 0xF0, 0x88, 0xA8, 0xF8, 0x4E, 0x02, 0x00, 0xFD,
12 | 0x6F, 0x0F, 0x80, 0xFC, 0x7F, 0x18, 0x80, 0xF4, 0x7D, 0x1F, 0x00, 0xFC,
13 | 0x21, 0x0F, 0x80, 0xF4, 0x63, 0x1F, 0x00, 0xFC, 0x3F, 0x0F, 0x80, 0xFC,
14 | 0x3F, 0x08, 0x00, 0xFC, 0x2F, 0x1F, 0x80, 0x8C, 0x7F, 0x18, 0x80, 0xF9,
15 | 0x08, 0x4F, 0x80, 0x78, 0x85, 0x2F, 0x80, 0x8D, 0xB1, 0x68, 0x80, 0x84,
16 | 0x21, 0x0F, 0x80, 0xFD, 0x6B, 0x5A, 0x80, 0xFC, 0x63, 0x18, 0x80, 0xFC,
17 | 0x63, 0x1F, 0x80, 0xFC, 0x7F, 0x08, 0x00, 0xFC, 0x63, 0x3F, 0x80, 0xFC,
18 | 0x7F, 0x29, 0x00, 0xFC, 0x3E, 0x1F, 0x80, 0xF9, 0x08, 0x42, 0x00, 0x8C,
19 | 0x63, 0x1F, 0x80, 0x8C, 0x62, 0xA2, 0x00, 0xAD, 0x6B, 0x5F, 0x80, 0x8A,
20 | 0x88, 0xA8, 0x80, 0x8C, 0x54, 0x42, 0x00, 0xF8, 0x7F, 0x0F, 0x80, 0xEA,
21 | 0xC0, 0x82, 0x08, 0x20, 0x80, 0xD5, 0xC0, 0x54, 0xF8, 0x80, 0xF1, 0xFF,
22 | 0x8F, 0x99, 0xF0, 0xF8, 0x8F, 0x1F, 0x99, 0xF0, 0xFF, 0x8F, 0x6B, 0xA4,
23 | 0xF9, 0x9F, 0x10, 0x8F, 0x99, 0x90, 0xF0, 0x55, 0xC0, 0x8A, 0xF9, 0x90,
24 | 0xF8, 0xFD, 0x63, 0x10, 0xF9, 0x99, 0xF9, 0x9F, 0xF9, 0x9F, 0x80, 0xF9,
25 | 0x9F, 0x20, 0xF8, 0x88, 0x47, 0x1F, 0x27, 0xC8, 0x42, 0x00, 0x99, 0x9F,
26 | 0x99, 0x97, 0x8C, 0x6B, 0xF0, 0x96, 0x69, 0x99, 0x9F, 0x10, 0x2E, 0x8F,
27 | 0x2B, 0x22, 0xF8, 0x89, 0xA8, 0x0F, 0xE0 };
28 |
29 | const static GFXglyph Org_01Glyphs[] = {
30 | { 0, 0, 0, 6, 0, 1 }, // 0x20 ' '
31 | { 0, 1, 5, 2, 0, -4 }, // 0x21 '!'
32 | { 1, 3, 1, 4, 0, -4 }, // 0x22 '"'
33 | { 2, 5, 5, 6, 0, -4 }, // 0x23 '#'
34 | { 6, 5, 5, 6, 0, -4 }, // 0x24 '$'
35 | { 10, 5, 5, 6, 0, -4 }, // 0x25 '%'
36 | { 14, 5, 5, 6, 0, -4 }, // 0x26 '&'
37 | { 18, 1, 1, 2, 0, -4 }, // 0x27 '''
38 | { 19, 2, 5, 3, 0, -4 }, // 0x28 '('
39 | { 21, 2, 5, 3, 0, -4 }, // 0x29 ')'
40 | { 23, 3, 3, 4, 0, -3 }, // 0x2A '*'
41 | { 25, 3, 3, 4, 0, -3 }, // 0x2B '+'
42 | { 27, 1, 2, 2, 0, 0 }, // 0x2C ','
43 | { 28, 4, 1, 5, 0, -2 }, // 0x2D '-'
44 | { 29, 1, 1, 2, 0, 0 }, // 0x2E '.'
45 | { 30, 5, 5, 6, 0, -4 }, // 0x2F '/'
46 | { 34, 5, 5, 6, 0, -4 }, // 0x30 '0'
47 | { 38, 1, 5, 2, 0, -4 }, // 0x31 '1'
48 | { 39, 5, 5, 6, 0, -4 }, // 0x32 '2'
49 | { 43, 5, 5, 6, 0, -4 }, // 0x33 '3'
50 | { 47, 5, 5, 6, 0, -4 }, // 0x34 '4'
51 | { 51, 5, 5, 6, 0, -4 }, // 0x35 '5'
52 | { 55, 5, 5, 6, 0, -4 }, // 0x36 '6'
53 | { 59, 5, 5, 6, 0, -4 }, // 0x37 '7'
54 | { 63, 5, 5, 6, 0, -4 }, // 0x38 '8'
55 | { 67, 5, 5, 6, 0, -4 }, // 0x39 '9'
56 | { 71, 1, 4, 2, 0, -3 }, // 0x3A ':'
57 | { 72, 1, 4, 2, 0, -3 }, // 0x3B ';'
58 | { 73, 3, 5, 4, 0, -4 }, // 0x3C '<'
59 | { 75, 4, 3, 5, 0, -3 }, // 0x3D '='
60 | { 77, 3, 5, 4, 0, -4 }, // 0x3E '>'
61 | { 79, 5, 5, 6, 0, -4 }, // 0x3F '?'
62 | { 83, 5, 5, 6, 0, -4 }, // 0x40 '@'
63 | { 87, 5, 5, 6, 0, -4 }, // 0x41 'A'
64 | { 91, 5, 5, 6, 0, -4 }, // 0x42 'B'
65 | { 95, 5, 5, 6, 0, -4 }, // 0x43 'C'
66 | { 99, 5, 5, 6, 0, -4 }, // 0x44 'D'
67 | { 103, 5, 5, 6, 0, -4 }, // 0x45 'E'
68 | { 107, 5, 5, 6, 0, -4 }, // 0x46 'F'
69 | { 111, 5, 5, 6, 0, -4 }, // 0x47 'G'
70 | { 115, 5, 5, 6, 0, -4 }, // 0x48 'H'
71 | { 119, 5, 5, 6, 0, -4 }, // 0x49 'I'
72 | { 123, 5, 5, 6, 0, -4 }, // 0x4A 'J'
73 | { 127, 5, 5, 6, 0, -4 }, // 0x4B 'K'
74 | { 131, 5, 5, 6, 0, -4 }, // 0x4C 'L'
75 | { 135, 5, 5, 6, 0, -4 }, // 0x4D 'M'
76 | { 139, 5, 5, 6, 0, -4 }, // 0x4E 'N'
77 | { 143, 5, 5, 6, 0, -4 }, // 0x4F 'O'
78 | { 147, 5, 5, 6, 0, -4 }, // 0x50 'P'
79 | { 151, 5, 5, 6, 0, -4 }, // 0x51 'Q'
80 | { 155, 5, 5, 6, 0, -4 }, // 0x52 'R'
81 | { 159, 5, 5, 6, 0, -4 }, // 0x53 'S'
82 | { 163, 5, 5, 6, 0, -4 }, // 0x54 'T'
83 | { 167, 5, 5, 6, 0, -4 }, // 0x55 'U'
84 | { 171, 5, 5, 6, 0, -4 }, // 0x56 'V'
85 | { 175, 5, 5, 6, 0, -4 }, // 0x57 'W'
86 | { 179, 5, 5, 6, 0, -4 }, // 0x58 'X'
87 | { 183, 5, 5, 6, 0, -4 }, // 0x59 'Y'
88 | { 187, 5, 5, 6, 0, -4 }, // 0x5A 'Z'
89 | { 191, 2, 5, 3, 0, -4 }, // 0x5B '['
90 | { 193, 5, 5, 6, 0, -4 }, // 0x5C '\'
91 | { 197, 2, 5, 3, 0, -4 }, // 0x5D ']'
92 | { 199, 3, 2, 4, 0, -4 }, // 0x5E '^'
93 | { 200, 5, 1, 6, 0, 1 }, // 0x5F '_'
94 | { 201, 1, 1, 2, 0, -4 }, // 0x60 '`'
95 | { 202, 4, 4, 5, 0, -3 }, // 0x61 'a'
96 | { 204, 4, 5, 5, 0, -4 }, // 0x62 'b'
97 | { 207, 4, 4, 5, 0, -3 }, // 0x63 'c'
98 | { 209, 4, 5, 5, 0, -4 }, // 0x64 'd'
99 | { 212, 4, 4, 5, 0, -3 }, // 0x65 'e'
100 | { 214, 3, 5, 4, 0, -4 }, // 0x66 'f'
101 | { 216, 4, 5, 5, 0, -3 }, // 0x67 'g'
102 | { 219, 4, 5, 5, 0, -4 }, // 0x68 'h'
103 | { 222, 1, 4, 2, 0, -3 }, // 0x69 'i'
104 | { 223, 2, 5, 3, 0, -3 }, // 0x6A 'j'
105 | { 225, 4, 5, 5, 0, -4 }, // 0x6B 'k'
106 | { 228, 1, 5, 2, 0, -4 }, // 0x6C 'l'
107 | { 229, 5, 4, 6, 0, -3 }, // 0x6D 'm'
108 | { 232, 4, 4, 5, 0, -3 }, // 0x6E 'n'
109 | { 234, 4, 4, 5, 0, -3 }, // 0x6F 'o'
110 | { 236, 4, 5, 5, 0, -3 }, // 0x70 'p'
111 | { 239, 4, 5, 5, 0, -3 }, // 0x71 'q'
112 | { 242, 4, 4, 5, 0, -3 }, // 0x72 'r'
113 | { 244, 4, 4, 5, 0, -3 }, // 0x73 's'
114 | { 246, 5, 5, 6, 0, -4 }, // 0x74 't'
115 | { 250, 4, 4, 5, 0, -3 }, // 0x75 'u'
116 | { 252, 4, 4, 5, 0, -3 }, // 0x76 'v'
117 | { 254, 5, 4, 6, 0, -3 }, // 0x77 'w'
118 | { 257, 4, 4, 5, 0, -3 }, // 0x78 'x'
119 | { 259, 4, 5, 5, 0, -3 }, // 0x79 'y'
120 | { 262, 4, 4, 5, 0, -3 }, // 0x7A 'z'
121 | { 264, 3, 5, 4, 0, -4 }, // 0x7B '{'
122 | { 266, 1, 5, 2, 0, -4 }, // 0x7C '|'
123 | { 267, 3, 5, 4, 0, -4 }, // 0x7D '}'
124 | { 269, 5, 3, 6, 0, -3 } }; // 0x7E '~'
125 |
126 | const static GFXfont Org_01 = {
127 | (uint8_t *)Org_01Bitmaps,
128 | (GFXglyph *)Org_01Glyphs,
129 | 0x20, 0x7E, 7 };
130 |
131 | // Approx. 943 bytes
132 |
--------------------------------------------------------------------------------
/firmware-calibration/lcd_5110/Fonts/Dialog_7pt.h:
--------------------------------------------------------------------------------
1 | // Created by http://oleddisplay.squix.ch/ Consider a donation
2 | // In case of problems make sure that you are using the font file with the correct version!
3 | const static uint8_t Dialog_plain_7Bitmaps[] = {
4 |
5 | // Bitmap Data:
6 | 0x00, // ' '
7 | 0xE8, // '!'
8 | 0xB4, // '"'
9 | 0x57,0xD5,0xF6,0x00, // '#'
10 | 0x5F,0x77,0xD0, // '$'
11 | 0xCB,0x4F,0xCB,0x4C, // '%'
12 | 0x72,0x3B,0x67,0x80, // '&'
13 | 0xC0, // '''
14 | 0x6A,0x90, // '('
15 | 0x95,0x60, // ')'
16 | 0x5D,0x70, // '*'
17 | 0x21,0x3E,0x42,0x00, // '+'
18 | 0xC0, // ','
19 | 0xC0, // '-'
20 | 0x80, // '.'
21 | 0x56,0xA0, // '/'
22 | 0xF6,0xDE, // '0'
23 | 0xC9,0x2E, // '1'
24 | 0xE4,0xAE, // '2'
25 | 0xE5,0x1E, // '3'
26 | 0x26,0x6F,0x20, // '4'
27 | 0xF3,0x9E, // '5'
28 | 0x73,0xDE, // '6'
29 | 0xE4,0xA4, // '7'
30 | 0xF5,0x5E, // '8'
31 | 0xF7,0x9C, // '9'
32 | 0x90, // ':'
33 | 0x98, // ';'
34 | 0x1E,0xE1, // '<'
35 | 0xF0,0xF0, // '='
36 | 0x87,0x78, // '>'
37 | 0xE5,0x04, // '?'
38 | 0x7B,0x1B,0x6E,0xC1,0xC0, // '@'
39 | 0x23,0x94,0xE8,0x80, // 'A'
40 | 0xF9,0xE9,0xF0, // 'B'
41 | 0x78,0x88,0x70, // 'C'
42 | 0xE9,0x99,0xE0, // 'D'
43 | 0xF3,0xCE, // 'E'
44 | 0xF3,0xC8, // 'F'
45 | 0x78,0xB9,0x70, // 'G'
46 | 0x99,0xF9,0x90, // 'H'
47 | 0xF8, // 'I'
48 | 0x55,0x70, // 'J'
49 | 0xAC,0xCE,0xB0, // 'K'
50 | 0x92,0x4E, // 'L'
51 | 0xDE,0xEB,0x58,0x80, // 'M'
52 | 0xDD,0xFB,0x90, // 'N'
53 | 0x69,0x99,0x60, // 'O'
54 | 0xF7,0xC8, // 'P'
55 | 0x69,0x99,0x62, // 'Q'
56 | 0xEA,0xCA,0xB0, // 'R'
57 | 0xF8,0x71,0xF0, // 'S'
58 | 0xF9,0x08,0x42,0x00, // 'T'
59 | 0x99,0x99,0x60, // 'U'
60 | 0x8A,0x94,0xE2,0x00, // 'V'
61 | 0xB6,0xD7,0x92,0x48, // 'W'
62 | 0x96,0x66,0x90, // 'X'
63 | 0xDA,0x88,0x42,0x00, // 'Y'
64 | 0xF2,0x64,0xF0, // 'Z'
65 | 0xEA,0xB0, // '['
66 | 0xA9,0x50, // '\'
67 | 0xD5,0x70, // ']'
68 | 0x69, // '^'
69 | 0xF0, // '_'
70 | 0x80, // '`'
71 | 0x67,0xF0, // 'a'
72 | 0x93,0xDB,0xC0, // 'b'
73 | 0x72,0x30, // 'c'
74 | 0x27,0xDB,0xC0, // 'd'
75 | 0xFE,0x70, // 'e'
76 | 0x6B,0xA4,0x80, // 'f'
77 | 0xF6,0xFE, // 'g'
78 | 0x93,0xDB,0x40, // 'h'
79 | 0xF8, // 'i'
80 | 0x55,0x70, // 'j'
81 | 0x93,0xED,0xC0, // 'k'
82 | 0xFC, // 'l'
83 | 0xFD,0x6B,0x50, // 'm'
84 | 0xF6,0xD0, // 'n'
85 | 0xF6,0xF0, // 'o'
86 | 0xF6,0xF8, // 'p'
87 | 0xF6,0xF2, // 'q'
88 | 0xEA, // 'r'
89 | 0xF8,0xF0, // 's'
90 | 0xBA,0xC0, // 't'
91 | 0xB6,0xF0, // 'u'
92 | 0x96,0x66, // 'v'
93 | 0xAE,0xD4,0xA0, // 'w'
94 | 0xF6,0x6F, // 'x'
95 | 0x96,0x64,0xC0, // 'y'
96 | 0xED,0x70, // 'z'
97 | 0x6A,0x24,0xC0, // '{'
98 | 0xFE, // '|'
99 | 0xC8,0xA5,0x80 // '}'
100 | };
101 | const static GFXglyph Dialog_plain_7Glyphs[] = {
102 | // bitmapOffset, width, height, xAdvance, xOffset, yOffset
103 | { 0, 1, 1, 3, 0, 0 }, // ' '
104 | { 1, 1, 5, 4, 1, -5 }, // '!'
105 | { 2, 3, 2, 4, 1, -5 }, // '"'
106 | { 3, 5, 5, 7, 1, -5 }, // '#'
107 | { 7, 3, 7, 5, 1, -6 }, // '$'
108 | { 10, 6, 5, 8, 1, -5 }, // '%'
109 | { 14, 5, 5, 6, 1, -5 }, // '&'
110 | { 18, 1, 2, 3, 1, -5 }, // '''
111 | { 19, 2, 6, 4, 1, -6 }, // '('
112 | { 21, 2, 6, 4, 1, -6 }, // ')'
113 | { 23, 3, 4, 5, 1, -5 }, // '*'
114 | { 25, 5, 5, 7, 1, -5 }, // '+'
115 | { 29, 1, 2, 3, 1, -1 }, // ','
116 | { 30, 2, 1, 4, 1, -3 }, // '-'
117 | { 31, 1, 1, 3, 1, -1 }, // '.'
118 | { 32, 2, 6, 3, 0, -5 }, // '/'
119 | { 34, 3, 5, 5, 1, -5 }, // '0'
120 | { 36, 3, 5, 5, 1, -5 }, // '1'
121 | { 38, 3, 5, 5, 1, -5 }, // '2'
122 | { 40, 3, 5, 5, 1, -5 }, // '3'
123 | { 42, 4, 5, 5, 1, -5 }, // '4'
124 | { 45, 3, 5, 5, 1, -5 }, // '5'
125 | { 47, 3, 5, 5, 1, -5 }, // '6'
126 | { 49, 3, 5, 5, 1, -5 }, // '7'
127 | { 51, 3, 5, 5, 1, -5 }, // '8'
128 | { 53, 3, 5, 5, 1, -5 }, // '9'
129 | { 55, 1, 4, 3, 1, -4 }, // ':'
130 | { 56, 1, 5, 3, 1, -4 }, // ';'
131 | { 57, 4, 4, 7, 1, -4 }, // '<'
132 | { 59, 4, 3, 7, 1, -4 }, // '='
133 | { 61, 4, 4, 7, 1, -4 }, // '>'
134 | { 63, 3, 5, 5, 1, -5 }, // '?'
135 | { 65, 6, 6, 8, 1, -5 }, // '@'
136 | { 70, 5, 5, 6, 0, -5 }, // 'A'
137 | { 74, 4, 5, 6, 1, -5 }, // 'B'
138 | { 77, 4, 5, 6, 1, -5 }, // 'C'
139 | { 80, 4, 5, 6, 1, -5 }, // 'D'
140 | { 83, 3, 5, 5, 1, -5 }, // 'E'
141 | { 85, 3, 5, 5, 1, -5 }, // 'F'
142 | { 87, 4, 5, 6, 1, -5 }, // 'G'
143 | { 90, 4, 5, 6, 1, -5 }, // 'H'
144 | { 93, 1, 5, 3, 1, -5 }, // 'I'
145 | { 94, 2, 6, 3, 0, -5 }, // 'J'
146 | { 96, 4, 5, 6, 1, -5 }, // 'K'
147 | { 99, 3, 5, 5, 1, -5 }, // 'L'
148 | { 101, 5, 5, 7, 1, -5 }, // 'M'
149 | { 105, 4, 5, 6, 1, -5 }, // 'N'
150 | { 108, 4, 5, 7, 1, -5 }, // 'O'
151 | { 111, 3, 5, 5, 1, -5 }, // 'P'
152 | { 113, 4, 6, 7, 1, -5 }, // 'Q'
153 | { 116, 4, 5, 6, 1, -5 }, // 'R'
154 | { 119, 4, 5, 5, 1, -5 }, // 'S'
155 | { 122, 5, 5, 5, 0, -5 }, // 'T'
156 | { 126, 4, 5, 6, 1, -5 }, // 'U'
157 | { 129, 5, 5, 6, 0, -5 }, // 'V'
158 | { 133, 6, 5, 8, 0, -5 }, // 'W'
159 | { 137, 4, 5, 5, 0, -5 }, // 'X'
160 | { 140, 5, 5, 5, 0, -5 }, // 'Y'
161 | { 144, 4, 5, 6, 1, -5 }, // 'Z'
162 | { 147, 2, 6, 4, 1, -5 }, // '['
163 | { 149, 2, 6, 3, 0, -5 }, // '\'
164 | { 151, 2, 6, 4, 1, -5 }, // ']'
165 | { 153, 4, 2, 7, 1, -5 }, // '^'
166 | { 154, 4, 1, 5, 0, 1 }, // '_'
167 | { 155, 2, 1, 5, 0, -6 }, // '`'
168 | { 156, 3, 4, 5, 1, -4 }, // 'a'
169 | { 158, 3, 6, 5, 1, -6 }, // 'b'
170 | { 161, 3, 4, 5, 1, -4 }, // 'c'
171 | { 163, 3, 6, 5, 1, -6 }, // 'd'
172 | { 166, 3, 4, 5, 1, -4 }, // 'e'
173 | { 168, 3, 6, 3, 0, -6 }, // 'f'
174 | { 171, 3, 5, 5, 1, -4 }, // 'g'
175 | { 173, 3, 6, 5, 1, -6 }, // 'h'
176 | { 176, 1, 5, 3, 1, -5 }, // 'i'
177 | { 177, 2, 6, 3, 0, -5 }, // 'j'
178 | { 179, 3, 6, 5, 1, -6 }, // 'k'
179 | { 182, 1, 6, 3, 1, -6 }, // 'l'
180 | { 183, 5, 4, 8, 1, -4 }, // 'm'
181 | { 186, 3, 4, 5, 1, -4 }, // 'n'
182 | { 188, 3, 4, 5, 1, -4 }, // 'o'
183 | { 190, 3, 5, 5, 1, -4 }, // 'p'
184 | { 192, 3, 5, 5, 1, -4 }, // 'q'
185 | { 194, 2, 4, 4, 1, -4 }, // 'r'
186 | { 195, 3, 4, 5, 1, -4 }, // 's'
187 | { 197, 2, 5, 4, 1, -5 }, // 't'
188 | { 199, 3, 4, 5, 1, -4 }, // 'u'
189 | { 201, 4, 4, 5, 0, -4 }, // 'v'
190 | { 203, 5, 4, 7, 0, -4 }, // 'w'
191 | { 206, 4, 4, 5, 0, -4 }, // 'x'
192 | { 208, 4, 5, 5, 0, -4 }, // 'y'
193 | { 211, 3, 4, 5, 1, -4 }, // 'z'
194 | { 213, 3, 6, 5, 1, -5 }, // '{'
195 | { 216, 1, 7, 3, 1, -5 }, // '|'
196 | { 217, 3, 6, 5, 1, -5 } // '}'
197 | };
198 | const static GFXfont Dialog_plain_7 = {
199 | (uint8_t *)Dialog_plain_7Bitmaps,(GFXglyph *)Dialog_plain_7Glyphs,0x20, 0x7E, 9};
--------------------------------------------------------------------------------
/firmware-multimeter/lcd_5110/Fonts/Dialog_7pt.h:
--------------------------------------------------------------------------------
1 | // Created by http://oleddisplay.squix.ch/ Consider a donation
2 | // In case of problems make sure that you are using the font file with the correct version!
3 | const static uint8_t Dialog_plain_7Bitmaps[] = {
4 |
5 | // Bitmap Data:
6 | 0x00, // ' '
7 | 0xE8, // '!'
8 | 0xB4, // '"'
9 | 0x57,0xD5,0xF6,0x00, // '#'
10 | 0x5F,0x77,0xD0, // '$'
11 | 0xCB,0x4F,0xCB,0x4C, // '%'
12 | 0x72,0x3B,0x67,0x80, // '&'
13 | 0xC0, // '''
14 | 0x6A,0x90, // '('
15 | 0x95,0x60, // ')'
16 | 0x5D,0x70, // '*'
17 | 0x21,0x3E,0x42,0x00, // '+'
18 | 0xC0, // ','
19 | 0xC0, // '-'
20 | 0x80, // '.'
21 | 0x56,0xA0, // '/'
22 | 0xF6,0xDE, // '0'
23 | 0xC9,0x2E, // '1'
24 | 0xE4,0xAE, // '2'
25 | 0xE5,0x1E, // '3'
26 | 0x26,0x6F,0x20, // '4'
27 | 0xF3,0x9E, // '5'
28 | 0x73,0xDE, // '6'
29 | 0xE4,0xA4, // '7'
30 | 0xF5,0x5E, // '8'
31 | 0xF7,0x9C, // '9'
32 | 0x90, // ':'
33 | 0x98, // ';'
34 | 0x1E,0xE1, // '<'
35 | 0xF0,0xF0, // '='
36 | 0x87,0x78, // '>'
37 | 0xE5,0x04, // '?'
38 | 0x7B,0x1B,0x6E,0xC1,0xC0, // '@'
39 | 0x23,0x94,0xE8,0x80, // 'A'
40 | 0xF9,0xE9,0xF0, // 'B'
41 | 0x78,0x88,0x70, // 'C'
42 | 0xE9,0x99,0xE0, // 'D'
43 | 0xF3,0xCE, // 'E'
44 | 0xF3,0xC8, // 'F'
45 | 0x78,0xB9,0x70, // 'G'
46 | 0x99,0xF9,0x90, // 'H'
47 | 0xF8, // 'I'
48 | 0x55,0x70, // 'J'
49 | 0xAC,0xCE,0xB0, // 'K'
50 | 0x92,0x4E, // 'L'
51 | 0xDE,0xEB,0x58,0x80, // 'M'
52 | 0xDD,0xFB,0x90, // 'N'
53 | 0x69,0x99,0x60, // 'O'
54 | 0xF7,0xC8, // 'P'
55 | 0x69,0x99,0x62, // 'Q'
56 | 0xEA,0xCA,0xB0, // 'R'
57 | 0xF8,0x71,0xF0, // 'S'
58 | 0xF9,0x08,0x42,0x00, // 'T'
59 | 0x99,0x99,0x60, // 'U'
60 | 0x8A,0x94,0xE2,0x00, // 'V'
61 | 0xB6,0xD7,0x92,0x48, // 'W'
62 | 0x96,0x66,0x90, // 'X'
63 | 0xDA,0x88,0x42,0x00, // 'Y'
64 | 0xF2,0x64,0xF0, // 'Z'
65 | 0xEA,0xB0, // '['
66 | 0xA9,0x50, // '\'
67 | 0xD5,0x70, // ']'
68 | 0x69, // '^'
69 | 0xF0, // '_'
70 | 0x80, // '`'
71 | 0x67,0xF0, // 'a'
72 | 0x93,0xDB,0xC0, // 'b'
73 | 0x72,0x30, // 'c'
74 | 0x27,0xDB,0xC0, // 'd'
75 | 0xFE,0x70, // 'e'
76 | 0x6B,0xA4,0x80, // 'f'
77 | 0xF6,0xFE, // 'g'
78 | 0x93,0xDB,0x40, // 'h'
79 | 0xF8, // 'i'
80 | 0x55,0x70, // 'j'
81 | 0x93,0xED,0xC0, // 'k'
82 | 0xFC, // 'l'
83 | 0xFD,0x6B,0x50, // 'm'
84 | 0xF6,0xD0, // 'n'
85 | 0xF6,0xF0, // 'o'
86 | 0xF6,0xF8, // 'p'
87 | 0xF6,0xF2, // 'q'
88 | 0xEA, // 'r'
89 | 0xF8,0xF0, // 's'
90 | 0xBA,0xC0, // 't'
91 | 0xB6,0xF0, // 'u'
92 | 0x96,0x66, // 'v'
93 | 0xAE,0xD4,0xA0, // 'w'
94 | 0xF6,0x6F, // 'x'
95 | 0x96,0x64,0xC0, // 'y'
96 | 0xED,0x70, // 'z'
97 | 0x6A,0x24,0xC0, // '{'
98 | 0xFE, // '|'
99 | 0xC8,0xA5,0x80 // '}'
100 | };
101 | const static GFXglyph Dialog_plain_7Glyphs[] = {
102 | // bitmapOffset, width, height, xAdvance, xOffset, yOffset
103 | { 0, 1, 1, 3, 0, 0 }, // ' '
104 | { 1, 1, 5, 4, 1, -5 }, // '!'
105 | { 2, 3, 2, 4, 1, -5 }, // '"'
106 | { 3, 5, 5, 7, 1, -5 }, // '#'
107 | { 7, 3, 7, 5, 1, -6 }, // '$'
108 | { 10, 6, 5, 8, 1, -5 }, // '%'
109 | { 14, 5, 5, 6, 1, -5 }, // '&'
110 | { 18, 1, 2, 3, 1, -5 }, // '''
111 | { 19, 2, 6, 4, 1, -6 }, // '('
112 | { 21, 2, 6, 4, 1, -6 }, // ')'
113 | { 23, 3, 4, 5, 1, -5 }, // '*'
114 | { 25, 5, 5, 7, 1, -5 }, // '+'
115 | { 29, 1, 2, 3, 1, -1 }, // ','
116 | { 30, 2, 1, 4, 1, -3 }, // '-'
117 | { 31, 1, 1, 3, 1, -1 }, // '.'
118 | { 32, 2, 6, 3, 0, -5 }, // '/'
119 | { 34, 3, 5, 5, 1, -5 }, // '0'
120 | { 36, 3, 5, 5, 1, -5 }, // '1'
121 | { 38, 3, 5, 5, 1, -5 }, // '2'
122 | { 40, 3, 5, 5, 1, -5 }, // '3'
123 | { 42, 4, 5, 5, 1, -5 }, // '4'
124 | { 45, 3, 5, 5, 1, -5 }, // '5'
125 | { 47, 3, 5, 5, 1, -5 }, // '6'
126 | { 49, 3, 5, 5, 1, -5 }, // '7'
127 | { 51, 3, 5, 5, 1, -5 }, // '8'
128 | { 53, 3, 5, 5, 1, -5 }, // '9'
129 | { 55, 1, 4, 3, 1, -4 }, // ':'
130 | { 56, 1, 5, 3, 1, -4 }, // ';'
131 | { 57, 4, 4, 7, 1, -4 }, // '<'
132 | { 59, 4, 3, 7, 1, -4 }, // '='
133 | { 61, 4, 4, 7, 1, -4 }, // '>'
134 | { 63, 3, 5, 5, 1, -5 }, // '?'
135 | { 65, 6, 6, 8, 1, -5 }, // '@'
136 | { 70, 5, 5, 6, 0, -5 }, // 'A'
137 | { 74, 4, 5, 6, 1, -5 }, // 'B'
138 | { 77, 4, 5, 6, 1, -5 }, // 'C'
139 | { 80, 4, 5, 6, 1, -5 }, // 'D'
140 | { 83, 3, 5, 5, 1, -5 }, // 'E'
141 | { 85, 3, 5, 5, 1, -5 }, // 'F'
142 | { 87, 4, 5, 6, 1, -5 }, // 'G'
143 | { 90, 4, 5, 6, 1, -5 }, // 'H'
144 | { 93, 1, 5, 3, 1, -5 }, // 'I'
145 | { 94, 2, 6, 3, 0, -5 }, // 'J'
146 | { 96, 4, 5, 6, 1, -5 }, // 'K'
147 | { 99, 3, 5, 5, 1, -5 }, // 'L'
148 | { 101, 5, 5, 7, 1, -5 }, // 'M'
149 | { 105, 4, 5, 6, 1, -5 }, // 'N'
150 | { 108, 4, 5, 7, 1, -5 }, // 'O'
151 | { 111, 3, 5, 5, 1, -5 }, // 'P'
152 | { 113, 4, 6, 7, 1, -5 }, // 'Q'
153 | { 116, 4, 5, 6, 1, -5 }, // 'R'
154 | { 119, 4, 5, 5, 1, -5 }, // 'S'
155 | { 122, 5, 5, 5, 0, -5 }, // 'T'
156 | { 126, 4, 5, 6, 1, -5 }, // 'U'
157 | { 129, 5, 5, 6, 0, -5 }, // 'V'
158 | { 133, 6, 5, 8, 0, -5 }, // 'W'
159 | { 137, 4, 5, 5, 0, -5 }, // 'X'
160 | { 140, 5, 5, 5, 0, -5 }, // 'Y'
161 | { 144, 4, 5, 6, 1, -5 }, // 'Z'
162 | { 147, 2, 6, 4, 1, -5 }, // '['
163 | { 149, 2, 6, 3, 0, -5 }, // '\'
164 | { 151, 2, 6, 4, 1, -5 }, // ']'
165 | { 153, 4, 2, 7, 1, -5 }, // '^'
166 | { 154, 4, 1, 5, 0, 1 }, // '_'
167 | { 155, 2, 1, 5, 0, -6 }, // '`'
168 | { 156, 3, 4, 5, 1, -4 }, // 'a'
169 | { 158, 3, 6, 5, 1, -6 }, // 'b'
170 | { 161, 3, 4, 5, 1, -4 }, // 'c'
171 | { 163, 3, 6, 5, 1, -6 }, // 'd'
172 | { 166, 3, 4, 5, 1, -4 }, // 'e'
173 | { 168, 3, 6, 3, 0, -6 }, // 'f'
174 | { 171, 3, 5, 5, 1, -4 }, // 'g'
175 | { 173, 3, 6, 5, 1, -6 }, // 'h'
176 | { 176, 1, 5, 3, 1, -5 }, // 'i'
177 | { 177, 2, 6, 3, 0, -5 }, // 'j'
178 | { 179, 3, 6, 5, 1, -6 }, // 'k'
179 | { 182, 1, 6, 3, 1, -6 }, // 'l'
180 | { 183, 5, 4, 8, 1, -4 }, // 'm'
181 | { 186, 3, 4, 5, 1, -4 }, // 'n'
182 | { 188, 3, 4, 5, 1, -4 }, // 'o'
183 | { 190, 3, 5, 5, 1, -4 }, // 'p'
184 | { 192, 3, 5, 5, 1, -4 }, // 'q'
185 | { 194, 2, 4, 4, 1, -4 }, // 'r'
186 | { 195, 3, 4, 5, 1, -4 }, // 's'
187 | { 197, 2, 5, 4, 1, -5 }, // 't'
188 | { 199, 3, 4, 5, 1, -4 }, // 'u'
189 | { 201, 4, 4, 5, 0, -4 }, // 'v'
190 | { 203, 5, 4, 7, 0, -4 }, // 'w'
191 | { 206, 4, 4, 5, 0, -4 }, // 'x'
192 | { 208, 4, 5, 5, 0, -4 }, // 'y'
193 | { 211, 3, 4, 5, 1, -4 }, // 'z'
194 | { 213, 3, 6, 5, 1, -5 }, // '{'
195 | { 216, 1, 7, 3, 1, -5 }, // '|'
196 | { 217, 3, 6, 5, 1, -5 } // '}'
197 | };
198 | const static GFXfont Dialog_plain_7 = {
199 | (uint8_t *)Dialog_plain_7Bitmaps,(GFXglyph *)Dialog_plain_7Glyphs,0x20, 0x7E, 9};
--------------------------------------------------------------------------------
/firmware-calibration/lcd_5110/Fonts/Dialog_9pt.h:
--------------------------------------------------------------------------------
1 | // Created by http://oleddisplay.squix.ch/ Consider a donation
2 | // In case of problems make sure that you are using the font file with the correct version!
3 | const static uint8_t Dialog_plain_9Bitmaps[] = {
4 |
5 | // Bitmap Data:
6 | 0x00, // ' '
7 | 0xFA, // '!'
8 | 0xB4, // '"'
9 | 0x28,0xAF,0xCA,0xFD,0x45,0x00, // '#'
10 | 0x23,0xE9,0xC3,0x97,0xC4, // '$'
11 | 0xE4,0xA4,0xA8,0xFF,0x15,0x25,0x27, // '%'
12 | 0x31,0x24,0x19,0x96,0x66,0xC0, // '&'
13 | 0xC0, // '''
14 | 0x6A,0xA9, // '('
15 | 0xA5,0x5A, // ')'
16 | 0xAB,0x9D,0x50, // '*'
17 | 0x21,0x3E,0x42,0x00, // '+'
18 | 0xC0, // ','
19 | 0xC0, // '-'
20 | 0x80, // '.'
21 | 0x25,0x25,0x20, // '/'
22 | 0x69,0x99,0x99,0x60, // '0'
23 | 0xC9,0x24,0xB8, // '1'
24 | 0x69,0x12,0x48,0xF0, // '2'
25 | 0x69,0x16,0x11,0xE0, // '3'
26 | 0x11,0x94,0xA9,0x7C,0x40, // '4'
27 | 0xF8,0x8E,0x11,0xE0, // '5'
28 | 0x7C,0x8E,0x99,0x60, // '6'
29 | 0xF1,0x22,0x24,0x40, // '7'
30 | 0x69,0x96,0x99,0x60, // '8'
31 | 0x69,0x9F,0x13,0xE0, // '9'
32 | 0x88, // ':'
33 | 0x8C, // ';'
34 | 0x04,0xEC,0x0E,0x04, // '<'
35 | 0xFC,0x0F,0xC0, // '='
36 | 0x81,0xC0,0xDC,0x80, // '>'
37 | 0xF1,0x24,0x40,0x40, // '?'
38 | 0x3C,0x42,0x9D,0xA5,0xA5,0x9E,0x44,0x38, // '@'
39 | 0x30,0xC4,0x92,0x7A,0x18,0x40, // 'A'
40 | 0xF4,0x63,0xE8,0xC7,0xC0, // 'B'
41 | 0x76,0x61,0x08,0x61,0xE0, // 'C'
42 | 0xF4,0xE3,0x18,0xCF,0xC0, // 'D'
43 | 0xF8,0x8F,0x88,0xF0, // 'E'
44 | 0xF8,0x8F,0x88,0x80, // 'F'
45 | 0x76,0x61,0x38,0xE5,0xC0, // 'G'
46 | 0x8C,0x63,0xF8,0xC6,0x20, // 'H'
47 | 0xFE, // 'I'
48 | 0x55,0x55,0x80, // 'J'
49 | 0x8C,0xA9,0x8A,0x4A,0x20, // 'K'
50 | 0x88,0x88,0x88,0xF0, // 'L'
51 | 0x87,0x3C,0xED,0xB6,0x18,0x40, // 'M'
52 | 0x8E,0x73,0x59,0xCE,0x20, // 'N'
53 | 0x76,0xE3,0x18,0xED,0xC0, // 'O'
54 | 0xE9,0x9E,0x88,0x80, // 'P'
55 | 0x76,0xE3,0x18,0xED,0xC2, // 'Q'
56 | 0xF4,0xA5,0xCA,0x4A,0x20, // 'R'
57 | 0x74,0x60,0xE0,0xC5,0xC0, // 'S'
58 | 0xF9,0x08,0x42,0x10,0x80, // 'T'
59 | 0x8C,0x63,0x18,0xC5,0xC0, // 'U'
60 | 0x86,0x14,0x92,0x48,0xC3,0x00, // 'V'
61 | 0x93,0x25,0x52,0xA6,0xC5,0x0A,0x00, // 'W'
62 | 0xCD,0x23,0x0C,0x31,0x28,0xC0, // 'X'
63 | 0x8A,0x94,0x42,0x10,0x80, // 'Y'
64 | 0xF8,0x44,0x44,0x43,0xE0, // 'Z'
65 | 0xEA,0xAB, // '['
66 | 0x91,0x24,0x48, // '\'
67 | 0xD5,0x57, // ']'
68 | 0x31,0x20, // '^'
69 | 0xF8, // '_'
70 | 0x90, // '`'
71 | 0x71,0xF9,0xF0, // 'a'
72 | 0x88,0x8E,0x99,0x9E, // 'b'
73 | 0x78,0x88,0x70, // 'c'
74 | 0x11,0x17,0x99,0x97, // 'd'
75 | 0x69,0xF8,0x70, // 'e'
76 | 0x74,0x4E,0x44,0x44, // 'f'
77 | 0x79,0x99,0x71,0x60, // 'g'
78 | 0x88,0x8F,0x99,0x99, // 'h'
79 | 0xBE, // 'i'
80 | 0x45,0x55,0xC0, // 'j'
81 | 0x88,0x89,0xAC,0xA9, // 'k'
82 | 0xFF, // 'l'
83 | 0xFF,0x26,0x4C,0x99,0x20, // 'm'
84 | 0xF9,0x99,0x90, // 'n'
85 | 0x69,0x99,0x60, // 'o'
86 | 0xE9,0x99,0xE8,0x80, // 'p'
87 | 0x79,0x99,0x71,0x10, // 'q'
88 | 0xF2,0x48, // 'r'
89 | 0xF1,0x9E, // 's'
90 | 0x4F,0x44,0x47, // 't'
91 | 0x99,0x99,0xF0, // 'u'
92 | 0x8C,0x54,0xA2,0x00, // 'v'
93 | 0x93,0x56,0xAA,0x24,0x40, // 'w'
94 | 0x8A,0x88,0xA8,0x80, // 'x'
95 | 0x8A,0x25,0x14,0x20,0x8C,0x00, // 'y'
96 | 0xF1,0x24,0xF0, // 'z'
97 | 0x69,0x44,0x93, // '{'
98 | 0xFF,0x80, // '|'
99 | 0xC9,0x14,0x96 // '}'
100 | };
101 | const static GFXglyph Dialog_plain_9Glyphs[] = {
102 | // bitmapOffset, width, height, xAdvance, xOffset, yOffset
103 | { 0, 1, 1, 4, 0, 0 }, // ' '
104 | { 1, 1, 7, 4, 1, -7 }, // '!'
105 | { 2, 3, 2, 5, 1, -7 }, // '"'
106 | { 3, 6, 7, 9, 1, -7 }, // '#'
107 | { 9, 5, 8, 7, 0, -7 }, // '$'
108 | { 14, 8, 7, 10, 0, -7 }, // '%'
109 | { 21, 6, 7, 9, 1, -7 }, // '&'
110 | { 27, 1, 2, 3, 1, -7 }, // '''
111 | { 28, 2, 8, 5, 1, -8 }, // '('
112 | { 30, 2, 8, 5, 1, -8 }, // ')'
113 | { 32, 5, 4, 6, 0, -7 }, // '*'
114 | { 35, 5, 5, 9, 1, -5 }, // '+'
115 | { 39, 1, 2, 4, 1, -1 }, // ','
116 | { 40, 2, 1, 4, 1, -3 }, // '-'
117 | { 41, 1, 1, 4, 1, -1 }, // '.'
118 | { 42, 3, 7, 4, 0, -7 }, // '/'
119 | { 45, 4, 7, 7, 1, -7 }, // '0'
120 | { 49, 3, 7, 7, 2, -7 }, // '1'
121 | { 52, 4, 7, 7, 1, -7 }, // '2'
122 | { 56, 4, 7, 7, 1, -7 }, // '3'
123 | { 60, 5, 7, 7, 1, -7 }, // '4'
124 | { 65, 4, 7, 7, 1, -7 }, // '5'
125 | { 69, 4, 7, 7, 1, -7 }, // '6'
126 | { 73, 4, 7, 7, 1, -7 }, // '7'
127 | { 77, 4, 7, 7, 1, -7 }, // '8'
128 | { 81, 4, 7, 7, 1, -7 }, // '9'
129 | { 85, 1, 5, 4, 1, -5 }, // ':'
130 | { 86, 1, 6, 4, 1, -5 }, // ';'
131 | { 87, 6, 5, 9, 1, -5 }, // '<'
132 | { 91, 6, 3, 9, 1, -4 }, // '='
133 | { 94, 6, 5, 9, 1, -5 }, // '>'
134 | { 98, 4, 7, 6, 1, -7 }, // '?'
135 | { 102, 8, 8, 11, 1, -7 }, // '@'
136 | { 110, 6, 7, 7, 0, -7 }, // 'A'
137 | { 116, 5, 7, 8, 1, -7 }, // 'B'
138 | { 121, 5, 7, 8, 1, -7 }, // 'C'
139 | { 126, 5, 7, 8, 1, -7 }, // 'D'
140 | { 131, 4, 7, 7, 1, -7 }, // 'E'
141 | { 135, 4, 7, 7, 1, -7 }, // 'F'
142 | { 139, 5, 7, 8, 1, -7 }, // 'G'
143 | { 144, 5, 7, 8, 1, -7 }, // 'H'
144 | { 149, 1, 7, 4, 1, -7 }, // 'I'
145 | { 150, 2, 9, 4, 0, -7 }, // 'J'
146 | { 153, 5, 7, 7, 1, -7 }, // 'K'
147 | { 158, 4, 7, 6, 1, -7 }, // 'L'
148 | { 162, 6, 7, 9, 1, -7 }, // 'M'
149 | { 168, 5, 7, 8, 1, -7 }, // 'N'
150 | { 173, 5, 7, 8, 1, -7 }, // 'O'
151 | { 178, 4, 7, 7, 1, -7 }, // 'P'
152 | { 182, 5, 8, 8, 1, -7 }, // 'Q'
153 | { 187, 5, 7, 7, 1, -7 }, // 'R'
154 | { 192, 5, 7, 8, 1, -7 }, // 'S'
155 | { 197, 5, 7, 6, 0, -7 }, // 'T'
156 | { 202, 5, 7, 8, 1, -7 }, // 'U'
157 | { 207, 6, 7, 7, 0, -7 }, // 'V'
158 | { 213, 7, 7, 8, 0, -7 }, // 'W'
159 | { 220, 6, 7, 7, 0, -7 }, // 'X'
160 | { 226, 5, 7, 6, 0, -7 }, // 'Y'
161 | { 231, 5, 7, 6, 0, -7 }, // 'Z'
162 | { 236, 2, 8, 5, 1, -7 }, // '['
163 | { 238, 3, 7, 4, 0, -7 }, // '\'
164 | { 241, 2, 8, 5, 1, -7 }, // ']'
165 | { 243, 6, 2, 9, 1, -7 }, // '^'
166 | { 245, 5, 1, 6, 0, 1 }, // '_'
167 | { 246, 2, 2, 6, 1, -8 }, // '`'
168 | { 247, 4, 5, 7, 1, -5 }, // 'a'
169 | { 250, 4, 8, 7, 1, -8 }, // 'b'
170 | { 254, 4, 5, 7, 1, -5 }, // 'c'
171 | { 257, 4, 8, 7, 1, -8 }, // 'd'
172 | { 261, 4, 5, 7, 1, -5 }, // 'e'
173 | { 264, 4, 8, 4, 0, -8 }, // 'f'
174 | { 268, 4, 7, 7, 1, -5 }, // 'g'
175 | { 272, 4, 8, 7, 1, -8 }, // 'h'
176 | { 276, 1, 7, 4, 1, -7 }, // 'i'
177 | { 277, 2, 9, 4, 0, -7 }, // 'j'
178 | { 280, 4, 8, 6, 1, -8 }, // 'k'
179 | { 284, 1, 8, 4, 1, -8 }, // 'l'
180 | { 285, 7, 5, 10, 1, -5 }, // 'm'
181 | { 290, 4, 5, 7, 1, -5 }, // 'n'
182 | { 293, 4, 5, 7, 1, -5 }, // 'o'
183 | { 296, 4, 7, 7, 1, -5 }, // 'p'
184 | { 300, 4, 7, 7, 1, -5 }, // 'q'
185 | { 304, 3, 5, 5, 1, -5 }, // 'r'
186 | { 306, 3, 5, 6, 1, -5 }, // 's'
187 | { 308, 4, 6, 5, 0, -6 }, // 't'
188 | { 311, 4, 5, 7, 1, -5 }, // 'u'
189 | { 314, 5, 5, 6, 0, -5 }, // 'v'
190 | { 318, 7, 5, 8, 0, -5 }, // 'w'
191 | { 323, 5, 5, 6, 0, -5 }, // 'x'
192 | { 327, 6, 7, 6, 0, -5 }, // 'y'
193 | { 333, 4, 5, 7, 1, -5 }, // 'z'
194 | { 336, 3, 8, 6, 1, -7 }, // '{'
195 | { 339, 1, 9, 4, 1, -7 }, // '|'
196 | { 341, 3, 8, 6, 1, -7 } // '}'
197 | };
198 | const static GFXfont Dialog_plain_9 = {
199 | (uint8_t *)Dialog_plain_9Bitmaps,(GFXglyph *)Dialog_plain_9Glyphs,0x20, 0x7E, 12};
200 |
--------------------------------------------------------------------------------
/firmware-multimeter/lcd_5110/Fonts/Dialog_9pt.h:
--------------------------------------------------------------------------------
1 | // Created by http://oleddisplay.squix.ch/ Consider a donation
2 | // In case of problems make sure that you are using the font file with the correct version!
3 | const static uint8_t Dialog_plain_9Bitmaps[] = {
4 |
5 | // Bitmap Data:
6 | 0x00, // ' '
7 | 0xFA, // '!'
8 | 0xB4, // '"'
9 | 0x28,0xAF,0xCA,0xFD,0x45,0x00, // '#'
10 | 0x23,0xE9,0xC3,0x97,0xC4, // '$'
11 | 0xE4,0xA4,0xA8,0xFF,0x15,0x25,0x27, // '%'
12 | 0x31,0x24,0x19,0x96,0x66,0xC0, // '&'
13 | 0xC0, // '''
14 | 0x6A,0xA9, // '('
15 | 0xA5,0x5A, // ')'
16 | 0xAB,0x9D,0x50, // '*'
17 | 0x21,0x3E,0x42,0x00, // '+'
18 | 0xC0, // ','
19 | 0xC0, // '-'
20 | 0x80, // '.'
21 | 0x25,0x25,0x20, // '/'
22 | 0x69,0x99,0x99,0x60, // '0'
23 | 0xC9,0x24,0xB8, // '1'
24 | 0x69,0x12,0x48,0xF0, // '2'
25 | 0x69,0x16,0x11,0xE0, // '3'
26 | 0x11,0x94,0xA9,0x7C,0x40, // '4'
27 | 0xF8,0x8E,0x11,0xE0, // '5'
28 | 0x7C,0x8E,0x99,0x60, // '6'
29 | 0xF1,0x22,0x24,0x40, // '7'
30 | 0x69,0x96,0x99,0x60, // '8'
31 | 0x69,0x9F,0x13,0xE0, // '9'
32 | 0x88, // ':'
33 | 0x8C, // ';'
34 | 0x04,0xEC,0x0E,0x04, // '<'
35 | 0xFC,0x0F,0xC0, // '='
36 | 0x81,0xC0,0xDC,0x80, // '>'
37 | 0xF1,0x24,0x40,0x40, // '?'
38 | 0x3C,0x42,0x9D,0xA5,0xA5,0x9E,0x44,0x38, // '@'
39 | 0x30,0xC4,0x92,0x7A,0x18,0x40, // 'A'
40 | 0xF4,0x63,0xE8,0xC7,0xC0, // 'B'
41 | 0x76,0x61,0x08,0x61,0xE0, // 'C'
42 | 0xF4,0xE3,0x18,0xCF,0xC0, // 'D'
43 | 0xF8,0x8F,0x88,0xF0, // 'E'
44 | 0xF8,0x8F,0x88,0x80, // 'F'
45 | 0x76,0x61,0x38,0xE5,0xC0, // 'G'
46 | 0x8C,0x63,0xF8,0xC6,0x20, // 'H'
47 | 0xFE, // 'I'
48 | 0x55,0x55,0x80, // 'J'
49 | 0x8C,0xA9,0x8A,0x4A,0x20, // 'K'
50 | 0x88,0x88,0x88,0xF0, // 'L'
51 | 0x87,0x3C,0xED,0xB6,0x18,0x40, // 'M'
52 | 0x8E,0x73,0x59,0xCE,0x20, // 'N'
53 | 0x76,0xE3,0x18,0xED,0xC0, // 'O'
54 | 0xE9,0x9E,0x88,0x80, // 'P'
55 | 0x76,0xE3,0x18,0xED,0xC2, // 'Q'
56 | 0xF4,0xA5,0xCA,0x4A,0x20, // 'R'
57 | 0x74,0x60,0xE0,0xC5,0xC0, // 'S'
58 | 0xF9,0x08,0x42,0x10,0x80, // 'T'
59 | 0x8C,0x63,0x18,0xC5,0xC0, // 'U'
60 | 0x86,0x14,0x92,0x48,0xC3,0x00, // 'V'
61 | 0x93,0x25,0x52,0xA6,0xC5,0x0A,0x00, // 'W'
62 | 0xCD,0x23,0x0C,0x31,0x28,0xC0, // 'X'
63 | 0x8A,0x94,0x42,0x10,0x80, // 'Y'
64 | 0xF8,0x44,0x44,0x43,0xE0, // 'Z'
65 | 0xEA,0xAB, // '['
66 | 0x91,0x24,0x48, // '\'
67 | 0xD5,0x57, // ']'
68 | 0x31,0x20, // '^'
69 | 0xF8, // '_'
70 | 0x90, // '`'
71 | 0x71,0xF9,0xF0, // 'a'
72 | 0x88,0x8E,0x99,0x9E, // 'b'
73 | 0x78,0x88,0x70, // 'c'
74 | 0x11,0x17,0x99,0x97, // 'd'
75 | 0x69,0xF8,0x70, // 'e'
76 | 0x74,0x4E,0x44,0x44, // 'f'
77 | 0x79,0x99,0x71,0x60, // 'g'
78 | 0x88,0x8F,0x99,0x99, // 'h'
79 | 0xBE, // 'i'
80 | 0x45,0x55,0xC0, // 'j'
81 | 0x88,0x89,0xAC,0xA9, // 'k'
82 | 0xFF, // 'l'
83 | 0xFF,0x26,0x4C,0x99,0x20, // 'm'
84 | 0xF9,0x99,0x90, // 'n'
85 | 0x69,0x99,0x60, // 'o'
86 | 0xE9,0x99,0xE8,0x80, // 'p'
87 | 0x79,0x99,0x71,0x10, // 'q'
88 | 0xF2,0x48, // 'r'
89 | 0xF1,0x9E, // 's'
90 | 0x4F,0x44,0x47, // 't'
91 | 0x99,0x99,0xF0, // 'u'
92 | 0x8C,0x54,0xA2,0x00, // 'v'
93 | 0x93,0x56,0xAA,0x24,0x40, // 'w'
94 | 0x8A,0x88,0xA8,0x80, // 'x'
95 | 0x8A,0x25,0x14,0x20,0x8C,0x00, // 'y'
96 | 0xF1,0x24,0xF0, // 'z'
97 | 0x69,0x44,0x93, // '{'
98 | 0xFF,0x80, // '|'
99 | 0xC9,0x14,0x96 // '}'
100 | };
101 | const static GFXglyph Dialog_plain_9Glyphs[] = {
102 | // bitmapOffset, width, height, xAdvance, xOffset, yOffset
103 | { 0, 1, 1, 4, 0, 0 }, // ' '
104 | { 1, 1, 7, 4, 1, -7 }, // '!'
105 | { 2, 3, 2, 5, 1, -7 }, // '"'
106 | { 3, 6, 7, 9, 1, -7 }, // '#'
107 | { 9, 5, 8, 7, 0, -7 }, // '$'
108 | { 14, 8, 7, 10, 0, -7 }, // '%'
109 | { 21, 6, 7, 9, 1, -7 }, // '&'
110 | { 27, 1, 2, 3, 1, -7 }, // '''
111 | { 28, 2, 8, 5, 1, -8 }, // '('
112 | { 30, 2, 8, 5, 1, -8 }, // ')'
113 | { 32, 5, 4, 6, 0, -7 }, // '*'
114 | { 35, 5, 5, 9, 1, -5 }, // '+'
115 | { 39, 1, 2, 4, 1, -1 }, // ','
116 | { 40, 2, 1, 4, 1, -3 }, // '-'
117 | { 41, 1, 1, 4, 1, -1 }, // '.'
118 | { 42, 3, 7, 4, 0, -7 }, // '/'
119 | { 45, 4, 7, 7, 1, -7 }, // '0'
120 | { 49, 3, 7, 7, 2, -7 }, // '1'
121 | { 52, 4, 7, 7, 1, -7 }, // '2'
122 | { 56, 4, 7, 7, 1, -7 }, // '3'
123 | { 60, 5, 7, 7, 1, -7 }, // '4'
124 | { 65, 4, 7, 7, 1, -7 }, // '5'
125 | { 69, 4, 7, 7, 1, -7 }, // '6'
126 | { 73, 4, 7, 7, 1, -7 }, // '7'
127 | { 77, 4, 7, 7, 1, -7 }, // '8'
128 | { 81, 4, 7, 7, 1, -7 }, // '9'
129 | { 85, 1, 5, 4, 1, -5 }, // ':'
130 | { 86, 1, 6, 4, 1, -5 }, // ';'
131 | { 87, 6, 5, 9, 1, -5 }, // '<'
132 | { 91, 6, 3, 9, 1, -4 }, // '='
133 | { 94, 6, 5, 9, 1, -5 }, // '>'
134 | { 98, 4, 7, 6, 1, -7 }, // '?'
135 | { 102, 8, 8, 11, 1, -7 }, // '@'
136 | { 110, 6, 7, 7, 0, -7 }, // 'A'
137 | { 116, 5, 7, 8, 1, -7 }, // 'B'
138 | { 121, 5, 7, 8, 1, -7 }, // 'C'
139 | { 126, 5, 7, 8, 1, -7 }, // 'D'
140 | { 131, 4, 7, 7, 1, -7 }, // 'E'
141 | { 135, 4, 7, 7, 1, -7 }, // 'F'
142 | { 139, 5, 7, 8, 1, -7 }, // 'G'
143 | { 144, 5, 7, 8, 1, -7 }, // 'H'
144 | { 149, 1, 7, 4, 1, -7 }, // 'I'
145 | { 150, 2, 9, 4, 0, -7 }, // 'J'
146 | { 153, 5, 7, 7, 1, -7 }, // 'K'
147 | { 158, 4, 7, 6, 1, -7 }, // 'L'
148 | { 162, 6, 7, 9, 1, -7 }, // 'M'
149 | { 168, 5, 7, 8, 1, -7 }, // 'N'
150 | { 173, 5, 7, 8, 1, -7 }, // 'O'
151 | { 178, 4, 7, 7, 1, -7 }, // 'P'
152 | { 182, 5, 8, 8, 1, -7 }, // 'Q'
153 | { 187, 5, 7, 7, 1, -7 }, // 'R'
154 | { 192, 5, 7, 8, 1, -7 }, // 'S'
155 | { 197, 5, 7, 6, 0, -7 }, // 'T'
156 | { 202, 5, 7, 8, 1, -7 }, // 'U'
157 | { 207, 6, 7, 7, 0, -7 }, // 'V'
158 | { 213, 7, 7, 8, 0, -7 }, // 'W'
159 | { 220, 6, 7, 7, 0, -7 }, // 'X'
160 | { 226, 5, 7, 6, 0, -7 }, // 'Y'
161 | { 231, 5, 7, 6, 0, -7 }, // 'Z'
162 | { 236, 2, 8, 5, 1, -7 }, // '['
163 | { 238, 3, 7, 4, 0, -7 }, // '\'
164 | { 241, 2, 8, 5, 1, -7 }, // ']'
165 | { 243, 6, 2, 9, 1, -7 }, // '^'
166 | { 245, 5, 1, 6, 0, 1 }, // '_'
167 | { 246, 2, 2, 6, 1, -8 }, // '`'
168 | { 247, 4, 5, 7, 1, -5 }, // 'a'
169 | { 250, 4, 8, 7, 1, -8 }, // 'b'
170 | { 254, 4, 5, 7, 1, -5 }, // 'c'
171 | { 257, 4, 8, 7, 1, -8 }, // 'd'
172 | { 261, 4, 5, 7, 1, -5 }, // 'e'
173 | { 264, 4, 8, 4, 0, -8 }, // 'f'
174 | { 268, 4, 7, 7, 1, -5 }, // 'g'
175 | { 272, 4, 8, 7, 1, -8 }, // 'h'
176 | { 276, 1, 7, 4, 1, -7 }, // 'i'
177 | { 277, 2, 9, 4, 0, -7 }, // 'j'
178 | { 280, 4, 8, 6, 1, -8 }, // 'k'
179 | { 284, 1, 8, 4, 1, -8 }, // 'l'
180 | { 285, 7, 5, 10, 1, -5 }, // 'm'
181 | { 290, 4, 5, 7, 1, -5 }, // 'n'
182 | { 293, 4, 5, 7, 1, -5 }, // 'o'
183 | { 296, 4, 7, 7, 1, -5 }, // 'p'
184 | { 300, 4, 7, 7, 1, -5 }, // 'q'
185 | { 304, 3, 5, 5, 1, -5 }, // 'r'
186 | { 306, 3, 5, 6, 1, -5 }, // 's'
187 | { 308, 4, 6, 5, 0, -6 }, // 't'
188 | { 311, 4, 5, 7, 1, -5 }, // 'u'
189 | { 314, 5, 5, 6, 0, -5 }, // 'v'
190 | { 318, 7, 5, 8, 0, -5 }, // 'w'
191 | { 323, 5, 5, 6, 0, -5 }, // 'x'
192 | { 327, 6, 7, 6, 0, -5 }, // 'y'
193 | { 333, 4, 5, 7, 1, -5 }, // 'z'
194 | { 336, 3, 8, 6, 1, -7 }, // '{'
195 | { 339, 1, 9, 4, 1, -7 }, // '|'
196 | { 341, 3, 8, 6, 1, -7 } // '}'
197 | };
198 | const static GFXfont Dialog_plain_9 = {
199 | (uint8_t *)Dialog_plain_9Bitmaps,(GFXglyph *)Dialog_plain_9Glyphs,0x20, 0x7E, 12};
200 |
--------------------------------------------------------------------------------
/firmware-calibration/lcd_5110/Fonts/Lato_9pt.h:
--------------------------------------------------------------------------------
1 | // Created by http://oleddisplay.squix.ch/ Consider a donation
2 | // In case of problems make sure that you are using the font file with the correct version!
3 | const static uint8_t Lato_Medium_9Bitmaps[] = {
4 |
5 | // Bitmap Data:
6 | 0x00, // ' '
7 | 0xFA, // '!'
8 | 0xF0, // '"'
9 | 0x31,0xBE,0xAF,0xA9,0x80, // '#'
10 | 0x23,0xD8,0xC3,0x14,0xBE,0x20, // '$'
11 | 0x65,0x4A,0xA2,0xA2,0xA5,0x53,0x00, // '%'
12 | 0x31,0x24,0x19,0x96,0x27,0x40, // '&'
13 | 0xA0, // '''
14 | 0x56,0xA9,0x40, // '('
15 | 0xA5,0x55,0x80, // ')'
16 | 0xB8, // '*'
17 | 0x21,0x3E,0x42,0x00, // '+'
18 | 0xD0, // ','
19 | 0xC0, // '-'
20 | 0xC0, // '.'
21 | 0x12,0x22,0x44,0xC0, // '/'
22 | 0x72,0x63,0x18,0xA5,0xC0, // '0'
23 | 0x4C,0x44,0x44,0xF0, // '1'
24 | 0x72,0x42,0x22,0x23,0xE0, // '2'
25 | 0x72,0x42,0x60,0xC5,0xC0, // '3'
26 | 0x11,0x94,0xAF,0x88,0x40, // '4'
27 | 0x72,0x1C,0x10,0x87,0xC0, // '5'
28 | 0x11,0x10,0xE8,0xC5,0xC0, // '6'
29 | 0xF8,0x44,0x22,0x11,0x00, // '7'
30 | 0x72,0x52,0xE8,0xC5,0xC0, // '8'
31 | 0x74,0x62,0xE1,0x11,0x80, // '9'
32 | 0x88, // ':'
33 | 0x8C, // ';'
34 | 0x71,0x10, // '<'
35 | 0xF0,0xF0, // '='
36 | 0xC3,0x48, // '>'
37 | 0xE1,0x12,0x40,0x40, // '?'
38 | 0x3C,0x85,0x6D,0x5A,0xAE,0x90,0x9E, // '@'
39 | 0x30,0xC2,0x92,0x7A,0x18,0x40, // 'A'
40 | 0xF9,0x9E,0x99,0xF0, // 'B'
41 | 0x3D,0x08,0x20,0x81,0x03,0xC0, // 'C'
42 | 0xF4,0x63,0x18,0xC7,0xC0, // 'D'
43 | 0xF8,0x8E,0x88,0xF0, // 'E'
44 | 0xF8,0x8E,0x88,0x80, // 'F'
45 | 0x3D,0x08,0x23,0x45,0x13,0xC0, // 'G'
46 | 0x8C,0x63,0xF8,0xC6,0x20, // 'H'
47 | 0xFE, // 'I'
48 | 0x24,0x92,0x70, // 'J'
49 | 0x9C,0xA9,0x8A,0x4A,0x20, // 'K'
50 | 0x92,0x49,0x38, // 'L'
51 | 0x87,0x0F,0x2D,0x5B,0x32,0x60,0x80, // 'M'
52 | 0x8E,0x73,0x5B,0xCE,0x20, // 'N'
53 | 0x38,0x8A,0x0C,0x18,0x28,0x8E,0x00, // 'O'
54 | 0xE9,0x99,0xE8,0x80, // 'P'
55 | 0x38,0x8A,0x0C,0x18,0x28,0x8E,0x02,0x02, // 'Q'
56 | 0xE4,0xA5,0xCA,0x4A,0x60, // 'R'
57 | 0x72,0x10,0xE1,0x8B,0xC0, // 'S'
58 | 0xF9,0x08,0x42,0x10,0x80, // 'T'
59 | 0x8C,0x63,0x18,0xC5,0xC0, // 'U'
60 | 0x85,0x14,0x92,0x30,0xC3,0x00, // 'V'
61 | 0x88,0xA6,0x55,0x2A,0xA5,0x31,0x18,0x88, // 'W'
62 | 0xCD,0x23,0x0C,0x31,0x28,0xC0, // 'X'
63 | 0x8D,0x25,0x0C,0x20,0x82,0x00, // 'Y'
64 | 0xF8,0xC4,0x46,0x23,0xE0, // 'Z'
65 | 0xEA,0xAA,0xC0, // '['
66 | 0x84,0x44,0x22,0x10, // '\'
67 | 0xD5,0x55,0xC0, // ']'
68 | 0x4A,0xB0, // '^'
69 | 0xF0, // '_'
70 | 0x80, // '`'
71 | 0xE1,0x79,0x70, // 'a'
72 | 0x88,0xE9,0x99,0xE0, // 'b'
73 | 0x78,0x88,0x70, // 'c'
74 | 0x11,0x79,0x99,0x70, // 'd'
75 | 0x79,0xF8,0x70, // 'e'
76 | 0x6B,0xA4,0x90, // 'f'
77 | 0x7C,0xA4,0xC7,0x45,0xC0, // 'g'
78 | 0x93,0xDB,0x68, // 'h'
79 | 0xBE, // 'i'
80 | 0xC5,0x55,0x80, // 'j'
81 | 0x88,0xAC,0xCC,0xB0, // 'k'
82 | 0xFE, // 'l'
83 | 0xFA,0x9A,0x69,0xA4, // 'm'
84 | 0xF6,0xDA, // 'n'
85 | 0x74,0x63,0x17,0x00, // 'o'
86 | 0xE9,0x99,0xE8,0x80, // 'p'
87 | 0x79,0x99,0x71,0x10, // 'q'
88 | 0xEA,0x80, // 'r'
89 | 0x68,0x61,0xE0, // 's'
90 | 0x4B,0xA4,0x98, // 't'
91 | 0xB6,0xDE, // 'u'
92 | 0x9A,0x94,0xC2,0x00, // 'v'
93 | 0x93,0x25,0xB3,0x66,0x40, // 'w'
94 | 0x96,0x25,0x90, // 'x'
95 | 0x9A,0x94,0xC2,0x11,0x00, // 'y'
96 | 0xF2,0x24,0xF0, // 'z'
97 | 0x55,0x95,0x40, // '{'
98 | 0x55,0x55,0x40, // '|'
99 | 0xD5,0x55,0xC0 // '}'
100 | };
101 | const static GFXglyph Lato_Medium_9Glyphs[] = {
102 | // bitmapOffset, width, height, xAdvance, xOffset, yOffset
103 | { 0, 1, 1, 3, 0, 0 }, // ' '
104 | { 1, 1, 7, 3, 1, -7 }, // '!'
105 | { 2, 2, 3, 4, 1, -7 }, // '"'
106 | { 3, 5, 7, 6, 0, -7 }, // '#'
107 | { 8, 5, 9, 6, 0, -8 }, // '$'
108 | { 14, 7, 7, 8, 0, -7 }, // '%'
109 | { 21, 6, 7, 7, 0, -7 }, // '&'
110 | { 27, 2, 2, 3, 0, -7 }, // '''
111 | { 28, 2, 9, 3, 0, -8 }, // '('
112 | { 31, 2, 9, 3, 0, -8 }, // ')'
113 | { 34, 2, 3, 5, 1, -7 }, // '*'
114 | { 35, 5, 5, 6, 0, -6 }, // '+'
115 | { 39, 2, 2, 3, 0, -1 }, // ','
116 | { 40, 2, 1, 4, 1, -3 }, // '-'
117 | { 41, 2, 1, 3, 0, -1 }, // '.'
118 | { 42, 4, 7, 5, 0, -7 }, // '/'
119 | { 46, 5, 7, 6, 0, -7 }, // '0'
120 | { 51, 4, 7, 6, 1, -7 }, // '1'
121 | { 55, 5, 7, 6, 0, -7 }, // '2'
122 | { 60, 5, 7, 6, 0, -7 }, // '3'
123 | { 65, 5, 7, 6, 0, -7 }, // '4'
124 | { 70, 5, 7, 6, 0, -7 }, // '5'
125 | { 75, 5, 7, 6, 0, -7 }, // '6'
126 | { 80, 5, 7, 6, 0, -7 }, // '7'
127 | { 85, 5, 7, 6, 0, -7 }, // '8'
128 | { 90, 5, 7, 6, 0, -7 }, // '9'
129 | { 95, 1, 5, 3, 1, -5 }, // ':'
130 | { 96, 1, 6, 3, 1, -5 }, // ';'
131 | { 97, 3, 4, 6, 1, -5 }, // '<'
132 | { 99, 4, 3, 6, 1, -5 }, // '='
133 | { 101, 4, 4, 6, 1, -5 }, // '>'
134 | { 103, 4, 7, 5, 0, -7 }, // '?'
135 | { 107, 7, 8, 9, 0, -7 }, // '@'
136 | { 114, 6, 7, 7, 0, -7 }, // 'A'
137 | { 120, 4, 7, 7, 1, -7 }, // 'B'
138 | { 124, 6, 7, 7, 0, -7 }, // 'C'
139 | { 130, 5, 7, 8, 1, -7 }, // 'D'
140 | { 135, 4, 7, 6, 1, -7 }, // 'E'
141 | { 139, 4, 7, 6, 1, -7 }, // 'F'
142 | { 143, 6, 7, 8, 0, -7 }, // 'G'
143 | { 149, 5, 7, 8, 1, -7 }, // 'H'
144 | { 154, 1, 7, 4, 1, -7 }, // 'I'
145 | { 155, 3, 7, 5, 0, -7 }, // 'J'
146 | { 158, 5, 7, 7, 1, -7 }, // 'K'
147 | { 163, 3, 7, 6, 1, -7 }, // 'L'
148 | { 166, 7, 7, 9, 1, -7 }, // 'M'
149 | { 173, 5, 7, 8, 1, -7 }, // 'N'
150 | { 178, 7, 7, 8, 0, -7 }, // 'O'
151 | { 185, 4, 7, 6, 1, -7 }, // 'P'
152 | { 189, 7, 9, 8, 0, -7 }, // 'Q'
153 | { 197, 5, 7, 7, 1, -7 }, // 'R'
154 | { 202, 5, 7, 6, 0, -7 }, // 'S'
155 | { 207, 5, 7, 6, 0, -7 }, // 'T'
156 | { 212, 5, 7, 8, 1, -7 }, // 'U'
157 | { 217, 6, 7, 7, 0, -7 }, // 'V'
158 | { 223, 9, 7, 10, 0, -7 }, // 'W'
159 | { 231, 6, 7, 7, 0, -7 }, // 'X'
160 | { 237, 6, 7, 7, 0, -7 }, // 'Y'
161 | { 243, 5, 7, 6, 0, -7 }, // 'Z'
162 | { 248, 2, 9, 4, 1, -7 }, // '['
163 | { 251, 4, 7, 5, 0, -7 }, // '\'
164 | { 255, 2, 9, 4, 0, -7 }, // ']'
165 | { 258, 4, 3, 6, 1, -7 }, // '^'
166 | { 260, 4, 1, 5, 0, 1 }, // '_'
167 | { 261, 1, 1, 5, 1, -7 }, // '`'
168 | { 262, 4, 5, 5, 0, -5 }, // 'a'
169 | { 265, 4, 7, 6, 1, -7 }, // 'b'
170 | { 269, 4, 5, 5, 0, -5 }, // 'c'
171 | { 272, 4, 7, 6, 0, -7 }, // 'd'
172 | { 276, 4, 5, 6, 0, -5 }, // 'e'
173 | { 279, 3, 7, 4, 0, -7 }, // 'f'
174 | { 282, 5, 7, 6, 0, -5 }, // 'g'
175 | { 287, 3, 7, 6, 1, -7 }, // 'h'
176 | { 290, 1, 7, 3, 1, -7 }, // 'i'
177 | { 291, 2, 9, 3, 0, -7 }, // 'j'
178 | { 294, 4, 7, 6, 1, -7 }, // 'k'
179 | { 298, 1, 7, 3, 1, -7 }, // 'l'
180 | { 299, 6, 5, 8, 1, -5 }, // 'm'
181 | { 303, 3, 5, 6, 1, -5 }, // 'n'
182 | { 305, 5, 5, 6, 0, -5 }, // 'o'
183 | { 309, 4, 7, 6, 1, -5 }, // 'p'
184 | { 313, 4, 7, 6, 0, -5 }, // 'q'
185 | { 317, 2, 5, 4, 1, -5 }, // 'r'
186 | { 319, 4, 5, 5, 0, -5 }, // 's'
187 | { 322, 3, 7, 4, 0, -7 }, // 't'
188 | { 325, 3, 5, 6, 1, -5 }, // 'u'
189 | { 327, 5, 5, 6, 0, -5 }, // 'v'
190 | { 331, 7, 5, 8, 0, -5 }, // 'w'
191 | { 336, 4, 5, 6, 0, -5 }, // 'x'
192 | { 339, 5, 7, 6, 0, -5 }, // 'y'
193 | { 344, 4, 5, 5, 0, -5 }, // 'z'
194 | { 347, 2, 9, 4, 0, -7 }, // '{'
195 | { 350, 2, 9, 3, 0, -7 }, // '|'
196 | { 353, 2, 9, 4, 0, -7 } // '}'
197 | };
198 | const static GFXfont Lato_Medium_9 = {
199 | (uint8_t *)Lato_Medium_9Bitmaps,(GFXglyph *)Lato_Medium_9Glyphs,0x20, 0x7E, 11};
200 |
--------------------------------------------------------------------------------