Introducción a la MCU STM32F103C8T6

1. Introducción

        STM32F103C8T6 es un microcontrolador de 32 bits basado en el núcleo Cortex-M3 lanzado por STMicroelectronics (ST).El hardware adopta el paquete LQFP48 y pertenece a la serie STM32 de microcontroladores ST. Además del conocido STM32, ST también tiene la serie SPC5X, la serie STM8, etc. Los parámetros específicos son los siguientes:

núcleo Corteza-M3
Destello 64K x 8 bits
LÁSTIMA 20K x 8 bits
GPIO 37 GPIO, a saber, PA0-PA15, PB0-PB15, PC13-PC15, PD0-PD1
ADC

2 ADC de 12 bits en total 12 canales, canales externos : PA0 a PA7+PB0 a PB1,

Canales internos : canal de sensor de temperatura ADC_Channel_16 y canal de voltaje de referencia interno ADC_Channel_17

Temporizadores

                        4 temporizadores/contadores de 16 bits, a saber, TIM1, TIM2, TIM3, TIM4

                                TM1 con inserción de tiempo muerto, a menudo utilizado para generar motores de control PWM

2 temporizadores de vigilancia (vigilancia independiente IWDG, vigilancia de ventana WWDG)
1 sysstick de temporizador de tictac de 24 bits contando hacia atrás
Voltaje de trabajo, temperatura 2V~3.6V、-40°C ~ 85°C
Puerto serie de comunicación

                                        2 * IIC, 2 * SPI, 3 * USART, 1 * CAN

reloj del sistema El reloj interno de 8 MHz HSI se puede multiplicar hasta 64 MHz, y el reloj externo de 8 MHz HSE se puede multiplicar hasta 72 MHz

        ARM cambió el nombre a Cortex después de ARM11 y lo dividió en tres categorías: A, R y M. La serie M incluye M0, M0+, M3, M4 y M7. Cortex-M3 es un núcleo MCU basado en la arquitectura ARMv7 lanzado por la empresa ARM. La empresa ST completó el diseño de circuitos periféricos como USART, DMA y GPIO sobre la base de este núcleo. El STM32 desarrollado bajo diferentes núcleos de la serie M se puede dividir aproximadamente en tres partes: serie de bajo consumo, serie principal y serie de alto rendimiento. La información específica se muestra en la siguiente figura:

        Los núcleos de la misma serie son generalmente los mismos.Por ejemplo, la serie F1 se desarrolla con el núcleo Cortex-M3, pero según el tamaño del Flash, el STM32 se puede dividir en productos de pequeña capacidad (<64K), productos de capacidad media (entre 64 000 y 128 000) y productos de gran capacidad3 Cada parte del producto de capacidad necesita usar diferentes archivos de inicio cuando se usa la biblioteca estándar SPL para desarrollarla y modificarla en el lugar precompilado. La información específica se muestra en la siguiente figura:

        Toda la estructura del sistema de STM32F103C8T6 se puede dividir en el núcleo Cortex-M3 diseñado por ARM y la matriz de bus optimizada por ST sobre esta base, DMA (acceso directo a memoria, lectura directa de memoria), AHB, APB1 y dispositivos externos montados en APB2 Hay dos partes, la estructura detallada se muestra en la siguiente figura:

        Cortex-M3 abandona la estructura de von Neumann (estructura de Princeton) y adopta la Arquitectura de Harvard (Arquitectura de Harvard ) que separa el almacenamiento de instrucciones y el almacenamiento de datos , de modo que Cortex-M3 también tiene un bus de instrucciones de 32 bits independiente y un bus de datos de 32 bits, el acceso a los datos ya no ocupará el bus de instrucciones, y la velocidad de funcionamiento de la MCU mejora después de leer las instrucciones y los datos al mismo tiempo. En la siguiente figura se muestra una comparación macro de las estructuras de von Neumann y Haval :
        Cortex-M3 es un núcleo de procesador de 32 bits, por lo que STM32 se denomina microcontrolador de 32 bits. Tiene 32 buses de direcciones, lo que significa que el espacio máximo de direccionamiento es 2^{32}=2^{2}*2^{30}=4 GByte. Además, los registros de Cortex-M3 son de 32 bits y la interfaz de memoria también es de 32 bits. La estructura detallada se muestra en la siguiente figura:

-------------------------------------------------- -------------------------------------------------- ---------------------------

Haga clic para saltar: materiales de aprendizaje relevantes (CSDN)

Disco de red de Baidu: https://pan.baidu.com/s/1ok8i8YeiNITmnNs-QEPVqw Código de extracción: 1234

-------------------------------------------------- -------------------------------------------------- ----------------------------

2. Placa base mínima

        Tal vez haya escuchado a menudo la palabra placa base mínima , entonces, ¿qué es la placa base mínima? De hecho, la placa del sistema más pequeña es el circuito más optimizado, que solo puede mantener el funcionamiento normal más básico de la MCU. El sistema mínimo generalmente se compone de un circuito de reinicio externo, un circuito de reloj externo y el cuerpo de la MCU. Además, no hay otros dispositivos externos como Bluetooth, EEPROM externa, chip de reloj DS1302 y pantalla de interfaz SPI. (Nota: STM32 es compatible con el reloj interno y el reinicio de encendido, pero en el sentido tradicional, el sistema mínimo se compone de un circuito de reinicio externo, un circuito de reloj externo y un cuerpo de MCU). Compré una placa de sistema mínima de STM32F103C8T6 en Taobao. El diseño es exquisito Bueno, se ve así:

        Si aún no sabe mucho sobre el sistema mínimo, entonces puede ver que el sistema mínimo está realmente simplificado y no se puede simplificar más.

        De hecho, la placa del sistema mínima comprada por Taobao no es muy diferente de la placa del sistema mínima azul de 10 billeteras, pero se extraen algunos pines para que puedan insertarse en periféricos como pantallas de visualización. El diseño de la placa es muy inteligente, todos los pines están extraídos y cuatro interfaces están reservadas para facilitar el acceso a la pantalla y otros equipos, y la interfaz de depuración SWD está reservada y ST-LINK se puede usar para descargar programas y emulaciones.

        A diferencia del microcontrolador STC89C52RC, el GPIO del STM32F103C8T6 tiene 8 modos, incluidos los modos de entrada pull-up y pull-down, por lo que las resistencias pull-up y pull-down no se pueden diseñar cuando se conectan botones. De acuerdo con su diagrama esquemático, un extremo de la tecla KEY0 está conectado a 3.3V VCC y el otro extremo está conectado al pin PA0. Un extremo del diodo emisor de luz LED0 también está conectado a VCC de 3,3 V a través de una resistencia de 1 KΩ y el otro extremo está conectado a PC13. Por lo tanto, si desea que el diodo emita luz, debe hacer que la salida de PC13 sea de bajo nivel. El voltaje operativo máximo de STM32 es de 3,6 V, y se usa un LDO (regulador lineal de caída baja) para reducir el voltaje de entrada VIN a 3,3 V para alimentar el microcontrolador. Cuatro condensadores de derivación de 0,1 uf entre 3,3 V y GND (eliminación de señales de CA de alta frecuencia) están conectados a los 4 VDD y 4 VSS del chip (¿QUÉ? ¿Por qué el chip tiene cuatro VDD y cuatro VSS? Supongo que debería ser para mejorar la capacidad de la fuente de alimentación para garantizar la fiabilidad de la fuente de alimentación).

3. Reglas de nomenclatura

        Encontré el manual chino STM32F103 en Internet. El principio de nomenclatura del microcontrolador se muestra en la siguiente figura:

4. Disposición de pines y multiplexación de pines

        De acuerdo con las reglas de nomenclatura, la C en STM32F103 C 8T6 representa que este chip tiene 48 pines, y su disposición de pines se muestra en la siguiente figura:

        El microcontrolador STM32 tiene funciones ricas, y solo 48 pines no son suficientes para asignar todas las funciones, por lo que algunos pines pueden realizar varias funciones, lo que se denomina multiplexación de pines. En términos generales, la primera función de la mayoría de los pines es GPIO (entrada y salida de propósito general). Pero vale la pena señalar que las funciones predeterminadas de PA13, PA14, P15, PB3, PB4, PC14, PC15, PD0 y PD1 no son GPIO, y el reloj AFIO debe estar encendido al usarlos. Preste atención a esto. Un UP en la estación B hizo una imagen intuitiva, como se muestra a continuación:

Fuente de la imagen: Cuenta pública "Aprendizaje de desarrollo electrónico"

        Las funciones predeterminadas de los pines del microcontrolador de la serie STM32F103 proporcionadas por el manual oficial se muestran en la siguiente figura:

5. Descarga del programa

        STM32 MCU admite 3 métodos de descarga de programas, que se pueden dividir en descarga de puerto serie ISP (usando USB-TTL para conectarse a PA9, PA10), descarga SWD (usando ST-LINK para conectarse a PA13, PA14), descarga JTAG (usando JLINK para conectar a PA13, PA14, PA15, PB3, PB4).

1. Descarga del ISP

        Todo el proceso de ISP es programación en el sistema, lo que significa programación del sistema en línea. El microcontrolador STM32 generalmente se puede programar a través del pin UART1. Al programar, debe cooperar con BOOT0 y BOOT1 para estar conectado a tierra o no. BOOT0 y BOOT1 se pueden combinar en cuatro estados. El significado de las diferentes posiciones se muestra en la siguiente figura, donde X es un elemento irrelevante.

        Antes de usar el puerto serie ISP para descargar, debe usar una tapa de puente para acortar BOOT0 a la posición 1 y BOOT1 a la posición 0 antes de encender el microcontrolador, es decir, el modo de memoria del sistema, y ​​​​luego se puede descargar el programa a través del puerto serie. Una vez que se completa la descarga del puerto serial del ISP, se apaga la alimentación. Antes de encender el microcontrolador, es necesario usar una tapa de puente para acortar BOOT0 a la posición 0, es decir, el modo de memoria flash principal.

        Debido al protocolo de comunicación de nivel TTL utilizado por la microcomputadora de un solo chip, se requiere un chip de serie a serie para la comunicación en serie con el puerto USB de la computadora. Los más comunes son la serie CH340 (como CH340N), FT232, PL2303 , etc. La siguiente figura toma CH340T como ejemplo.

        El GND del descargador está conectado al GND de la microcomputadora de un solo chip (conectar uno), los 3.3V del descargador están conectados a los 3.3V de la microcomputadora de un solo chip (o los 5V del descargador están conectados al VIN de la microcomputadora de un solo chip), el RXD del descargador está conectado a la microcomputadora de un solo chip PA9 (U1TX), y el descargador TXD está conectado a la microcomputadora de un solo chip PA10. (U1RX) está conectado.

        Después de comprender el cableado, puede intentar compilar y descargar. Hay una gran cantidad de software de descarga, ST lanzó oficialmente el software Flash Loader Demonstrator para la descarga de programas, y también hay un software de descarga FLYMCU en China.

Demostrador de cargador flash

2. Descarga SWD

        Para descargar usando la interfaz SWD, solo necesita conectar 3.3V (si la placa para programar el programa viene con su propia fuente de alimentación, no es necesario conectar el pin de 3.3V), GND, SWDIO (PA13), SWCLK ( PA14), RST (conexión no esencial), puede comprar más de diez piezas de ST-LINK downloader de Taobao (esta forma de disco U en realidad no es producida por la compañía ST, pero puede usarse después de grabar su firmware). El uso de la interfaz SWD no solo puede programar la programación, sino también realizar una simulación en línea (depuración).El proceso de simulación puede monitorear datos como registros, lo cual es muy adecuado para el desarrollo de software (encontrar problemas). Vale la pena señalar que ST-LINK/V2 solo admite programas de grabación para sus propios STM32 y STM8, y no admite programas de grabación para MCU de otras empresas (incluso si también están equipados con núcleos Cortex-M3).

ST-LINK/V2

3. Descarga JTAG

        La interfaz JTAG necesita usar TMS (selección de modo), TCK (reloj), TDI (entrada de datos), TDO (salida de datos), nTRST (restablecer, no es necesario), correspondiente a STM32F103C8T6 es PA13 (TMS), PA14 (TCK ), PA15 (TDI), PB3 (TDO), PB4 (nTRST), la primera función de estos pines es la interfaz JTAG, por lo que estos pines no se pueden usar simplemente como GPIO. Al usar la descarga JTAG, puede usar el descargador J-LINK (el SEGGER J-LINK genuino es más caro y se recomienda la imitación doméstica para comprar la versión V9 o superior), o puede usar la imitación doméstica o original de la compañía ST ST-LINK con interfaz JTAG /V2 (como lo introdujo Punctual Atomic, pero aún caro, woohoo). Sin embargo, las funciones que puede realizar JTAG también pueden ser realizadas por SWD en general.Soy perezoso y generalmente no uso esta interfaz de descarga.

ENLACE J
ST-LINK/V2

        Si no necesitamos usar la descarga de JTAG, pero los recursos de GPIO son escasos o el diseño de PCB ya usó estos pines cuya primera función es JTAG, entonces debemos desactivar JTAG. Por ejemplo, si quiero usar GPIOA15 como puerto GPIO, entonces el nivel de código debe implementarse así:

    GPIO_InitTypeDef GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能PORTA时钟
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);// 关闭JTAG但使能SWD
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

Método de cierre detallado: vea la "Depuración de STM32 JTAG" de otro blogger

6. RTT

        El nombre completo de RTT es Real Time Transfer, que se traduce como transmisión en tiempo real. ¿Por qué presentarles esto? Se mencionó anteriormente que J-LINK, ST-LINK, etc. pueden descargar programas y también pueden simular en línea. Entonces, la pregunta es, ¿admiten directamente la comunicación en serie? ¡La respuesta es no! ! ! Pero no entre en pánico, en respuesta a este problema, SEGGER ha lanzado una tecnología de memoria compartida.Esta función puede evitar la necesidad de usar un USART externo para la prueba de datos en serie, lo cual es muy conveniente. Sin embargo, dado que SEGGER lanza RTT, esto requiere el uso de depuradores J-LINK V8 y superiores.Si no eres malo, puedes darle prioridad a J-LINK. RTT admite todas las MCU con núcleos ARM Cortex-M0/M0+/M1/M3/M4/M7/M23/M33, sin limitarse a STM32.

Sitio web oficial de SEGGER

         Sin embargo, para usar la función RTT, debe agregar el código fuente proporcionado por SEGGER al archivo del proyecto. El paquete de instalación del sitio web oficial: " data-link-title="<descarga del sitio web oficial>"><descarga del sitio web oficial> Para tutoriales detallados de instalación y uso, consulte la información de "Tough Guy" compartida por hermano" .

        Después de importar el código fuente, puede utilizar las siguientes funciones en el programa. Estas funciones son fáciles de conocer según la descripción:

Nombre de la función describir
SEGGER_RTT_Lectura() Leer datos de un búfer de entrada.
SEGGER_RTT_Escribir() Escribir datos en un búfer de salida.
SEGGER_RTT_WriteString() Escriba una cadena terminada en cero en un búfer de salida.
SEGGER_RTT_printf() Escriba una cadena formateada en un búfer de salida.
SEGGER_RTT_GetKey() Obtenga un carácter del búfer de entrada 0.
SEGGER_RTT_HasKey() Compruebe si un carácter está disponible en el búfer de entrada 0.
SEGGER_RTT_WaitKey() Espere a que un carácter esté disponible en el búfer de entrada 0 y obténgalo.
SEGGER_RTT_ConfigUpBuffer() Configure un búfer activo (de salida).
SEGGER_RTT_ConfigDownBuffer() Configure un búfer inactivo (de entrada).
SEGGER_RTT_Init() Inicialice la estructura del bloque de control de RTT cuando utilice solo objetivos de RAM.
SEGGER_RTT_EstablecerTerminal() Configure el terminal "virtual" para usar para la salida en el canal 0 a través de Write y WriteString.
SEGGER_RTT_TerminalFuera() Envíe una cadena terminada en cero a través de un terminal "virtual".

         Finalmente, para usar RTT, debe instalar J-Link RTT Viewer, J-Link RTT Client y J-Link RTT Logger en la computadora. Estos tres terminales se pueden instalar y usar como desee. 

Visor de RTT

7. RTOS

        RTOS (sistema operativo en tiempo real) es un término general para sistemas operativos en tiempo real. Actualmente, existen varios sistemas operativos en tiempo real como freeRTOS, RT-Thread y UCOS-III en el mercado. En el complejo y poderoso nivel de hardware de STM32, los programadores no lo usarán simplemente como un MCU tradicional para ejecutar programas bare metal (bare metal se refiere a programas que no usan RTOS), sino que comenzarán a considerar la coordinación de programas y la multitarea paralela (no paralela en el verdadero sentido , porque el núcleo único es al mismo tiempo. solo puede manejar una cosa). RTOS es algo interesante. Si está interesado, consideraré actualizar un artículo sobre RTOS más adelante. Puede ir al sitio web oficial de freeRTOS para ver o leer artículos de otros autores. 

8. Introducción al texto original del sitio web oficial

        La familia de línea de rendimiento de densidad media STM32F103xx incorpora el núcleo RISC de 32 bits ARM®Cortex®-M3 de alto rendimiento que funciona a una frecuencia de 72 MHz, memorias integradas de alta velocidad (memoria Flash de hasta 128 Kbytes y SRAM de hasta 20 Kbytes) , y una amplia gama de E/S mejoradas y periféricos conectados a dos buses APB. Todos los dispositivos ofrecen dos ADC de 12 bits, tres temporizadores de 16 bits de propósito general más un temporizador PWM, así como interfaces de comunicación estándar y avanzadas: hasta dos I2C y SPI, tres USART, un USB y un CAN.

        Los dispositivos funcionan con una fuente de alimentación de 2,0 a 3,6 V. Están disponibles tanto en el rango de temperatura de –40 a +85 °C como en el rango de temperatura ampliado de –40 a +105 °C. Un conjunto completo de modo de ahorro de energía permite el diseño de aplicaciones de bajo consumo.
La familia de líneas de rendimiento de densidad media STM32F103xx incluye dispositivos en seis tipos de paquetes diferentes: de 36 pines a 100 pines. Dependiendo del dispositivo elegido, se incluyen diferentes conjuntos de periféricos, la descripción a continuación ofrece una descripción general de la gama completa de periféricos propuestos en esta familia.
Estas características hacen que la familia de microcontroladores de línea de rendimiento de densidad media STM32F103xx sea adecuada para una amplia gama de aplicaciones, como accionamientos de motores, control de aplicaciones, equipos médicos y portátiles, PC y periféricos para juegos, plataformas GPS, aplicaciones industriales, PLC, inversores, impresoras, escáneres. , sistemas de alarma, videoporteros y HVAC.

        Principales características

  • Núcleo de CPU ARM® Cortex®-M3 de 32 bits
    • Frecuencia máxima de 72 MHz, rendimiento de 1,25 DMIPS/MHz (Dhrystone 2.1) con acceso a memoria en estado de espera 0
    • Multiplicación de ciclo único y división de hardware
  • Recuerdos
    • 64 o 128 Kbytes de memoria Flash
    • 20 Kbytes de SRAM
  • Gestión de reloj, reset y suministro
    • Suministro de aplicaciones de 2,0 a 3,6 V y E/S
    • POR, PDR y detector de tensión programable (PVD)
    • Oscilador de cristal de 4 a 16 MHz
    • RC interno de 8 MHz recortado de fábrica
    • Control remoto interno de 40 kHz
    • PLL para el reloj de la CPU
    • Oscilador de 32 kHz para RTC con calibración
  • bajo consumo
    • Modos de suspensión, parada y espera
    • Suministro VBAT para RTC y registros de respaldo
  • 2 convertidores A/D de 1 μs y 12 bits (hasta 16 canales)
    • Rango de conversión: 0 a 3,6 V
    • Capacidad de muestra dual y retención
    • Sensor de temperatura
  • DMA
    • Controlador DMA de 7 canales
    • Periféricos compatibles: temporizadores, ADC, SPI, I2C y USART
  • Hasta 80 puertos de E/S rápidos
    • 26/37/51/80 E/S, todas asignables en 16 vectores de interrupción externos y casi todos tolerantes a 5 V
  • Modo de depuración
    • Depuración de cable serie (SWD) e interfaces JTAG
  • 7 temporizadores
    • Tres temporizadores de 16 bits, cada uno con hasta 4 IC/OC/PWM o contador de pulsos y entrada de codificador de cuadratura (incremental)
    • Temporizador PWM de control de motor de 16 bits con generación de tiempo muerto y parada de emergencia
    • 2 temporizadores de vigilancia (Independiente y Ventana)
    • Contador descendente de 24 bits del temporizador SysTick
  • Hasta 9 interfaces de comunicación
    • Hasta 2 interfaces I2C (SMBus/PMBus)
    • Hasta 3 USART (interfaz ISO 7816, LIN, capacidad IrDA, control de módem)
    • Hasta 2 SPI (18 Mbit/s)
    • Interfaz CAN (2.0B activo)
    • Interfaz USB 2.0 de alta velocidad
  • Unidad de cálculo CRC, ID único de 96 bits
  • Los paquetes son ECOPACK®

9. Resumen del artículo

        El microcontrolador STM32F103C8T6 está diseñado en el paquete LQFP48. El chip tiene un total de 44 pines, de los cuales A0-A15 tiene un total de 16 pines, el puerto B tiene B0-B15, un total de 16 pines y el puerto C tiene C13-C15 , un total de 3 pines. El puerto D tiene dos pines, D0-D1. Vale la pena señalar que las placas de núcleo mínimo C14 y C15 están conectadas a un oscilador de cristal de 32.768 K, y D0 y D1 están conectadas a un oscilador de cristal de 8 MHz . En general, no deben usarse como puertos IO. Si realmente desea usarlo, solo puede eliminar el circuito del oscilador de cristal externo (usando HSI, LSI) y realizarlo reasignando y configurando el registro AFIO_MAPR.

        De hecho, después de conocer la serie de microcontroladores STC15, le tenía miedo al microcontrolador STM32. Creo que hay muchos registros del microcontrolador STC15F2K60S2. ¿Cómo recuerda tantos registros del STM32? Ahora comencé a aprender y aprendí que hay una biblioteca de firmware oficial para que todos puedan llamar. De acuerdo con el tiempo de lanzamiento, se puede dividir en biblioteca de firmware anterior (por debajo de V3.0.0), biblioteca de periféricos estándar (haga clic en mí para saltar) , Biblioteca HAL (haga clic para saltar) , biblioteca LL (la biblioteca LL está incluida en la biblioteca HAL) Cuatro tipos. En la actualidad, la última versión de la biblioteca estándar es la V3.5.0, que llama la API oficial para el desarrollo. Fue lanzada por ST en 2011 y ha estado suspendida durante 10 años. El uso de HAL se puede utilizar para el desarrollo gráfico, que es más vívido en los sentidos. Sin embargo, debido a que la biblioteca HAL tiene como objetivo resolver los diferentes problemas generales de la biblioteca estándar en diferentes series de microcontroladores, su eficiencia de ejecución de código no es tan alta como la de la biblioteca estándar. Si el nivel de optimización del compilador es bajo, el archivo HEX generado será más grande. Más tarde, ST lanzó la biblioteca LL para este problema.La mayoría de las funciones API de la biblioteca LL llaman directamente a los registros, lo que mejora la eficiencia de ejecución del código. Sin embargo, cuanto más largo sea el lanzamiento, más ricos serán los datos que podamos recopilar. Actualmente estoy aprendiendo el método de desarrollo de la biblioteca estándar, y le sugiero que elija de acuerdo con su propia situación.

        Se puede encontrar más información en el sitio web chino oficial de ST: Inicio - STMicroelectronics .

        Se recomiendan varios foros de estudio:

        1. Átomo puntual: OpenEdv

        2. Foro de Hard Rock: Electrónica de Hard Rock - Comunidad

        3. Foro integrado de Tough Guy: Foro integrado de Tough Guy - ¡Desarrollado por Discuz!

        4. Foro Wildfire: Foro electrónico Wildfire -

        5.51 Black Electronics Forum: 51 Black Electronics Forum - Aprendizaje de tecnología integrada DIY MCU para la producción electrónica de un solo chip

        6. STM32 Arduino: Comunidad china STM32 Arduino-Arduino - ¡Desarrollado por Discuz!

Supongo que te gusta

Origin blog.csdn.net/fantastic_sky/article/details/110229474
Recomendado
Clasificación