Producción de reloj electrónico keil basado en RASC_configure keil y use el puerto serie para imprimir
- descripción general
- documentos de referencia
- preparación de hardware
- videotutorial
- Nueva construcción
- guardar la ruta del proyecto
- configuración de chips
- Selección de plantilla de proyecto
- ajuste del reloj
- configuración de pines
- configuración UART
- Configuración de propiedades UART
- Configuración de DEPURACIÓN
- función imprimirf()
- Configurar la pila de e2studio
- generar proyecto
- Establezca el configurador inteligente de RA en Keil
- configuración de keil
- Configuración de errores
- Prototipo de función R_SCI_UART_Open()
- Función de devolución de llamada user_uart_callback ()
- salida de printf redirigida al puerto serie
- Configuración de RTC
- código completo
- lograr efecto
descripción general
Este artículo presenta principalmente un método para hacer un reloj electrónico basado en el microcontrolador de la serie Renesas RA, centrándose en cómo usar el configurador inteligente Renesas RA para generar la configuración del puerto serie y cómo imprimir el puerto serie en la placa de desarrollo Renesas RA2E1 en la práctica. configuración. A través de pasos y ejemplos detallados, los lectores podrán comprender cómo usar RA Smart Configurator, una poderosa herramienta, para simplificar el proceso de configuración del puerto serie y aplicarlo a proyectos reales para lograr funciones de impresión y comunicación de puerto serie eficientes. El artículo también incluirá explicaciones de fragmentos de código relevantes y parámetros de configuración para ayudar a los lectores a comprender y aplicar profundamente estos conceptos. Finalmente, se puede desarrollar fácilmente una aplicación de reloj electrónico completamente funcional, estable y confiable en la plataforma Renesas RA.
documentos de referencia
https://renesas.github.io/fsp/_s_t_a_r_t__d_e_v.html#RASC-MDK-IAR-guía-del-usuario
preparación de hardware
Primero, debe preparar una placa de desarrollo. Aquí estoy preparando una placa de desarrollo con el modelo de chip R7FA2E1A72DFL:
videotutorial
https://www.bilibili.com/video/BV1BF411Q7cq/
Producción de reloj electrónico Keil basada en RASC (Renesas RA)----(2) configurar keil y usar el puerto serie para imprimir
Nueva construcción
Haga clic en Archivo->Nuevo->Proyecto FSP
guardar la ruta del proyecto
Ingrese el nombre del proyecto, tenga cuidado de no ingresar chino.
configuración de chips
En este artículo, R7FA2E1A72DFL se usa para demostración y IDE elige keil.
Selección de plantilla de proyecto
ajuste del reloj
No hay un oscilador de cristal externo configurado en la placa de desarrollo, por lo que se selecciona el oscilador de cristal interno.
HOCO es un oscilador de cristal interno de alta velocidad.
configuración de pines
Mirando el diagrama esquemático, podemos saber que los puertos seriales son P109 y P110.
Al mismo tiempo, se exporta a través del puerto serie.
configuración UART
点击Pilas->Nueva pila->Controlador->Conectividad -> Controlador UART en r_sci_uart。
Configuración de propiedades UART
Configuración de DEPURACIÓN
Configure el puerto de depuración como SWD.
función imprimirf()
La función printf() es una función de salida con estilo, que generalmente se usa para enviar mensajes a dispositivos de salida estándar en un estilo prescrito. Esta función se usa a menudo al escribir pasos. El patrón de llamada de la función printf() es: printf("<cadena con estilo>", <lista de parámetros>);
donde la cadena con estilo incluye dos partes: una parte son caracteres normales, y estos caracteres se mostrarán tal como son; la otra parte Es un carácter específico para el estilo, que comienza con "%", seguido de uno o varios caracteres específicos, que se utiliza para determinar el estilo del contenido de salida. La tabla de parámetros es una serie de parámetros que deben generarse, y su número debe ser el mismo que el número de parámetros de salida especificados por la cadena formateada. Los parámetros están separados por comas inglesas "," y el orden corresponde uno por uno , de lo contrario será Ocurrió un error inesperado.
Nota: La función printf empuja la pila de derecha a izquierda y luego coloca la primera lectura en la parte inferior de la pila y la última lectura en la parte superior de la pila. El procesamiento comienza desde la parte superior de la pila, por lo que el resultado vemos es que el procesamiento se inicia desde la derecha de.
Configurar la pila de e2studio
La función printf generalmente necesita establecer el tamaño de la pila. Esto se debe a que la función printf necesita usar espacio de pila para almacenar variables temporales e información de llamada de función en tiempo de ejecución. Un tamaño de pila insuficiente puede provocar bloqueos del programa o un comportamiento impredecible.
La función printf usa una lista de parámetros variables, usará la pila para almacenar los parámetros al llamar y luego borrará los parámetros al final de la llamada a la función, lo que requiere suficiente espacio en la pila. Además, printf también usará algunas variables temporales, si el espacio de la pila es insuficiente, el programa fallará.
Por lo tanto, para evitar este tipo de problemas, el tamaño de la pila debe establecerse razonablemente de acuerdo con las necesidades del programa.
generar proyecto
Haga clic en Generar contenido del proyecto para generar el proyecto del proyecto.
Una vez completada la generación, el proyecto se puede abrir en la carpeta correspondiente.
Abra el software y compílelo, puede ver que user_uart_callback no está definido, porque la función de devolución de llamada del puerto serie acaba de generarse, lo que indica que el proyecto generado es normal.
Si necesita abrir RA Smart Configurator, puede operar como se muestra a continuación.
Establezca el configurador inteligente de RA en Keil
Haga clic en Herramientas > Personalizar menú de herramientas en keil...
La configuración se muestra en la siguiente figura.
● Cree uno nuevo en Nombre del elemento de menú e ingrese RA Smart Configurator
● Ingrese la dirección rasc.exe en Comando
● Ingrese en Carpeta inicial
$P
● Entrada en argumentos
--device $D --compiler ARMv6 configuration.xml
Después de configurarlo, puede abrirlo en Herramientas->RA Smart Configurator.
Encienda con éxito como se muestra a continuación.
configuración de keil
microlib está altamente optimizado para mantener el código pequeño. Tiene menos funcionalidad que la biblioteca C predeterminada y no tiene algunas características ISO C en absoluto. Algunas funciones de la biblioteca también se ejecutan lentamente. Si desea utilizar printf(), debe habilitar
Configuración de errores
Aquí uso jlink para depurar, y pueden ver que el dispositivo está correctamente identificado.
También configurado para borrar todo y restablecer y ejecutar.
Se deben agregar 3 paquetes.
Consulte el manual para saber que la dirección SRAM correspondiente es 0x2000 4000-0x2000-8000.
Entonces ingrese la dirección RAM correspondiente en KEIL, que es 0x2000 4000-0x2000-8000
Prototipo de función R_SCI_UART_Open()
Por lo tanto, la función R_SCI_UART_Open() se puede utilizar para configurar, abrir e inicializar el UART.
/* Open the transfer instance with initial configuration. */
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
añadido al programa principal.
Defina la variable de error.
fsp_err_t err = FSP_SUCCESS;
Función de devolución de llamada user_uart_callback ()
Cuando se envían los datos, puede verificar UART_EVENT_TX_COMPLETE para determinar si la transmisión está completa.
Puede verificar si el valor del campo "evento" en la estructura "p_args" es igual a "UART_EVENT_TX_COMPLETE". Si la condición es verdadera, se ejecutará el bloque de código que sigue a la instrucción if.
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
}
Al mismo tiempo, printf necesita importar archivos de encabezado.
#include <stdio.h>
salida de printf redirigida al puerto serie
El método de impresión más utilizado es printf, por lo que el problema a resolver es redirigir la salida de printf al puerto serie y luego enviar los datos a través del puerto serie.
Asegúrese de agregar el archivo de encabezado #include <stdio.h>
int fputc(int ch, FILE *f)
{
err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){
}
uart_send_complete_flag = false;
return ch;
}
Agregue un bucle while al programa principal para imprimir ¡Hola mundo!
while(1)
{
printf("hello world!\n");
R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);
}
Configuración de RTC
Si salta a la inicialización de RTC durante la depuración, significa que el reloj requerido por el RTC no se ha activado correctamente.
Porque no usamos un oscilador de cristal externo.
点击Pilas->Nueva pila->Temporizadores -> Reloj en tiempo real (r_rtc)。
Modifique la fuente del reloj de LOCO a LOCO, el oscilador de cristal interno de baja velocidad.
Después de la configuración, regenere el código.
código completo
#include "hal_data.h"
#include <stdio.h>
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
}
int fputc(int ch, FILE *f)
{
err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){
}
uart_send_complete_flag = false;
return ch;
}
void hal_entry(void)
{
/* TODO: add your own code here */
/* Open the transfer instance with initial configuration. */
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
while(1)
{
printf("hello world!\n");
R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}