El programa STM32 no se ejecuta

Actualmente estoy tratando de hacer mi propia placa de desarrollo stm32. Tengo un microcontrolador stm32f100c4t6 montado en pcb. Estoy usando la edición gratuita de Atollic True Studio. Hice un pequeño programa de parpadeo como se muestra a continuación.

#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;
    }
}

He usado el demostrador del cargador de flash st en Windows para cargar el programa en la memoria flash. sin embargo, detecta el tamaño de la memoria flash como 32 KB cuando en realidad tiene 16 KB. pero el programa se cargó en flash y se verificó con éxito. (Detecta el ID del dispositivo como 0x420, que es para una línea de valor de densidad media, mientras que este microcontrolador es una línea de valor de baja densidad).

Cuando cambio la configuración del puente de BOOT0 a tierra para ponerlo en modo de ejecución, no sucede nada. el pin PA3 a P6 permanece en 0v. He conectado un cristal de 24 MHz como cristal principal y 32.768 KHz como cristal RTC. Puedo obtener voltajes alrededor de 1.8v en cristal de 24 MHz. los otros pines de cristal permanecen en 0v. ¿Esto esta mal?

También probé stm32flash en Linux para cargar el programa, carga y verifica el programa con éxito. pero también detecta el microcontrolador como línea de valor de densidad media (128 KB).

Estoy atascado en esta situación. cualquier ayuda sería apreciable.

Gracias por leer.

EDITAR: He adjuntado el enlace del esquema .

Creo que vamos a necesitar tu esquema. ¿Puedes subirlo a algún lado y compartir un enlace? Alguien se detendrá y lo editará.
Un comentario menor: no estoy seguro de si int es capaz de manejar números tan grandes como 100000 (muy bien podría serlo). No lo sería si solo tiene 16 bits de ancho. Para estar seguro, elegiría int32_t (o uint32_t) en su lugar para la declaración de la función de retardo.
@fm_andreas, puede que tengas razón. pero también probé con valor 100. pero no pasa nada.
¿Ha intentado usar JTAG/SWD para probar su hardware?
¿Qué pasa con la configuración del reloj? Si se ejecuta así, la CPU utilizará el reloj RC interno. Tienes que configurar el árbol del reloj.
@Leon Heller, Lo siento, no tengo JTAG/SWD para probar.
¡Eso fue muy tonto! La depuración va a ser difícil. Vea si puede agregar las conexiones: solo hay dos señales para SWD.
@Blup1980, ¿tengo que configurar el reloj para ambos cristales?
Use el oscilador interno para la prueba inicial, hace las cosas mucho más fáciles.
@JaydeepDhrangdhariya: sería una buena idea comprar una de las placas STM Discovery. Le proporcionarán una plataforma económica conocida para probar su software y también funcionan como programadores SWD/interfaces de depuración. En general, puede usar cualquier placa Discovery STM32 con cualquier chip STM32, incluso si la parte que desea programar no es la misma subfamilia que el chip de destino provisto en la placa Discovery. La última vez que lo comprobé, estos eran más baratos que los cables seriales USB de nivel lógico...
El código que publicaste debería funcionar. Sospecho que el problema radica en alguna parte del código de inicio (que debería venir con el compilador) o en algunas configuraciones en el compilador/enlazador. Como han sugerido otros, manténgalo simple, use primero los osciladores incorporados y obtenga una interfaz de depuración.
No creo que el compilador de C tenga que cumplir volatilecon una variable a la que no se puede acceder desde ningún otro contexto (es local y su dirección no se pasa a ninguna parte). Comprobaría el código de la máquina para comprobar que el bucle de retardo está realmente allí.
¿Ha probado algún otro código de muestra proporcionado con Compiler? Una vez tuve un problema similar... ¡Era un problema con la configuración del compilador! (PS Era un compilador diferente)
@fm_andreas Dado que este es un sistema de complemento a 2 de 32 bits, int contendrá todos los valores positivos hasta (2^32)/2 - 1= 2.147 mil millones. Pero uint32_tes de hecho para preferir.

Respuestas (2)

Aquí está el programa de luz intermitente LED más simple posible que funciona en la placa Discovery STM32VL:

/* 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++)
    ;
}

Si usa la configuración de reloj predeterminada, debe conectar un cristal de 8 MHz (o 25 MHz para chips de línea de conectividad) a su chip.

Un fragmento de código de system_stm32f10x.cla función SetSysClockTo24() .

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

Espero que ayude.