Siguiendo lo dicho en software para programar LibreServo he utilizado CubeMX para toda la configuración inicial con el que he generado el proyecto base para TrueStudio.
El primer ejemplo a realizar es el más básico, un led parpadeando. En nuestro caso, LibreServo usa el led RGB Asmb-mtb0-0A3a2, así que haremos que cambie de color alternativamente. Es un ejemplo básico pero esencial para poder seguir avanzando.
El código que enseñe intentaré siempre poner las zonas donde se programan, delimitadas por entradas que pone CubeMX para luego respetar nuestro código a la hora de realizar una actualización de las librerías. Para realizar la espera, usaremos el propio Systick. Para ello:
- Configuramos Systick
/* USER CODE BEGIN SysInit */
SysTick->CTRL=5;
/* USER CODE END SysInit */
- Declaramos y programamos las funciones Delay
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
static void Delay();
static void Delay_ms(uint32_t);
/* USER CODE END PFP */
/* USER CODE BEGIN 4 */
static void Delay()
{
SysTick->LOAD=72000-1; //LibreServo funciona a 72MHz
SysTick->VAL=0;
while(SysTick->CTRL==5){}
}
static void Delay_ms(__IO uint32_t nCount)
{
for(;nCount!=0;nCount--) Delay();
}
/* USER CODE END 4 */
- Por último, nuestro sencillo código para hacer que el led RGB vaya cambiando de color
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
GPIOA->ODR ^= LL_GPIO_PIN_2; //toggle pin (si está encendido lo apaga, y si está apagado lo enciende)
Delay_ms(500); //Espera medio segundo
GPIOA->ODR ^= LL_GPIO_PIN_2;
GPIOA->ODR ^= LL_GPIO_PIN_3;
Delay_ms(500);
GPIOA->ODR ^= LL_GPIO_PIN_3;
GPIOA->ODR ^= LL_GPIO_PIN_4;
Delay_ms(500);
GPIOA->ODR ^= LL_GPIO_PIN_4;
/* USER CODE END WHILE */
}
Puede parecer un programa muy simple y rídiculo... Pero tras meses diseñando y calculando, ver que tu microcontrolador se programa y empieza a funcionar te hace saltar de emoción. Cualquiera que me vea emocionado por ver un led cambiar de color ¡pensará que estoy loco! Sí que es cierto que viendo el resultado final, y con multímetro en la mano, el led veo que brilla demasiado. Casi 5mA por cada color. En la próxima versión pondré unas resistencias mayores, 470 Ohms sería una cifra más adecuada (en vez de los 160 de ahora):