{"id":410,"date":"2017-11-24T23:10:13","date_gmt":"2017-11-24T22:10:13","guid":{"rendered":"http:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=410"},"modified":"2017-12-30T19:35:27","modified_gmt":"2017-12-30T18:35:27","slug":"42-iwdg-library-stm32f4","status":"publish","type":"page","link":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=410","title":{"rendered":"42-IWDG-Library (STM32F4)"},"content":{"rendered":"<p><div id=\"nav-below\" class=\"navigation\"><div class=\"nav-previous\"><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=408\" title=\"41-RTC-Library (STM32F4)\"><span class=\"meta-nav\">\u2190<\/span> 41-RTC-Library (STM32F4)<\/a><\/div><\/div><!-- #nav-below --><div id=\"nav-below\" class=\"navigation\"><div class=\"nav-next\"><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=412\" title=\"43-LCD_EADOG-Library (STM32F4)\">43-LCD_EADOG-Library (STM32F4) <span class=\"meta-nav\">&rarr;<\/span><\/a><\/div><\/div><!-- #nav-below --><\/p>\n<p>Mit dieser Library kann der interne Watchdog (IWDG) der STM32F4 CPU benutzt werden. (die CPU hat auch noch einen zweiten Watchdog : WWDG)<\/p>\n<p>Der IWDG h\u00e4ngt am internen RC-Oszillator (mit ca. 32kHz) und ist damit unabh\u00e4ngig vom rest der CPU. Wenn der Watchdog einmal gestartet ist, kann er von der Software nicht mehr gestoppt werden und muss zyklisch getriggert werden sonst wird ein Reset ausgel\u00f6st.<\/p>\n<p>Der interne RC-Oszillator ist nicht besonders genau aber das spielt f\u00fcr den Zweck des Watchdogs in meinen Augen keine gro\u00dfe Rolle. Ich w\u00fcrde einen Sicherheitsfaktor von 2 vorsehen (also wenn der Timeout auf 250ms eingestellt wird, sollte der Trigger ca. alle 100ms aufgerufen werden)<\/p>\n<p>Die Init-Funktion liefert als R\u00fcckgabewert ob der letzte Reset-Grund der Watchdog war. Das kann benutzt werden um einen Fehlerstatus auszugeben.<\/p>\n<p>Die Library ist sehr einfach aufgebaut mit zwei Funktionen (Init und Trigger)<\/p>\n<p>In der Demo wird eine Pausenzeit solange vergr\u00f6\u00dfert, bis der Watchdog zuschl\u00e4gt.<\/p>\n<p><strong>Voraussetzungen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">Benutzte Module der CooCox-IDE : RCC, IWDG\r\nBenutzte Librarys : keine<\/pre>\n<p><strong>Enumerationen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">typedef enum {\r\n  RESET_SOURCE_NORMAL =0,  \/\/ normaler Reset\r\n  RESET_SOURCE_IWDG        \/\/ reset durch IWDG\r\n}IWDG_RESET_SOURCE_t;<\/pre>\n<p><strong>:<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">typedef enum {\r\n IWDG_TIME_10ms =0, \/\/ Timeout auf ca. 10ms\r\n IWDG_TIME_50ms,    \/\/ Timeout auf ca. 50ms\r\n IWDG_TIME_100ms,   \/\/ Timeout auf ca. 100ms\r\n IWDG_TIME_250ms,   \/\/ Timeout auf ca. 250ms\r\n IWDG_TIME_500ms,   \/\/ Timeout auf ca. 500ms\r\n IWDG_TIME_1s,      \/\/ Timeout auf ca. 1s\r\n IWDG_TIME_2s       \/\/ Timeout auf ca. 2s\r\n}IWDG_TIME_t;<\/pre>\n<p><strong>Funktionen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">IWDG_RESET_SOURCE_t UB_Init_IWDG(IWDG_TIME_t timeout);  \/\/ zum starten des Watchdogs\r\nvoid UB_IWDG_Trigger(void);                             \/\/ zum triggern des Watchdogs<\/pre>\n<p><strong>Beispiel :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">\/\/--------------------------------------------------------------\r\n\/\/ File     : main.c\r\n\/\/ Datum    : 26.05.2013\r\n\/\/ Version  : 1.0\r\n\/\/ Autor    : UB\r\n\/\/ EMail    : mc-4u(@)t-online.de\r\n\/\/ Web      : www.mikrocontroller-4u.de\r\n\/\/ CPU      : STM32F4\r\n\/\/ IDE      : CooCox CoIDE 1.7.0\r\n\/\/ Module   : CMSIS_BOOT, M4_CMSIS_CORE\r\n\/\/ Funktion : Demo der IWGD-Library\r\n\/\/ Hinweis  : Diese zwei Files muessen auf 8MHz stehen\r\n\/\/              \"cmsis_boot\/stm32f4xx.h\"\r\n\/\/              \"cmsis_boot\/system_stm32f4xx.c\"\r\n\/\/--------------------------------------------------------------\r\n\r\n#include \"main.h\"\r\n#include \"stm32_ub_led.h\"\r\n#include \"stm32_ub_iwdg.h\"\r\n\r\nvoid Delay(volatile uint32_t nCount)\r\n{\r\n  while(nCount--)\r\n  {\r\n  }\r\n}\r\n\r\nint main(void)\r\n{\r\n  IWDG_RESET_SOURCE_t check;\r\n  uint32_t akt_pause=500000;\r\n\r\n  SystemInit(); \/\/ Quarz Einstellungen aktivieren\r\n\r\n  \/\/ Init der LEDs\r\n  UB_Led_Init();\r\n\r\n  UB_Led_On(LED_ORANGE); \/\/ LED einschalten\r\n\r\n  Delay(5000000); \/\/ kleine Pause\r\n\r\n  \/\/ Watchdog aktivieren (mit ca. 500ms)\r\n  \/\/ und Reset-Quelle auswerten\r\n  check=UB_Init_IWDG(IWDG_TIME_500ms);\r\n  if(check==RESET_SOURCE_IWDG) {\r\n    \/\/ letze Reset Quelle war der Watchdog\r\n    UB_Led_On(LED_RED);\r\n  }\r\n  else {\r\n    \/\/ letze Reset Quelle war kein Watchdog\r\n    UB_Led_On(LED_GREEN);\r\n  }\r\n\r\n  while(1)\r\n  {\r\n    \/\/ kleine Pause\r\n    Delay(akt_pause);\r\n\r\n    \/\/ Watchdog triggern\r\n    UB_IWDG_Trigger();\r\n\r\n    \/\/ blaue LED blinken lassen\r\n    UB_Led_Toggle(LED_BLUE);\r\n\r\n    \/\/ Delay Zeit vergr\u00f6ssern\r\n    \/\/ wenn sie &gt;500ms ist, schl\u00e4gt der Watchdog zu !!\r\n    akt_pause+=100000;\r\n  }\r\n}\r\n<\/pre>\n<p>Hier die Library zum\u00a0<strong>Download :<\/strong><\/p>\n<p><a href=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/05\/ub_stm32f4_iwdg_v100.zip\">ub_stm32f4_iwdg_v100<\/a><\/p>\n<p>Hier der komplette CooCox-Projektordner zum\u00a0<strong>Download :<\/strong><\/p>\n<p><a href=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2013\/05\/Demo_42_IWDG.zip\">Demo_42_IWDG<\/a><\/p>\n<h3 id=\"comments-title\">4 Antworten auf <em>42-IWDG-Library (STM32F4)<\/em><\/h3>\n<ol class=\"commentlist\">\n<li id=\"li-comment-2806\" class=\"comment even thread-even depth-1\">\n<div id=\"comment-2806\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/6f72ca5ac0ac671c79f3a35c2b13d9fc?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Daniel<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">10. Januar 2015 um 19:08<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hallo. Ich versuche gerade die IWDG-Lib zum Laufen zu bewegen. Sobald ich sie enable (analog dem Beispiel), funktioniert der I2C2 Bus nicht mehr, respektive ich kann auf mein EEPROM nicht mehr zugreifen, ein \u201cUB_I2C2_ReadByte(\u2026) blockiert. Ohne klappt alles wunderbar.<br \/>\nIrgend eine Idee, an was das liegen k\u00f6nnte ?<\/p>\n<p>Board: Olimex H407 (12Mhz und 32.768khz quarze).<\/p>\n<p>Danke und Gruss<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-2817\" class=\"comment byuser comment-author-admin_ub bypostauthor odd alt depth-2\">\n<div id=\"comment-2817\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">11. Januar 2015 um 14:13<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>was macht die CPU denn ? nach dem enable MUSS zyklisch die Trigger-Funktion aufgerufen werden ansonsten macht die CPU einen Reset.<br \/>\nstelle mal eine Watchdogzeit von 2sec ein, ob es damit dann funktioniert.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-2824\" class=\"comment even thread-odd thread-alt depth-1\">\n<div id=\"comment-2824\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/6f72ca5ac0ac671c79f3a35c2b13d9fc?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Daniel<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">12. Januar 2015 um 00:41<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Ich komme gar nicht so weit.<br \/>\nDa ich noch nicht herausgefunden habe, wie ich hier sch\u00f6n formatierten Code eingeben kann, wird das wohl etwas murks <img decoding=\"async\" class=\"wp-smiley\" src=\"wp-includes\/images\/smilies\/icon_smile.gif\" alt=\":-)\" \/><br \/>\nmain()<br \/>\n{<br \/>\nIWDG_RESET_SOURCE_t check;<br \/>\nsystem_init();<br \/>\ncheck=UB_Init_IWDG(IWDG_TIME_100ms);<br \/>\neeprom_error = UB_M24C08_Init(M24C08_0);<br \/>\nwhile(1)<br \/>\n{ UB_IWDG_Trigger(); }<br \/>\n}<br \/>\nWenn ich den IWDG initialisiere geht der n\u00e4chste Befehl mit dem Lesen eines Bytes vom EEPROM nicht mehr, respektive blockiert. Logischerweise schl\u00e4gt dann der Watch-Dog zu, und zwar in einem sch\u00f6nen Takt, da I2C nach jedem Reset blockiert.<br \/>\nIrgendwie verhindert das aktivieren des IWDG das funktionieren von I2C.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<li id=\"li-comment-2825\" class=\"comment odd alt thread-even depth-1\">\n<div id=\"comment-2825\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/6f72ca5ac0ac671c79f3a35c2b13d9fc?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Daniel<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">12. Januar 2015 um 17:13<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hmm, eventuell (hoffentlich) liegt der Bock wirklich bei mir.<br \/>\nScheinbar dauert ein intialisieren von I2C mit lesen eines einzelnen Bytes mehr als die 100ms. Habe aber gemeint, ich h\u00e4tte auch mal mit 500ms probiert.<br \/>\nIch habe jetzt die Library eliminiert, und das Ganze direkt in meinem Program eingebaut, und jetzt l\u00e4uft es. Also so was:<\/p>\n<p>if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) {<br \/>\nprintf(\u201c\u2026\u201d);<br \/>\nRCC_ClearFlag();<br \/>\n}<\/p>\n<p>IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);<br \/>\nIWDG_SetPrescaler(IWDG_Prescaler_32);<br \/>\nIWDG_SetReload(500);<br \/>\nIWDG_ReloadCounter();<br \/>\nIWDG_Enable();<\/p>\n<p>Werde es sp\u00e4ter noch mal probieren, erstmal danke f\u00fcr das Feedback<\/p>\n<p>Gruss<br \/>\nDaniel<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Mit dieser Library kann der interne Watchdog (IWDG) der STM32F4 CPU benutzt werden. (die CPU hat auch noch einen zweiten Watchdog : WWDG) Der IWDG h\u00e4ngt am internen RC-Oszillator (mit ca. 32kHz) und ist damit unabh\u00e4ngig vom rest der CPU. &hellip; <a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=410\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":144,"menu_order":42,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[128],"tags":[190,9,7],"class_list":["post-410","page","type-page","status-publish","hentry","category-stm32f4","tag-iwdg","tag-library","tag-stm32f4"],"_links":{"self":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=410"}],"version-history":[{"count":3,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/410\/revisions"}],"predecessor-version":[{"id":1581,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/410\/revisions\/1581"}],"up":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/144"}],"wp:attachment":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}