STM32-Programm wird nicht ausgeführt

Ich versuche derzeit, mein eigenes stm32-Entwicklungsboard zu erstellen. Ich habe einen stm32f100c4t6 Mikrocontroller auf der Platine montiert. Ich verwende Atollic True Studio Free Edition. Ich hatte ein kleines Blink-LED-Programm wie unten gemacht.

#include <stddef.h>
#include "stm32f10x.h"

void delay(int count)
{
    volatile int i;

    for (i = 0; i < count; i++)
    {
    }
}

GPIO_InitTypeDef GPIO_InitStructure;

int main(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    while (1)
    {
        delay(100000);
        GPIOA->BSRR = 0xF << 3;
        delay(100000);
        GPIOA->BRR = 0xF << 3;
    }
}

Ich habe st flash loader demonstrator unter Windows verwendet, um das Programm in den Flash-Speicher zu laden. Es erkennt jedoch die Flash-Speichergröße als 32 KB, obwohl sie tatsächlich 16 KB hat. aber das Programm wurde in den Flash geladen und erfolgreich verifiziert. (Es erkennt die Geräte-ID als 0x420, was für die Wertleitung mit mittlerer Dichte steht, während dieser Mikrocontroller eine Wertleitung mit niedriger Dichte ist.)

Wenn ich die Jumper-Einstellung von BOOT0 auf Masse ändere, um es in den Ausführungsmodus zu versetzen, passiert nichts. der Pin PA3 bis P6 bleibt auf 0V. Ich habe einen 24-MHz-Quarz als Hauptquarz und einen 32,768-kHz-Quarz als RTC-Quarz angeschlossen. Ich kann Spannungen um 1,8 V bei einem 24-MHz-Quarz erhalten. die anderen Kristallstifte bleiben auf 0 V. ist das falsch?

Ich habe auch versucht, stm32flash unter Linux zu laden, es lädt und überprüft das Programm erfolgreich. aber es erkennt auch den Mikrocontroller als Mediam Density Value Line (128 KB).

Ich stecke in dieser Situation fest. jede Hilfe wäre spürbar.

Danke fürs Lesen.

BEARBEITEN: Ich habe den Link des Schaltplans angehängt .

Ich denke, wir werden Ihren Schaltplan brauchen - können Sie ihn irgendwo hochladen und einen Link teilen? Jemand wird vorbeikommen und es bearbeiten.
Ein kleiner Kommentar: Ich bin mir nicht sicher, ob int in der Lage ist, Zahlen so groß wie 100000 zu verarbeiten (es kann sehr gut sein). Es wäre nicht, wenn es nur 16 Bit breit ist. Um sicherzugehen, würde ich stattdessen int32_t (oder uint32_t) für die Deklaration der Verzögerungsfunktion verwenden.
@fm_andreas, vielleicht hast du recht. aber ich habe es auch mit dem Wert 100 versucht. aber nichts passiert.
Haben Sie versucht, Ihre Hardware mit JTAG/SWD zu testen?
Was ist mit der Uhreinstellung? Wenn es so ausgeführt wird, verwendet die CPU die interne RC-Uhr. Sie müssen den Uhrenbaum einrichten.
@Leon Heller, Entschuldigung, ich habe kein JTAG/SWD zum Ausprobieren.
Das war sehr dumm! Das Debuggen wird schwierig. Sehen Sie, ob Sie die Verbindungen hinzufügen können - es gibt nur zwei Signale für SWD.
@Blup1980, also muss ich die Uhr für beide Kristalle einrichten?
Verwenden Sie den internen Oszillator für erste Tests, das macht die Sache viel einfacher.
@JaydeepDhrangdhariya - es wäre eine gute Idee, eines der STM Discovery-Boards zu kaufen. Sie bieten Ihnen sowohl eine kostengünstige, bekanntermaßen gute Plattform zum Testen Ihrer Software, als auch als SWD-Programmierer/Debug-Schnittstellen. Sie können im Allgemeinen jedes STM32-Discovery-Board mit jedem STM32-Chip verwenden, auch wenn das Teil, das Sie programmieren möchten, nicht aus derselben Unterfamilie stammt wie der auf dem Discovery-Board bereitgestellte Zielchip. Als ich zuletzt nachgesehen habe, waren diese billiger als serielle USB-Kabel mit Logikpegel.
Der von dir gepostete Code sollte funktionieren. Ich vermute, das Problem liegt entweder im Startcode (der mit dem Compiler geliefert werden sollte) oder in einigen Einstellungen im Compiler/Linker. Wie andere vorgeschlagen haben, halten Sie es einfach, verwenden Sie zuerst die integrierten Oszillatoren und erhalten Sie eine Debugging-Schnittstelle.
Ich glaube nicht, dass der C-Compiler volatileeine Variable berücksichtigen muss, auf die von keinem anderen Kontext aus zugegriffen werden kann (lokal ist und ihre Adresse nirgendwo weitergegeben wird). Ich würde den Maschinencode überprüfen, ob die Verzögerungsschleife wirklich vorhanden ist.
Haben Sie anderen Beispielcode ausprobiert, der mit Compiler bereitgestellt wird? Einmal hatte ich ein ähnliches Problem .... Es war ein Problem mit den Compiler-Einstellungen! (PS Es war ein anderer Compiler)
@fm_andreas Da dies ein 32-Bit-2er-Komplementsystem ist, hält int alle positiven Werte bis zu (2^32)/2 - 1= 2,147 Milliarden. uint32_tIst aber in der Tat zu bevorzugen.

Antworten (2)

Hier ist das einfachste mögliche LED-Blinkerprogramm, das auf dem STM32VL Discovery Board funktioniert:

/* Test.c
** Simple program for STM32F100RB to flash LED on PC_9
**
*/

#include <stm32f10x.h>

void delay(void);

void main(void)
{
  // I/O port C clock enable
  RCC->APB2ENR = RCC_APB2ENR_IOPCEN;
  // Set PC_9 to output 
  GPIOC->CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9);
  GPIOC->CRH |= GPIO_CRH_MODE9;

  while(1)
  {
    GPIOC->BSRR = (1<<9);
    delay();
    GPIOC->BRR = (1<<9);
    delay();
  }
}

void delay(void)
{
  volatile unsigned int i;

  for (i = 0; i < 20000; i++)
    ;
}

Wenn Sie die Standardtaktkonfiguration verwenden, sollten Sie einen 8-MHz-Quarz (oder 25 MHz für Connectivity-Line-Chips) an Ihren Chip anschließen.

Ein Codeausschnitt aus system_stm32f10x.cder Funktion SetSysClockTo24() .

#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
    /*  PLL configuration:  = (HSE / 2) * 6 = 24 MHz */

Hoffentlich hilft das.