No se puede mostrar el mensaje 5118. Un nuevo servicio de MegaFon: leer SMS eliminados. Reembolso de fondos gastados

¡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 súper 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, en su mayor parte. 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.

Ahora pasemos a problemas técnicos) Varias veces ya he mencionado el nombre " Curso de entrenamiento 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 resumen, Keil me dejó prácticamente solo impresiones agradables, aunque existen desventajas, por supuesto, no son 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!

Este artículo es el primero de una serie planificada de artículos sobre el estudio de la programación de microcontroladores. Estudiando varios materiales Noté que casi todos comienzan con el hecho de que se le pide al principiante que descargue (o use la que viene con el entorno de desarrollo) una biblioteca para trabajar con dispositivos periféricos y la use para escribir su primer programa (generalmente un LED parpadea ).

Esto me sorprendió mucho. Si cree en estos artículos, ni siquiera necesita leer la documentación del controlador programable para programar. me enseñaron sabiduría "programación de hardware" completamente diferente.

En este artículo, el camino desde la frase "¡Sí, quiero intentarlo!" hasta que el alegre guiño del LED será mucho más largo que el de otros autores. Intentaré revelar aspectos de la programación de microcontroladores que se esconden detrás del uso. funciones de biblioteca y ejemplos ya preparados.
Si tiene la intención de estudiar seriamente la programación de microcontroladores, este artículo es para usted. Quizás también pueda ser de interés para aquellos que ya han jugado lo suficiente con Arduino y quieren tener en sus manos todas las capacidades hardware del hardware.

Seleccionar un microcontrolador

Muchos podrán decir que es mejor empezar a aprender microcontroladores con AVR, PIC, 8051 o algo más. La cuestión es multifacética y controvertida. Conozco suficientes ejemplos donde las personas, después de haber estudiado Cortex-M, programaron AVR, ARM7, etc. Yo mismo comencé con Cortex-M3. Si te enfrentas a una tarea específica, en Internet hay mucha información con comparaciones. varios tipos microcontroladores y tareas resueltas con su ayuda. Esta pregunta también se planteó en el caso de Habré, por ejemplo.

Supondremos que hemos descubierto el tipo de microcontrolador. Pero el mercado ofrece una amplia gama de modificaciones diferentes de diferentes fabricantes. Se diferencian en muchos parámetros, desde el tamaño de la memoria flash hasta el número de entradas analógicas. Para cada tarea, la elección debe hacerse individualmente. Ninguno Recomendaciones generales no hay y no puede haber. Solo señalaré que vale la pena comenzar su estudio con los fabricantes de MK que tengan la mayor gama posible. Luego, al elegir un MK para una tarea específica, existe una probabilidad bastante alta de que algo del surtido presentado le convenga.

Elegí STM32(aunque creo que es mejor empezar a estudiar con MK de TexasInstruments; la documentación está muy bien compilada), porque están muy extendidos entre los desarrolladores de electrónica rusos. Si tiene algún problema o pregunta, puede encontrar fácilmente soluciones en los foros. Otra ventaja es la amplia selección de placas de demostración tanto del fabricante como de organizaciones de terceros.

¿Qué necesitas estudiar?

Desafortunadamente, para empezar a programar un MK, sólo una PC no es suficiente. Tendrás que conseguir una placa de demostración y un programador en alguna parte. Aunque esto reduce la competencia en el mercado laboral.

Yo mismo estoy usando un tablero de demostración. STM3220G-EVAL y programador J-Link PRO. Pero para empezar será suficiente. STM32F4DESCUBRIMIENTO, que se puede comprar sin problemas especiales por una pequeña cantidad.

Todos los ejemplos serán específicamente para el tablero de depuración. STM32F4DESCUBRIMIENTO. En En este punto No nos importará en absoluto que esta placa tenga una MCU basada en el núcleo Cortex-M4. No utilizaremos sus características y ventajas sobre Cortex-M3 en un futuro próximo. Veremos qué pasa a continuación.

Si tiene alguna otra placa basada en STM32F2xx/STM32F4xx, puede trabajar con ella. Al presentar el material, intentaré describirlo con el mayor detalle posible. Por qué lo hacemos de esta manera y no de otra manera. Espero que nadie tenga problemas para transferir ejemplos a otro hardware.

Entorno de desarrollo

Como ya se ha mencionado varias veces, existe una cantidad suficiente de entornos de desarrollo para microcontroladores ARM, tanto de pago como no tanto. Y nuevamente me gustaría omitir la controversia sobre este asunto. Estoy usando IAR Embedded Workbench para ARM 6.60. Todos los ejemplos estarán en este entorno. Si le gusta (o su organización usa) algo más (Keil, Eclipse, CCS, CooCoc, etc.), esto tampoco le hará daño. Prestaré especial atención a las características relacionadas específicamente con el entorno de desarrollo.

¿Por qué un entorno de desarrollo pago?

Quizás alguien no esté del todo satisfecho con el hecho de que sugiero usar un entorno de desarrollo pago, pero en IAR es posible obtener una licencia temporal sin restricciones de funcionalidad, o una licencia ilimitada con un límite de tamaño de código (32 KB para MK es mucho ).
Además, señalaré de inmediato que para algunos MK no existe. entornos libres desarrollo. Y desafortunadamente, estos parlamentarios son irremplazables en algunas áreas.


No describiré el proceso de instalación.

¿Dónde empezar?

Creando un proyecto
Primero, creemos proyecto vacío. IAR le permite crear proyectos en ASM, C y C++. Usaremos C.

Aparecerá frente a nosotros un proyecto vacío con un archivo principal.

Ahora necesita configurar el proyecto para comenzar a trabajar con "nuestro" MK y depurador. MK instalado en la placa STM32F4DISCOVERY STM32F407VG. Debe seleccionarse en las propiedades del proyecto (Opciones generales->Destino->Dispositivo):

Cuando selecciona un procesador programable de destino, se carga su descripción, lo que proporciona amplias oportunidades para la depuración (esto se discutirá más adelante). Además, se adjunta automáticamente un archivo de configuración que describe el espacio de direcciones disponible para el vinculador. Si es necesario, tocaremos el tema. archivo de configuración enlazador en los siguientes artículos.

Después de esto, necesitas configurar el depurador. La depuración del programa se produce directamente "en el hardware". Esto se hace usando un depurador JTAG. Puedes aprender más sobre cómo sucede esto en Wikipedia. El depurador ST-LINK/V2 está integrado en la placa STM32F4DISCOVERY. Para trabajar con el depurador, debe seleccionar su controlador en el menú. Depurador->Configuración->Controlador. También es necesario indicar que la depuración se debe realizar directamente en el hardware. Para hacer esto necesitas configurar la bandera. Depurador->Descargar->Usar cargador(es) flash


Para los que vieron la palabra Simulador.

En teoría, IAR permite depurar programas mediante un simulador. Pero nunca lo he visto usado en la práctica.

Ahora el proyecto está listo para trabajar (programación, llenado y depuración).

"TZ" para el primer proyecto.
Resumamos: mk y junta de desarrollo seleccionado, proyecto preparado. Es hora de decidir la tarea.

No nos desviemos de los clásicos. El primer proyecto será un LED parpadeante. Afortunadamente, hay muchos de ellos en el tablero. ¿Qué significa esto desde el punto de vista de la programación? Primero que nada, necesitas estudiar. diagrama esquemático placa de demostración y comprenda cómo se "inicia" el LED.
disponible en el sitio web del fabricante. EN esta descripción Incluso hay una sección separada sobre los LED en el tablero: 4.4 LED. Por ejemplo, usaremos Usuario LD3. Encontrémoslo en el diagrama:

El análisis más simple del circuito sugiere que para "encender" el LED, es necesario aplicar "1" al pin MK (que para este MK corresponde a 3,3 V). El apagado se realiza aplicando “0” a este pin. En el diagrama este pin está designado PD13(este es probablemente el más información importante de este documento).

Como resultado, podemos escribir "TK" para nuestro primer programa:
El programa para MK debe transferir el estado del pin MK PD13 del estado "0" al estado "1" y viceversa con una cierta periodicidad, perceptible para el ojo humano ( nota IMPORTANTE, si parpadea el LED con demasiada frecuencia es posible que el ojo no pueda discernirlo).

Antes de empezar a programar, o un poco de teoría
Antes de comenzar a implementar nuestras especificaciones técnicas, es necesario comprender cómo se gestiona MK.

Para empezar, cualquier MK incluye un núcleo, memoria y unidades periféricas. Creo que con la memoria todo está claro por ahora. Permítanme mencionar que el STM32 tiene una memoria flash en la que se almacena el programa MK (en caso general no es declaración verdadera, el programa se puede almacenar en un disco externo memoria no volátil, pero lo omitiremos por ahora) y otros datos, incluidos los datos del usuario. También existe SRAM: memoria de acceso aleatorio.

El núcleo es la parte del microcontrolador que ejecuta un flujo de comandos. En nuestro MK el tipo de núcleo es Cortex-M4. El núcleo MK se puede comparar con el procesador de una PC. Sólo puede ejecutar comandos y transferir datos a otras unidades (en esta comparación no se tienen en cuenta los procesadores con aceleradores de gráficos integrados).
Al mismo tiempo, el fabricante MK no desarrolla el núcleo. El núcleo se compra en ARM Limited. La principal diferencia entre los distintos diputados está en la periferia.

Bloques periféricos: bloques que interactúan con " mundo exterior"o realizar funciones específicas que no están disponibles para el núcleo MK. Las MCU modernas (incluida la STM32) contienen una amplia gama de unidades periféricas. Las unidades periféricas están diseñadas para resolver varias tareas, a partir de la lectura del valor de voltaje de entrada analogica MK antes de transmitir datos a dispositivos externos a través del bus SPI.
A diferencia del núcleo MK, las unidades periféricas no ejecutan instrucciones. Sólo ejecutan comandos del kernel. En este caso, no se requiere la participación del kernel al ejecutar el comando.

Ejemplo

Un ejemplo es el bloque UART, que está diseñado para recibir y transmitir datos desde MK a dispositivos externos. El kernel sólo necesita configurar el bloque y darle datos para su transmisión. Después de esto, el kernel puede continuar ejecutando instrucciones. sobre los hombros bloque periférico El control de la salida correspondiente del MK está asignado para transmitir datos de acuerdo con el protocolo. La propia unidad periférica transfiere la salida MK al estado requerido "0" o "1" en momento justo tiempo mientras realiza la transferencia.

Interacción del núcleo con la unidad periférica.
La interacción del núcleo MK con la unidad periférica se lleva a cabo mediante registros especiales (también existe interacción a través del mecanismo de interrupción y DMA, pero más sobre esto en las siguientes publicaciones). Desde el punto de vista del núcleo, esto es sólo un trozo de memoria con dirección específica, eso simplemente no es cierto. Escribir datos en un registro especial equivale a transmitir un comando o datos a una unidad periférica. Lectura: recibir datos de un bloque o leer su estado. La descripción de los bloques periféricos y sus registros especiales ocupa la mayor parte de la descripción MK.

IMPORTANTE: Después de escribir datos en un registro especial y luego leerlos, puede obtener datos completamente diferentes. Por ejemplo, enviar datos al bloque UART para enviar y leer los datos recibidos por el bloque desde dispositivo externo, se realiza utilizando el mismo registro.

Los registros especiales suelen dividirse en campos de bits. Uno (o más) bits controlan un parámetro de bloque periférico específico, generalmente de forma independiente. Por ejemplo, diferentes bits del mismo registro controlan el estado. diferentes salidas mk.

recuerda c
Si eres un gurú de C, puedes saltarte con seguridad esta sección. Está destinado principalmente a aquellos a quienes se les enseñó (o aprendieron por sí mismos) a programar para una PC. La experiencia demuestra que la gente a menudo no recuerda órdenes importantes. Aquí les recordaré brevemente operaciones bit a bit y trabajar directamente con la memoria en su dirección.

Escribir datos en una dirección de memoria

Supongamos que al leer la descripción de la unidad periférica, nos dimos cuenta de que para ello funcionamiento correcto debes escribir el número 0x3B en él. La dirección de registro especial es 0x60004012. El registro es de 32 bits.
Si no sabes inmediatamente cómo hacer esto, intentaré describir la cadena de razonamiento para obtener el comando correcto.

El valor 0x60004012 no es más que el valor de un puntero a una ubicación de memoria. Esto es exactamente lo que debemos indicar en nuestro programa, es decir, realizar una conversión de tipo según la sintaxis del lenguaje C:

(largo sin firmar*)(0x60004012)

Entonces tenemos un puntero a un elemento. Ahora necesitamos escribir en este elemento. valor requerido. Esto se hace eliminando la referencia al puntero. Así obtenemos el comando correcto:

*(largo sin firmar*)(0x60004012) = 0x3B;

Establecer bits arbitrarios en 1

Suponga que desea establecer los bits 7 y 1 en la dirección 0x60004012 en "1" sin cambiar el valor de todos los demás bits del registro. Para hacer esto, necesita usar la operación binaria |. Te daré la respuesta correcta de inmediato:

*(largo sin firmar*)(0x60004012) |= 0x82;

Presta atención a 2 hechos. Los bits se cuentan desde cero, no desde el principio. Esta operacion de hecho, se necesitan al menos 3 ciclos de reloj: leer el valor, modificarlo y escribirlo. A veces esto no es aceptable porque entre la lectura y la escritura, es posible que la unidad periférica haya cambiado el valor de uno de los bits que no podemos cambiar. No se olvide de esta función; de lo contrario, pueden aparecer errores que son extremadamente difíciles de detectar.

Establecer bits arbitrarios en 0

Suponga que desea establecer los bits 7 y 1 en la dirección 0x60004012 en "0" sin cambiar el valor de todos los demás bits del registro. Para hacer esto, necesita usar el operador binario &. Te daré la respuesta correcta de inmediato:

*(largo sin firmar*)(0x60004012) &= 0xFFFFFF7D;

O su notación más simple (no se preocupe por la operación adicional, el compilador calculará todo por adelantado incluso con una optimización mínima):

*(largo sin firmar*)(0x60004012) &= (~0x82);

Algunas características de los programas para MK.
Aquí intentaré describir algunas características de los programas para MK que es importante recordar. Las cosas son bastante obvias, pero aún así.
El programa no tiene fin.
A diferencia de la mayoría de los programas de PC, el programa MK nunca debería terminar, ¡NUNCA! ¿Qué tendrá que hacer exactamente MK después de completar su programa? La pregunta es prácticamente retórica. Por eso, no olvides asegurarte de no haber olvidado el ciclo eterno. Si lo deseas, puedes poner el MK en modo de suspensión.
Usar variables enteras
A pesar de que utilizamos un microcontrolador con núcleo Cortex-M4, que realiza operaciones con números de coma flotante en el hardware, recomiendo no utilizarlos. En un microcontrolador sin soporte para este tipo de operaciones, el tiempo de cálculo será simplemente enorme.
Evite la asignación de memoria dinámica
Esto es sólo un consejo. La razón es simple: no hay suficiente memoria. A menudo me he encontrado con bibliotecas que tenían "pérdidas lentas de memoria". Fue muy desagradable cuando, después de varias semanas operación estable MK se congeló con un error. Es mejor pensar de antemano en la arquitectura de su programa para no tener que usar selección dinámica memoria.
Si aún desea utilizarlo, estudie detenidamente el funcionamiento del administrador de memoria o escriba el suyo propio.

¡Pongámonos a trabajar!

Trabajar en un programa para MK siempre comienza con la lectura de la documentación. Para nuestro MK está disponible en la web del fabricante. Hay muchas páginas, pero léelas todas. Adiós No hay necesidad. Como ya se ha dicho, mayoría La documentación contiene una descripción de las unidades periféricas y sus registros. También quiero llamar su atención sobre el hecho de que este manual de referencia no fue escrito para un MK, sino para varias líneas. Esto sugiere que el código será portátil cuando se mueva a otros MK en estas líneas (a menos, por supuesto, que intente utilizar unidades periféricas que no están en el MK que está utilizando).

En primer lugar, debes decidir con qué bloques trabajar. Para hacer esto, simplemente estudie las secciones. Introducción Y Principales características.

El control directo del estado de los pines MK se realiza mediante el bloque GPIO. Como se indica en la documentación, la MCU STM32 puede tener hasta 11 bloques GPIO independientes. Varios bloques GPIO periféricos se denominan comúnmente puertos. Los puertos se designan con las letras de la A a la K. Cada puerto puede contener hasta 16 pines. Como señalamos anteriormente, el LED está conectado al pin PD13. Esto significa que este pin está controlado por una unidad periférica. Puerto GPIO D. Pin número 13.

Esta vez no necesitaremos ninguna otra unidad periférica.

Control de reloj periférico
Para reducir el consumo de energía del MK, casi todas las unidades periféricas se apagan después de encender el MK. El bloque se activa/desactiva aplicando/deteniendo el suministro de una señal de reloj a su entrada. Para un funcionamiento correcto, es necesario configurar el controlador de señal de reloj MK para que la unidad periférica requerida reciba una señal de reloj.
Importante: La unidad periférica no puede iniciar la operación inmediatamente después de encender la señal del reloj. Debe esperar unos cuantos tics hasta que "comience". Las personas que utilizan bibliotecas para dispositivos periféricos, a menudo ni siquiera conocen esta característica.

Los registros son responsables de permitir el cronometrado de unidades periféricas. Registro de habilitación de reloj periférico RCC XXX.En lugar de XXX pueden utilizarse los neumáticos AHB1, AHB2, AHB3, APB1 y APB2. Después de estudiar detenidamente la descripción de los registros correspondientes, podemos concluir que la sincronización del bloque periférico GPIOD se activa configurando "1" en el tercer bit del registro. Registro de habilitación de reloj periférico RCC AHB1 (RCC_AHB1ENR):

Ahora necesitas descubrir cómo averiguar la dirección del registro. RCC_AHB1ENR.

Comentario: La descripción del sistema de sincronización STM32 MK merece un artículo aparte. Si los lectores lo desean, cubriré esta sección con más detalle en uno de los siguientes artículos.

Determinar direcciones de registros especiales
La determinación de las direcciones de los registros especiales debe comenzar por la lectura del apartado mapa de memoria en el manual de referencia. Puede observar que a cada bloque se le asigna su propia sección del espacio de direcciones. Por ejemplo, para el bloque RCC esta es la sección 0x4002 3800 - 0x4002 3BFF:

Para obtener la dirección del registro, es necesario agregar al valor inicial del espacio de direcciones del bloque RCC Dirección compensar el registro requerido. Direcciones compensadas también se indica en la descripción del registro (ver captura de pantalla arriba).

Como resultado, hemos determinado la dirección de registro. RCC_AHB1ENR- 0x4002 3830.

bloque GPIO
Para una comprensión general del bloque GPIO, recomiendo leer la sección completa del Manual de referencia. Por ahora no puedes prestarle mucha atención Modo alternativo. Eso lo dejaremos para más tarde.

Ahora nuestra tarea es aprender a gestionar el estado de los pines MK. Pasemos directamente a la descripción de los registros GPIO.

Modo operativo
En primer lugar, debe configurar el modo de funcionamiento del pin 13 del puerto D como Modo de salida de propósito general, lo que significa que el bloque GPIO controlará el estado del pin MK. El modo de funcionamiento de los pines MK se controla mediante un registro. Registro de modo de puerto GPIO (GPIOx_MODER) (x = A..I/J/K):

Como se puede ver en la descripción, para realizar el ajuste que requerimos, necesitamos escribir el valor 01b en 26-27 bits del registro. GPIOx_MODER. La dirección del registro se puede determinar utilizando el mismo método descrito anteriormente.

Configurar los parámetros de funcionamiento de los pines de salida del puerto GPIO
El bloque GPIO le permite utilizar ajustes adicionales para pines del puerto de salida. Estas configuraciones se realizan en los registros:
  • Registro de tipo de salida del puerto GPIO (GPIOx_OTYPER)- configurar el tipo de salida push-pull o drenaje abierto
  • Registro de velocidad de salida del puerto GPIO (GPIOx_OSPEEDR)- establecer la velocidad de la salida
No cambiaremos estos parámetros, ya que estamos bastante satisfechos con los valores predeterminados.
Establecer el valor en el pin MK
Finalmente, hemos llegado al momento de controlar el estado de salida del MK. Hay dos métodos para configurar el valor de salida en un pin MK específico.

Usamos el registro de configuración/reinicio de bits del puerto GPIO (GPIOx_BSRR)

Escribir un "0" o un "1" en los bits 0-16 provoca el cambio correspondiente en el estado de los pines del puerto. Para poder instalar valor específico a la salida de uno o más pines MK y no cambiar el estado de los demás, será necesario utilizar la operación de modificación de bits individuales. Esta operación se realiza en al menos 3 ciclos. Si es necesario escribir unos en algunos bits y ceros en otros, se necesitarán al menos 4 ciclos de reloj. Este método Preferiblemente se utiliza para revertir el estado de una salida si se desconoce su estado original.

Registro de configuración/restablecimiento de bits del puerto GPIO (GPIOx_BSRR)

A diferencia de método anterior, escribir 0 en cualquiera de los bits de este registro no conducirá a nada (y, en general, ¡todos los bits son de solo escritura!). Escribir 1 en los bits 0-15 dará como resultado que se establezca un “1” en la salida correspondiente del MK. Escribir 1 en los bits 16-31 establecerá “0” en la salida correspondiente del MK. Este método es preferible al anterior si necesita establecer un valor específico en el pin "MK" en lugar de cambiarlo.

¡Encendamos el LED!
Habiendo encontrado las direcciones de todos los registros necesarios, puede escribir un programa que encienda el LED:
vacío principal() ( //Habilitar el reloj del puerto D *(unsigned long*)(0x40023830) |= 0x8; //pequeño retraso para GPIOD prepararse volatile unsigned long i=0; i++; i++; i++; i=0; //Establecer PD13 como salida de propósito general *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) (0x04000000); //Encender el LED *(unsigned long*)(0x40020C14) ) |= 0x2000; mientras(1);
Se puede compilar ( Proyecto->Compilar) y llenar ( Proyecto->Descargar->Descargar aplicación activa). O ejecutar la depuración ( Proyecto->Descargar y depurar) e iniciar la ejecución (F5).
¡El LED se encendió!
LED intermitente
El parpadeo del LED no es más que un encendido y apagado alternativo con un retraso entre estas acciones. La forma más sencilla es activar y desactivar en un bucle eterno e insertar un retraso entre ellos.
void main() ( //Habilita el reloj del puerto D *(unsigned long*)(0x40023830) |= 0x8; //pequeño retraso para GPIOD prepárate volatile unsigned long i=0; i++; i++; i++; i=0; / /Establecer PD13 como salida de propósito general *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) (0x04000000 while(1) ( //Encender el LED *(); unsigned long*)(0x40020C14) |= 0x2000; //Retraso para(i=0; i<1000000 ;++i); //Turn LED OFF *(unsigned long*)(0x40020C14) &= ~0x2000; //Delay for(i=0; i<1000000 ;++i); } }
El valor de retardo de 1.000.000 se seleccionó experimentalmente para que el período de parpadeo del LED fuera visible a simple vista, pero no demasiado largo.
Optimizando el algoritmo
La desventaja del método de parpadeo del LED elegido es que el núcleo MK pasa la mayor parte de su tiempo en bucles vacíos, aunque podría estar haciendo algo útil (en nuestro ejemplo no hay otras tareas, pero aparecerán en el futuro).

Para evitar esto, generalmente se usa un contador de ciclos y el estado del pin MK cambia cuando el programa pasa por una cierta cantidad de ciclos.
void main() ( //Habilita el reloj del puerto D *(unsigned long*)(0x40023830) |= 0x8; //pequeño retraso para GPIOD prepárate volatile unsigned long i=0; i++; i++; i++; i=0; / /Establezca PD13 como salida de propósito general *(unsigned long*)(0x40020C00) = (*(unsigned long*)(0x40020C00)& (~0x0C000000)) (0x04000000) (i++; if(!(i); ) %2000000)) ( //Encender el LED *(unsigned long*)(0x40020С14) |= 0x2020; ) else if(!(i%1000000)) ( //Apagar el LED *(unsigned long*)(0x40020С14) & = ~0x2000;) ) )
Pero incluso aquí no estará exento de problemas; al cambiar el número de comandos ejecutados dentro del ciclo, el período de parpadeo del LED (o el período de ejecución de otros comandos en el ciclo) cambiará. Pero en este momento no podemos luchar contra esto.

Un poco sobre depuración
IAR le permite depurar una aplicación directamente en el hardware. Todo parece casi igual que depurar una aplicación de PC. Existe un modo para la ejecución paso a paso, ingresando a una función, viendo los valores de las variables (En modo de depuración Ver->Ver->Ver1/4).

Pero además de esto, es posible visualizar los valores de los registros del kernel, registros especiales de unidades periféricas (Ver->Registro), etc.
Le recomiendo encarecidamente que se familiarice con las capacidades del depurador mientras aprende a programar MK.

Algunas palabras para concluir

Quizás muchos dirán que escribir direcciones manualmente en un programa no es correcto, ya que el fabricante proporciona archivos con definiciones de registros y campos de bits, bibliotecas para trabajar con periféricos y otras herramientas que facilitan la vida al desarrollador. Estoy completamente de acuerdo con esto, pero sigo creyendo que los primeros pasos en la programación de MK deben realizarse investigando la documentación manualmente, determinando de forma independiente los registros y campos de bits necesarios. No es necesario que utilices esto en el futuro, pero definitivamente necesitas saber cómo hacerlo.
Estas son sólo algunas de las razones para esta afirmación:
  • ¡A veces las bibliotecas del fabricante contienen errores! Una vez casi incumplí la fecha límite de un proyecto debido a esto. Volví a soldar el chip varias veces, pensando que el cristal se había dañado durante la soldadura (esto ya había sucedido antes). El problema fue que la dirección del registro especial se ingresó incorrectamente en la biblioteca. Esto suele ocurrir con las líneas MK o MK que acaban de salir al mercado.
  • Las bibliotecas para trabajar con periféricos de algunos fabricantes no implementan todas las capacidades de las unidades periféricas. Especialmente pecé con esto. Micro Luminaria, que luego fueron compradas por TI. Tuve que escribir la inicialización de los periféricos manualmente.
  • Mucha gente se acostumbra a iniciar la programación MK estudiando ejemplos. Creo que primero debes decidir qué te permite implementar MK. Esto sólo se puede entender leyendo la documentación. Si algo no está en los ejemplos, no significa que el hardware no lo admita. El último ejemplo es la compatibilidad con hardware PTP STM32. Por supuesto, puedes encontrar algo en Internet, pero esto no está incluido. conjunto estándar Desde el fabricante.
  • Los controladores de unidades periféricas de algunos fabricantes están tan poco optimizados que cambiar el estado de un pin usando la biblioteca requiere hasta 20 ciclos de reloj. Este es un lujo inasequible para algunas tareas.

Gracias a todos los que leyeron mi post, resultó mucho más de lo que esperaba al principio.
Espero sus comentarios y críticas razonadas. Si quienes lo leen tienen ganas, intentaré continuar la serie de artículos. Quizás alguien tenga ideas sobre temas que valga la pena tratar; me encantaría escucharlas.

A la tarjeta SIM operador más grande países en modo automatico está conectado el programa Kaleidoscope, que los clientes consideran molesto e interfiere con la comunicación, por eso muchos suscriptores preguntan: 5038 Megáfono: ¿cuál es el número?

Debe averiguar por qué se necesita este número y qué es el "Caleidoscopio" en Megafon.

Descripción del servicio "caleidoscopio" en Megafon

El operador ha creado dos canales para los usuarios de Megafon.

Uno de ellos habla sobre eventos interesantes en el mundo, noticias y envía un chiste divertido: este es el servicio "caleidoscopio".

A veces suscriptores de un número corto. 5118 recibir el servicio en forma de mensajería SMS. El otro proporciona información sobre la empresa Megafon y los acontecimientos ocurridos recientemente con el operador.

El segundo servicio se llama Megafon. Contiene información sobre el quiosco Megafon.

A menudo, el suscriptor recibe notificaciones de 723 “La lista de temas es irrelevante”, lo que les irrita. números cortos, de donde pueden provenir mensajes: 5052,7522,5016

En la pantalla dispositivo móvil aparece Anuncio acerca de suscribirse a canal de entretenimiento, que se mantiene durante 40 segundos. Esta es una especie de ventana emergente.

Si el suscriptor desea ignorar servicios de entretenimiento, luego presiona la tecla “cancelar”. Si está interesado en la información que se le ofrece, la confirma con el botón “ok”.

Si el cliente no tiene tiempo de leer el mensaje, este no desaparece, sino que se envía a la bandeja de entrada. Esta carpeta se encuentra en el servicio Megafon Pro. En el menú de parámetros, el cliente puede ajustar de forma independiente el sonido de la alerta, así como el idioma del mensaje y el método para recibir información.

El servicio es gratuito, pero el contenido solicitado para la lectura adicional de la información es de pago. El coste se indica en el mensaje recibido por el suscriptor. Esta opción es similar a la opción "camaleón" disponible para los suscriptores de Beeline.

Reglas de desactivación

Después de que el servicio haya firmado exitosamente el asunto en la tarjeta SIM automáticamente, el pregunta lógica, como un caleidoscopio en Megáfono. Para esto hay numero especial 5038 . Con su ayuda, podrás abandonar el caleidoscopio que a menudo aparece en la pantalla de tu dispositivo móvil.

Dado que la opción se activa automáticamente, se puede desactivar de forma independiente marcando número específico y ejecución condiciones establecidas mediante desinstalación.

Para desactivar necesitarás:

  • Deshabilitar las opciones de “caleidoscopio” se puede hacer a través de la palabra "Detener" en 5038 ;
  • Para desactivar el “canal de entretenimiento” del servicio, debes hacer esto: enviar un SMS con la palabra "OFF1" en 0538 ;
  • Para que el canal Megafon ya no envíe notificaciones al número del suscriptor, debes enviar un SMS con el texto "OFF1" en 0538 .

Para utilizar la desinstalación del servicio, es decir, la posibilidad de deshabilitarlo, debe seleccionar uno de los métodos:

  1. Puedes enviar un mensaje SMS al número *808*0# . Debes introducir la palabra en el texto del mensaje. "Detener" o "Apagado". La notificación sobre la desinstalación del servicio llegará después de enviar un mensaje a centro de servicio. De esta forma la opción quedará deshabilitada.
  2. Posible salida Comandos USSD en número de servicio *808*0# y una tecla de llamada.
  3. La desactivación se puede realizar a través de la configuración del menú SIM en teléfono móvil, es decir, visitando la configuración y luego seleccionando la palabra "radiodifusión" y punto "desactivar".


¿Cómo conectar el caleidoscopio?

Puedes conectarte a tu servicio favorito de forma gratuita. Recopilación Dinero Su cuenta sólo será debitada por el contenido proporcionado.

Si la opción se desinstaló previamente, puede conectarla adicionalmente a través de varias opciones, la más conveniente la elige el suscriptor de Megafon.

Las opciones de conexión incluyen los siguientes métodos:

  • Enviar mensaje con texto "Comenzar" o "Comenzar" al numero *808*99# . Entonces Los SMS llegarán notificación de una nueva conexión de servicio para el suscriptor;
  • Se puede enviar un mensaje con la palabra inicio a 0538 ;
  • Enviar una solicitud al número *808*1# , después de lo cual Megafon regresará servicio remoto al número solicitado;
  • Otra solución es mensaje vacío al numero 1145 ;
  • A través del contacto salón corporativo Megafon, donde los empleados verifican los datos del pasaporte del cliente con el propietario de la tarjeta SIM y ayudan a restablecer el servicio faltante.


Video

Conclusión

No todos los suscriptores están contentos opciones adicionales, llegando en forma de notificaciones a su teléfono. Por eso necesitas saber el número. 0538 para desactivar servicios no deseados.

Esto se puede hacer conociendo los métodos básicos para deshabilitar funciones, así como con la ayuda de los empleados de Megafon.

El novedoso tipo de estafa a los suscriptores está ganando impulso nuevamente. Sólo que ahora todo es legal y el operador responde: "¡No estoy en el negocio!" En un par de meses, la cuenta perdió 800 rublos. Ya no tengo fuerzas para luchar contra ellos, me han vencido. ¿Qué pasó?

Como sabemos, los usuarios avanzados Internet móvil, y no sólo móviles, aconsejan lo siguiente:
- no descargar programas sospechosos;
- no introduzca su número de teléfono en sitios sospechosos;
- No envíes SMS a números extraños.

Como verdades doradas. Pero no importa cómo sea. Es posible que no se requiera su confirmación para conectar basura costosa; solo necesita navegar por Internet en su teléfono o PC de casa.

Esto me pasó a mí también. En algún sitio para compartir archivos, inmediatamente se abrió una página con información sobre los productos. Sin hacer clic en nada, simplemente cierro la página. Reciba inmediatamente un SMS: "Gracias por suscribirse". Extraño. Reviso el saldo, todo el dinero está ahí. Creo que como no di confirmación, entonces conéctate a contenido de entretenimiento No podrán hacerme.

Necesitas ir a tu cuenta personal.

Después de un par de meses, comencé a sospechar que Internet se había vuelto más caro de alguna manera. Si antes el número costaba entre 200 y 300 rublos, ahora cuesta hasta 500 rublos. Como resultado, nuevamente 0 rublos. Empecé a investigar y descubrí una suscripción a contenido erótico desde febrero. Eliminé la suscripción y la olvidé, ayer verifiqué el saldo: está vacío nuevamente. Voy a suscripciones y allí nuevamente hay un servicio familiar. Después de eso, llamo al soporte de Megafon y con el tono "Estoy cansado, soy un cabrón" les informo que dejo el servicio, estoy cansado.

Mira en la sección "¡Con una cuota de suscripción!

Una simpática joven operadora dice: “Hiciste clic en todo tipo de banners y subiste a otros sitios, así que firmaron por ti”.
Yo: “¿Qué firmaste cuando acepté? suscripciones pagas? O devuelves el dinero o te vas con tu Megafon"

La solicitud fue aceptada y medio día después me devolvieron 800 rublos. (Es una lástima que nunca llegué a este sitio erótico =) También recibí algunas instrucciones sobre cómo controlar las suscripciones.

Al final lo descubrí. La suscripción se produce según el siguiente esquema:

Vas a un sitio determinado y se activa el script. Determina que ha iniciado sesión desde un dispositivo móvil o utilizando una tarjeta SIM.
- Se habilita una redirección a un sitio pago con una suscripción, que luego redirige a wap.megafonpro.ru y esta entrada a Megafon desde la página del sitio pago es una confirmación. Lindo, ¿no?

¿Como pelear?

Obtenga información sobre todas las suscripciones en la página podpiski.megafon.ru;
- Si lo encuentra, llame al operador y exija un reembolso;
- Busque en Windows por la ruta windows\system32\drivers\etc\hosts archivo de hosts, ábrelo en el bloc de notas y al final agrega 127.0.0.1 wap.megafonpro.ru guarda lo mismo sin extensiones de texto(requiere ayuda de un amigo avanzado);
- El propio operador recomienda un método por un período de 3 meses - enviamos un SMS con el texto "USTZAPRIT1" al número 5051 y al número 5151

Todo el dinero está protegido. ¿Pero por cuánto tiempo? Personalmente, una lucha así realmente me cansa; mi energía, tiempo y dinero se destinan a luchar contra imbéciles. ¿Debería quedarme con un operador así?

Siempre estuve seguro de que operadores móviles almacenar SMS enviados/recibidos durante algún tiempo. Pero esta confianza era teórica. Hoy volví a estar convencido de ello.
Al principio, cuando me encontré con lo siguiente, mi reacción fue "¡¿Qué carajo?!" Pero luego, mientras escribía el texto, me tranquilicé un poco y me di cuenta de que alguien necesitaría el servicio.

¿Por qué necesitas SMS eliminados?

Borraste accidentalmente un SMS en tu teléfono. Tal vez había información comercial importante, tal vez era un SMS que usted guarda como recuerdo. ¿O tal vez tienes el teléfono de tu esposa frente a ti y te preguntas qué mensajes SMS eliminó?
¿Crees que el texto no se puede restaurar? Pero no, puedes leer lo que se ha borrado.
Para hacer esto necesitas lo siguiente:
  • Acceso a un celular con la tarjeta SIM requerida
  • Conectado previamente servicio SMS
  • 5 minutos de tiempo

Interfaz UMS con mensajes SMS abiertos enviados no desde el servicio

Cómo funciona

Me encontré con esto completamente por accidente. El 11 de diciembre del año pasado, cuando leí por primera vez sobre UMS, me registré en este servicio sólo por diversión. Jugué un poco con Flash SMS y lo olvidé. Hoy fue necesario enviar Flash nuevamente, entré a la interfaz ums y... vi TODA mi correspondencia SMS desde diciembre de 2012 hasta hoy. Y a partir de ese momento envié y recibí mensajes sólo por teléfono. Desde ese momento he cambiado 3 dispositivos, mucho firmware, es decir. No se trata de algún servicio instalado en el sistema operativo.


Mensaje a la UMS


Y algunos mas

¿Cómo conectar/desconectar?

Puedes activar y desactivar el servicio a través de la guía de servicios o llamando al Call Center. El servicio se llama UMS (Cambiar el conjunto de servicios->Servicios populares->UMS). Se bloquea al registrarse en la interfaz web de UMS.

Cómo encontrar un servicio en la Guía de Servicios

conclusiones

Por un lado, el servicio es útil. Con su ayuda, todos tus mensajes se recopilan en uno, lo suficiente interfaz conveniente. Puede cambiar de teléfono libremente, realizar borrados (¡hola a los controladores de droides!), realizar restauraciones de firmware. Todos tus SMS no se perderán. Por otro lado, siempre estuve seguro de que si borraba un SMS del dispositivo, sólo las autoridades competentes podrían leerlo (y no les interesa el spam que recibo). Además, allí se almacena información confidencial: SMS de la banca móvil, indicando el saldo de la cuenta.
En general, depende de ti. Desactivaré este servicio para evitar daños.

Mensajes del banco


Arriba