Bluepill_Plantilla Es la plantilla base (mejorada) para soporte y compatibilidad en Mbed para la tarjeta "BluePill" basada en el procesador ARM M3 STM32F103C8T6

Dependencies:   mbed

main.cpp

Committer:
Antulius
Date:
2022-02-22
Revision:
7:62b714b5d89d
Parent:
6:f47832fe0b07

File content as of revision 7:62b714b5d89d:

/* #############################################################################
**    Archivo        : main.c
**    Proyecto       : STM32F103C8_Plantilla_Enhenced
**    Procesador     : STM32F103C8T6
**    Plataforma     : Blue Pill
**    Herramienta    : Mbed
**    Compilador     : Mbed Online C Compiler
**    Version        : Mbed-OS 5.15.0
**    Fecha/Hora     : 18-12-2019, 11:48, # CodeGen: 0
**    Descripción    :
**         Este proyecto hace...
**         This module contains user's application code.
**   Componentes     : GPIO, Timer, PWM, etc .
**   Configuraciones : Includes, Stacks y Drivers externos
**   Autores         :
**         ATEAM Development Group:
**          - Antulio Morgado Valle
**
**   Versión        : Beta
**   Revisión       : A
**   Release        : 0
**   Bugs & Fixes   :
**   Date           : 20/10/2019
**                    Added support for Led_RGB
**                    22/09/2018 
**                    Added LCD Menu, Beta version
**
** ###########################################################################*/
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:                       I N C L U D E S
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
#include "stm32f103c8t6.h"
#include "mbed.h"
#include "Serial.h"
//#include "AnalogIn.h"
//#include "PwmOut.h"
//#include "Led_RGB.h"
//#include <stdio.h>
//#include <conio.h>
//#include <stdlib.h>
/*
:...............................................................................
:                       D E F I N I C I O N E S
:...............................................................................
*/
#define LED_ON          0           // Estado para el Led Encendido
#define LED_OFF         1           // Estado para el Led Apagado
#define BUZZ_ON         1           // Estado para Buzzer Encendido
#define BUZZ_OFF        0           // Estado para Buzzer Apagado
#define ON              0           // Estado para boton presionado
#define OFF             1           // Estado para boton sin presionar
#define HOLD            2           // Estado para boton mantenido
#define RELEASE         3           // Estado para boton liberado
#define FALSE           0           // Estado FALSO
#define TRUE            1           // Estado VERDADERO
#define TICKER_RATE     1000        // Periodo de Interrupción (us)
#define BAUD_RATE       115200      // Velocidad de Transmisión (Bauds)
                                    // Velocidades Permitidas:
                                    // 300, 600, 1200, 2400, 4800, 9600,
                                    // 14400, 19600, 28800, 38400, 57600
                                    // 115200, 230400
/*
+------------------------------------------------------------------------------+
|             C O N F I G U R A C I O N    D E     P U E R T O S               |
+------------------------------------------------------------------------------+
*/
Ticker      TimerInt;               // Inicializa la Interrupción por Timer
DigitalOut  Led_Monitor(LED1);      // Inicializa el LED Monitor (Interno)
DigitalOut  Led_Testigo(PB_1);      // Inicializa el LED Testigo (Externo)
PwmOut      Pwm1(PA_7);             // Inicializa el PWM para el LED Externo
PwmOut      Buzzer(PB_0);           // Inicializa el PWM para el Buzzer Externo
AnalogIn    Sensor1(PA_1);          // Inicializa Canal Analógico para Potenciometro 1
Serial      Terminal(PA_2, PA_3);   // Inicializa la Comunicación Serial a la PC (Rx, Tx)
/*
+-------------------------------------------------------------------------------
|               V A R I A B L E S    G L O B A L E S                           |
+-------------------------------------------------------------------------------
*/
uint16_t  v_rate=TICKER_RATE/2;     // Velocidad de barrido (500us = 0.5ms)
uint16_t  v_counter=250;            // Cuenta inicial de 250us
uint16_t  v_blink=0;                // Cuenta inical de parpadeos
uint16_t  v_cuenta=0;               // Cuenta inical de parpadeos del LED
/* END variables */

/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|  Definición de Funciones Prototipo y Rutinas de los Vectores de Interrupción
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
        // Las Definiciones de Funciones Prototipo 
        // y Apuntadores a Vectores de Interrupciones van aquí !
void TimerInt_OnInterrupt(void);
void Blinking_Led(void);
void Clear_Screen(void);
void Buzzer_Beep(void);
void Setup(void);
/* END prototypes */

/* END definitions */
/*
#===============================================================================
||                                                                            ||
||                  P R O G R A M A     P R I N C I P A L                     ||
||                                                                            ||
#=============================================================================== 
*/
int main()                  // El código secuencial comienza aquí
{
//+++++++++++++++++++ Secuencia  Principal +++++++++++++++++++++++++++++++++++++                               
//       Inicialización de variables, puertos, interrupciones y carátula                    
  Setup();                  // Inicialización de puertos, interrupciones y condiciones iniciales
  Clear_Screen();           // Limpia la pantalla de la Terminal  
//+++++++++++++++++++ Lazo Principal +++++++++++++++++++++++++++++++++++++++++++
//            El Lazo del Programa principal está aquí !!!
  while (true)
  {
    Blinking_Led();         // Parapadeo del LED por Software
    Pwm1 = Sensor1.read();     // Lee el Potenciometro y cambia el PWM 
    v_cuenta++;
    Terminal.printf("\rLED Testigo Parpadea %d Veces ... \n\r",v_cuenta);                           
  }
}
/* END main */

/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
::              V E C T O R E S    D E     I N T E R R U P C I Ó N
::                  (Rutinas de Atención a Interrupciones)
::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
                // Las Rutinas de Atención a Interrupciones van aquí !
/*
** =============================================================================
**     Vector      :  TimerInt_OnInterrupt()
*/
/*!
**     @brief
**         Called after Ticker is done, [Interrupt service/event]
**         and it is enabled: 
**         TimerInt.attach_us(&TimerInt_OnInterrupt, Ticker_Rate);
**         the event is enabled and will be executed every  [Ticker_Rate]
**     @param
**         UserDataPtr     - Pointer to the user or
**                           RTOS specific data. The pointer is passed
**                           as the parameter of Init method.
*/
/* ========================================================================== */
void TimerInt_OnInterrupt()         // Rutina de Atención al Ticker
{
    v_counter--;                    // Aquí va la Rutina de Servicio !
    if (!v_counter)
    {
        v_blink++;
        Terminal.printf("\rLED Monitor Flashing %d Times !!! ",v_blink);
        Led_Monitor = !Led_Monitor; // Parapadeo del LED por Interrupción (LED Toggled)
        v_counter = v_rate;         // Restablece el contador, Le asigna el periodo de 0.5ms (Rate=500)
    } 
}
/* END Events */   
/*
 ______________________________________________________________________________
/______________________________________________________________________________\
|                                                                              |
|                   F U N C I O N E S     P R O T O T I P O                    |
|______________________________________________________________________________|
\______________________________________________________________________________/
*/
                // Las Funciones Prototipo van aquí !
/*
|-------------------------------------------------------------------------------
|     Función     :     Setup()
|      
|     Descripción :     Inicialización de variables, puertos e interrupciones
|
|     Parámetros  :     Ninguno
|          
|     Retorna     :     Nada
|-------------------------------------------------------------------------------
*/
void Setup()    
{
    confSysClock();            // Inicialización del Sistema, Configure system clock (72MHz HSE clock, 48MHz USB clock)
    TimerInt.attach_us(&TimerInt_OnInterrupt, TICKER_RATE);   // Le asigna el periodo de interrupción de 1ms (TICKER_RATE=1000)
    Terminal.baud(BAUD_RATE);  // Se configura la velocidad de transmisión e inicia la comunicación serial.    
    Terminal.printf("The System is Wake Up!.\n\r"); 
    Buzzer_Beep();             // Prueba el Buzzer    
}
/*
|-------------------------------------------------------------------------------
|     Función     :     Blinking_Led()
|      
|     Descripción :     Rutina para Parpadeo del Led por Software
|
|     Parámetros  :     Ninguno
|          
|     Retorna     :     Nada
|-------------------------------------------------------------------------------
*/
void Blinking_Led()             // Software Blinking routine for LED 
{
        // The on-board LED is connected, via a resistor, to +3.3V (not to GND). 
        // So to turn the LED on or off we have to set it to 0 or 1 respectively
    Led_Testigo = LED_ON;        // turn the LED on (using Positive Logic)
    wait_ms(200);           // 200 millisecond
    Led_Testigo = LED_OFF;        // turn the LED off (using Positive Logic)
    wait_ms(1000);          // 1000 millisecond
}

/*
|-------------------------------------------------------------------------------
|     Función     :     Clear_Screen()
|      
|     Descripción :     Limpia la Pantalla de la Terminal
|
|     Parámetros  :     Ninguno
|          
|     Retorna     :     Nada
|-------------------------------------------------------------------------------
*/
void Clear_Screen() 
{
    // ANSI Terminal Commands
    Terminal.printf("\x1B[2J");     // secuencia de Escape  \e[2J
    Terminal.printf("\x1B[H");      // secuencia de Escape  \e[H
}

/*
|-------------------------------------------------------------------------------
|     Función     :     Buzzer_Beep()
|      
|     Descripción :     Rutina para prueba del Buzzer
|
|     Parámetros  :     Ninguno
|          
|     Retorna     :     Nada
|-------------------------------------------------------------------------------
*/
void Buzzer_Beep()                      // Software routine for Buzzer Beep
{ 
  Terminal.printf("Testing Buzzer... \n\r");
  Buzzer = BUZZ_ON;
  wait_ms(750);
  Buzzer = BUZZ_OFF;
  wait_ms(125);
  Buzzer = BUZZ_ON;
  wait_ms(250);
  Buzzer = BUZZ_OFF;   
  wait_ms(125);
  Buzzer = BUZZ_ON;
  wait_ms(500);
  Buzzer = BUZZ_OFF;
  Terminal.printf("Buzzer OK ! \n\r");
}
/* END functions */    
                
/* END program */

/*
*+******************************************************************************
*+                  D O C U M E N T A C I Ó N
*+******************************************************************************
*+                  La documentación va aquí!:
*+
*+------------------------------------------------------------------------------
*+                  IDENTIFICADORES
*+------------------------------------------------------------------------------
*+
*+ prefijo      signifcado              uso    
*+  v_          variable  (var)         v_nombre_variable
*+  c_          constante (const)       c_nombre_constante
*+  i_          indice    (index)       i_nombre_indice
*+  p_          apuntador (pointer)     p_nombre_apuntador
*+  l_          etiqueta  (label)       l_nombre_etiqueta
*+  f_          función   (function)    f_nombre_funcion
*+
*+------------------------------------------------------------------------------
*+  Conexión al Led Testigo:
*+------------------------------------------------------------------------------
*+
*+  Los leds se pueden conectar a cualquier pin que se declare como DigitalOut. 
*+  El dispositivo puede drenar hasta 20ma por todas sus salidas a un voltaje de 
*+  3.3V, pero se recomienda no exceder de 1mA por salida.
*+  Esto se logra poniendo una resistencia limitadora de mínimo 330 Ohms.
*+
*+    3.3V o 5V
*+       O
*+       |
*+       |
*+       /
*+       \   1K
*+       /
*+       \                         UTILIZANDO LÓGICA NEGATIVA
*+       |
*+    ___|___
*+    \      /
*+     \    /
*+      \  /
*+     __\/__
*+       |
*+       |__________________________  PIN (Digital Out)
*+
*+
*+
*+
*+                    1K
*+
*+        _________/\  /\  /\  _____    PIN (Digital Out)
*+       |           \/  \/  \/
*+       |
*+       |
*+    ___|___
*+    \      /
*+     \    /
*+      \  /                       UTILIZANDO LÓGICA POSITIVA
*+     __\/__
*+       |
*+       |
*+       |
*+    ___|___
*+     _____
*+      ___
*+       _
*+
*+      GND
*+
*+------------------------------------------------------------------------------
*+ Descripción del Conexionado para el Buzzer Piezo-Eléctrico
*+------------------------------------------------------------------------------
*+
*+                  100
*+  PWM Pin  -----/\/\/\/-------|
*+                              | 
*+                              |  +
*+                             ( ) 
*+                            ( o ) BUZZER
*+                             ( )
*+                              |
*+                              |
*+                              |
*+                            -----
*+                             ---
*+                              -
*+
*+------------------------------------------------------------------------------
*+  Conexión al Potenciometro:
*+
*+  Como recomendación hay que poner un filtro pasa bajas para evitar que el 
*+  ruido al convertidor analógico/digital.
*+
*+      3.3V
*+       O
*+       |
*+       |
*+       |          Conexión de los Potenciometros
*+       |
*+       /
*+       \  10K 
*+       /          100
*+       \  <----/\/\/\/\-------------->  PIN (AnalogIn Pin)
*+       \                  |
*+       /                  |
*+       \                -----   0.1uF
*+       |                -----
*+       |                  |
*+       |                  |
*+       |                  |
*+    ___|___            ___|___
*+     _____              _____
*+      ___                ___
*+       _                  _
*+
*+      GND                GND
*+
*+
*+      Conexión al Joy Stick Keyes
*+
*+           1   2   3   4   5
*+          GND Vcc VrX VrY SW
*+
*+
*+
*+------------------------------------------------------------------------------
*+  Conexión hacia la Terminal Serial:
*+------------------------------------------------------------------------------
*+
*+  Los Transeptores recomedados para se pueden conectar a los siguientes pines
*+  de las UART's que posee la Bluepill por medio del siguiente conexionado.
*+
*+  UART1   UART2   UART3      CABLE        CP2102  PL2303  CH340G  FT232RL
*+  PA_9    PA_2    PB_10   Tx  ------> Rx    3       2       2        3
*+  PA_10   PA_3    PB_11   Rx  <------ Tx    4       3       3        2
*+                          3V  ------  3V    5       5       4        1
*+                          GND ------  GND   2       1       1        4
*+------------------------------------------------------------------------------
*+
*+   Powered by
*+
*+          T H E     A N T U L I U ' S   T E A M   R&D  Unltd 
*+
*+  Research, Development, Systems, Equipment, Support & Spare Parts.
*+  (C) Copyright 1989-2019, All Rights Reserved
*+
*+  Welcome to The Beaners Proyect Community!                
*+----------------------------------------------------------------------------*/

/* END documentation */ 

/* END Mbed */