STM32F103C8T6 y Arduino IDE

Hola , estoy empezando a trabajar con el modulo que contiene el micrcontrolador STM32F103C8T6 y me costo un poco hacerlo funcionar con ese parche para integrarlo al IDE de Arduino que se pega en la carpeta hardware porque al principio me daba un mensaje de error en la compilacion y probaba con varias versiones de arduino ide y el resultado era el mismo hasta que di con la solucion y pude hacerlo funcionar, me parecia mas amigable programar en arduino IDE que en su propio sistema de Keil uVision pero luego de conectar la tarjeta y compilar un simple programa de BLink que hace parpadear un led que incorpora la placa, el compilador me dice que a generado un archivo de 7 k y en otra PC el mismo hasta el doble 15k ocupando entre el 10 al 20% de la memoria del chip que tiene 64k en total , osea como es que un simple programa de blink se va a engullir tanta memoria? es asi normal una compilacion para un simple programa con el STM32 en arduino IDE? esa es mi consulta gracias de antemano por sus respuestas.

Para empezar tendrias que cambiar el bootloader del mismo. Yo tengo 4 modulos de este ARM STM32Fxxxx y al principio me pasaba como a ti. Si te vas al foro de STM32DUINO, tendras que dominar el ingles si o si.

Recuerda que usar STM32 embebido con Arduino (caso del STM32) tienes unos 16_KiloBytes extras.. para tus proyectos

Otra ayuda. Si logras subir programa por "BootLoader" te suprime 4KBytes.

Suerte amigo!.

Gracias por sus alcanzes los tendre en cuenta, yo ando usando el programador St link para cargarle los programas ya sean usando el Arduino IDE o el Keil uvision quizas sea que ese programador /debugger anda consumiendo mas memoria que cargandoselo por puerto serial simple, pero bueno ahora me a surgido otra duda en cuanto quize hacer un simple secuencial de leds y conecte un led a cada pin no me funciono como esperaba, lo que hize fue configurar todos los pines disponibles del chip como salidas y luego mande prender y apagar individualmente en secuencia pudiendo observar que ciertos pines no trabajaban , el programa lo hize en Arduino IDE y en uvision y el resultado fue el mismo, los pines PA0-PA10 trabajan bien pero los pines PA11 a PA15 pareciera que se resistieran a configurarse como salidas por mas que alli esta en las instrucciones, en el caso del puerto B ocurre que PB0-PB4 tampoco responden como salidas y el resto de terminales del puerto B si trabajan bien , en el caso de los pocos pines del puerto C estos si trabajan sin problema, pense que quizas esos pines que no responden pudieran estar dañados por lo que cambie de tarjeta STM pero obtuve los mismos resultados, es posible que dos unidades hayan venido falladas en los mismos pines? o hay algun conflicto por resolver que impide que casi la mitad del numero de pines no obedezca funcionar como salidas? alguien mas a probado que todos los pines de este chip esten trabajando como salidas? o hay algun detalle o configuracion que este adueñandose de esos pines para otras funciones y no los deje configurar como salidas?

Esta es la tarjeta con la que estoy iniciandome en la programacion de esta familia

el programa lo hize en Arduino IDE y en uvision y el resultado fue el mismo, los pines PA0-PA10 trabajan bien pero los pines PA11 a PA15 pareciera que se resistieran a configurarse como salidas por mas que alli esta en las instrucciones, en el caso del puerto B ocurre que PB0-PB4 tampoco responden como salidas y el resto de terminales del puerto B si trabajan bien

Tienes una gran mezcla de cosas que sería bueno ordenes.

1ro usar IDE es una cosa. Usar Keil otra. Asi que porque en lugar de hablar en el aire, no posteas el código (usando la etiqueta que corresponde como te he pedido por privado) asi vemos como intentas definir los pines de salida que dices que no trabajan apropiadamente.

2do. Acabo de revisar KEIL uVision para ver si habia incorporado alguna forma de compilacion de sketch estilo arduino y por lo visto no. Keil puede programar cualquier placa Arduino ya que se enfoca en el microcontrolador que use, AVR, SAM, ARM, lo que fuere.

Quedamos a la espera!

La placa que describes;

|500x266

Funciona bien. Son las que tengo. Se supone has usado la versión correcta del IDE de Arduino. Algunas versiones no funcionan. Yo empezaría por lo básico que es en Arduino, Kiel la versión pro es de pago siendo la Lite unos pocos KBytes para subir a la placa.

Te dejo un video mio con un display VFD y como bien te dice @surbyte por tu código que estas usando para ver si hay fallos.

Como te comenté en mi primer mensaje, el [u]bootloader viene de serie "vacío"[/u] en estas placas y si no le "pones" uno no te funcione correctamente todos los pines de la placa. Los puedes encontrar en el repositorio de Roger Clark

Claro, el problema del bootloader te va consumir una parte de los 64KBytes de flash, yo opté por poner el DFU en el mismo de esta forma se puede programar a través del conector USB y ademas la R10 que viene de serie siendo de 10KOhms se tiene que substituir a 1K5 de lo contrario jamas funcionará el USB, pero todas las placas tienen el mismo error, leete esta Wiki Documentación

|500x340

Saludos!

El Circuito se trata en si de un simple secuencial de leds, conectando los pines de los puertos PA, PB y PC disponibles en la tarjeta que suman 32 pines, a cada pin le conecto un solo led con su respectiva resistencia de 470 ohm, utilizando el Arduino IDE 1.8.1 escribo ese programa que configura todos los 32 pines como salidas y luego en el bucle infinito hago que cada uno se encienda y apague por un tiempo corto variable, el resultado es que de los 32 leds se encienden y apagan 27 leds quedando 5 leds apagados todo el tiempo, cambie de tarjetita STM32F103c8t6 y el resultado fue el mismo 5 pines no encendian, despues hize la programacion de el secuencial en el lenguaje del Keil uvision seleccionando el micro en cuestion y configurando las salidas con el STMcubemx y el resultado fue el mismo hay 5 pines que no encienden, sera que tienen asignadas otras funciones inalterables o quizas sean de colector abierto? Asi que la consulta seria como puedo activar esos pines como salidas o asi es el comportamiento normal en esos pines en ese microcontrolador? ,los pines que no encienden son el PA11, PA12, PA15 , PB3 y PB4.

PD: intento pegar el codigo completo pero me rechaza por exceder la capacidad de 9000 caracteres y lo mutila, pero la secuencia del On / Off es repetitiva para cada uno de los 32 pines

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(PC13, OUTPUT);
  pinMode(PC14, OUTPUT);
  pinMode(PC15, OUTPUT);
  
  pinMode(PB15, OUTPUT);
  pinMode(PB14, OUTPUT);
  pinMode(PB13, OUTPUT);
  pinMode(PB12, OUTPUT);
  pinMode(PB11, OUTPUT);
  pinMode(PB10, OUTPUT);
  pinMode(PB9, OUTPUT);
  pinMode(PB8, OUTPUT);
  pinMode(PB7, OUTPUT);
  pinMode(PB6, OUTPUT);
  pinMode(PB5, OUTPUT);
  pinMode(PB4, OUTPUT);
  pinMode(PB3, OUTPUT);
  pinMode(PB1, OUTPUT);
  pinMode(PB0, OUTPUT);
  
  pinMode(PA15, OUTPUT);
  pinMode(PA12, OUTPUT);
  pinMode(PA11, OUTPUT);
  pinMode(PA10, OUTPUT);
  pinMode(PA9, OUTPUT);
  pinMode(PA8, OUTPUT);
  pinMode(PA7, OUTPUT);
  pinMode(PA6, OUTPUT);
  pinMode(PA5, OUTPUT);
  pinMode(PA4, OUTPUT);
  pinMode(PA3, OUTPUT);
  pinMode(PA2, OUTPUT);
  pinMode(PA1, OUTPUT);
  pinMode(PA0, OUTPUT);

}

// the loop function runs over and over again forever
void loop() {
  int retardovar = 500;
  digitalWrite(PA7, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA7, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar);     // wait for a second

  digitalWrite(PA6, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA6, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA5, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA5, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA4, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA4, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA3, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA3, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA2, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA2, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA1, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA1, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA0, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA0, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA8, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA8, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA9, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA9, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA10, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA10, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA11, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PA12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA12, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar);

  digitalWrite(PA15, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PA15, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar);  
  
  digitalWrite(PB0, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB0, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PB1, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB1, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

  digitalWrite(PB3, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB3, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

 digitalWrite(PB4, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB4, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

 digitalWrite(PB5, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB5, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

 digitalWrite(PB6, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB6, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

 digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB7, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

 digitalWrite(PB8, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB8, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

 digitalWrite(PB9, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB9, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

 digitalWrite(PB10, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB10, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

   digitalWrite(PB11, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB11, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

 digitalWrite(PB12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(retardovar);                       // wait for a second
  digitalWrite(PB12, LOW);    // turn the LED off by making the voltage LOW
  delay(retardovar); 

 digitalWrite(PB13, HIGH);   
  delay(retardovar);                       
  digitalWrite(PB13, LOW);    
  delay(retardovar); 
.
.
.
.
.

  }

Hola

Me alegro de ver que existe gente que trabaja con esta placa de arduino.
Llevo trabajando con esta placa un par de meses y he realizado algunos montajes:

http://seta43.hol.es/stm1.html
http://seta43.hol.es/stm2.html
http://seta43.hol.es/stm3.html
http://seta43.hol.es/oscstm1.html

Este último es un osciloscopio de 640.000 muestras/segundo.
No sabía que se podía programar desde el propio USB , lo hacía mediante un conversor USB->Serie , probare cambiar el boot.

Espero ver mas gente con esta placa.

Saludos
Juan

Para modificar un codigo de Arduino UNO a STM32F103C8T6 se amerita un gran cambio?

En el Arduino UNO utilizo RTC, SD, SIM800L, un pulsador por interrupcion y las siguientes librerias:

#include <Wire.h>
#include "RTClib.h"
#include <SD.h>
#include <SPI.h>

El STM32 dispone de RTC incorporado, asi que hay que ver si las librerías habituales sirven. Lo mejor sería chequearlo en el foro que indica Lightcalamar. Debe haber ejemplos alli. Lo mismo haría con la SD.

Bueno ahora voy a flashear el bootloader para usb a ver que tal y hago pruebas para la SD. :)

Supongo que el DFU debe ser este: gd32f1_generic_boot20_pc13.bin

lo que pasa es que arduino stm32 esta basada en maple, a su vez no esta basada en CMSIS por lo tanto no pueden usarse los registros directamente, ojala tendria osciloscopio para hacer esas pruebas, pero dejo algo que hice
USART a 500000 baudios

//USART Asin.8N1
RCC->APB2ENR|=0b00000000000000000010000000000101;
GPIOA->CRH|=0b00000000000000000000010010100000;
USART1->CR1|=0b00000000000000000000000000001100;
USART1->BRR=(SystemCoreClock/500000);

configurar puerto como salida
//PB11 como salida
RCC->APB2ENR|=(1<<3);//clock puerto B
GPIOB->CRH&=~(1<<15);//" " "
GPIOB->CRH&=~(1<<14);//GPIOB 11 modo:push pull
GPIOB->CRH|=(1<<13)|(1<<12);//speed:50MHZ

timer interrupcion
//timer2 
NVIC_EnableIRQ (TIM2_IRQn);
RCC->APB1ENR|=(1<<0);
TIM2->DIER|=(1<<0);

etc etc esto se puede programar en keil sin incluir ninguna libreria, si pude notar que ocupa 900 bytes el uso de puerto serie, 6 salidas digitales y 3 timers
Para compilar no hace falta ningun IDE, se pueden usar directamente los comando de arm-none-eabi y para subir el programa mediante puerto serie pueden usar stm32flash que tambien es un comando, puse todo en un makefile y con un solo comando se sube muchisimo mas rapida la compilacion y la subida que en arduino IDE

El problema es otro.

No quiero, ni va ser un off-topic pero hay que matizar unas puntualizaciones.

De hecho los procesadores STM32Fxxxx, al menos con los que he trabajado y (sigo con ellos) son muy buenas opciones y vuelan a 160MHz en adelante. El problema es del mensaje anterior.

La famosa l*ibrería maple*.

Bien en IDE Arduino no solo existe el core (nucleo) del foro del canguro. Existen otros nucleos (cores) donde pueden hacer funcionar cualquier dispositivo a tu antojo sin usar la maple. La librería maple no es otra que "realiza" que librería del mundo "arduino" puedan ser compatibles y eso es un GRAN error.

En el foro del canguro ya escribí que estaban equivocados, pero lo mismo que los gatos, los canguros son asín de cabezones y desistí. Ademas tienen un legión de adictos a la maple y su tropa se pode a la retarguardía ;) jejejeje

Hace unos meses atras construimos un equipo el FT81xmania donde nuestro objetivo principal es a traves de un core llamado STM32GENERIC que lo pueden encontratar en la red, hacer funcionar cualquier dispositivo, y así es, van funcionando.

Solo es cuestíon de modificar librerías y adaptalas a STM32, asi de sencillo (bueno ya he realizado una docena) y pasar OLIMPICAMENTE de la "maldita" maple, si esto se entiende bien y si no pues a comprar mas Arduino modelo UNO y semejantes ....

Adaptar una libreria como dije es bien sencillo, adaptar una libraría como la Gameduino2 en STM32, a @TFTLCDCyg y servidor nos complicó la vida, y actualmente esta funcionando sin problemas, claro por supuesto con la mejor pantalla de hoy en día para Arduino como son las FT81x.

No hay otras mejores. Sorry. Si lo dudan es porque nunca fueron propietarios de una de estas. No saben el alcance de usar una pantalla FTDI (FT8xx) con STM32F4 por ejemplo ...

Saludos