Programación STM32. STM32 - microcontrolador para principiantes según plataformas Arduino para programación en c stm32

09.02.2022

Lo mejor es empezar a familiarizarse con cualquier cosa con instrucciones. En algunos casos, todo está claro y, en otros, "hmm, nada funciona, parece que aún necesitas leer las instrucciones". Los microcontroladores son dispositivos bastante complejos y ciertamente no puedes hacer nada útil con ellos sin leer la documentación, aunque...

Después de algunos AVR, es posible que experimente una ligera sorpresa ante la cantidad de archivos PDF diferentes para los microcontroladores STM32. ¿Dónde buscar primero? ¿Cómo usarlo? ¿Qué está pasando más? A primera vista nada está claro. Por eso, decidí hacer un pequeño repaso al mundo de la documentación de estos maravillosos microcontroladores. Pondré especial énfasis en el STM32F103C8T6, ya que planeo escribir varias lecciones sobre el uso de esta piedra en particular.

Los principales documentos para los STM son los siguientes:

  1. Ficha de datos
  2. Manual de referencia
  3. Manual de programación
  4. Hoja de erratas

Ficha de datos

La Hoja de Datos contiene información sobre la presencia de ciertos periféricos en un MK particular, distribución de pines, características eléctricas y marcas de chips para STM32F103x8 y STM32F103xB, es decir, para estos, que están encerrados en un rectángulo rojo:

En pocas palabras, una hoja de datos para 8 microcontroladores.

Conceptos básicos de la hoja de datos

En primer lugar, debes prestar atención a la sección. 7.Esquema de información de pedidos, en el que se indica, representa cada carácter de la marca. Por ejemplo, para STM32F103C8T6: paquete LQFP-48, flash de 64 Kb, rango de temperatura de –40 a 85 °C.

La principal diferencia entre los microcontroladores de diferentes columnas es el número de patas y el volumen del flash, todo lo demás es igual. Una pequeña excepción es la columna de la primera versión. tx: Estos microcontroladores tienen menos módulos SPI, I2C y USART. La numeración de periféricos comienza desde uno: es decir, si está en STM32F103 cx tenemos 2 SPI, luego tienen los nombres SPI1 y SPI2, y en STM32F103 tx Solo tenemos SPI1. Dado que tenemos una hoja de datos para los microcontroladores STM32F103x8 y STM32F103xB, esta tabla es válida solo para estos modelos. Por ejemplo STM32F103 C8 o STM32F103 C.B. corresponden a esta tabla, y STM32F103 C6 no, hay una hoja de datos separada para ello.

en el capitulo 2.2 Compatibilidad total en toda la familia Se dice que los dispositivos STM32F103xx son software, funcionales y compatibles pin a pin (para los mismos casos).

En el manual de referencia hay una división en los siguientes "tipos" de microcontroladores: STM32F103x4 y STM32F103x6 se designan como dispositivos de baja densidad , STM32F103x8 y STM32F103xB como dispositivos de densidad media , STM32F103xC, STM32F103xD y STM32F103xE como dispositivos de alta densidad . Los dispositivos de baja densidad tienen menos memoria Flash y RAM, temporizadores y periféricos. Los dispositivos de alta densidad tienen más memoria Flash y RAM, y también cuentan con periféricos adicionales como SDIO, FSMC, I2S y DAC, sin dejar de ser totalmente compatibles con otros miembros de la familia STM32F103xx. Es decir, si en alguna etapa del desarrollo quedó claro que el microcontrolador seleccionado no es suficiente para implementar todas las capacidades, entonces puede elegir con seguridad una piedra más sofisticada sin tener que reescribir todo el software existente, y si la nueva piedra está disponible En el mismo caso, entonces no es necesario volver a cablear la placa de circuito impreso.

Manual de referencia

Vamonos. El manual de referencia contiene una descripción detallada de todos los periféricos, registros, compensaciones, etc. Este es el documento principal que se utiliza al crear firmware para un microcontrolador. El manual de referencia está compilado para un gran grupo de microcontroladores, en nuestro caso para todos los STM32F10xxx, a saber, STM32F101xx, STM32F102xx, STM32F103xx y STM32F105xx/STM32F107xx. Pero STM32F100xx no está incluido en este RM, hay uno para ellos.

Lo principal en el manual de referencia.

Como se mencionó anteriormente, en el manual de referencia existe una división en los siguientes “tipos” de microcontroladores: de baja, media, alta densidad y conectividad.
línea. EN 2.3 Glosario explicó quién es quién:

  • Dispositivos de baja densidad Se trata de microcontroladores STM32F101xx, STM32F102xx y STM32F103xx con tamaños de memoria Flash de entre 16 y 32 Kbytes.
  • Dispositivos de densidad media estos son STM32F101xx, STM32F102xx y STM32F103xx, tamaños de memoria flash entre 64 y 128 Kbytes.
  • Dispositivos de alta densidad estos son STM32F101xx y STM32F103xx, tamaños de memoria flash entre 256 y 512 Kbytes.
  • Dispositivos de densidad XL estos son STM32F101xx y STM32F103xx, tamaños de memoria flash entre 768 Kbytes y 1 Mbyte.
  • Dispositivos de línea de conectividad Estos son los microcontroladores STM32F105xx y STM32F107xx.

Nuestro STM32F103C8T6 es un dispositivo de densidad media. Será útil saber esto al estudiar periféricos; por ejemplo, hay secciones separadas sobre RCC para dispositivos de densidad baja, media, alta y XL, y dispositivos de línea de conectividad.

Manual de programación

El Manual de Programación no es un documento imprescindible al inicio del conocimiento de los STM, pero sí muy importante a la hora de estudiar en profundidad estos microcontroladores. Contiene información sobre el núcleo del procesador, el conjunto de instrucciones y los periféricos centrales. Además, esta no es la misma periferia que se describe en el manual de referencia. Incluye:

  • Temporizador del sistema - temporizador del sistema
  • Controlador de interrupción vectorial anidado: controlador de interrupción de prioridad
  • Bloque de control del sistema
  • Unidad de protección de memoria

Una vez que comencemos a familiarizarnos con las interrupciones en STM32, necesitaremos una sección 4.3 Controlador de interrupción vectorial anidado (NVIC). Bueno, el temporizador del sistema es algo genial que será útil en algunos RTOS o para crear temporizadores de software.

Hoja de erratas

Errata Sheet es una colección de todos los fallos de hardware conocidos y los problemas de los microcontroladores y consejos sobre cómo solucionarlos. Un documento bastante divertido 🙂 Antes de utilizar cualquier periférico, te aconsejo que le eches un vistazo. Esto puede ayudar a reducir la cantidad de células nerviosas perdidas al depurar su firmware milagroso, que simplemente no quiere funcionar :)

Sistema de sincronización STM32.

Hoy hablaremos sobre el sistema de reloj para microcontroladores STM 32. Si aún no sabes qué es un reloj, su frecuencia y no has tocado los sistemas de reloj antes. Aunque este enlace analiza el sistema de sincronización del microcontrolador AVR, los conceptos definidos en la lección del enlace también son aplicables al sistema de sincronización de los microcontroladores STM 32.

¡Entonces empecemos!

Consideraremos el sistema de sincronización usando el ejemplo del microcontrolador STM 32F 303VCT 6, que está instalado en la placa de depuración STM 32 F 3 DISCOVERY.

Echemos un vistazo a la estructura general del sistema de reloj:

Como podemos ver, el sistema de sincronización STM 32 es un orden de magnitud más complejo que el sistema de sincronización del microcontrolador. AVR, a pesar de que La figura muestra sólo la parte principal.

¡Vamos a averiguar!

El diagrama debe verse de izquierda a derecha. Primero, debemos seleccionar la fuente de reloj principal del controlador. Elegiremos entre HSI y HSE.

HSE-Generador externo de alta frecuencia. La fuente de reloj es una señal de reloj externa (frecuencia de entrada), que, como vemos en el diagrama, puede ser de 4 a 32 MHz. Podría ser un resonador de cuarzo, un generador de reloj, etc.

HSI - Generador interno de alta frecuencia. En los microcontroladores STM 32 F 3, es un circuito RC con una frecuencia de 8 MHz. La precisión es significativamente menor que la del generador HSE externo.

Cada una de estas fuentes de reloj se puede conectar a PLL. Sin embargo, la señal HSI se reducirá en un factor de 2 antes de enviarse al PLL. La señal HSE, a su vez, se puede suministrar al PLL sin cambios, o se puede reducir un cierto número de veces, a petición del usuario.

PLL Reloj - Sistema de bucle de bloqueo de fase (PLL). Le permite multiplicar la señal de entrada HSI o HSE por la cantidad de veces requerida.

Con PLL, la señal se puede enviar al bus del sistema, cuya frecuencia máxima es 72 MHz. Alternativamente, la señal HSE o HSI se puede suministrar directamente al bus del sistema, es decir, sin conversión PLL.

La frecuencia de reloj del sistema SYSCLK sincroniza todos los buses principales del microcontrolador a través de los divisores correspondientes, como vemos en el diagrama anterior. Tenga en cuenta que algunos autobuses tienen una velocidad máxima de reloj inferior a SYSCLK. Por lo tanto, antes de aplicar la señal de reloj SYSCLK al bus, se debe dividir con un divisor apropiado. Si no se hace esto, el microcontrolador se congelará.

Para ajustar el reloj, puede recurrir a la edición manual de registros o utilizar las funciones de la biblioteca. Usaremos la biblioteca.

Configuremos nuestro tablero de depuración. STM 32 F 3 DESCUBRIMIENTO para funcionar a una frecuencia de reloj de 72 MHz.

Creemos y configuremos un proyecto en Keil uVision. .

Agreguemos el siguiente código:

#include "stm32f30x_gpio.h" #include "stm32f30x_rcc.h" void InitRCC() ( RCC_HSEConfig(RCC_HSE_ON); //Habilitar HSE while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //Esperando HSE //Establecer latencia de Flash FLASH ->ACR |= FLASH_ACR_PRFTBE; FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)((uint8_t)0x02);/ /Establezca PREDIV1 como fuente para PLL y establezca PLLMUL=9 RCC_PLLCmd(ENABLE);//Habilite PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//Esperando PLL RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);//Establezca PLL como SYSCLK Soucre RCC_HSICmd(DISABLE);//Desactivar HSI ) int main(void) ( RCC_ClocksTypeDef RCC_Clocks; InitRCC(); RCC_GetClocksFreq (&RCC_Clocks); __NOP (); while (1) ( ) )

#incluir "stm32f30x_gpio.h"

#incluir "stm32f30x_rcc.h"

anular InitRCC()

RCC_HSEConfig(RCC_HSE_ON); //Habilitar HSE

mientras (RCC_GetFlagStatus (RCC_FLAG_HSERDY) == RESET); //Esperando HSE

//Establecer latencia de Flash

FLASH -> ACR |= FLASH_ACR_PRFTBE ;

FLASH -> ACR &= (uint32_t) ((uint32_t) ~ FLASH_ACR_LATENCY);

FLASH -> ACR |= (uint32_t) ((uint8_t) 0x02);

RCC_PREDIV1Config(RCC_PREDIV1_Div1); //PREDIV 1 Divisor = 1

RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); //Establece PREDIV1 como fuente para PLL y establece PLLMUL=9

RCC_PLLCmd(HABILITAR); //Habilitar PLL

mientras (RCC_GetFlagStatus (RCC_FLAG_PLLRDY) == RESET); //Esperando PLL

RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK); //Establece PLL como fuente SYSCLK

RCC_HSICmd(DESACTIVAR); //Desactivar HSI

int principal (vacío)

RCC_ClocksTypeDef RCC_Clocks;

InitRCC();

RCC_GetClocksFreq (& RCC_Clocks);

NOP();

mientras(1)

En la función principal main, se declara una estructura. RCC _ RelojesTipoDef. Esta estructura contiene campos que reflejan la frecuencia de reloj actual de ciertas partes del controlador.

Luego, la función principal llama a la función InitRCC, que ajusta el reloj del controlador. Veámoslo con más detalle.

Equipo RCC _ Configuración HSE (RCC _ HSE _ EN ), habilitamos HSE. Se necesita tiempo para habilitarlo, por lo que debe esperar hasta que se establezca la bandera. RCC _ BANDERA _ HSERDY . Hacemos esto en un bucle mientras (RCC _ Obtener estado de bandera (RCC _ BANDERA _ HSERDY ) == REINICIAR ) .

Luego ajustamos el retraso de la memoria flash. ¡Esto debe hacerse cuando el bus del sistema funciona a frecuencias superiores a 36 MHz!

Después de configurar el retraso, seleccione el PLL del preescalador. Equipo RCC _ PREDIV 1 configuración (RCC _ PREDIV 1_ división 1) configuramos el preescalador a 1. Con el comando RCC _ PLLConfig (RCC _ PLLFuente _ PREDIV 1, RCC _ PLLMul _9 ) seleccione HSE como fuente de frecuencia para el PLL y seleccione multiplicación por 9 veces. Ya sólo queda habilitar PLL con el comando RCC _ PLLCmd (PERMITIR ), y esperar a que se establezca la bandera RCC _ BANDERA _ PLLRDY, en un bucle while. Por lo tanto, proporcionamos el retraso de tiempo necesario para encender el PLL. Después de eso, seleccione PLL como fuente de la frecuencia del sistema SYSCLK con el comando RCC _ Configuración SYSCLK (RCC _ Fuente SYSCLK _ PLLCLK ). No tocaremos los predivisores de los autobuses, por lo que los autobuses AHB, APB 1, APB 2 operarán en frecuencias de 72,36 y 72 MHz, respectivamente.

Ya solo queda apagar la cadena RC interna con el comando RCC _ HSICmd (DESACTIVAR ).

Después de ejecutar la función InitRCC, en el bucle principal del firmware rellenaremos la estructura RCC _ RelojesTipoDef, lo que nos permitirá saber si hemos configurado correctamente el sistema de reloj. Hacemos esto como un equipo RCC_GetClocksFreq(&RCC_Clocks).

Puede ver las frecuencias de reloj del controlador en modo de depuración estableciendo un punto de interrupción en el comando __ NOP () lo que significa un comando vacío. Este comando se agrega a menudo para facilitar la depuración.

Conexión de la placa de depuración DESCUBRIMIENTO STM32 F3, recopile el firmware, actualice la placa y finalmente ingrese al modo de depuración presionando el botón Iniciar / Detener sesión de depuración (Ctrl + F 5). Establecer un punto de interrupción en una función __ NOP, y agregando la estructura RCC _Clocks a Watch, comenzamos a ejecutar el firmware presionando F 5. Como resultado, vemos:

Las frecuencias están ajustadas correctamente y el microcontrolador ahora funciona a 72 MHz.

Entonces, como aprendió en la lección de hoy, el sistema de sincronización STM 32 es lo suficientemente potente y flexible para satisfacer las necesidades de sus proyectos. ¡Al dedicar tiempo a configurarlo, logrará excelentes resultados!

¡Gracias por su atención! Como siempre, ¡tus preguntas están en los comentarios!

Cualquier copia, reproducción, cita del material o partes del mismo está permitida únicamente con el consentimiento por escrito de la administración de MKPROG .RU. ¡La copia, cita y reproducción ilegales están penadas por la ley!

En los últimos años, los microcontroladores (MCU) de 32 bits basados ​​en procesadores ARM han ido conquistando rápidamente el mundo de la electrónica. Este avance se debe a su alto rendimiento, arquitectura avanzada, bajo consumo de energía, bajo costo y herramientas de programación avanzadas.

CUENTO
El nombre ARM es un acrónimo de Advanced RISC Machines, donde RISC (Computadora con conjunto de instrucciones reducidas) significa arquitectura de procesador con conjunto de instrucciones reducidas. La abrumadora cantidad de microcontroladores populares, como las familias PIC y AVR, también tienen una arquitectura RISC, lo que les permite aumentar el rendimiento al simplificar la decodificación de instrucciones y acelerar su ejecución. La aparición de microcontroladores ARM de 32 bits avanzados y productivos nos permite pasar a resolver problemas más complejos que las MCU de 8 y 16 bits ya no pueden afrontar. La arquitectura del microprocesador ARM con núcleo de 32 bits y conjunto de instrucciones RISC fue desarrollada por la empresa británica ARM Ltd, que desarrolla exclusivamente kernels, compiladores y herramientas de depuración. La empresa no produce MK, pero vende licencias para su producción. MK ARM es uno de los segmentos de más rápido crecimiento del mercado MK. Estos dispositivos utilizan tecnologías de ahorro de energía, por lo que se utilizan ampliamente en sistemas integrados y dominan el mercado de dispositivos móviles para los que es importante un bajo consumo de energía. Además, los microcontroladores ARM se utilizan activamente en comunicaciones, dispositivos portátiles e integrados donde se requiere un alto rendimiento. Una característica de la arquitectura ARM es el núcleo informático del procesador, que no está equipado con ningún elemento adicional. Cada desarrollador de procesadores debe equipar de forma independiente este núcleo con los bloques necesarios para sus tareas específicas. Este enfoque ha funcionado bien para los grandes fabricantes de chips, aunque inicialmente se centró en soluciones de procesadores clásicas. Los procesadores ARM ya han pasado por varias etapas de desarrollo y son muy conocidos por las familias ARM7, ARM9, ARM11 y Cortex. Este último se divide en subfamilias de procesadores CortexA clásicos, procesadores en tiempo real CortexR y núcleos de microprocesadores CortexM. Fueron los núcleos CortexM los que se convirtieron en la base para el desarrollo de una gran clase de microcontroladores de 32 bits. Se diferencian de otras variantes de la arquitectura Cortex principalmente en el uso del conjunto de instrucciones Thumb2 de 16 bits. Este conjunto combina el rendimiento y la compacidad de las instrucciones ARM y Thumb "clásicas" y fue desarrollado específicamente para trabajar con los lenguajes C y C++, lo que mejora significativamente la calidad del código. La gran ventaja de las MCU construidas sobre el núcleo CortexM es su compatibilidad de software, que teóricamente permite el uso de código de programa en un lenguaje de alto nivel en modelos de diferentes fabricantes. Además de indicar el área de aplicación del núcleo, los desarrolladores de MK indican el rendimiento del núcleo CortexM en una escala de diez puntos. Hoy en día, las opciones más populares son CortexM3 y CortexM4. Las MCU con arquitectura ARM son producidas por empresas como Analog Devices, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Milander. , HiSilicon y otros.
Gracias a la arquitectura optimizada, el coste de los MCU basados ​​en el núcleo CortexM es en algunos casos incluso menor que el de muchos dispositivos de 8 bits. Los modelos "más jóvenes" actualmente se pueden comprar por 30 rublos. para la carrocería, lo que crea competencia para las generaciones anteriores de MK. MICROCONTROLADORES STM32 Consideremos el MCU más asequible y extendido de la familia STM32F100 de STMicroelectronics, que es uno de los principales fabricantes de MCU del mundo. La compañía anunció recientemente el inicio de la producción de un MK de 32 bits que aprovecha las ventajas industriales.
Núcleos STM32 en aplicaciones de bajo coste. Las MCU de la familia de la línea Value STM32F100 están diseñadas para dispositivos donde el rendimiento de las MCU de 16 bits no es suficiente y la rica funcionalidad de los dispositivos "normales" de 32 bits es redundante. La línea de MCU STM32F100 se basa en un núcleo ARM CortexM3 moderno con periféricos optimizados para su uso en aplicaciones típicas donde se usaban MCU de 16 bits. El rendimiento del MCU STM32F100 a 24 MHz es superior al de la mayoría de los MCU de 16 bits. Esta línea incluye dispositivos con varios parámetros:
● de 16 a 128 kbytes de memoria flash de programas;
● de 4 a 8 kbytes de RAM;
● hasta 80 puertos de entrada/salida GPIO;
● hasta nueve temporizadores de 16 bits con funciones avanzadas;
● dos temporizadores de vigilancia;
● ADC de 12 bits de alta velocidad de 16 canales;
● dos DAC de 12 bits con generadores de señales integrados;
● hasta tres interfaces UART compatibles con los modos IrDA, LIN e ISO7816;
● hasta dos interfaces SPI;
● hasta dos interfaces I2C que admiten modos SMBus y PMBus;
● Acceso directo a memoria (DMA) de 7 canales;
● Interfaz CEC (Consumer Electronics Control) incluida en el estándar HDMI;
● reloj en tiempo real (RTC);
● Controlador de interrupciones anidado NVIC.

El diagrama funcional del STM32F100 se muestra en la Figura 1.

Arroz. 1. Arquitectura de la línea MK STM32F100

Una comodidad adicional es la compatibilidad de pines de los dispositivos, que permite, si es necesario, utilizar cualquier MK de la familia con mayor funcionalidad y memoria sin necesidad de modificar la placa de circuito impreso. La línea de controladores STM32F100 se produce en tres tipos de paquetes LQFP48, LQFP64 y LQFP100, con 48, 64 y 100 pines, respectivamente. La asignación de pines se presenta en las Figuras 2, 3 y 4. Estas cajas se pueden instalar en placas de circuito impreso sin el uso de equipos especiales, lo cual es un factor importante en la producción a pequeña escala.


Arroz. 2. MCU STM32 en paquete LQFP48 Fig. 3. MCU STM32 en paquete LQFP64


Arroz. 4. MCU STM32 en paquete LQFP100

STM32F100 es un dispositivo asequible y optimizado basado en el núcleo CortexM3, respaldado por un entorno de desarrollo avanzado para la familia de microcontroladores STM32, que contiene
Bibliotecas gratuitas para todos los periféricos, incluido el control de motores y los teclados táctiles.

DIAGRAMA DE CONEXIÓN STM32F100C4
Consideremos el uso práctico de MK usando el ejemplo del dispositivo STM32F100C4 más simple, que, sin embargo, contiene todos los bloques principales de la línea STM32F100. El diagrama del circuito eléctrico del STM32F100C4 se muestra en la Figura 5.


Arroz. 5. Diagrama de conexión para MK STM32F100C4

El condensador C1 garantiza que el MK se reinicie cuando se enciende la alimentación, y los condensadores C2-C6 filtran el voltaje de suministro. Las resistencias R1 y R2 limitan la corriente de señal de los pines MK. El oscilador interno se utiliza como fuente de reloj, por lo que no es necesario utilizar un cristal externo.


Las entradas BOOT0 y BOOT1 le permiten seleccionar el método de carga del MK al encenderlo de acuerdo con la tabla. La entrada BOOT0 está conectada al bus de potencial cero a través de la resistencia R2, que protege el pin BOOT0 de un cortocircuito cuando se usa como puerto de salida de PB2. Usando el conector J1 y un puente, puede cambiar el potencial en la entrada BOOT0, determinando así cómo se carga el MK: desde la memoria flash o desde el gestor de arranque incorporado. Si necesita cargar el MK desde la RAM, se puede conectar un conector similar con un puente a la entrada BOOT1.
La programación del MK se realiza a través del puerto serie UART1 o mediante programadores especiales: depuradores JTAG o STLink. Este último es parte del popular dispositivo de depuración STM32VLDISCOVERY, que se muestra en la Figura 6. En la placa STM32VLDIS COVERY, el conector de 4 pines del programador (depurador STLink) se denomina SWD. El autor del artículo sugiere programar el MK a través del puerto serie UART1, ya que es mucho más sencillo, no requiere equipo especial y no es inferior en velocidad a JTAG o ST Link. Cualquier computadora personal (PC) que tenga un puerto serial COM o un puerto USB con un conversor USBRS232 puede usarse como dispositivo de control capaz de generar comandos y mostrar los resultados del programa MK, así como también como programador.

Para interconectar el puerto COM de una PC con un MK, es adecuado cualquier convertidor de señales RS232 a niveles de señal lógica de 0 a 3,3 V, por ejemplo, el microcircuito ADM3232. La línea de transmisión TXD del puerto serie del ordenador, después del convertidor de nivel, debe conectarse a la entrada PA10 del microcontrolador, y la línea del receptor RXD, a través de un convertidor similar, a la salida PA9.

Si necesita utilizar un reloj MK no volátil, debe conectarle una batería CR2032 con un voltaje de 3 V y un resonador de cuarzo con una frecuencia de 32768 Hz. Para ello, el MK está equipado con pines Vbat/GND y OSC32_IN/OSC32_OUT. Primero se debe desconectar el pin Vbat del bus de alimentación de 3,3 V.

Los terminales libres restantes del MK se pueden utilizar según sea necesario. Para hacer esto, deben conectarse a los conectores que se encuentran alrededor del perímetro de la placa de circuito impreso del MK, por analogía con los populares dispositivos Arduino y la placa de depuración STM32VLDISCOVERY.


Arroz. 6. Dispositivo de depuración STM32VLDISCOVERY


Esquema del circuito eléctrico STM32VLDISCOVERY.

Por lo tanto, dependiendo del propósito y método de uso del MK, puede conectarle los elementos necesarios para usar otros bloques funcionales y puertos, por ejemplo, ADC, DAC, SPI, I2C, etc. En el futuro, estos dispositivos se analizarán con más detalle.

PROGRAMACIÓN
Hoy en día, muchas empresas ofrecen herramientas para crear y depurar programas para microcontroladores STM32. Estos incluyen Keil de ARM Ltd, IAR Embedded Workbench para ARM, Atol lic TrueStudio, CooCox IDE, GCC y Eclipse IDE. El desarrollador puede elegir el software según sus preferencias. A continuación describiremos el kit de herramientas Keil uVision 4 de la empresa Keil, que admite una gran cantidad de tipos de microcontroladores, tiene un sistema desarrollado de herramientas de depuración y se puede utilizar de forma gratuita con restricciones en el tamaño del código generado de 32 kbytes ( que, de hecho, es el máximo para los microcontroladores considerados).

Inicio fácil y rápido con CooCox CoIDE.

Entonces empecemos. Vaya al sitio web oficial de CooCox y descargue la última versión de CooCox CoIDE. Para descargar es necesario registrarse, el registro es sencillo y gratuito. Luego instale el archivo descargado y ejecútelo.

CooCox CoIDE- un entorno de desarrollo basado en Eclipse que, además de STM32, admite muchas otras familias de microcontroladores: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro, etc. Con cada nueva versión de CoIDE, el La lista de microcontroladores se actualiza constantemente. Después de instalar CoIDE con éxito, ejecute:

Aparecerá la ventana de inicio del Paso 1, en la que debemos seleccionar el fabricante de nuestro microcontrolador. Presione ST y vaya al Paso 2 (seleccionar un microcontrolador), en el que debe seleccionar un modelo específico. Tenemos STM32F100RBT6B, así que haga clic en el modelo correspondiente:

A la derecha, la ventana de Ayuda muestra breves características de cada chip. Después de seleccionar el microcontrolador que necesitamos, pasamos al tercer paso, Paso 3: seleccionar las bibliotecas necesarias para trabajar:

Creemos un proyecto simple para hacer parpadear un LED, como es habitual en el aprendizaje de microcontroladores.

Para hacer esto, necesitamos la biblioteca GPIO; cuando esté habilitada, CoIDE le pedirá que cree un nuevo proyecto. Pulsamos Sí en esta propuesta, indicamos la carpeta donde se almacenará nuestro proyecto y su nombre. Al mismo tiempo, CoIDE conectará al proyecto otros 3 necesarios para que la biblioteca funcione, y también creará toda la estructura necesaria del proyecto:

Otra ventaja de CoIDE es que tiene la capacidad de cargar ejemplos directamente en el entorno de desarrollo. En la pestaña Componentes puedes ver que hay ejemplos para casi todas las bibliotecas, haz clic en GPIO (con 4 ejemplos) y míralos:

Puede agregar sus propios ejemplos allí. Como puede ver en la captura de pantalla anterior, los ejemplos ya contienen código para hacer parpadear el LED GPIO_Blink. Puede hacer clic en el botón Agregar y se agregará al proyecto, pero como un archivo incluido, por lo que lo haremos de manera diferente y simplemente copiaremos el código de ejemplo completo en el archivo main.c. Lo único es reemplazar la línea void GPIO_Blink(void) con int main(void). Entonces, presione F7 (o seleccione Proyecto->Construir en el menú) para compilar el proyecto y... ¡no hubo tanta suerte!

El entorno necesita un compilador GCC, pero no tenemos uno. Por lo tanto, vaya a la página Herramientas GNU para procesadores integrados ARM, seleccione su tipo de sistema operativo a la derecha y descargue la última versión de la cadena de herramientas. Luego ejecutamos el archivo e instalamos la cadena de herramientas gcc. A continuación, en la configuración de CoIDE indicaremos la ruta correcta a la cadena de herramientas:

Presione F7 nuevamente (Proyecto->Construir) y vea que la compilación fue exitosa:

Todo lo que queda es flashear el microcontrolador. Para ello conectamos nuestra placa al ordenador mediante USB. Luego, en la configuración del depurador necesita instalar ST-Link para hacer esto, seleccione Proyecto->Configuración en el menú y abra la pestaña Depurador. Seleccione ST-Link de la lista desplegable y cierre la ventana:

Intentemos flashear el MK. En el menú, seleccione Flash->Descarga de programa (o haga clic en el icono correspondiente en la barra de herramientas) y vea que el MK se ha actualizado correctamente:

Vemos un LED parpadeando en el tablero, creo que no tiene sentido proporcionar un vídeo o una foto, porque... todos lo vieron.

Además, varios modos de depuración funcionan en CoIDE. Para hacer esto, presione CTRL+F5 (o en el menú Depurar->Depurar):

Eso es todo. Como puede ver, configurar y trabajar con CoIDE es muy sencillo. Espero que este artículo te anime a estudiar microcontroladores STM32 muy prometedores y económicos.

¡Doy la bienvenida a nuestro sitio web a todos los amantes de la programación, los microcontroladores y la electrónica en general! En este artículo les contaré un poco sobre lo que haremos aquí, es decir, sobre el curso de capacitación sobre microcontroladores ARM.

Entonces, primero, averigüemos qué necesita saber y poder hacer para comenzar a aprender ARM. Pero, en principio, nada muy complicado y encantador 😉 Por supuesto, la gente suele cambiar a los controladores ARM después de haber jugado lo suficiente con PIC y AVR, es decir, la mayoría de ellos son desarrolladores experimentados. Pero intentaré describir con el mayor detalle y claridad posible todo lo que analizaremos, para que aquellos que decidieron probar suerte en la programación de microcontroladores por primera vez puedan comprender fácilmente el material. Por cierto, si tienes alguna pregunta o si algo simplemente no funciona según lo previsto, escribe en los comentarios, intentaré resolverlo y ayudarte.

Pasemos ahora a cuestiones técnicas) Ya he mencionado varias veces el nombre "Curso de formación ARM", pero, en general, esto no es del todo cierto. No existe un microcontrolador ARM. Hay un controlador con un núcleo ARM(!), pero esto, como ve, todavía no es lo mismo. Así, estos dispositivos son producidos por varias empresas, entre las que destacan STMicroelectronics y NXP Semiconductors. En consecuencia, producen controladores STM y LPC. Opté por el STM32, simplemente me gustaron más =) Es muy cautivador con STM que una vez que hayas tratado con cualquier MK de la línea STM32F10x, no tendrás ningún problema con ningún otro. Una línea, una hoja de datos. Por cierto, hay una gran cantidad de placas de desarrollo caras y no tan caras con controladores STM32, lo cual es muy agradable, aunque al principio depuraremos nuestros programas en un simulador para evaluar las capacidades del controlador antes de comprar hardware. Aquí, por si acaso, está el sitio web oficial de STMicroelectronics.

De alguna manera pasamos sin problemas al tema del compilador, así que diré algunas palabras al respecto. Sin pensarlo dos veces, elegí Keil, sobre todo por el potente simulador incorporado. Puede mirar el UART allí y cualquier registro, e incluso hay un analizador lógico disponible. En una palabra, Keil me dejó en su mayoría impresiones agradables, aunque, por supuesto, hay algunas desventajas, pero no catastróficas. Para que puedas descargar Keil uvision4 de forma segura desde fuera. sitio(). Es cierto que hay uno PERO: el IDE es de pago, pero hay un modo de demostración disponible con un límite de código de 32 kB, que por ahora es más que suficiente para nosotros. Para quienes esto no es suficiente, hay una gran cantidad de grietas para Keil 😉 Todo se instala sin problemas: empujamos más un par de veces y todo se instala perfectamente y funciona sin bailes adicionales con pandereta.

En realidad, eso es todo lo que quería decirte aquí, es hora de pasar de las palabras a la acción, pero eso será en el próximo artículo. ¡Aprenderemos a programar microcontroladores STM32 desde cero!

Recientemente, un colega me enganchó con la idea de crear una casa inteligente e incluso logré encargar docenas de sensores diferentes para mí. Surgió la pregunta sobre la elección. Microcontrolador(en adelante MK) o tableros. Después de buscar un poco encontré varias opciones. Entre ellos estaban arduino(incluidos sus clones, uno de los cuales pedí para mí solo para divertirme) y Plataforma de lanzamiento, pero todo esto es redundante y engorroso (aunque en cuanto a programación es mucho más sencillo, pero no tocaré el tema de los holivars, cada uno tiene sus gustos). Al final, decidí no decidirme por una placa ya preparada, sino tomar solo el MK y hacer todo desde cero. Al final elegí entre Atmel ATtiny (2313), Atmel ATmega(decidí negarme porque no pude encontrarlo por el dinero adecuado), STM32(Cortex en el núcleo BRAZO). Ya había jugado con el adolescente, así que lo tomé para mí. STM32VL-Descubrimiento. Esto se puede llamar una introducción a una serie de artículos sobre STM32. Permítanme hacer una reserva de inmediato: no seré el autor de la mayoría de estos artículos, porque... Recién lo estoy aprendiendo yo mismo, aquí los publico principalmente para mí, para que sea más fácil buscar si olvido algo. ¡Y entonces vámonos!

información general

Microcontroladores familias STM32 Contiene hasta siete puertos de E/S de 16 bits con nombres de PORTA a PORTG. En un modelo específico microcontrolador Sin excepción, están disponibles todos los pines de puerto, cuyo número total depende del tipo de vivienda y se especifica en la Hoja de Datos de la subfamilia correspondiente.

Para habilitar el puerto x, primero debe conectarlo al bus APB2 configurando el bit IOPxEN correspondiente en el registro de habilitación del reloj periférico. RCC_APB2ENR:

RCC->APB2ENR |= RCC_APB2ENR_IOPxEN; // Habilitar el reloj PORTx.

Gestión portuaria STM32 llevado a cabo utilizando conjuntos de siete registros de 32 bits:

  • GPIOx_CRL, GPIOx_CRH– establecer los modos de funcionamiento de cada uno de los bits del puerto como entrada o salida, determinar la configuración de las etapas de entrada y salida.
  • GPIOx_IDR– registro de datos de entrada para leer el estado físico de los pines del puerto x.
  • GPIOx_ODR– el registro de salida escribe datos directamente en el puerto.
  • GPIOx_BSRR– registro de configuración de bits de puerto y reinicio atómico.
  • GPIOx_BSR– registro de reinicio de bits de puerto.
  • GPIOx_LCKR– registro de bloqueo de configuración de pin.

Modos de funcionamiento del pin GPIO

Los modos de funcionamiento de pines individuales están determinados por una combinación de bits. MODO Y CNFy registros GPIOx_CRL Y GPIOx_CRH(en adelante: x es el nombre del puerto, y es el número de bit del puerto).

GPIOx_CRL- registro de configuración de pines 0...7 puertos X:

Estructura de registro GPIOx_CRH estructura similar GPIOx_CRL y está diseñado para controlar los modos de funcionamiento de los pines superiores del puerto (bits 8...15).

Los bits MODEy de los registros especificados determinan la dirección de salida y el límite de velocidad de conmutación en el modo de salida:

  • MODOy = 00: Modo de entrada (estado después del reinicio);
  • MODOy = 01: Modo de salida, velocidad máxima – 10 MHz;
  • MODOy = 10: Modo de salida, velocidad máxima – 2 MHz;
  • MODOy = 11: Modo de salida, velocidad máxima – 50 MHz.

Los bits CNF especifican la configuración de las etapas de salida de los pines correspondientes:

en modo de inicio de sesión:

  • CNFy = 00: Entrada analogica;
  • CNFy = 01: Entrada en tercer estado (estado después del reinicio);
  • CNFy = 10: Entrada con resistencia pull-up (si PxODR=1) o pull-down (si PxODR=0);
  • CNFy = 11: Reservado.

en modo salida:

  • CNFy = 00: Salida push-pull de uso general;
  • CNFy = 01: Salida de drenaje abierto de uso general;
  • CNFy = 10: Salida push-pull con función alternativa;
  • CNFy = 11: Salida de drenaje abierta con función alternativa.

Para aumentar la inmunidad al ruido, todos los buffers de entrada contienen disparadores Schmidt. Parte de las conclusiones STM32, equipados con diodos protectores conectados al bus común y al bus de alimentación, están marcados en la hoja de datos como FT (tolerante a 5 V), compatible con un voltaje de 5 voltios.

Protección de bits de configuración GPIO

Para proteger los bits en los registros de configuración contra escrituras no autorizadas en STM32 se proporciona un registro de bloqueo de configuración GPIOx_LCKR
GPIOx_LCKR- registro de bloqueo de configuración de salida del puerto:

Para proteger la configuración de un pin de puerto individual, se debe configurar el bit LCKy correspondiente. Luego realice una grabación secuencial en la categoría. LCKK valores “1” - “0” - “1” y dos operaciones de lectura de registros LCKR, que en caso de bloqueo exitoso dará por el bit LCKK valores "0" y "1". La protección de los bits de configuración permanecerá vigente hasta el próximo reinicio del microcontrolador.

Archivo de definición de periféricos microcontroladores STM32 stm32f10x.h define grupos separados de registros unidos por un propósito funcional común (incluido GPIO), como estructuras del lenguaje C, y los propios registros como elementos de esta estructura. Por ejemplo:

GPIOC->BSRR– Registro de establecimiento/reinicio del puerto GPIOC BSRR.
Usemos las definiciones del archivo stm32f10x.h para ilustrar cómo trabajar con registros de E/S del microcontrolador. STM32F100RB instalado en el kit de inicio DESCUBRIMIENTO STM32VLD:

#incluye "stm32F10x.h" u32 tmp; int main (void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Habilita el reloj PORTC. GPIOC->CRH |= GPIO_CRH_MODE8; // Salida LED4 PC8 a la salida. GPIOC->CRH &=~GPIO_CRH_CNF8; // Push-pull salida en PC8. GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9|GPIO_LCKR_LCKR;tmp=GPIOC->LCKR;

Escribir y leer GPIO

Los puertos de entrada están pensados ​​para escribir y leer. GPIOx_IDR y dia libre GPIOx_ODR registros de datos.

Escribir en el registro de salida ODR puerto configurado para salida, establece los niveles de salida de todos los bits del puerto de acuerdo con el valor registrado. Si un pin está configurado como entrada pull-up, el estado del bit de registro correspondiente ODR activa el pull-up de la salida al bus de alimentación (pull-up, ODR=1) o al bus general del microcontrolador (pull-down, ODR=0).

Leer registro IDR devuelve el valor de estado de los pines del microcontrolador configurados como entradas:

// Si se presiona el botón (PA0=1), configure los bits del puerto C; de lo contrario, reinicie. si (GPIOA->IDR y GPIO_IDR_IDR0) GPIOC->ODR=0xFFFF; de lo contrario GPIOC->ODR=0x0000;

Restablecer y configurar bits de puerto

Para reinicio atómico y conjunto de bits GPIO en microcontroladores STM32 el registro está destinado GPIOx_BSRR. Tradicional para la arquitectura. BRAZO un método de gestión de bits de registro que no requiere el uso de una operación de tipo "leer-modificar-escribir" le permite configurar y restablecer bits de puerto simplemente escribiendo uno en los bits configurados BS (conjunto de bits) y restablecer BR (restablecimiento de bits) registro BSRR. En este caso, escribir cero bits en el registro no afecta el estado de los pines correspondientes.

GPIOx_BSRR– registro para restablecer y configurar bits de puerto:

GPIOC->BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BR9; // Enciende el LED4 (PC8), apaga el LED3. GPIOC->BSRR=GPIO_BSRR_BS9|GPIO_BSRR_BR8; // Enciende el LED3 (PC9), apaga el LED4.

Funciones alternativas GPIO y su reasignación (reasignación)
Casi todos los circuitos externos para fines especiales. STM32(incluidos cables para conectar resonadores de cuarzo, JTAG/SWD y así sucesivamente) pueden habilitarse en los pines correspondientes del microcontrolador, o deshabilitarse desde ellos para permitir su uso como pines de uso general. La selección de una función de salida alternativa se realiza mediante registros con el prefijo "AFIO”_.
Además, se registra AFIO _ le permite seleccionar varias opciones para la ubicación de funciones especiales en los pines del microcontrolador. Esto se aplica en particular a las salidas de las interfaces de comunicación, temporizadores (registros AFIO_MAPR), pines de interrupción externos (registros AFIO_EXTICR) etc.