Estoy diseñando un dispositivo IoT con muchos sensores que se integrarán mediante interfaces seriales como UART, SPI, I2C, etc. Para las capacidades de comunicación, planeo usar Wi-Fi (IEEE 802.11). ¿Tiene sentido usar algo como Wi-Fi SoC de Atmel y SAM D21 ARM Cortex-M0+ MCU o usar Cortex M4 de Atmel y luego integrar un módulo WiFi usando SPI o UART (no una solución SoC)?
Dado que tengo muchos periféricos a bordo, ¿tiene sentido usar una CPU Cortex M4 que es mucho más rápida y capaz?
Editar : estoy seguro de que esto se basa en opiniones. Pero estoy buscando algunas entradas de diseño válidas que me ayuden a tomar esta decisión. Por ejemplo,
Planeo integrar un almacenamiento SD, un reloj en tiempo real, una cantidad de sensores: temperatura, energía, etc. La cantidad de periféricos puede ser de 10 a 12. Todos integrados a través de UART, SPI e I2C. También planeo tener comunicación - Wifi, RF, GSM, Ethernet, etc.
No necesito ninguna capacidad matemática extrema. La unidad FPU sería agradable pero no obligatoria.
Lo que busco son respuestas a preguntas como...
Además: soy un ingeniero eléctrico con habilidades de programación integradas amateur/decentes. No es el mejor pero decente.
Para responder sumariamente a sus puntos centrales;
En el manejo de la comunicación con dispositivos periféricos, lo más importante es seleccionar el procesador correcto con el soporte correcto para los buses de hardware que está utilizando. Hay muchas maneras de hacer muchos tipos de comunicación, pero la mayoría de los elementos habilitados para SPI que debería preocuparte como aficionado algo experimentado estarán en el rango de 10 a 20 MHz de SPI como máximo.
Eso significa que su periférico SPI registrará un byte por cada 20 ciclos de reloj de núcleo en una CPU de 48 MHz en los momentos de mayor actividad. En un entorno interrumpido bien diseñado que es más que suficiente si no está haciendo grandes cantidades de enmascaramiento, cambio, adición y división en cada byte individual, para cada byte.
Además, ir a 80 MHz no te ayudará significativamente allí si comienzas a atragantarte.
Por lo tanto, es mucho mejor encontrar un procesador con un buen soporte para la gestión de periféricos, como un sistema DMA/uDMA que se pueda utilizar para grandes transferencias y un buen hardware FIFO, si es posible, que contenga al menos 4 bytes de datos (2 de 16 bits). palabras, o 1 qword de 32 bits, o solo 4 bytes), por lo que puede generar valores int32 de forma masiva.
Lo que más lo ayudará con las consideraciones en tiempo real es comprender cómo funcionan las interrupciones y cómo usarlas de manera eficiente sin bloquear grandes cantidades de tiempo del procesador. Después de todo, mientras el periférico en serie está saliendo o ingresando datos a unos pocos MHz, su núcleo no necesita hacer nada al respecto, siempre que elija el controlador correcto con el tipo correcto de soporte de hardware.
La cantidad de RAM interna (o RAM externa paralela rápida, pero en serio, no querrás comenzar a pensar en eso en este punto de tu 'carrera') que necesitas estará determinada por la cantidad de datos que generará una cosa en el tiempo. otra cosa necesita manejar la salida de la misma. Si se asegura de que su tubería de salida (¿probablemente WiFi?) sea rápida y sus sensores generen un orden de magnitud menos de datos, no necesitará tanta RAM siempre que administre bien el flujo. Si crea paquetes de datos de 5 kB cuyo inicio depende del final a través de su propio diseño tonto, necesitará más RAM que cuando los crea, por lo que no hay dependencia fuera de los bloques de 512 bytes (o menos).
Una velocidad de núcleo más rápida no lo ayudará mucho si todo lo que está haciendo es moverse unos pocos bytes alrededor de cada interrupción que recibe. Si necesita SPI de súper alta velocidad (que el módulo WiFi probablemente no admitirá si es asequible de todos modos), necesita un procesador con un reloj periférico de alta velocidad y controladores de pines de E/S de alta velocidad y baja capacitancia, en lugar de que uno con un núcleo rápido.
Parafraseando anecdóticamente: ahora estoy usando un procesador M4 para hacer algo que se podría haber hecho con un Atmega de 20 MHz, si no fuera por el hecho de que la interfaz de bus que algunos estúpidos especificaron necesita Bit-Banging de muy alta velocidad y FPGA son no es una opción en este diseño. Entonces, estoy ingresando, digamos, 5 Mbps de datos y emitiéndolos a través de periféricos estándar como I2C y SPI, y todo se decodifica, se matifica y demás, pero el 70 % de las veces mi núcleo hace algo, está golpeando la entrada de 5 Mbps y decidiendo rápidamente. en decisiones bit a bit. Quita eso y podría haber elegido al menos una MPU 8 veces más barata. Porque casi todo lo demás es interrupción y hardware en el que el núcleo no hace absolutamente nada.
Creo que m4 sería mejor ya que el reloj de la CPU es mucho más rápido, puede conservar energía (que creo que es un factor importante en IOT) al pasar al modo de suspensión rápidamente. Además, la integración mediante la interfaz serial no es un problema, la utilidad debería ser un problema en la consideración del diseño. Además, está utilizando M0+ no M0, M0+ fue diseñado para aplicaciones de baja potencia en mente. Sin embargo, si está buscando algo elegante, le recomiendo que eche un vistazo a cortex M4f. pero le he dado una visión general para alguien dispuesto a dar el paso como un interés.
Pero como señaló @Asmyldof, hay muchos factores que pueden afectar sus decisiones de diseño. Por lo tanto, sería mejor si los finaliza antes de seleccionar su elección de MCU...
Asmyldof