Reset-Funktion an D7       


Elektronik-Labor  Projekte  CH32V


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.




Elektronik-Labor  Projekte  CH32V