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 .
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.c
la 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.
usuario17592
fm_andreas
Jaydeep Dhrangdhariya
leon heller
Blup1980
Jaydeep Dhrangdhariya
leon heller
Jaydeep Dhrangdhariya
leon heller
chris stratton
fm_andreas
Kaz
volatile
con 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í.Cisne y
Lundin
(2^32)/2 - 1
= 2.147 mil millones. Perouint32_t
es de hecho para preferir.