ssd1306 驱动

This commit is contained in:
许晟昊 2024-12-06 11:06:52 +08:00
parent 09749259be
commit c1b7eca232
16 changed files with 662 additions and 247 deletions

View File

@ -49,7 +49,6 @@ extern "C"
#include "lib.h" #include "lib.h"
#include "bsp.h" #include "bsp.h"
#include "board.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
@ -78,6 +77,10 @@ extern "C"
/* Private defines -----------------------------------------------------------*/ /* Private defines -----------------------------------------------------------*/
#define LED_BLUE_Pin LL_GPIO_PIN_13 #define LED_BLUE_Pin LL_GPIO_PIN_13
#define LED_BLUE_GPIO_Port GPIOC #define LED_BLUE_GPIO_Port GPIOC
#define OLED_SDA_Pin LL_GPIO_PIN_12
#define OLED_SDA_GPIO_Port GPIOB
#define OLDE_SCK_Pin LL_GPIO_PIN_13
#define OLDE_SCK_GPIO_Port GPIOB
#ifndef NVIC_PRIORITYGROUP_0 #ifndef NVIC_PRIORITYGROUP_0
#define NVIC_PRIORITYGROUP_0 ((uint32_t)0x00000007) /*!< 0 bit for pre-emption priority, \ #define NVIC_PRIORITYGROUP_0 ((uint32_t)0x00000007) /*!< 0 bit for pre-emption priority, \
4 bits for subpriority */ 4 bits for subpriority */

View File

@ -55,6 +55,9 @@ void MX_GPIO_Init(void)
/**/ /**/
LL_GPIO_ResetOutputPin(LED_BLUE_GPIO_Port, LED_BLUE_Pin); LL_GPIO_ResetOutputPin(LED_BLUE_GPIO_Port, LED_BLUE_Pin);
/**/
LL_GPIO_ResetOutputPin(GPIOB, OLED_SDA_Pin|OLDE_SCK_Pin);
/**/ /**/
GPIO_InitStruct.Pin = LED_BLUE_Pin; GPIO_InitStruct.Pin = LED_BLUE_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
@ -76,12 +79,19 @@ void MX_GPIO_Init(void)
/**/ /**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_10 GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_10
|LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_13|LL_GPIO_PIN_14 |LL_GPIO_PIN_11|LL_GPIO_PIN_14|LL_GPIO_PIN_15|LL_GPIO_PIN_3
|LL_GPIO_PIN_15|LL_GPIO_PIN_3|LL_GPIO_PIN_4|LL_GPIO_PIN_5 |LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7
|LL_GPIO_PIN_6|LL_GPIO_PIN_7|LL_GPIO_PIN_8|LL_GPIO_PIN_9; |LL_GPIO_PIN_8|LL_GPIO_PIN_9;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct); LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/**/
GPIO_InitStruct.Pin = OLED_SDA_Pin|OLDE_SCK_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
} }
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */

View File

@ -24,6 +24,7 @@
/* Private includes ----------------------------------------------------------*/ /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
#include "board.h"
#include "app.h" #include "app.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
@ -103,6 +104,7 @@ int main(void)
MX_DMA_Init(); MX_DMA_Init();
MX_USART1_UART_Init(); MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
my_mem_init(SRAMIN); // Initialize internal memory pool 1
board_init(); board_init();
app_init(); app_init();
/* USER CODE END 2 */ /* USER CODE END 2 */

View File

@ -103,7 +103,7 @@
<bEvRecOn>1</bEvRecOn> <bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf> <bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf> <bTchkAxf>0</bTchkAxf>
<nTsel>0</nTsel> <nTsel>3</nTsel>
<sDll></sDll> <sDll></sDll>
<sDllPa></sDllPa> <sDllPa></sDllPa>
<sDlgDll></sDlgDll> <sDlgDll></sDlgDll>
@ -114,7 +114,7 @@
<tDlgDll></tDlgDll> <tDlgDll></tDlgDll>
<tDlgPa></tDlgPa> <tDlgPa></tDlgPa>
<tIfile></tIfile> <tIfile></tIfile>
<pMon>BIN\UL2CM3.DLL</pMon> <pMon>BIN\CMSIS_AGDI.dll</pMon>
</DebugOpt> </DebugOpt>
<TargetDriverDllRegistry> <TargetDriverDllRegistry>
<SetRegEntry> <SetRegEntry>
@ -125,7 +125,7 @@
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
<Key>CMSIS_AGDI</Key> <Key>CMSIS_AGDI</Key>
<Name>UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F10x_128 -FL020000 -FS08000000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)</Name> <Name>-X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)</Name>
</SetRegEntry> </SetRegEntry>
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
@ -324,7 +324,7 @@
<Group> <Group>
<GroupName>User/system</GroupName> <GroupName>User/system</GroupName>
<tvExp>0</tvExp> <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
@ -412,6 +412,18 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\system\bsp\i2cs.c</PathWithFileName>
<FilenameWithoutPath>i2cs.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>
@ -422,7 +434,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>16</FileNumber> <FileNumber>17</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -434,7 +446,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>17</FileNumber> <FileNumber>18</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -446,7 +458,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>18</FileNumber> <FileNumber>19</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -458,7 +470,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>19</FileNumber> <FileNumber>20</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -470,7 +482,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>20</FileNumber> <FileNumber>21</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -482,7 +494,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>21</FileNumber> <FileNumber>22</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -494,7 +506,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>22</FileNumber> <FileNumber>23</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -506,7 +518,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>23</FileNumber> <FileNumber>24</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -518,7 +530,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>24</FileNumber> <FileNumber>25</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -530,7 +542,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>25</FileNumber> <FileNumber>26</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -542,7 +554,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>26</FileNumber> <FileNumber>27</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -554,7 +566,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>27</FileNumber> <FileNumber>28</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -566,7 +578,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>28</FileNumber> <FileNumber>29</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -578,7 +590,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>29</FileNumber> <FileNumber>30</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -590,7 +602,7 @@
</File> </File>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>30</FileNumber> <FileNumber>31</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -610,7 +622,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>31</FileNumber> <FileNumber>32</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -622,7 +634,7 @@
</File> </File>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>32</FileNumber> <FileNumber>33</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -634,7 +646,7 @@
</File> </File>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>33</FileNumber> <FileNumber>34</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -646,7 +658,7 @@
</File> </File>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>34</FileNumber> <FileNumber>35</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -658,7 +670,7 @@
</File> </File>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>35</FileNumber> <FileNumber>36</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -670,7 +682,7 @@
</File> </File>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>36</FileNumber> <FileNumber>37</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -682,7 +694,7 @@
</File> </File>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>37</FileNumber> <FileNumber>38</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -702,7 +714,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>8</GroupNumber> <GroupNumber>8</GroupNumber>
<FileNumber>38</FileNumber> <FileNumber>39</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -712,6 +724,18 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\board\ssd1306_oled.c</PathWithFileName>
<FilenameWithoutPath>ssd1306_oled.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>

View File

@ -580,6 +580,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\User\system\bsp\uarts.c</FilePath> <FilePath>..\User\system\bsp\uarts.c</FilePath>
</File> </File>
<File>
<FileName>i2cs.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\system\bsp\i2cs.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
@ -1136,6 +1141,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\User\board\board.c</FilePath> <FilePath>..\User\board\board.c</FilePath>
</File> </File>
<File>
<FileName>ssd1306_oled.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\board\ssd1306_oled.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>

View File

@ -1,217 +1,361 @@
:020000040800F2 :020000040800F2
:100000002804002005010008210800087B010008E1 :100000006018002005010008690800089701000831
:100010001D080008710100085D0A000800000000CA :100010006508000871010008A50A0008000000003A
:10002000000000000000000000000000650900085A :10002000000000000000000000000000AD09000812
:10003000790100080000000067080008670900084F :100030009501000800000000AF080008AF090008A3
:100040001F010008650800081F0100081F010008C3 :100040001F010008AD0800081F0100081F0100087B
:100050001F0100081F0100081F0100081F01000800 :100050001F0100081F0100081F0100081F01000800
:100060001F0100081F0100081F0100081F010008F0 :100060001F0100081F0100081F0100081F010008F0
:100070001F0100081F010008750100087701000832 :100070001F0100081F0100089101000893010008FA
:100080001F0100081F0100081F0100081F010008D0 :100080001F0100081F0100081F0100081F010008D0
:100090001F0100081F0100081F0100081F010008C0 :100090001F0100081F0100081F0100081F010008C0
:1000A0001F0100081F0100081F0100081F010008B0 :1000A0001F0100081F0100081F0100081F010008B0
:1000B0001F0100081F0100081F0100081F010008A0 :1000B0001F0100081F0100081F0100081F010008A0
:1000C0001F0100081F0100081F0100081F01000890 :1000C0001F0100081F0100081F0100081F01000890
:1000D0001F0100085B0A00081F0100081F0100083B :1000D0001F010008A30A00081F0100081F010008F3
:1000E0001F0100081F0100081F010008DFF810D0E1 :1000E0001F0100081F0100081F010008DFF810D0E1
:1000F00000F02CF800480047A10B0008AFF3008087 :1000F00000F02CF8004800475D110008AFF30080C5
:10010000280400200648804706480047FEE7FEE72F :10010000601800200648804706480047FEE7FEE7E3
:10011000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7B7 :10011000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7B7
:10012000590A0008ED000008D2B201E000F8012BE6 :10012000A10A0008ED000008D2B201E000F8012B9E
:10013000491EFBD270470022F6E710B513460A4667 :10013000491EFBD270470022F6E710B513460A4667
:1001400004461946FFF7F0FF204610BD064C074D48 :1001400004461946FFF7F0FF204610BD064C074D48
:1001500006E0E06840F0010394E807009847103497 :1001500006E0E06840F0010394E807009847103497
:10016000AC42F6D3FFF7C6FF0C0D00082C0D0008BB :10016000AC42F6D3FFF7C6FFE815000808160008F2
:1001700000BFFEE770477047704700BFFEE7000012 :1001700000BFFEE770B504460D4600BF2CB901F084
:1001800008B5054989690143034A916111468969A6 :10018000E9F901E000BF00BFFCE700BF012070BD3E
:100190000140009100BF08BD0010024008B50549AC :1001900070477047704700BFFEE7000008B505498B
:1001A00089690143034A91611146896901400091BF :1001A00089690143034A91611146896901400091BF
:1001B00000BF08BD0010024030B54B1E054CE35C8B :1001B00000BF08BD0010024008B505498969014328
:1001C000C35823F4405313434C1E024D2C5D03517E :1001C000034A9161114689690140009100BF08BD51
:1001D00030BD0000D40C000830B54B1E054CE35C6C :1001D0000010024030B54B1E054CE35CC35823F4BD
:1001E000C35844F21004A34313434C1E014D2C5D2D :1001E000405313434C1E024D2C5D035130BD0000A3
:1001F000035130BDD40C000830B54B1E054CE35CF8 :1001F0009815000830B54B1E054CE35CC35844F21B
:10020000C35823F0800313434C1E024D2C5D035151 :100200001004A34313434C1E014D2C5D035130BD1C
:1002100030BD0000D40C000830B54B1E054CE35C2B :100210009815000830B54B1E054CE35CC35823F01D
:10022000C35823F4406313434C1E024D2C5D03510D :10022000800313434C1E024D2C5D035130BD000072
:1002300030BD0000D40C000830B54B1E054CE35C0B :100230009815000830B54B1E054CE35CC35823F4F9
:10024000C35823F0200313434C1E024D2C5D035171 :10024000406313434C1E024D2C5D035130BD000032
:1002500030BD0000D40C000830B54B1E054CE35CEB :100250009815000830B54B1E054CE35CC35823F0DD
:10026000C35823F0400313434C1E024D2C5D035131 :10026000200313434C1E024D2C5D035130BD000092
:1002700030BD0000D40C000830B54B1E054CE35CCB :100270009815000830B54B1E054CE35CC35823F0BD
:10028000C35823F4407313434C1E024D2C5D03519D :10028000400313434C1E024D2C5D035130BD000052
:1002900030BD0000D40C00082DE9F04102460B46A9 :100290009815000830B54B1E054CE35CC35823F499
:1002A0001868C0F30F2595FAA5F0B0FA80F480E045 :1002A000407313434C1E024D2C5D035130BD0000C2
:1002B0000120A040284000287AD0082C04D240F227 :1002B000981500082DE9F04102460B461868C0F376
:1002C000011000FA04F106E0A4F108004FF0011655 :1002C0000F2595FAA5F0B0FA80F480E00120A04057
:1002D000864046F08061586808280ED11869D668B3 :1002D000284000287AD0082C04D240F2011000FAFD
:1002E00026EA11260F0A97FAA7F7B7FA87F700FA56 :1002E00004F106E0A4F108004FF00116864046F044
:1002F00007F73E43D66000BF00BF586802EB1166A7 :1002F0008061586808280ED11869D66826EA112648
:1003000091FAA1FCBCFA8CFC4FEA8C084FF00F0C60 :100300000F0A97FAA7F7B7FA87F700FA07F73E43FD
:100310000CFA08FC376827EA0C0791FAA1FCBCFA32 :10031000D66000BF00BF586802EB116691FAA1FCDD
:100320008CFC4FEA8C0C00FA0CFC47EA0C07376097 :10032000BCFA8CFC4FEA8C084FF00F0C0CFA08FC5E
:1003300000BF5868012802D05868092838D1986849 :10033000376827EA0C0791FAA1FCBCFA8CFC4FEA5B
:1003400002EB116691FAA1FCBCFA8CFC4FEA8C0816 :100340008C0C00FA0CFC47EA0C07376000BF5868B9
:100350004FF0030C0CFA08FC376827EA0C0791FAF7 :10035000012802D05868092838D1986802EB116644
:10036000A1FCBCFA8CFC4FEA8C0C00FA0CFC47EAAE :1003600091FAA1FCBCFA8CFC4FEA8C084FF0030C0C
:100370000C07376000BFD86802EB116691FAA1FC48 :100370000CFA08FC376827EA0C0791FAA1FCBCFAD2
:10038000BCFA8CFC4FEA8C084FF0040C0CFA08FC09 :100380008CFC4FEA8C0C00FA0CFC47EA0C07376037
:10039000376827EA0C0791FAA1FCBCFA8CFC4FEAFB :1003900000BFD86802EB116691FAA1FCBCFA8CFC94
:1003A0008C0C00FA0CFC47EA0C07376000BF00BF5A :1003A0004FEA8C084FF0040C0CFA08FC376827EA77
:1003B000641C25FA04F000287FF47AAFBDE8F081D0 :1003B0000C0791FAA1FCBCFA8CFC4FEA8C0C00FAF9
:1003C0004FF47A71B0FBF1F2521E4FF0E0235A6104 :1003C0000CFC47EA0C07376000BF00BF641C25FA2D
:1003D00000229A6105221A6100BF704710B50446D9 :1003D00004F000287FF47AAFBDE8F081C1F30F226A
:1003E00000F076FA2060206800F03EFA60606068F5 :1003E000426170474FF47A71B0FBF1F2521E4FF048
:1003F00000F04AFAA060606800F058FAE06010BDB2 :1003F000E0235A6100229A6105221A6100BF70470A
:100400000149086070470000000000202DE9FF410D :1004000010B5044600F088FA2060206800F050FA29
:1004100004460D4601270026204600F041F800283A :100410006060606800F05CFAA060606800F06AFAF2
:1004200033D1E9686868084329690843E16841F203 :10042000E06010BD01490860704700000000002036
:100430000C6291430843E060A868216921F44051AF :100430002DE9FF4104460D4601270026204600F025
:100440000143216100BF6869616921F44071014382 :1004400041F8002833D1E9686868084329690843FE
:10045000616100BF6846FFF7C1FF0E48844201D1C9 :10045000E16841F20C6291430843E060A8682169B9
:10046000039E08E00C48844201D1029E03E00B4841 :1004600021F440510143216100BF6869616921F4B1
:10047000844200D1029E46B1286830B1002731463F :1004700040710143616100BF6846FFF7C1FF0E484C
:1004800020462A6800F011F800BF384604B0BDE8E5 :10048000844201D1039E08E00C48844201D1029EBF
:10049000F081000000380140004400400048004066 :1004900003E00B48844200D1029E46B1286830B187
:1004A0000146C868C0F34030704770B501EBC10326 :1004A0000027314620462A6800F011F800BF384680
:1004B00003EB01139400B3FBF4F301EBC10404EB71 :1004B00004B0BDE8F0810000003801400044004075
:1004C00001149500B4FBF5F46425B4FBF5F404EBDA :1004C000004800400146C868C0F34030704770B52E
:1004D000C40505EB0414A3EB8403322404EB0313DB :1004D00001EBC10303EB01139400B3FBF4F301EB55
:1004E0006424B3FBF4F303F0F00301EBC10404EB69 :1004E000C10404EB01149500B4FBF5F46425B4FBDE
:1004F00001149500B4FBF5F46425B4FBF5F403EBAB :1004F000F5F404EBC40505EB0414A3EB84033224E8
:10050000041401EBC10303EB01139500B3FBF5F3F6 :1005000004EB03136424B3FBF4F303F0F00301EBF7
:1005100001EBC10505EB01159600B5FBF6F5642668 :10051000C10404EB01149500B4FBF5F46425B4FBAD
:10052000B5FBF6F505EBC50606EB0515A3EB850354 :10052000F5F403EB041401EBC10303EB0113950095
:10053000322505EB03136425B3FBF5F303F00F033A :10053000B3FBF5F301EBC10505EB01159600B5FB27
:1005400023449BB2836070BD38B5012014494969CA :10054000F6F56426B5FBF6F505EBC50606EB0515D5
:100550000143134A5161114649690140009100BFAE :10055000A3EB8503322505EB03136425B3FBF5F309
:1005600000BF00F08BFA05460022114600F05AF950 :1005600003F00F0323449BB2836070BD38B50120B4
:10057000044621460E2000F089FA0E2000F070FAA1 :10057000144949690143134A5161114649690140CF
:1005800000F07CFA05460022114600F04BF90446C3 :10058000009100BF00BF00F09DFA05460022114611
:1005900021460F2000F07AFA0F2000F061FA38BDF2 :1005900000F06CF9044621460E2000F09BFA0E2074
:1005A0000010024000B585B014216846FFF7C3FD76 :1005A00000F082FA00F08EFA05460022114600F0B3
:1005B0001020FFF7E5FD2020FFF7E2FD0420FFF704 :1005B0005DF9044621460F2000F08CFA0F2000F070
:1005C000DFFD0820FFF7DCFD1548C0F30F21154AB9 :1005C00073FA38BD0010024000B585B014216846AA
:1005D000516100BF00900120019002200290002094 :1005D000FFF7B1FD1020FFF7E1FD2020FFF7DEFD62
:1005E000039069461046FFF757FE0F480090002021 :1005E0000420FFF7DBFD0820FFF7D8FD1C491D485C
:1005F000019069460B48FFF74FFE0C480090002021 :1005F000FFF7F4FE1C491D48FFF7F0FE1848009075
:10060000019069460A48FFF747FE6FF07B40009073 :1006000001200190022002900020039069461548C5
:100610000020019069460748FFF73EFE05B000BD87 :10061000FFF750FE164800900020019069461148EF
:100620002000200400100140C000C004FFFF990416 :10062000FFF748FE134800900020019069461248E9
:1006300000080140000C01402DE9F0418CB01C2164 :10063000FFF740FE114800900020019069460B48EA
:1006400005A8FFF778FD14216846FFF774FD4FF405 :10064000FFF738FE08480090012001900220029038
:100650008040FFF7A3FD0420FFF7A0FD684800904D :100650000020039069460548FFF72CFE05B000BD59
:10066000092001900320029000200390694665480C :10066000200020040010014030003004000C014044
:10067000FFF712FE6448009004200190694661482B :10067000C000C004FFFF990400080140FFFFCF0441
:10068000FFF70AFE002205216048FFF7A5FD0022C2 :100680002DE9F0418CB01C2105A8FFF754FD142181
:1006900005215E48FFF790FD002205215B48FFF72A :100690006846FFF750FD4FF48040FFF78DFD0420C2
:1006A000CBFD002205215948FFF7D6FD8022052108 :1006A000FFF78AFD6848009009200190032002901E
:1006B0005648FFF7A1FD002205215448FFF7DCFD55 :1006B0000020039069466548FFF7FCFD6448009000
:1006C000002205215148FFF7A7FD102204214F48C1 :1006C0000420019069466148FFF7F4FD00220521EE
:1006D000FFF782FD002204214C48FFF76DFD002248 :1006D0006048FFF78FFD002205215E48FFF77AFD95
:1006E00004214A48FFF7A8FD002204214748FFF7EC :1006E000002205215B48FFF7B5FD0022052159488E
:1006F000B3FD802204214548FFF77EFD002204213E :1006F000FFF7C0FD802205215648FFF78BFD002241
:100700004248FFF7B9FD002204214048FFF784FD6D :1007000005215448FFF7C6FD002205215148FFF797
:1007100025213F4B1B68C3F30220002425460346D6 :1007100091FD102204214F48FFF76CFD00220421B7
:10072000C3F1070CBCF1040F02D94FF0040C01E037 :100720004C48FFF757FD002204214A48FFF792FD8D
:10073000C3F1070C674603F1040CBCF1070F02D2AA :10073000002204214748FFF79DFD802204214548FF
:100740004FF0000C01E0A3F1030C66464FF0010CE2 :10074000FFF768FD002204214248FFF7A3FD0022C5
:100750000CFA07FCACF1010C0CEA040C0CFA06FCD8 :1007500004214048FFF76EFD25213F4B1B68C3F382
:100760004FF0010808FA06F8A8F1010808EA0508A0 :100760000220002425460346C3F1070CBCF1040F08
:100770004CEA080200BF002904DB1007030E2548DD :1007700002D94FF0040C01E0C3F1070C674603F106
:10078000435407E01007040E21480C3001F00F031A :10078000040CBCF1070F02D24FF0000C01E0A3F102
:100790001B1FC45400BF2520002809DB00F01F02E6 :10079000030C66464FF0010C0CFA07FCACF1010C9F
:1007A000012191404209920002F1E022C2F80011B9 :1007A0000CEA040C0CFA06FC4FF0010808FA06F8F3
:1007B00000BF4FF4E13005900020069007900890AC :1007B000A8F1010808EA05084CEA080200BF002970
:1007C0000C20099000200A900B9005A91248FFF711 :1007C00004DB1007030E2548435407E01007040E0E
:1007D0001DFE00BF1048006920F490400E490861DA :1007D00021480C3001F00F031B1FC45400BF25201B
:1007E0000846406920F02A00486100BF00BF084663 :1007E000002809DB00F01F0201219140420992001C
:1007F000C06840F40050C86000BF0CB0BDE8F08194 :1007F00002F1E022C2F8001100BF4FF4E130059091
:100800000200020400080140040004040000024049 :1008000000200690079008900C20099000200A9084
:100810000CED00E000E400E00038014000BFFEE71E :100810000B9005A91248FFF70BFE00BF10480069B6
:1008200000BFFEE7F0B503460C4603F00701C1F137 :1008200020F490400E4908610846406920F02A00F3
:100830000700042801D9042001E0C1F107000646A1 :10083000486100BF00BF0846C06840F40050C8606F
:10084000081D072801D2002000E0C81E054601202F :1008400000BF0CB0BDE8F0810200020400080140C6
:10085000B040401E2040A8400127AF407F1E1740F7 :1008500004000404000002400CED00E000E400E0AD
:100860003843F0BD70477047014600BF04484068F8 :100860000038014000BFFEE700BFFEE7F0B50346D9
:1008700000F0F0000009034A125C21FA02F0704710 :100870000C4603F00701C1F10700042801D9042048
:1008800000100240DB0C0008014600BF054840682C :1008800001E0C1F107000646081D072801D200203B
:1008900000F4E060044A02EB1020027821FA02F032 :1008900000E0C81E05460120B040401E2040A84090
:1008A0007047000000100240EB0C0008014600BF3A :1008A0000127AF407F1E17403843F0BD70477047A7
:1008B0000548406800F46050044A02EBD0200278FA :1008B000014600BF0448406800F0F0000009034A08
:1008C00021FA02F07047000000100240EB0C000813 :1008C000125C21FA02F07047001002409F150008E8
:1008D00010B5002400BF0B48406800F00C0020B1A8 :1008D000014600BF0548406800F4E060044A02EBAE
:1008E000042804D0082808D103E0074C07E0064C90 :1008E0001020027821FA02F0704700000010024048
:1008F00005E000F00BF8044601E0034C00BF00BF28 :1008F000AF150008014600BF0548406800F460508D
:10090000204610BD0010024000127A000021002293 :10090000044A02EBD020027821FA02F0704700007E
:1009100000BF1148406800F4803002461AB1B2F5B9 :1009100000100240AF15000810B5002400BF0B48BE
:10092000803F0CD101E00D490BE000BF0A48406850 :10092000406800F00C0020B1042804D0082808D149
:10093000C0F34040401C0A4BB3FBF0F101E0074913 :1009300003E0074C07E0064C05E000F00BF8044626
:1009400000BF00BF00BF0448406800F470100223DD :1009400001E0034C00BF00BF204610BD0010024074
:1009500003EB9040484370470010024000093D00FF :1009500000127A000021002200BF1148406800F414
:1009600000127A007047704710B5022037490968B5 :10096000803002461AB1B2F5803F0CD101E00D494A
:1009700021F007010143354A116000BF00BF00BFED :100970000BE000BF0A484068C0F34040401C0A4BEF
:100980003248006800F007000228F8D100BF304864 :10098000B3FBF0F101E0074900BF00BF00BF04481E
:10099000006840F480302E49086000BF00BF00BFEF :10099000406800F47010022303EB90404843704716
:1009A0002B480068C0F340400028F8D04FF4803056 :1009A0000010024000093D0000127A0070477047B5
:1009B0004FF4E011264A526822F47C1200F44033CE :1009B00010B502203749096821F007010143354A83
:1009C0000B431A43224B5A6000BF00BF1846006811 :1009C000116000BF00BF00BF3248006800F00700A0
:1009D00040F080701946086000BF00BF00BF1C488F :1009D0000228F8D100BF3048006840F480302E492A
:1009E0000068C0F340600028F8D00020184949682A :1009E000086000BF00BF00BF2B480068C0F3404054
:1009F00021F0F0010143164A516000BF1015114665 :1009F0000028F8D04FF480304FF4E011264A5268B6
:100A0000496821F4E0610143516000BF00201146B4 :100A000022F47C1200F440330B431A43224B5A6009
:100A1000496821F460510143516000BF0220114632 :100A100000BF00BF1846006840F0807019460860AB
:100A2000496821F003010143516000BF00BF00BFCE :100A200000BF00BF00BF1C480068C0F34060002842
:100A30000748406800F00C000828F8D10548FFF787 :100A3000F8D000201849496821F0F0010143164A16
:100A4000BFFC0448FFF7DCFC10BD000000200240A2 :100A4000516000BF10151146496821F4E06101436F
:100A50000010024000A24A047047704700BFFEE742 :100A5000516000BF00201146496821F460510143F4
:100A6000002809DB00F01F02012191404209920099 :100A6000516000BF02201146496821F00301014393
:100A700002F1E022C2F8001170470000024800684D :100A7000516000BF00BF00BF0748406800F00C0095
:100A8000C0F30220704700000CED00E010B5002814 :100A80000828F8D10548FFF7ADFC0448FFF7CAFC79
:100A900004DB0A07130E054A135406E00A07140E76 :100A900010BD0000002002400010024000A24A04E5
:100AA000034A00F00F031B1FD45410BD00E400E004 :100AA0007047704700BFFEE7002809DB00F01F0217
:100AB00018ED00E002E008C8121F08C1002AFAD1B0 :100AB000012191404209920002F1E022C2F80011A6
:100AC00070477047002001E001C1121F002AFBD1CE :100AC0007047000002480068C0F302207047000031
:100AD00070470000014601F1100000E0001D0268AF :100AD0000CED00E010B5002804DB0A07130E054AF0
:100AE0001AB9024A12689042F8D3704710000020E9 :100AE000135406E00A07140E034A00F00F031B1FFD
:100AF00010B50648046803E02046FFF7EBFF044604 :100AF000D45410BD00E400E018ED00E002E008C8A6
:100B0000034800688442F7D310BD00000C000020A9 :100B0000121F08C1002AFAD170477047002001E087
:100B100010000020002001490860704704000020F8 :100B100001C1121F002AFBD170472DE9FC41044698
:100B200010B5024800F006F810BD000004000020D7 :100B20000CB1012100E00021084640F26F21FFF7DF
:100B30007047000038B5014600200090086810B1E9 :100B300021FB25462C462E686F68D7E90401CDE9D4
:100B4000142821D116E000BF124B134CE068C3F308 :100B400000016868D0F80CC097E80F00E047204625
:100B50000F2222EA000400EA020544EA05440E4D91 :100B500000F05CFAD6E90401CDE900012868D0F87C
:100B60002C6100BF00BF0D480068486000BF142022 :100B600008C096E80F00E047204600F04FFAD6E9AB
:100B7000086000BF094A48681268101A642801D248 :100B70000401CDE900012868D0F80CC096E80F0008
:100B8000002038BD00BFDFE7002008600090032090 :100B8000E047BDE8FC810000014601F1100000E0F3
:100B9000F7E70000200020040010014014000020AE :100B9000001D02681AB9024A12689042F8D37047E1
:100BA00008B50120464989690143454A91611146CA :100BA0001000002010B50648046803E02046FFF757
:100BB00089690140009100BF00BF00071146C96963 :100BB000EBFF0446034800688442F7D310BD0000F1
:100BC0000143D1611146C9690140009100BF00BFD6 :100BC0000C000020100000202DE9FC4104460CB16F
:100BD000032002463B4B19684FF6FF0319403A4B7E :100BD000012100E00021084640F28B21FFF7CAFA0C
:100BE0000B4343EA0221374B196000BF01211B6808 :100BE00025462C462E686F68D7E90401CDE900013F
:100BF000C3F30220002425460346C3F1070CBCF1D1 :100BF0006868D0F808C097E80F00E047204600F08A
:100C0000040F02D94FF0040C01E0C3F1070C674652 :100C000005FAD6E90401CDE900012868D0F808C04A
:100C100003F1040CBCF1070F02D24FF0000C01E00D :100C100096E80F00E047204600F0F8F9D6E9040115
:100C2000A3F1030C66464FF0010C0CFA07FCACF183 :100C2000CDE900012868D0F80CC096E80F00E04735
:100C3000010C0CEA040C0CFA06FC4FF0010808FA4F :100C3000BDE8FC810FB4DDE900108A68C0F30F2322
:100C400006F8A8F1010808EA05084CEA080200BF06 :100C40001A40C0F30F239A4201D1012200E0002292
:100C5000002904DB1007030E1C48435407E010076B :100C5000D0B204B070472DE9FC47054689460DB176
:100C6000040E18480C3001F00F031B1FC45400BFC2 :100C6000012100E0002108465F21FFF783FA4FF0E1
:100C70000120002809DB00F01F02012191404209F8 :100C7000000AD0462C462668676800BF3AE0D7E9EC
:100C8000920002F1E022C2F8001100BF00BF10483C :100C80000401CDE900016068D0F808C097E80F00C2
:100C9000406820F0E06040F000700D49486000BFFF :100C9000E047D6E90401CDE900012068D0F808C09A
:100CA000FFF762FEFFF77EFCFFF74EFCFFF7C4FC88 :100CA00096E80F00E0474FEA48604FEA1068284690
:100CB000FFF73EFFFFF72EFF01E0FFF731FFFCE7F4 :100CB00000F0ACF9D7E90401CDE900016068D0F893
:100CC000001002400CED00E00000FA0500E400E036 :100CC00014C097E80F00E04718B108F1010000F0E8
:100CD00000000140081C3044586C800000000000F7 :100CD000FF08D6E90401CDE900012068D0F80CC076
:100CE00000000001020304060708090000000001DB :100CE00096E80F00E047284600F090F90AF101006D
:100CF0000203045F6C697374006C69737420616C27 :100CF00000F0FF0ABAF1080FC1DBB9F1010F03D10F
:100D00006C20636F6D6D616E640000002C0D000837 :100D00002846FFF70AFF02E02846FFF75DFF40464E
:100D10000000002028000000B40A0008540D00085C :100D1000BDE8FC870FB4DDE90001C1F30F22426199
:100D20002800002000040000C40A00080024F40089 :100D200000BF04B070470FB4DDE90001C1F30F222A
:100D300000000000000000000000000000000000B3 :100D3000026100BF04B070472DE9FC4104460CB1CC
:100D400000000000F30C0008F90C0008C6E533B4FD :100D4000012100E0002108460F21FFF713FA254694
:040D5000F10A00089C :100D50002C462E686F68D7E90401CDE90001686868
:100D6000D0F808C097E80F00E047D6E90401CDE9C4
:100D700000012868D0F808C096E80F00E047204638
:100D800000F044F9D7E90401CDE900016868D0F822
:100D90000CC097E80F00E047204600F037F9D6E98D
:100DA0000401CDE900012868D0F80CC096E80F00D6
:100DB000E047204600F02AF9BDE8FC812DE9FC411E
:100DC00004460CB1012100E0002108462D21FFF767
:100DD000D1F925462C462E686F68D6E90401CDE985
:100DE00000012868D0F80CC096E80F00E047D7E96A
:100DF0000401CDE900016868D0F80CC097E80F0045
:100E0000E047204600F002F9D6E90401CDE90001EF
:100E10002868D0F808C096E80F00E047D7E9040139
:100E2000CDE900016868D0F808C097E80F00E047F6
:100E3000204600F0EBF8BDE8FC810FB430B5DDE9E9
:100E40000301C268C1F30F2323EA020402EA030587
:100E500044EA0544046100BF30BC5DF814FB2DE991
:100E6000FC4104460CB1012100E00021084640216C
:100E7000FFF780F94FF0000825462C462E686F6872
:100E8000D7E90401CDE900016868D0F808C097E807
:100E90000F00E047D6E90401CDE900012868D0F849
:100EA00008C096E80F00E047204600F0AFF80CE0DD
:100EB00008F1010000F0FF08B8F1FA0F05DD204647
:100EC000FFF77CFF0020BDE8FC81D7E90401CDE9F4
:100ED00000016868D0F814C097E80F00E0470028C8
:100EE000E6D1D6E90401CDE900012868D0F80CC0AC
:100EF00096E80F00E047204600F088F80120E2E77E
:100F00002DE9FC47064688464FF000090EB1012145
:100F100000E0002108468821FFF72CF934462768B5
:100F200065684FF0000946E008F0800050B1D5E94F
:100F30000401CDE900016068D0F808C095E80F0011
:100F4000E04709E0D5E90401CDE900016068D0F887
:100F50000CC095E80F00E047D7E90401CDE9000196
:100F60002068D0F808C097E80F00E047304600F04E
:100F70004DF84FEA48604FEA1068D7E90401CDE91F
:100F800000012068D0F80CC097E80F00E047304619
:100F900000F03CF8B9F1070F09D1D5E90401CDE91A
:100FA00000016068D0F808C095E80F00E04709F13B
:100FB000010000F0FF09B9F1080FB5DBBDE8FC87BF
:100FC00070B506460D4600240BE0E00045FA00F03F
:100FD000C1B23046FFF794FF3046FFF740FF601C78
:100FE000C4B2022CF1DB70BD0020014908607047DB
:100FF0000400002010B5024800F07AF810BD00008F
:101000000400002010B500F0FBF910BD70B50446D7
:101010000CB1012100E00021084640F25921FFF700
:10102000A9F80025258900E000BF281EA5F10101CF
:101030008DB2F9D170BD00002DE9F04105460E4694
:1010400018273946002000F0BDF904460CB10121F3
:1010500000E0002108463621FFF78CF82560666025
:101060000548A0600548E0600548206105486061CA
:101070002046BDE8F0810000270D0008150D00088E
:101080003B0E0008350C0008F7B515465C263146C6
:10109000002000F097F9044620466946082203E044
:1010A00011F8013B00F8013B131EA2F10106B2B298
:1010B000F6D100BF25810848A0630849E1630849CB
:1010C00021640849A164084961640849E164002079
:1010D000A4F858002046FEBD390D0008BD0D0008DB
:1010E0005F0E0008570C0008010F0008C10F000830
:1010F00038B5014600200090086810B1142821D1AD
:1011000016E000BF124B134CE068C3F30F2222EA33
:10111000000400EA020544EA05440E4D2C6100BFBC
:1011200000BF0D480068486000BF1420086000BF81
:10113000094A48681268101A642801D2002038BD94
:1011400000BFDFE70020086000900320F7E7000001
:1011500020002004001001404000002008B50120BC
:10116000484989690143474A9161114689690140AB
:10117000009100BF00BF00071146C9690143D1615A
:101180001146C9690140009100BF00BF032002461B
:101190003D4B19684FF6FF0319403C4B0B4343EAA4
:1011A0000221394B196000BF01211B68C3F30220E3
:1011B000002425460346C3F1070CBCF1040F02D9F5
:1011C0004FF0040C01E0C3F1070C674603F1040C77
:1011D000BCF1070F02D24FF0000C01E0A3F1030CA9
:1011E00066464FF0010C0CFA07FCACF1010C0CEA5E
:1011F000040C0CFA06FC4FF0010808FA06F8A8F1F6
:10120000010808EA05084CEA080200BF002904DBCF
:101210001007030E1E48435407E01007040E1A4837
:101220000C3001F00F031B1FC45400BF0120002825
:1012300009DB00F01F02012191404209920002F1F6
:10124000E022C2F8001100BF00BF1248406820F041
:10125000E06040F000700F49486000BFFFF7A8FB56
:10126000FFF7B2F9FFF782F9FFF70AFA002000F062
:1012700013F8FFF7C7FEFFF7B7FE01E0FFF7BAFE6E
:10128000FCE70000001002400CED00E00000FA0551
:1012900000E400E00000014010B504460C4951F89C
:1012A00024104A000B4951F82400002100F09EF858
:1012B000094951F824200749083951F82400002130
:1012C00000F094F8012103480830015510BD0000DA
:1012D000D015000834000020E01500082DE9F04783
:1012E00004460F460025A9462348005D20B9224840
:1012F00018380168204688471FB94FF0FF30BDE815
:10130000F0871E4850F82400B7FBF0F61B4850F851
:101310002400B7FBF0F100FB117000B1761C1848F7
:1013200050F82400451E22E01348083850F82400E5
:1013300030F8150010B909F1010901E04FF000097A
:10134000B14513D14FF0000809E00B48083850F8B8
:10135000240005EB080220F8126008F10108B045EE
:10136000F3D3064850F824006843C8E76D1E002DEB
:10137000DADA4FF0FF30C2E73C000020D815000851
:10138000D015000810B501460023002207E00B48E5
:1013900050F8210030F8120000B15B1C521C0848C4
:1013A00050F821009042F2D864205843044C54F87D
:1013B0002140B0FBF4F0C0B210BD000034000020AA
:1013C000D015000870B504460E4631462046FFF79A
:1013D00085FF0546681C08B9002070BD024850F81A
:1013E00024002844F9E700002C00002030B5034613
:1013F00001E003F8011B141EA2F10102F9D130BD76
:101400001CB52F492F48FFF717FE00902E492D4895
:10141000FFF712FE01900022DDE90001FFF734FE24
:101420002A490860AE2000F055F8D52000F052F8A7
:10143000802000F04FF8A82000F04CF83F2000F08A
:1014400049F8D32000F046F8002000F043F840208F
:1014500000F040F88D2000F03DF8142000F03AF83C
:10146000202000F037F8002000F034F8A12000F030
:1014700031F8C82000F02EF8DA2000F02BF8122006
:1014800000F028F8812000F025F8CF2000F022F8A5
:10149000D92000F01FF8F12000F01CF8DB2000F04C
:1014A00019F8402000F016F8A42000F013F8A62048
:1014B00000F010F8AF2000F00DF800F009F81CBDA6
:1014C00020002004000C0140100010044400002003
:1014D0007047000038B5044600208DF800008DF8F4
:1014E00001401B480068816B19480068884718480C
:1014F00000687821426C16480068904714480068DC
:10150000016C1348006888479DF800101048006877
:10151000426C0F48006890470D480068016C0C4809
:10152000006888479DF8011009480068426C084827
:101530000068904706480068016C054800688847C5
:1015400003480068C16B02480068884738BD000046
:101550004400002000BF00BF00BF00BF00BFBFF3BA
:101560004F8F00BF00BF00BF0948006800F4E06073
:1015700008490843001D0649086000BF00BF00BFBE
:10158000BFF34F8F00BF00BF00BF00BF00BFFDE72C
:101590000CED00E00000FA05081C3044586C800097
:1015A0000000000000000001020304060708090013
:1015B000000000010203045F6C697374006C6973BE
:1015C0007420616C6C20636F6D6D616E640000004F
:1015D00000020000000000000800000008000000F9
:1015E00000100000000000000816000800000020A5
:1015F00058000000FC0A000860160008580000208F
:10160000081800000C0B00080024F4000000000083
:1016100000000000000000000000000000000000CA
:101620000000000000000000000000009912000807
:1016300085130008600000202000002060100020BA
:101640002200002000000000000000000000000058
:10165000B7150008BD150008C6E533B4A50B000892
:04000005080000ED02 :04000005080000ED02
:00000001FF :00000001FF

View File

@ -1,2 +1,9 @@
#include "board.h" #include "board.h"
void board_init(void) {} /**
* @brief
*
*/
void board_init(void)
{
ssd1306_init();
}

View File

@ -1,5 +1,6 @@
#ifndef __BOARD_H__ #ifndef __BOARD_H__
#define __BOARD_H__ #define __BOARD_H__
#include "lib.h" #include "lib.h"
#include "ssd1306_oled.h"
void board_init(void); void board_init(void);
#endif #endif

155
User/board/ssd1306_oled.c Normal file
View File

@ -0,0 +1,155 @@
/**
* @file ssd1306_oled.c
* @author xushenghao
* @brief SSD1306 OLED display driver
* @version 0.1
* @note PB13-SCK PB12-SDA
*/
#include "ssd1306_oled.h"
#include "ssd1306_oled.h"
static i2c_t *ssd1306_oled;
static uint8_t buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8]; // 定义屏幕缓冲区
static void ssd1306_write_command(uint8_t command)
{
uint8_t data[2];
data[0] = SSD1306_CMD_SET_LOW_COLUMN; // Co = 0, D/C# = 0
data[1] = command;
ssd1306_oled->interface.start(ssd1306_oled);
ssd1306_oled->interface.write_byte(ssd1306_oled, SSD1306_I2C_ADDRESS);
ssd1306_oled->interface.wait_ack(ssd1306_oled);
ssd1306_oled->interface.write_byte(ssd1306_oled, data[0]);
ssd1306_oled->interface.wait_ack(ssd1306_oled);
ssd1306_oled->interface.write_byte(ssd1306_oled, data[1]);
ssd1306_oled->interface.wait_ack(ssd1306_oled);
ssd1306_oled->interface.stop(ssd1306_oled);
}
static void ssd1306_write_data(uint8_t data)
{
uint8_t buffer[2];
buffer[0] = SSD1306_CMD_SET_START_LINE; // Co = 0, D/C# = 1
buffer[1] = data;
ssd1306_oled->interface.start(ssd1306_oled);
ssd1306_oled->interface.write_byte(ssd1306_oled, SSD1306_I2C_ADDRESS);
ssd1306_oled->interface.wait_ack(ssd1306_oled);
ssd1306_oled->interface.write_byte(ssd1306_oled, buffer[0]);
ssd1306_oled->interface.wait_ack(ssd1306_oled);
ssd1306_oled->interface.write_byte(ssd1306_oled, buffer[1]);
ssd1306_oled->interface.wait_ack(ssd1306_oled);
ssd1306_oled->interface.stop(ssd1306_oled);
}
static void ssd1306_test(void)
{
}
void ssd1306_init(void)
{
i2c_gpio_group_t gpios;
gpios.scl = gpio_create(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
gpios.sda = gpio_create(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
ssd1306_oled = i2c_create(gpios, 0);
ssd1306_write_command(SSD1306_CMD_DISPLAY_OFF);
ssd1306_write_command(SSD1306_CMD_SET_DISPLAY_CLOCK_DIV);
ssd1306_write_command(0x80);
ssd1306_write_command(SSD1306_CMD_SET_MULTIPLEX);
ssd1306_write_command(SSD1306_HEIGHT - 1);
ssd1306_write_command(SSD1306_CMD_SET_DISPLAY_OFFSET);
ssd1306_write_command(0x00);
ssd1306_write_command(SSD1306_CMD_SET_START_LINE | 0x00);
ssd1306_write_command(SSD1306_CMD_CHARGE_PUMP);
ssd1306_write_command(0x14);
ssd1306_write_command(SSD1306_CMD_MEMORY_MODE);
ssd1306_write_command(0x00);
ssd1306_write_command(SSD1306_CMD_SEG_REMAP | 0x01);
ssd1306_write_command(SSD1306_CMD_COM_SCAN_DEC);
ssd1306_write_command(SSD1306_CMD_SET_COM_PINS);
ssd1306_write_command(0x12);
ssd1306_write_command(SSD1306_CMD_SET_CONTRAST);
ssd1306_write_command(0xCF);
ssd1306_write_command(SSD1306_CMD_SET_PRECHARGE);
ssd1306_write_command(0xF1);
ssd1306_write_command(SSD1306_CMD_SET_VCOM_DETECT);
ssd1306_write_command(0x40);
ssd1306_write_command(SSD1306_CMD_DISPLAY_ALL_ON_RESUME);
ssd1306_write_command(SSD1306_CMD_NORMAL_DISPLAY);
ssd1306_write_command(SSD1306_CMD_DISPLAY_ON);
ssd1306_test();
}
void ssd1306_display_on(void)
{
ssd1306_write_command(SSD1306_CMD_DISPLAY_ON);
}
void ssd1306_display_off(void)
{
ssd1306_write_command(SSD1306_CMD_DISPLAY_OFF);
}
void ssd1306_clear(void)
{
for (uint16_t i = 0; i < SSD1306_WIDTH * SSD1306_HEIGHT / 8; i++)
{
ssd1306_write_data(0x00);
}
}
/**
* @brief SSD1306屏幕上绘制一个像素点
*
* SSD1306 OLED显示屏上绘制一个像素点
*
* @param x x坐标
* @param y y坐标
* @param color
*/
void ssd1306_draw_pixel(uint8_t x, uint8_t y, uint8_t color)
{
if (x >= SSD1306_WIDTH || y >= SSD1306_HEIGHT)
{
return;
}
if (color)
{
buffer[x + (y / 8) * SSD1306_WIDTH] |= (1 << (y % 8));
}
else
{
buffer[x + (y / 8) * SSD1306_WIDTH] &= ~(1 << (y % 8));
}
}
/**
* @brief SSD1306 OLED显示屏的内容
*
* SSD1306 OLED显示屏
*
*
*
* @note
*/
void ssd1306_update_screen(void)
{
for (uint8_t i = 0; i < SSD1306_HEIGHT / 8; i++)
{
ssd1306_write_command(SSD1306_CMD_COLUMN_ADDR);
ssd1306_write_command(0);
ssd1306_write_command(SSD1306_WIDTH - 1);
ssd1306_write_command(SSD1306_CMD_PAGE_ADDR);
ssd1306_write_command(i);
ssd1306_write_command(i);
for (uint8_t j = 0; j < SSD1306_WIDTH; j++)
{
ssd1306_write_data(buffer[j + i * SSD1306_WIDTH]);
}
}
}

51
User/board/ssd1306_oled.h Normal file
View File

@ -0,0 +1,51 @@
#ifndef __SSD1306_OLED_H
#define __SSD1306_OLED_H
#include "main.h"
// OLED引脚定义
#define SSD1306_SDA_PORT OLED_SDA_GPIO_Port
#define SSD1306_SDA_PIN OLED_SDA_Pin
#define SSD1306_SCK_PORT OLDE_SCK_GPIO_Port
#define SSD1306_SCK_PIN OLDE_SCK_Pin
// I2C地址
#define SSD1306_I2C_ADDRESS 0x78
// OLED显示参数
#define SSD1306_WIDTH 128
#define SSD1306_HEIGHT 64
// OLED命令定义
#define SSD1306_CMD_DISPLAY_OFF 0xAE
#define SSD1306_CMD_DISPLAY_ON 0xAF
#define SSD1306_CMD_SET_CONTRAST 0x81
#define SSD1306_CMD_DISPLAY_ALL_ON_RESUME 0xA4
#define SSD1306_CMD_DISPLAY_ALL_ON 0xA5
#define SSD1306_CMD_NORMAL_DISPLAY 0xA6
#define SSD1306_CMD_INVERT_DISPLAY 0xA7
#define SSD1306_CMD_SET_DISPLAY_OFFSET 0xD3
#define SSD1306_CMD_SET_COM_PINS 0xDA
#define SSD1306_CMD_SET_VCOM_DETECT 0xDB
#define SSD1306_CMD_SET_DISPLAY_CLOCK_DIV 0xD5
#define SSD1306_CMD_SET_PRECHARGE 0xD9
#define SSD1306_CMD_SET_MULTIPLEX 0xA8
#define SSD1306_CMD_SET_LOW_COLUMN 0x00
#define SSD1306_CMD_SET_HIGH_COLUMN 0x10
#define SSD1306_CMD_SET_START_LINE 0x40
#define SSD1306_CMD_MEMORY_MODE 0x20
#define SSD1306_CMD_COLUMN_ADDR 0x21
#define SSD1306_CMD_PAGE_ADDR 0x22
#define SSD1306_CMD_COM_SCAN_INC 0xC0
#define SSD1306_CMD_COM_SCAN_DEC 0xC8
#define SSD1306_CMD_SEG_REMAP 0xA0
#define SSD1306_CMD_CHARGE_PUMP 0x8D
// 函数声明
void ssd1306_init(void);
void ssd1306_display_on(void);
void ssd1306_display_off(void);
void ssd1306_clear(void);
void ssd1306_draw_pixel(uint8_t x, uint8_t y, uint8_t color);
void ssd1306_update_screen(void);
#endif // __SSD1306_OLED_H

View File

@ -15,12 +15,12 @@
// mem1内存参数设定.mem1完全处于内部SRAM里面.(设置内部SARM的内存池和内存表的参数) // mem1内存参数设定.mem1完全处于内部SRAM里面.(设置内部SARM的内存池和内存表的参数)
#define MEM1_BLOCK_SIZE 8 // 一个内存块大小为32字节 #define MEM1_BLOCK_SIZE 8 // 一个内存块大小为32字节
#define MEM1_MAX_SIZE 25 * 1024 // 最大管理内存 1K (我们这个内存管理系统的内部SRAM可控制的内存大小) #define MEM1_MAX_SIZE 4 * 1024 // 最大管理内存 1K (我们这个内存管理系统的内部SRAM可控制的内存大小)
#define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE / MEM1_BLOCK_SIZE // 内存表大小(有多少块内存块) #define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE / MEM1_BLOCK_SIZE // 内存表大小(有多少块内存块)
// mem2内存参数设定.mem2的内存池处于外部SRAM里面 // mem2内存参数设定.mem2的内存池处于外部SRAM里面
#define MEM2_BLOCK_SIZE 8 // 一个内存块大小为32字节 #define MEM2_BLOCK_SIZE 8 // 一个内存块大小为32字节
#define MEM2_MAX_SIZE 20 * 1024 // 因为精英版没有外扩内存,故这里设置一个最小值 #define MEM2_MAX_SIZE 0 * 1024 // 因为精英版没有外扩内存,故这里设置一个最小值
#define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE / MEM2_BLOCK_SIZE // 内存表大小 #define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE / MEM2_BLOCK_SIZE // 内存表大小
// 内存管理控制器结构体 // 内存管理控制器结构体

View File

@ -47,7 +47,7 @@ sizeof(B) = 8(内存空间大小8个字节)
// 内存池(32字节对齐) // 内存池(32字节对齐)
// 可控制的内存大小 // 可控制的内存大小
__attribute__((aligned(32))) uint8_t mem1base[MEM1_MAX_SIZE]; // 内部SRAM内存池 __attribute__((aligned(32))) uint8_t mem1base[MEM1_MAX_SIZE]; // 内部SRAM内存池
__attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((section(".sram2"))); __attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE];
// __attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); // 外部SRAM内存池 // __attribute__((aligned(32))) uint8_t mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); // 外部SRAM内存池
// 内存管理表 // 内存管理表
// 可控制的内存控制块个数(每个内存块大小为32字节) // 可控制的内存控制块个数(每个内存块大小为32字节)

View File

@ -21,7 +21,7 @@
#include "uarts.h" #include "uarts.h"
// #include "eeprom.h" // #include "eeprom.h"
// #include "spis.h" // #include "spis.h"
// #include "i2cs.h" #include "i2cs.h"
///< 定义回调函数类型 ///< 定义回调函数类型
typedef void (*pvd_irq_handle_cb)(void); typedef void (*pvd_irq_handle_cb)(void);

View File

@ -44,11 +44,11 @@ static uint8_t _read(gpio_t gpio)
/** /**
* @brief GPIO对象 * @brief GPIO对象
* @param {GPIO_TypeDef} *port - GPIO寄存器指针 * @param {GPIO_TypeDef} *port - GPIO寄存器指针
* @param {uint16_t} pin - * @param {uint32_t} pin -
* @return {gpio_t *} - GPIO对象指针 * @return {gpio_t *} - GPIO对象指针
* @note: GPIO对象GPIO功能 * @note: GPIO对象GPIO功能
*/ */
gpio_t *gpio_create(GPIO_TypeDef *port, uint16_t pin) gpio_t *gpio_create(GPIO_TypeDef *port, uint32_t pin)
{ {
gpio_t *gpio = (gpio_t *)osel_mem_alloc(sizeof(gpio_t)); gpio_t *gpio = (gpio_t *)osel_mem_alloc(sizeof(gpio_t));
DBG_ASSERT(gpio != NULL __DBG_LINE); DBG_ASSERT(gpio != NULL __DBG_LINE);

View File

@ -93,7 +93,7 @@
typedef struct GPIO typedef struct GPIO
{ {
GPIO_TypeDef *port; ///< The GPIO port. GPIO_TypeDef *port; ///< The GPIO port.
uint16_t pin; ///< The GPIO pin. uint32_t pin; ///< The GPIO pin.
/** /**
* @brief Set the GPIO pin to high. * @brief Set the GPIO pin to high.
@ -132,7 +132,7 @@ typedef struct GPIO
* @param pin The GPIO pin. * @param pin The GPIO pin.
* @return The created GPIO pin. * @return The created GPIO pin.
*/ */
extern gpio_t *gpio_create(GPIO_TypeDef *port, uint16_t pin); extern gpio_t *gpio_create(GPIO_TypeDef *port, uint32_t pin);
/** /**
* @brief Free the memory allocated for a GPIO pin. * @brief Free the memory allocated for a GPIO pin.

View File

@ -39,12 +39,14 @@ Mcu.Package=LQFP48
Mcu.Pin0=PC13-TAMPER-RTC Mcu.Pin0=PC13-TAMPER-RTC
Mcu.Pin1=PD0-OSC_IN Mcu.Pin1=PD0-OSC_IN
Mcu.Pin2=PD1-OSC_OUT Mcu.Pin2=PD1-OSC_OUT
Mcu.Pin3=PA9 Mcu.Pin3=PB12
Mcu.Pin4=PA10 Mcu.Pin4=PB13
Mcu.Pin5=PA13 Mcu.Pin5=PA9
Mcu.Pin6=PA14 Mcu.Pin6=PA10
Mcu.Pin7=VP_SYS_VS_Systick Mcu.Pin7=PA13
Mcu.PinsNb=8 Mcu.Pin8=PA14
Mcu.Pin9=VP_SYS_VS_Systick
Mcu.PinsNb=10
Mcu.ThirdParty0=RealThread.RT-Thread.3.1.5 Mcu.ThirdParty0=RealThread.RT-Thread.3.1.5
Mcu.ThirdPartyNb=1 Mcu.ThirdPartyNb=1
Mcu.UserConstants= Mcu.UserConstants=
@ -74,6 +76,12 @@ PA14.Mode=Serial_Wire
PA14.Signal=SYS_JTCK-SWCLK PA14.Signal=SYS_JTCK-SWCLK
PA9.Mode=Asynchronous PA9.Mode=Asynchronous
PA9.Signal=USART1_TX PA9.Signal=USART1_TX
PB12.GPIOParameters=GPIO_Label
PB12.GPIO_Label=OLED_SDA
PB12.Signal=GPIO_Output
PB13.GPIOParameters=GPIO_Label
PB13.GPIO_Label=OLDE_SCK
PB13.Signal=GPIO_Output
PC13-TAMPER-RTC.GPIOParameters=GPIO_Label PC13-TAMPER-RTC.GPIOParameters=GPIO_Label
PC13-TAMPER-RTC.GPIO_Label=LED_BLUE PC13-TAMPER-RTC.GPIO_Label=LED_BLUE
PC13-TAMPER-RTC.Signal=GPIO_Output PC13-TAMPER-RTC.Signal=GPIO_Output