Wie das immer so ist: Die Dinge von denen man annimmt sie wären einfach und schnell erledigt sind es dann nicht. Ich migriere meine Sourcen von STM8S103 so, dass ich sie auch auf einem STM8S105 verwenden kann und war überrascht, dass nach dem Anpassen meines speziellen Bootloaders für STM8 fast alles lief. Aber eben nur "fast". Mein Problem hängt (mal wieder) mit I2C zusammen, das will auf (m)einem s105 einfach nicht und das Problem ist, wie ich glaube, dass die Pins für B4 und B5 auf I2C geremappt werden müssen (was sie bei einem 103er nicht müssen). Hier wirds jetzt (nicht wirklich) lustig. Die Adresse des Optionbytes fuer "alternate function remap" liegt an Adresse 0x4803 und das Bit zum Setzen der alternate Funktion ist 6. Ein:
1 | #define ARF *(unsigned char*) 0x4803 |
2 | #define ARF6 (1 << 6) |
3 | |
4 | . |
5 | . |
6 | |
7 | ARF= |= ARF6; |
führt nicht zum Erfolg, wenn man das Datenblatt weiter studiert (oder besser gesagt, wenn ich das richtig interpretiert habe), dann muss der Flashspeicher für das Optionbyte das man schreiben möchte noch entsperrt werden, also mache ich ein
1 | #define FLASH_PUKR *(unsigned char*) 0x5062 |
2 | |
3 | . |
4 | . |
5 | |
6 | FLASH_PUKR = 0x56; |
7 | FLASH_PUKR = 0xAE; |
weil das die Abfolge ist, den Flash zu entsperren und ich dachte die Optionbytes setzen zu können. Das haut aber nicht hin. Den Code den ich für I2C verwende ist der, den ich auch für einen STM8S103 verwende und dort auch gut funktioniert. Im Datenblatt habe ich keine Unterschiede beim Initialisieren und verwenden des I2C mit STM8S103 und STM8S105 gefunden (ich habe die von mir verwendeten Register und Registerbits der einzelnen Controller verglichen). Wer kennt die Fallstricke bei einem STM8S105 und leuchtet mit der Taschenlampe damit mir ein Licht aufgeht ? By the way: Das Datenblat des STM8S104 hat definitiv einen Fehler (siehe Screenshot): Es führt auf Seite 111 das Autofunction-Remappbit 6 zweimal auf (anstelle von Remappbit 7).