Producción de reloj electrónico keil basado en RASC (Renesas RA) (2)----configurar keil y usar el puerto serie para imprimir

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:

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

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
inserte la descripción de la imagen aquí

guardar la ruta del proyecto

Ingrese el nombre del proyecto, tenga cuidado de no ingresar chino.
inserte la descripción de la imagen aquí

configuración de chips

En este artículo, R7FA2E1A72DFL se usa para demostración y IDE elige keil.
inserte la descripción de la imagen aquí

Selección de plantilla de proyecto

inserte la descripción de la imagen aquí

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.
inserte la descripción de la imagen aquí

HOCO es un oscilador de cristal interno de alta velocidad.
inserte la descripción de la imagen aquí

configuración de pines

Mirando el diagrama esquemático, podemos saber que los puertos seriales son P109 y P110.
inserte la descripción de la imagen aquí
Al mismo tiempo, se exporta a través del puerto serie.
inserte la descripción de la imagen aquí

configuración UART

点击Pilas->Nueva pila->Controlador->Conectividad -> Controlador UART en r_sci_uart。
inserte la descripción de la imagen aquí

Configuración de propiedades UART

inserte la descripción de la imagen aquí

Configuración de DEPURACIÓN

Configure el puerto de depuración como SWD.
inserte la descripción de la imagen aquí

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.

inserte la descripción de la imagen aquí

generar proyecto

Haga clic en Generar contenido del proyecto para generar el proyecto del proyecto.
inserte la descripción de la imagen aquí

Una vez completada la generación, el proyecto se puede abrir en la carpeta correspondiente.
inserte la descripción de la imagen aquí

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.
inserte la descripción de la imagen aquí

Si necesita abrir RA Smart Configurator, puede operar como se muestra a continuación.
inserte la descripción de la imagen aquí

Establezca el configurador inteligente de RA en Keil

Haga clic en Herramientas > Personalizar menú de herramientas en keil...
inserte la descripción de la imagen aquí

La configuración se muestra en la siguiente figura.
inserte la descripción de la imagen aquí

● 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.
inserte la descripción de la imagen aquí

Encienda con éxito como se muestra a continuación.

inserte la descripción de la imagen aquí

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
inserte la descripción de la imagen aquí

Configuración de errores

Aquí uso jlink para depurar, y pueden ver que el dispositivo está correctamente identificado.
inserte la descripción de la imagen aquí

También configurado para borrar todo y restablecer y ejecutar.

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Se deben agregar 3 paquetes.
inserte la descripción de la imagen aquí

Consulte el manual para saber que la dirección SRAM correspondiente es 0x2000 4000-0x2000-8000.
inserte la descripción de la imagen aquí
Entonces ingrese la dirección RAM correspondiente en KEIL, que es 0x2000 4000-0x2000-8000

inserte la descripción de la imagen aquí

Prototipo de función R_SCI_UART_Open()

inserte la descripción de la imagen aquí

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.

inserte la descripción de la imagen aquí

Defina la variable de error.

fsp_err_t err = FSP_SUCCESS;

inserte la descripción de la imagen aquí

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.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

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>

inserte la descripción de la imagen aquí

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;
	}

inserte la descripción de la imagen aquí
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);
       }

inserte la descripción de la imagen aquí

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.

inserte la descripción de la imagen aquí

点击Pilas->Nueva pila->Temporizadores -> Reloj en tiempo real (r_rtc)。
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Modifique la fuente del reloj de LOCO a LOCO, el oscilador de cristal interno de baja velocidad.

inserte la descripción de la imagen aquí

Después de la configuración, regenere el código.
inserte la descripción de la imagen aquí

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
}

lograr efecto

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_24312945/article/details/131797241
Recomendado
Clasificación