Sunteți pe pagina 1din 9

Mipixel

el blog de F.J. Snchez

Tutorial JALv2

Empezar con el STM32

Acerca de

Inicio 2010 Noviembre Empezar con el STM32 IV: usando el mdulo GPIO

Buscar en este sitio:


Buscar

Empezar con el STM32 IV: usando el mdulo GPIO


Enviado por F. J. Snchez el Sb, 20/11/2010 - 19:16. ARM CooCox Cortex-M3 STM32 Lo primero que a cualquiera se le ocurrira hacer con una placa de desarrollo es hacer parpadear un led, y eso es lo que yo voy a explicar aqu. Como entorno de desarrollo usar CooCox CoIDE en

Sobre m...
Mi nombre es Francisco Javier Snchez, estudio telecomunicaciones y en este blog cuento todo lo que me parece interesante sobre tecnologa y sociedad.

su versin 1.1.0. Lo bueno de este entorno es que ya trae el compilador GCC, las libreras de STMicroelectronics y los ficheros de linkado e inicializacin del microcontrolador, por lo que podemos pasar a escribir nuestro software directamente. Como placa de desarrollo usar la ET-STM32F103 que ya coment en otro post.

Nube de etiquetas

ms etiquetas

Tras lanzar el IDE de CooCox nos aparecer una ventana en la que podremos seleccionar el fabricante de nuestro microcontrolador, en nuestro caso ST. Tras eso seleccionaremos el modelo que use nuestra placa de desarrollo, en mi caso es el STM32F103RB.

STMicroelectronics dispone de una librera que nos ayuda a usar y configurar los perifricos de sus microcontroladores. Esta librera se ha incluido en el repositorio de CooCox en forma de mdulos independientes, de manera que podemos ver todos los mdulos, incluir los que vayamos a usar, ver ayuda sobre los mismos, ejemplos, etc. Para nuestro primer ejemplo solo usaremos el mdulo GPIO, as que procedemos a marcarlo. En ese momento veremos que otros mdulos se marcan automticamente, ya que son dependencias. Tambin nos preguntar si queremos crear un proyecto nuevo a lo que le decimos que si.

ltimos comentarios
Hola, muuy interesante la hace 1 da 22 horas Hola a todos, al igual que3 a hace 1 semana 2 das ME DA ESE ERROR EN EL WIDGET hace 1 semana 4 das me re ayudo esto para hace 4 semanas 2 das hola ese telefono sera todo hace 4 semanas 4 das ha y soy de la rep. hace 4 semanas 4 das ha y soy de la rep. hace 4 semanas 4 das hola espero me puedan ayudar hace 4 semanas 4 das Hola, solo una curiosidad ... hace 5 semanas 1 da Yo tambien tengo un G1 Y POR hace 9 semanas 5 das

Bastar con escoger un nombre para nuestro proyecto, que en mi caso ser "ledBlink" y un directorio donde se almacenar. El directorio por defecto en Windows 7 me ha dado problemas, as que he optado por usar un directorio en el que la ruta no contenga caractres extraos.

Una vez hecho esto nos aparecer la ventana del IDE con un montn de ficheros en la parte inferior izquierda. Ah deberemos de localizar uno llamado main.c y hacer doble click para abrirlo. Una vez abierto lo editaremos de forma que tenga el siguiente cdigo:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

#include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" GPIO_InitTypeDef GPIO_InitStructure; int main(){ int ncount; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENAB GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOB, &GPIO_InitStructure); while(1){ GPIO_WriteBit(GPIOB, GPIO_Pin_8,Bit_SET); for(ncount=0; ncount<500000; ncount++); GPIO_WriteBit(GPIOB, GPIO_Pin_8,Bit_RESET for(ncount=0; ncount<500000; ncount++); } return 1; }

Lo primero que hay que saber a la hora de programar uno de estos microcontroladres es cmo funciona el perifrico que queremos usar, al menos grosso modo. Los perifricos en esta familia de microcontroladores estn conectados bien a un bus llamado Advanced High-Performance Bus (AHB) o al Advanced Peripheral Bus (APB). El APB se divide en 2, el APB1 de baja velocidad (36MHz mx.) y el APB2 de alta velocidad (72MHz mx.). Los perifricos ms comunes estn conectados a uno de estos buses y por defecto estn desactivados para no consumir energa. Para activarlos lo que tendremos que hacer es activarles la seal de reloj usando la funcin RCC_APB1PeriphClockCmd(), RCC_APB2PeriphClockCmd() o RCC_AHBPeriphClockCmd(); segn al bus al que est conectado nuestro perifrico. En nuestro caso usaremos el perifrico I/O port B que se encuentra conectado al APB2. La pregunta es, cmo se yo a qu bus est conectado el perifrico que quiero usar? La respuesta la podemos encontrar en el Reference Manual de la familia STM32F. Pero claro, son ms de 1000 pginas y a veces cuesta... Por suerte CooCox nos lo pone un poco ms fcil, si escribimos el nombre de cualquier funcin sin parmetros y luego ponemos el puntero sobre la funcin, aparecer un cuadro de texto en el que se muestran los posibles argumentos de la funcin, as como una descripcin de lo que hace (cortesa de STMicroelectronics).

En la imagen podemos ver cmo en el APB1 hay perifricos como los timers del 2 al 7, los SPI 2 y 3, las USART del 2 al 5, etc. Ojo, eso no quiere decir que nuestro microcontrolador tenga todos esos perifricos, sino que esa funcin acepta esos argumentos como parmetros. En mi caso por ejemplo uso un microcontrolador que se engloba dentro de los Medium density performance line. Podemos encontrar en el datasheet de esta categora los perifricos que si tiene y los que no (columna STM32F103Rx).

Una vez que sabemos que tenemos los puertos A,B y C (y algn pin del D) podemos proceder a activar el B, ya que es al que hay conectados algunos leds. Concretamente estn conectados a travs de un driver que suministra la corriente necesaria para que se enciendan. La conexin a los leds est hecha con lgica positiva tal y como podemos ver en los esquemas de la placa.

Ahora ya tenemos activado el perifrico (linea 9) y toca configurarlo. La librera de STMicroelectronics proporciona una estructura para cada tipo de perifrico, una funcin que da valores por defecto a esa estructura y una funcin que usa esa estructura para configurar un perifrico. En el caso de los perifricos de I/O el tipo de dato de la estructura se llama GPIO_InitTypeDef, la funcin que da valores por defecto GPIO_StructInit() y la que inicializa el perifrico GPIO_Init(). La nomenclatura es estandar a otros perifricos, pero eso se ver en otra ocasin. La estructura GPIO_InitTypeDef tiene 3 campos: GPIO_Pin, GPIO_Speed y GPIO_Mode. GPIO_Pin: hace referencia al pin que queremos inicializar. Podemos usar los valores GPIO_Pin_[0-15] y GPIO_Pin_All. Tambin podemos usar el operador | (OR) para inicializar distintos pines, por ejemplo: GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_4. GPIO_Speed: definimos la velocidad mxima a la que trabajar nuestro pin y puede ser GPIO_Speed_2MHz, GPIO_Speed_10MHz o GPIO_Speed_50MHz. GPIO_Mode: una de las cosas que puede sorprender a los que vengan de microcontroladores de 8 bits de gama baja, es la cantidad de posibilidades que nos da un simple pin de este micro. Para las entradas podemos configurar el pin con uno de estos valores: GPIO_Mode_IN_FLOATING, GPIO_Mode_IPD o GPIO_Mode_IPU, segn si queremos usar entrada flotante, con pull-down o pull-up. Para las salidas podemos optar por GPIO_Mode_Out_OD o GPIO_Mode_Out_PP segn si queremos que sea a drenador abierto o push-pull. Hay otros valores que se usan cuando vamos a usar una funcin alternativa del pin, pero de momento voy a omitirlos. En el cdigo de ejemplo se ha configurado solo el pin 8 a 50MHz y como salida push-pull. Lo siguiente es llamar a la funcin GPIO_Init() para que inicialice el perifrico con los datos de la estructura. Para ello pasamos como primer argumento el puerto en el que queremos aplicar esta configuracin y como segundo le pasamos la estructura por referencia (usando el operador & delante del nombre de la variable).

Con esto ya tenemos el puerto y el pin configurados, y podemos pasar a usar dicho pin. Para ello he creado un bucle infinito en el que se hace siempre lo mismo, se escribe un 1 lgico en el pin, se ejecuta un bucle largo para que haya un retraso, se pone un 0 lgico en el pin y se vuelve a a ejecutar un bucle largo para que haya otro retraso. De aqu solo cabe mencionar que podemos usar distintas funciones para modificar el valor de los pines de salida. GPIO_SetBits(GPIOx, GPIO_Pin_x): esta funcin pone a 1 el pin o los pines que especifiquemos en el puerto que especifiquemos. GPIO_ResetBits(GPIOx, GPIO_Pin_x): igual que la anterior, pero los pone a 0. GPIO_Write(GPIOx, PortVal): nos permite asignar un valor de 16 bits al puerto que queramos, as podemos dar valor a los 16 pines con una sola funcin. GPIO_WriteBit(GPIOx, GPIO_Pin, BitVal): nos permite dar un valor (Bit_RESET o Bit_SET) a un solo pin de un puerto concreto. Como vemos, tenemos muchas alternativas para hacer una misma cosa lo que nos da flexibilidad a la hora de hacer nuestro cdigo. El resto creo que sobra explicarlo, ya que con lo anterior debera de quedar todo claro. Ahora guardamos el fichero pulsando sobre el icono de guardar y despus simplemente hacemos click en el botn "Build" ( todo algo como lo de la imagen. ) o F7. Si todo ha ido bien deberemos de ver en una seccin abajo del

Tras esto lo siguiente ser subir el cdigo a la placa. En mi caso usar el programa de STMicroelectronics "Flash Loader Demonstrator" y el puerto USART1 (Download) de la placa que es en el que el bootloader del microcontrolador responde. Configuramos la aplicacin con los datos de nuestro puerto serie, pulsamos el botn BOOT0 (led rojo encendido) para que al resetear la placa entre en modo bootloader, pulsamos reset y pulsamos siguiente en la aplicacin Flash Loader Demonstrator. Volvemos a pulsar siguiente hasta que nos aparezca algo como esto:

Ah se puede apreciar la ruta a seguir para encontrar el archivo que tenemos que cargar (...\ledBlink\Debug\bin\ledBlink.bin) y las opciones que hay que marcar, pulsamos siguiente y si todo ha ido bien debera de aparecer una barra cargando y que al acabar se pondr de color verde. Ahora volvemos a cambiar de posicin el botn BOOT0 (led rojo apagado) y reseteamos la placa. El led PB8 debera de parpadear. Eso es todo por ahora. Quien quiera puede probar a usar el resto de leds, a conectar otros elementos a algn pin (recordad, salida a 3.3V) o incluso a probar a usar alguna entrada usando la ayuda de CooCox. La prxima parte ser sobre cmo usar el puerto serie y los pines como entradas. Empezar con el STM32 III: Placas de desarrollo blog de F. J. Snchez arriba

Que tal Francisco Javier


Enviado por Cesar David Revelo Apraez (no verificado) el Mi, 22/06/2011 - 23:39. Que tal Francisco Javier Sanchez, soy estudiante de ultimo semestre en Ingenieria Electronica, y me ha parecido muy interesante lo que has subido en tu blog acerca del STM 32, mira que estoy adelantando un trabajo de grado y mi idea es disenar un prototipo de un osciloscopio digital portable basado en una plataforma ARM CORTEX M3, aunque soy principiante en esto, agradeceria infinitamente tu ayuda con respecto a la utilizacion de los diferentes modulos que nos brinda la placa de desarrollo ETSTM32F103 (manejo de perifericos, puerto serial, puerto usb, conversores, adquisicion de senales, etc).

espero tu colaboracion en este proyectpo que quiero desarrollar.

responder

Enviar un comentario nuevo


Su nombre: *
Annimo

Correo electrnico: *
El contenido de este campo se mantiene privado y no se mostrar pblicamente. If you have a Gravatar account associated with the e-mail address you provide, it will be used to display your avatar.

Pgina principal:

Comentario: *

Path:

Disable rich-text Ms informacin sobre opciones de formato

Guardar

Vista previa

S-ar putea să vă placă și