├── 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 | {E03751BF-A14F-48BD-9B13-A7DA6A3C7991},00000000000000E1 -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------