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 .
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.c
der 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.
Benutzer17592
fm_andreas
Jaydeep Dhrangdhariya
Leon Heller
Blup1980
Jaydeep Dhrangdhariya
Leon Heller
Jaydeep Dhrangdhariya
Leon Heller
Chris Stratton
fm_andreas
Kaz
volatile
eine 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.Schwanand
Lundin
(2^32)/2 - 1
= 2,147 Milliarden.uint32_t
Ist aber in der Tat zu bevorzugen.