NRF52832 Uarte recibir longitud variable usando DMA

NRF52832 recientemente con el desarrollo de un proyecto, en el que la necesidad de utilizar el puerto serie, con el fin de mejorar la calidad general y la eficiencia de la comunicación, es natural pensar en el uso de DMA para recibir, sino para el DMA nRF52832, hay un percance que no se puede lograr recibir una longitud variable (de hecho, una gran cantidad de DMA chip no se puede lograr en los mecanismos de hardware larga recepción incierta), no puede ser como STM32, como por ejemplo si hay una interrupción DMA inactivo para determinar los datos se han recibido, así que esto nos hace muy grande la cabeza, también conduce la primera y más importante pregunta - cómo determinar con rapidez y eficacia si se han recibido los datos. Por esto no puede por su propia iniciativa determinar si los datos han sido recibidos en el chip, la interrupción de temporizador para determinar la forma más directa y eficaz, entonces usted tiene una manera de resolver la específica forma de resolverlo? A continuación abandonó el senderismo, vamos a empezar a desarrollar:

Paso 1: Uarte serie de inicialización

nRF52832 único hardware de puerto serie, puerto serie puede hacer ambas cosas UART serie ordinaria, también se puede hacer la UART. Al mismo tiempo se puede utilizar sólo una, que sólo Uarte utilizar la función de DMA, así que nuestro primer paso es inicializar Uarte y DMA.

Para configurar un puerto serie, no es nada más de configuración común cuenta con su velocidad de transmisión, emisión y recepción pines, pines de control de flujo por hardware, y si se debe permitir el control de flujo por hardware, la paridad y así sucesivamente, lo que para los Amigos de la cuenca jugar un microcontrolador para no llame para decir algo.

Desde el manual, podemos ver más que algunos registros pueden ser utilizados para configurar el contenido pin-pin y la velocidad de transmisión y la paridad y así sucesivamente. Ahora pongo el código para trabajar directamente para recibir instrucciones.

En cuanto a por qué estos registros no están aquí para explicar el uso de esta forma, porque creo que teniendo en cuenta que ellos están interesados ​​en este chip, tiene que haber alguna base para la programación incrustado, no se explican demasiado estas cosas demasiado básico.

Vea aquí alguien le preguntará a su UART_RXD y UART_TXD lo que son en realidad muy simple, por nRF52832, los pines se utilizan para cada figuras periféricas, así que sólo necesitamos los pasadores de configuración de tiempo el número correspondiente a llenar en la línea. UART_RXD UART_TXD define y se muestra a continuación, de hecho, se definen en el pasador 8 y el pasador 6.

amigos cuidadosas pueden me han visto aquí para definir la velocidad de transmisión también se publican a cabo, así que sé cómo esta tasa en baudios 115200 corresponde a es esto, por supuesto, es inseparable del desarrollo universal de los datos manuales.

A través de la tabla de consulta anterior podemos saber lo que queremos los datos de configuración correspondientes a la tasa de bits.

Después de configurar los pines de transceptor y la velocidad de transmisión, el siguiente paso fue para configurar el control de flujo por hardware, en primer lugar abrimos el manual de registro.

Le di en el programa son todos 0, que yo no utilizar el control de flujo por hardware, que no usamos la función de control de flujo por hardware de forma natural sin la configuración de pines correspondientes. Hasta ahora hemos puesto sobre algunos de la configuración básica de hardware Uarte completó.

A continuación tenemos que hacer es configurar el gatillo y habilitación de interrupción Uarte arriba.

El código anterior no es suficiente para ver lo que es obvio, me registro las instrucciones correspondientes publicados para la explicación.

Algunos amigos ven aquí puede estar en duda, el manual no quiere decir que permiten UART con 0x04 ella? ¿Por qué tengo que hacer es 0x08, al principio me hizo la misma configuración que 0x04, pero luego me di cuenta que no importa lo que hago, el puerto serie son imposibles, a continuación, se duplicó se encontró el manual de viruta original, se debe configurar para jugar sólo 0x08 por lo que cuando es necesario, o basarse en el aH original manual.

Me registro para activar INTEN RXDRDY, ENDRX, ENDTX los tres, por supuesto, la interrupción de serie sólo se responden a los tres eventos.

RXDRDY: recibió con éxito de la línea de recepción a una bandera byte de datos (pero estos datos no se puede almacenar en la memoria caché).

ENDRX: recepción completa (DMA de recepción búfer está lleno) indicador de memoria intermedia

ENDTX: Después de enviar el último datos enviados (DMA) caché.

Bandera figura a cabo estos tres eventos es muy necesario, de lo contrario no se puede empezar más tarde. Hablando de esto y, finalmente, a la cabeza de la DMA y, a continuación, lo que es DMA?

La declaración anterior es Baidu, muy oficial, muy enrevesado. Para empezar pueden no ser tan fácil de entender, para Uarte la DMA es, simplemente, es que el chip puede recibir automáticamente en la sección de datos de la caché, los datos pueden ser automáticamente enviados para una caché a través del puerto serie , es así de simple, mecanismo de hardware DMA pura, lo que significa que el uso de DMA puede mejorar en gran medida la eficacia de la comunicación y la calidad de la comunicación, reducir el coste de tiempo del programa. Dado que la DMA tan bueno, así que por supuesto que queremos que el estilo. Como mecanismo de FIFO que no tendría demasiado para entender su distrito, a fin de cuentas es empujar a cabo una operación de pila, por el momento, no importa.

Así que por los procedimientos anteriores hemos abierto la DMA Uarte recibir y de interrupción de transmisión, sino que se basan únicamente en el mencionado 105 y 106 de línea de programa que no funciona, esto no es suficiente para abrir el servicio de interrupción, por lo que sólo el primer programa 107 de línea, lo cual programa de línea es muy complicado, que se utiliza para configurar el vector de interrupción NVIC, sabes kernel CM4 nRF52832 se basa, por lo que cuando se utiliza la interrupción también le gustaría utilizar otro chip de núcleo CM4 configurado como vectores de interrupción, este fragmento complicado, si hay una necesidad abriré otro blog para explicar, no hacer la comprensión en profundidad. Con estas tres líneas del programa, nuestros interrupciones y DMA Uarte se pueden abrir, por supuesto, sólo para los tres servicios permiten a nuestros términos. Una maravilla poder, digamos por un largo tiempo no han aparecido ver los registros de DMA sobre el carácter DMA ah, sí, eso es tan mágico, NRF haciendo Uarte cuando tuvo que configurar los registros de DMA vienen juntos, así que no lo hacen demasiado enredado.
Hablando del espacio de caché anterior, DMA se requiere, el análisis final, el espacio de almacenamiento de datos de dos, en general, recibimos y búfer de hacer cada uno para guardar los datos necesarios para enviar y recibir datos.

Como puede verse en el código anterior, cada uno de la transmisión y recepción que tenía una longitud de 1024 bytes tampón también definir la longitud de los datos transmitidos y recibidos datos.

Desde entonces, el caché de ahí, la forma en que Uarte de DMA y asociarlo?

Nosotros, estos cuatro registros se puede ver que están recibiendo el puntero de datos, el número máximo de búfer de bytes recibidos, los punteros de datos de transmisión, el número máximo de búfer de transmisión de datos bytes.

Para que pueda tener el siguiente código.

línea de programa 102 indica al microcontrolador recibe los datos para ser empujado uarteStruct.rxBuf la pila de datos, el programa indica al microcontrolador 103 OK, quiero recibir los 255 bytes de datos. (No hablo por el momento de ser enviado).

Parece que la configuración del puerto serie se debe hacer, en realidad no, también tenemos que abrir el puerto para recibir la tarea, el puerto serie para recibir datos.

Aquí, la configuración Uarte DMA se ha completado sustancialmente. Así que aquí se encuentra nuestro desarrollo de dos boxes. Demasiado fácil a tener que volcar.

Un pozo: si la longitud de los datos de DMA recibidos o una duración de tiempo de los datos de transmisión no son más grandes que 255, ya que RXD.MAXCNT TXD.MAXCNT y sólo un byte.

Cuelgue dos: o bien enviar o recibir tampón de memoria intermedia DMA son solamente idata, porque RXD.PTR y TXD.PTR pueden único punto a idata en los datos, que los datos pueden no ser transmitidos por DMA o la const los datos recibidos en el espacio no idata.

Durante el desarrollo debe prestar atención a estas dos cuestiones, recuerda! Recuerde! .

Paso 2: la rutina de servicio de interrupción

Para la rutina de servicio de interrupción Uarte, porque hemos acaba de abrir una interrupción de tres, así que sólo podemos conseguir tres de interrupción, es decir EVENTS_ENDRX, EVENTS_RXDRDY, EVENTX_ENDTX. Ilustrar tres registros de eventos se muestran a continuación.

Así que con estos tres eventos de interrupción se puede determinar fácilmente si los datos no se ha recibido por completo, enviar el contenido, por supuesto, esto es sólo para unos 255 bytes, para la recepción, esto es sólo especificar la cantidad de la longitud de la recepción ENDRX para generar un evento de interrupción.

Por último lecho hablar acabada sobre esto, si realmente se ve aquí, felicitaciones, a continuación, por fin podemos empezar a hablar de secar hasta, hablando en frente están efectivamente recibida contenido de longitud fija como ropa de cama y de importación, lo que necesito saber su cuenta decir el siguiente contenido:

Entonces nos dimos cuenta de lo específico DMA longitud variable recibido?

1, lista para recibir tampones, ya que no se sabe cuánto tiempo los datos recibidos, por lo que el valor por defecto es 255 recibe la longitud, con el fin de reducir el evento entrante EVENTS_ENDRX número de interrupciones.

2, tenemos que abrir la tarea de recepción, y abierto para recibir bytes de interrupción se genera para permitir EVENTS_RXDRDY interrupción evento, que se utiliza para determinar el primer byte de datos se recibe una serie de datos consecutivos.

3, después de un byte de datos se ha recibido EVENTS_RXDRDY discapacidad evento de interrupción, lo que puede evitar que cada byte es recibido en el una vez interrumpido, temporizador de ciclo abierto.

4, probando la rutina de servicio de temporizador de eventos EVENTS_RXDRDY, si la bandera es 0, es decir, al final de la última temporizador El temporizador no recibe los datos, recibir datos puede considerarse terminado, se han recibido los datos de eventos de envío (el producir eventos EVENTS_ENDRX ), las cosas de otro modo EVENTS_RXDRDY borran, continuar con las pruebas.

5, EVENTS_ENDRX después se genera la interrupción de eventos para determinar si los datos recibidos es más largo que la longitud de la memoria intermedia, si hay más de final forzado a recibir, si hay un eventos de cambio generadas por el temporizador activa extremo receptor, si no, continuar recibiendo.

Lo anterior es un proceso DMA breve darse cuenta de la longitud variable recibido. Lo que implica que nos habla delante del temporizador, el trabajo del temporizador aquí es detectar los dos interrupción del temporizador principal en caso EVENTS_RXDRDY, con el fin de determinar si se ha recibido los datos, cabría duda, no en un extremo de recepción después se genera la interrupción después de que el blindaje byte de datos de eventos EVENTS_RXDRDY interrupción ti? Sí, es un escudo, pero no afecta el evento ah generado, simplemente no desencadenar una interrupción Bale. Así que no es detectada entre dos de interrupción del temporizador no recibe los datos. Si no hay datos se ha recibido se considera terminado, tomar la iniciativa de enviar evento EVENTS_ENDRX. Entonces, ¿cómo se toma la iniciativa de enviar el incidente? Consulte los espectáculos manuales establecidos tarea TASKS_STOPRX puede generar eventos EVENTS_ENDRX. Por lo tanto, temporizador rutina de servicio de interrupción puede ser el siguiente:

Estoy aquí por la conveniencia, utilizando un temporizador APP, APP en cuanto a cómo utilizar el temporizador, no lo haga a explicar aquí.

Dado que el uso del temporizador de APP, por lo que es natural para ser inicializado:

¿Qué pasa con el temporizador de alguna de la necesidad de datos para definir y APP temporizador de inicio y funciones de parada de la siguiente manera:

Ahora bien, también tiene un contador de tiempo, la idea básica ha sido también, la inicialización del puerto serie también es bueno, ahora sólo Uarte contenido de la rutina de servicio de interrupción, y uno de nuestros eventos se trate,

El primero en hablar de EVENTS_RXDRDY eventos: poner directamente el código siguiente

De acuerdo con las ideas anteriores, para producir el primer byte después de la necesidad de bytes a desactivar interrupción de recepción interrupción de la recepción, para evitar la recepción de cada byte para generar una interrupción, de esta manera nuestra DMA, no hay un sentido en el que esta función es lograr 154 líneas los primeros 155 bytes recibidos línea de interrupción para despejar, a continuación, una explicación clara extremo receptor de la bandera, se aclaró a cabo poco, despeja el recibir longitud, temporizador APP abierta para determinar si es o no recibido, porque todo lo que acaba de comenzar, por lo que estos datos deben ser recibir despejado para hacer para prepararse.

El siguiente paso es evento EVENTS_ENDRX interrumpió:

Esto es parte de un pequeño problema, damos un paso a paso en términos de entrar en los eventos que interrumpen el primer paso, por supuesto es para borrar la bandera evento mismo. Línea de actuación es decir 130 recibe un puntero a la siguiente dirección de entrada es recibido, ¿por qué hacerlo? En primer vistazo a los contenidos de este RXD.AMOUT registro:

¿Qué quiere decir, que el registro RXD.AMOUT este tiempo puede registrarse para recibir el número de bytes de dirección de entrada de datos la última vez que los datos recibidos más datos recibidos esta vez no está exactamente en el siguiente para recibir la dirección de la entrada de datos todavía?

Del mismo modo la línea 131 es la longitud total de los datos actualmente recibido.

Línea 134 se utiliza para determinar si los datos han sido recibidos, las ideas anteriores que hemos recibido de datos es más largo que el tamaño del búfer de recepción temporizador expira o no datos recibidos son los datos que se han recibido. Después de recibir los datos que no necesitamos un temporizador, por supuesto, lo puso fuera, por lo que habrá un programa en la línea 135, línea 136 es un programa para la dirección del punto de re-entrada para recibir nuestra dirección del buffer de pre-definido para la próxima una recepción preparada. 137 programa de línea es una notificación de que se hayan recibido solicitudes, los datos pueden ser procesados, con el fin de evitar el byte erróneo en la interrupción de recepción de nuevo, tenemos que querer recibir la bandera caso de bytes se borra y luego girar a recibir interrupción de bytes.

Líneas 142-148 actualización se siguiente recibió la longitud de datos de la línea.

149 es la línea para reiniciar la tarea de recepción.

Con estos programas, podemos alcanzar una longitud variable de función Uarte DMA de recepción.

Se debe complementar dos instrucciones, creo que ha encontrado el tiempo para leer y bytes abierta interrupción de recepción y cierre de bytes recibir interrupciones Estas instrucciones aparecen muy brusco, agregar aquí la definición de estas dos instrucciones.

Y hemos dicho más arriba, el tercer evento de la interrupción se utiliza para hacerlo, de hecho, se utiliza para conseguir la función variable de tiempo para enviar.

Primero EVENTS_ENDTX Este evento indica que el contenido de la DMA de transmisión tampón ha sido enviado, las primeras 164 líneas para borrar la bandera de evento de interrupción 165 calcula el programa de línea de transmisión representa la longitud restante en bytes, el siguiente paso es si hay datos a transmitir determinar la longitud restante no menos de 255 es, si se enviará el restante, entonces la transmisión no está en los 255 bytes.

La misma necesidad de iniciar el envío de tareas.

La primera de 120 líneas es para empezar a enviar la tarea.

Cuando llega a su fin, es necesario excluir algunos de los boxes.

En primer lugar: ¿Por qué no en la interrupción de temporizador para notificar a la aplicación han recibido acceso directo al último byte es recibido por RXD.AMOUT, pero para obtener EVENTS_ENDRX configurar manualmente TASKS_STOPRX y después de conseguir la última longitud de bytes de la solicitud de notificación que recibe ha recibido?

Hay un pozo, y si usted desea conseguir RXD.AMOUT debe producir con el fin de obtener los eventos EVENTS_ENDRX, o adquirido es el último valor generado después del evento EVENTS_ENDRX. Con el fin de asegurar que el manejo de los datos recibidos al DMA búfer de recepción después de que haya la necesidad de generar eventos EVENTS_ENDRX.

En segundo lugar: la adquisición RXD.AMOUT y debe ser conseguir después de EVENTS_ENDTX productos.

Tercero: EVENTS_RXDRDY nuevo listo para recibir en ese momento, asegúrese de borrar el indicador EVENTS_RXDRDY, y luego volver a abrir interrumpido, o si hay una posibilidad de entrar interrupción abierta interrumpido afectar a la recepción.

 

Y finalmente pegar mis representaciones:

Limitado, habilidades, si mal, corregir mi oración es que, Wan Xie, Xie Wan. . . . .

 

 

 

 

 

 

 

 

Publicado cinco artículos originales · ganado elogios 0 · Vistas 561

Supongo que te gusta

Origin blog.csdn.net/qq_33784286/article/details/104899319
Recomendado
Clasificación