Reset-Funktion an D7
Diese Woche habe ich neue bestückte Platinenmuster mit dem CH32V003
bekommen. Weil ich gerade intensiv an der Entwicklung des TestLab und
PicoBasic arbeite, habe ich meine aktuelle Firmware reingeladen und
getestet. Aber, oh großer Schreck, es hat nicht richtig funktioniert.
Was ist jetzt kaputt?! Bisher lief doch alles problemlos. Mit dem
Oszilloskop konnte ich sehen, dass immer wieder neue Startversuche
stattfanden und dann wieder abgebrochen wurden. In Verdacht hatte ich
meine Umschaltung vom Quarz auf den RC-Oszillator. Den Teil habe ich
umgebaut, und alles lief prima auf einer Platine. Aber dann ein
Rückschlag: Auf einer zweiten Platine lief es nicht.
Hat das irgendetwas mit der Vorgeschichte des Controllers zu tun? Ich
hatte bereits ein Programm, das den Reset-Pin ein- und abschalten kann,
wobei diese Funktion in die User Bytes geschrieben wird, sozusagen die
Fuses des CH32V003. Damit konnte ich die Reset-Funktion abschalten. Und
danach lief alles wie geplant. Nochmal Reset aktiviert, und dann habe
ich nachgemessen. Ich war immer davon ausgegangen, dass am Reset-Pin
(PD4) ein Pullup eingeschaltet wird. Aber da war keiner! Dann habe ich
mit die Testplatine von WCH genauer angeschaut. Da gibt es nur einen
Kondensator mit 100 nF am Rest-Pin und Reset-Taster, aber keinen
Widerstand, auch kein interner Pullup wurde eingeschaltet, obwohl das
im Datenblatt so angegeben wird.
Als Ursache des Problems hat sich schließlich herausgestellt, dass ich
beim Umprogrammieren der User-Bytes versehentlich falsche Daten
reingeschrieben hatte. Tatsächlich habe ich dabei ungewollt den
Watchdog aktiviert, der dann regelmäßig einen Neustart ausgelöst hat.
Jetzt habe ich das korrigiert und dabei zusätzlich am Ende des
Programms den Inhalt des Userbytes ausgegeben.
Damit kann man wahlweise nur den Inhalt des Userbytes ansehen, die
Reset-Funktion abschalten oder Reset-Funktion wieder einschalten. Die
jeweiligen Kommentarzeichen vor dem Aufruf der Funktionen muss man dazu
entfernen.
//Reset On/Off
#include "debug.h"
void Option_Byte_Reset_OFF(void)
{
FLASH_Unlock();
FLASH_EraseOptionBytes();
FLASH_UserOptionByteConfig(OB_IWDG_SW, OB_STDBY_NoRST, OB_RST_NoEN, OB_PowerON_Start_Mode_USER);
}
void Option_Byte_Reset_ON(void)
{
FLASH_Unlock();
FLASH_EraseOptionBytes();
FLASH_UserOptionByteConfig(OB_IWDG_SW, OB_STDBY_NoRST, OB_RST_EN_DT1ms ,OB_PowerON_Start_Mode_USER);
}
int main(void){
//Option_Byte_Reset_ON();
//Option_Byte_Reset_OFF();
Delay_Init();
USART_Printf_Init(115200);
Delay_Ms(10);
printf("FLASH_UserOptionByte %d\r\n", FLASH_GetUserOptionByte() & 255);
while(1);
}
Dies sind die Inhalte des User Bytes:
Neuer Chip: 215 110 10 111 Reset ON 12ms
Reset Off: 223 110 11 111 Reset Off
Reset ON: 207 110 01 111 Reset ON 1 ms
Bei Fehlversuchen kam es regelmäßig dazu, dass der
Flash-Speicher schreib- und lesegeschützt wurde. Wenn man danach ein
weiteres Programm flashen will, muss man den Schreibschutz zuerst
wieder abschalten. Im MounRiver Studio muss man dazu unter
Flash/Download Configuration auf die Schaltfläche Disable mcu
code-protect (Symbol geöffnetes Schloss) klicken.