Programando la Placa de Desarrollo Mini-STM32 (Valoración de 5.00 sobre 5, resultante de 1 votos)

Componentes y tecnología electrónica, regulación, automatización, domótica, inmótica y edificio inteligente. Protocolo KNX, X10, EIB, LON, DALI, DMX, Zigbee, Powerline…
Avatar de Usuario
por
#287653
Hola a todos

En realidad, estos temas ya los tengo en forma de página en mi web personal, junto a otros de electrónica de válvulas y de componentes discretos, algo de física nuclear, especialmente de detectores de radiación, mecánica, hidrodinámica, criptografía, navegación y algunos temas más. Lo que pasa es que no he puesto el enlace concreto porque a algunos foros no les gusta que se "desvíe el tráfico" pese a que no tengo publicidad ni hago negocio con ello de ningún tipo.

A la vez, todo lo que he publicado hasta ahora está bajo licencia Creative Commoms, y por tanto permito la libre duplicación, así como su paso a otros formatos siempre que se mantenga el carácter no comercial y se cite claramente el origen de la información.

En el tema de la MIni-STM32 ya llevo 7 partes publicadas (la última ayer noche), y veo que va a ser bastante largo, ya que apenas he comenzado a descubrir las posibilidades de esta fantástica placa, con sus buenas posibilidades gráficas, más memoria y un procesador bastante más potente que los Atmega de los Arduinos, pero que a diferencia de estos, no hay casi información en castellano y es parcial y muy dispersa en inglés.

La verdad es que desde hace mes y medio me estoy pegando un panzón de horas y horas programando y desentrañando características y procedimientos, pero siempre intento descubrir y probar las cosas por mi mismo y dejar expuestos los temas lo más claramente posible, como a mi me gustaría encontrarlos en otro sitios, en vez de las típicas informaciones que o bien contienen más preguntas que respuestas, o aquellas más expertas que te explican las cosas de manera que sólo las entiendes si ya las sabías previamente.

Un saludo
Última edición por Anilandro el 02 Dic 2011, 12:24, editado 1 vez en total
Avatar de Usuario
por
#287698
Bueno, tampoco es así Esaizmata, sólo que dedico tiempo a aquellas cosas que me gustan, y si me meto en algo no es para divagar, sino para clarificar conceptos y experiencias, ya que es la única forma de que puedan servir tanto a uno mismo como a los demás. Pero te aseguro que muchas de ellas son más fruto de la cabezonería que de la habilidad.

Un saludo
Avatar de Usuario
por
#287701
Programando la placa de desarrollo Mini-STM32 - IV
Recordando las funciones GPIO y añadiendo algunas adicionales

NOTA: Algunas fotografías son de formato horizontal mayor del que permite el foro, y por este motivo pueden salir cortadas en su lado derecho. Para verlas correctamente basta copiar su dirección de enlace y abrirlo en una pantalla aparte del navegador.

En los listados de los programas anteriores hay una palabra que sale con mucha frecuencia: se trata de GPIO, ligada a órdenes de entradas o salidas del microcontrolador. Algunas de dichas órdenes ya las hemos utilizado en páginas anteriores, aquí añadiremos algunas más y también explicaremos las distintas variantes que pueden adoptar en su relación con los circuitos electrónicos externos.

Para empezar diremos que la palabra GPIO significa "General Purpose Input/Output", lo que traducido al castellano significa "Entradas/Salidas de Propósito General". La GPIO es una librería que contiene una serie de funciones que permiten controlar dichas entradas y salidas, algunas de las cuales deberíamos manejar con soltura, puesto que son la base de muchos de los programas que vamos a realizar.

En los ejemplos de órdenes que vienen a continuación, la mayoría de ellas están referidas explícitamente al puerto B del microncotrolador, lo cual establece en la palabra "GPIOB", pero salvo excepciones puntuales, serían igualmente utilizables con los demás puertos, cambiando esta parte por GPIOA, GPIOC, GPIOD o GPIOE.

Comencemos por la orden que abre la configuración de puertos (en esta caso el puerto B)

Órdenes de apertura de puerto A, B, C. D o E

GPIO_InitTypeDef GPIO_InitStructure; /* Inicia estructura, se ha de poner antes del main( )*/

Ahora pasaremos a activar el puerto B, asociándolo al bus interno APB2 (Advanced Peripheral Bus)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* Activa puerto B conectándolo a bus interno APB2 */

Seguidamente estableceremos la velocidad de este puerto, eligiendo para el APB2 entre tres opciones: 2, 10 y 50 Mhz.

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* Establece velocidad a 50 Mhz */

__________________________________


Modos de configuración de pines en Entrada/Salida digital

Los pines utilizados como entradas o salidas digitales pueden configurarse de diversas formas para adaptarse lo mejor posible al circuito exterior al microcontrolador. Las salidas pueden ser de dos tipos, que se explican además gráficamente en la siguiente imagen:

Salidas Digitales

- Mode_Out_PP, que conecta una salida tipo Push-Pull, un tipo de circuito que fuerza la tensión de salida con independencia de donde esté conectada la carga. En la forma en A se conectaría un LED con su resistencia limitadora desde el punto de salida a masa, y en B como atacaría esta salida cualquier otra entrada de media impedancia. La lógica es positiva, pin activado = 1, pin desactivado = 0. La orden concreta para este modo es:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* Establece siguientes pines en salida push-pull */

- Mode_Out_OD, que significa salida en "Open Drenator" o "Drenador abierto", en que el transistor final actúa sólo como interruptor y necesita de aporte externo de tensión para manifestar su estado. En el caso C el LED estará conectado entre el pin de salida y el positivo, y al conducir el transistor, se iluminará. La lógica será positiva, pin activado = 1, pin desactivado = 0. En el caso D la resistencia externa forma junto al transistor interno un circuito inversor, y por tanto la lógica de la señal resultante será negativa, pin activado = 0, pin desactivado = 1. La orden concreta para este modo es:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /* Establece siguientes pines en salida drenador abierto */

Los dos modos de salida digital: en PP (Push-Pull) o OD (Drenador abierto)
Imagen
__________________________________

Entradas Digitales


Si configuramos el pin como entrada digital dispondremos de tres modos distintos:

- Mode_IN_FLOATING, que significa "entrada en flotación". En esta configuración de pin del microcontrolador no posee polarización propia y la tensión la proporcionan los componentes exteriores, dando e circuitol E una lógica positiva, pulsador cerrado = 1, pulsador abierto = 0, y el F lógica negativa, pulsador cerrado = 0, pulsador abierto = 1. La orden a utilizar en este modo es:

GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING; /* Establece siguientes pines en entrada en flotación */

- Mode_IPD, cuyo significado es Input Pull-Dawn, o entrada forzada a tierra, a causa de la resistencia interna unida a masa, como el caso G. La lógica es positiva, con pulsador abierto = 0 y pulsador cerrado = 1. La orden es:

GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IPD; /* Establece siguientes pines en entrada con resistencia interna pull-down (a masa) */

- Mode_IPU, que significa Input Pull-Up, o entrada forzada a positivo, por la resistencia interna que en este caso está entre la línea de entrada y el positivo de alimentación. Este modo opera de modo inverso del anterior y por tanto su lógica es negativa: pulsador abierto = 1, pulsador cerrado = 0. El circuito se muestra en el diagrama F y la orden es:

GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IPU; /* Establece siguientes pines en entrada con resistencia interna pull-up (a positivo) */

Los tres modos de entrada digital: IN_FLOATING (en flotación), IPD (con resistencia a masa) y IPU (con resistencia a positivo)

Imagen
__________________________________

Pines a los que aplicar la configuración


Una vez establecida la configuración del pin mediante las órdenes anteriores, ahora concretaremos a que pin o grupo de pines afectará, siempre pertenecientes al puerto que hayamos activado antes. La orden para un pin individual es la siguiente:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x; /* inicia pin x en Modo especificado anteriormente */

Para iniciar más de un pin a la vez se utiliza el operador "|" (Alt Gr + 1). La orden adquiere la forma:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x|GPIO_Pin_z; /* igual que antes, pero inicia pines x, z en Modo especificado anteriormente */


Cerrar la configuración de puertos A, B, C. D o E

Una vez acabada la iniciación de los pines de un puerto determinado, en este caso el B, debemos cerrar su configuración con la siguiente orden.

GPIO_Init(GPIOB, &GPIO_InitStructure); /* Cierra configuración de pines del puerto B */

Pueden asignarse distintas configuraciones de modo a otros pines del mismo puerto, pero siempre hay que cerrar estas asignaciones con "GPIO_Init(GPIOB, &GPIO_InitStructure);" Observar el siguiente fragmento de código, que configura el pin1 como salida Push-Pull y el pin2 como entrada en flotación:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*siguientes pin como Salida Digital en modo Push-Pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /* inicia pin 1, como Salida Digital */
GPIO_Init(GPIOB, &GPIO_InitStructure); /* cerrar configuración */

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /*siguiente pin como Entrada Digital en modo Flotación */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; /* inicia pin 2 como Entrada Digital */
GPIO_Init(GPIOB, &GPIO_InitStructure); /* cerrar configuración */

__________________________________

Utilizar las Salidas Digitales

Una vez ya tenemos configurado uno o más pines como Salida Digital, podemos utilizarlo de distintas maneras

GPIO_WriteBit(GPIOB, GPIO_Pin_x,Bit_SET); /* Activa el pin x del puerto B */
GPIO_WriteBit(GPIOB, GPIO_Pin_x,Bit_RESET); /* Desactiva el pin x del puerto B */
GPIO_SetBits(GPIOB, GPIO_Pin_x); /* Activa el pin x del puerto B */
GPIO_ResetBits(GPIOB, GPIO_Pin_x); /* Desactiva el pin x del puerto B */


En estas órdenes se puede utilizar el operador "|" para añadir más de un pin a la operación. Por ejemplo:

GPIO_WriteBit(GPIOB, GPIO_Pin_x|GPIO_Pin_y,Bit_SET); /* Activa los pines x e y del puerto B */
GPIO_WriteBit(GPIOB, GPIO_Pin_x|GPIO_Pin_y,Bit_RESET); /* Desactiva los pines x e y del puerto B */
GPIO_SetBits(GPIOB, GPIO_Pin_x|GPIO_Pin_y); /* Activa los pines x e y del puerto B */
GPIO_ResetBits(GPIOB, GPIO_Pin_x|GPIO_Pin_y); /* Desactiva los pines x e y del puerto B */


Utilizando GPIO_Pin_ALL en vez del GPIO_Pin_x, la operación de activar o desactivar afecta a todos los pines que estén iniciados. Por ejemplo:

GPIO_WriteBit(GPIOB, GPIO_Pin_All, Bit_SET); /* Activa todos los pines iniciados del puerto B */
GPIO_WriteBit(GPIOB, GPIO_Pin_All, Bit_RESET); /* Desactiva todos los pines iniciados del puerto B */

GPIO_SetBits(GPIOB, GPIO_Pin_ALL); /* Activa todos los pines iniciados del puerto B */
GPIO_ResetBits(GPIOB, GPIO_Pin_ALL); /* Desactiva todos los pines iniciados del puerto B */


__________________________________

Utilizar las Entradas Digitales

Las Entradas Digitales no tienen tanta variedad, al menos en lo referente a órdenes que podamos utilizar en este estadio. La función siguiente asigna a una variable el valor binario 1 - 0 del pin configurado como entrada digital.

valor = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_x); /* Lee estado (1-0) del Pin x del puerto B y lo carga en la variable "valor" */

Hay también una serie de órdenes que afectan a puertos completos, tanto de lectura como de escritura, pero en la placa Mini-STM32 no hay ningún puerto en que todos sus pines estén disponibles, ya que muchos de ellos son utilizados para manejar el hardware propio, así que de momento no las tendremos en cuenta.

Patillaje completo del microcontrolador STM32F103VC, mostrando los 5 puertos, los pines utilizados y los disponibles

Imagen

Los pines libremente disponibles en la placa Mini-STM32 son un total de 31:

Puerto A 5 pines (PA0, PA1, PA2, PA3, PA8)
Puerto B 8 pines (PB8, PB9, PB10, PB11, PB12, PB13, PB14, PB15)
Puerto C 8 pines (PC0, PC1, PC2, PC3, PC4, PC5, PC6, PC7)
Puerto D 3 pines (PD6, PD12, PD13)
Puerto E 7 pines (PE0, PE1, PE2, PE3, PE4, PE5, PE6)

Habría también una serie de pines de utilización alternativa con usos internos que estarían condicionados al circuito fijo de cada uno de ellos, el cual deberá ser consultado en el esquema para valorar su compatibilidad con cualquier con otro circuito exterior que añadamos. Estos pines son un total de 19:

Puerto A 5 pines (PA11, PA12, PA13, PA14, PA15)
Puerto B 6 pines (PB0, PB1, PB2, PB3, PB4, PB7)
Puerto C 6 pines (PC8, PC9, PC10, PC11, PC12, PC13)
Puerto D 2 pines (PD2, PD3)
Puerto E 0 pines

Continuará...

PD: El mismo texto puede verse en forma de página web en:
http://sites.google.com/site/anilandro/06156-mstm32-04
Avatar de Usuario
por
#287732
Hola, no sé si has visto mi mensaje anterior. Te decía que es mejor darle otro formato a toda esta información, así va a ser poco 'usable'. Podrías recopilar todo en un documento pdf y colgarlo dentro de la sección Artículos técnicos del portal. Contacta conmigo vía MP o email.
Palabras clave
Temas similares

Usuarios navegando por este Foro: Google [Bot] y 0 invitados

Permisos de mensaje

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro