OBJETIVO:
Se hará uso del módulo del puerto serial UART1 con el que cuenta el MCU R5F104PJAFB de la tarjeta de evaluación YRDKRL78G14. Se le enviara un dato de 8 bits por medio de una hypeterminal serial, el MCU la recibe en su interrupción y ese mismo dato de 8 bits lo reenvía de regreso a la hypeterminal.
- Configurar la unidad UART1
- Habilitar ambas interrupciones (Send – Receive)
- Hacer Eco del dato recibido
DESARROLLO:
- Del manual Renesas RL78G14 RDK User's Manual ubicamos los pines del puerto serial:
- Utilizamos un conversor USB-Serial:
Conectamos TxD1 --> RxD, TxD --> RxD1 y GND --> PIN 20 GND
PASOS:
1.- Abrir el software e2studio
2.- New/ C Project
1.- Clic derecho en el proyecto generado y seleccionar Properties:
2.- Seleccionar C/C++ Build / Settings / Linker / Device y establecer los siguientes parámetros:
OCD = 85
Option Byte = efffe8
Palomear: Use range of debug monitor area. Nota: No establecer ningún valor solo dejarlo en blanco.
Apply y después OK.
3.- Configuraremos el UART 1 por medio del modulo SAU0 a 9600 bps, 1 bit stop y no paridad.
void R_SAU0_Create(void)
{
SAU0EN = 1U; /* supply SAU0 clock */
__nop();
__nop();
__nop();
__nop();
SPS0 = _0004_SAU_CK00_FCLK_4 | _0040_SAU_CK01_FCLK_4;
R_UART1_Create();
}
void R_UART1_Create(void)
{
ST0 |= _0008_SAU_CH3_STOP_TRG_ON |
_0004_SAU_CH2_STOP_TRG_ON; /* disable UART1 receive and transmit */
STMK1 = 1U; /* disable INTST1 interrupt */
STIF1 = 0U; /* clear INTST1 interrupt flag */
SRMK1 = 1U; /* disable INTSR1 interrupt */
SRIF1 = 0U; /* clear INTSR1 interrupt flag */
SREMK1 = 1U; /* disable INTSRE1 interrupt */
SREIF1 = 0U; /* clear INTSRE1 interrupt flag */
/* Set INTST1 low priority */
STPR11 = 1U;
STPR01 = 1U;
/* Set INTSR1 low priority */
SRPR11 = 1U;
SRPR01 = 1U;
/* Set INTSRE1 low priority */
SREPR11 = 1U;
SREPR01 = 1U;
SMR02 = _0020_SAU_SMRMN_INITIALVALUE | _0000_SAU_CLOCK_SELECT_CK00 |
_0000_SAU_TRIGGER_SOFTWARE |
_0002_SAU_MODE_UART | _0000_SAU_TRANSFER_END;
SCR02 = _8000_SAU_TRANSMISSION | _0000_SAU_INTSRE_MASK |
_0000_SAU_PARITY_NONE | _0080_SAU_LSB | _0010_SAU_STOP_1 |
_0007_SAU_LENGTH_8;
SDR02 = _CE00_UART1_TRANSMIT_DIVISOR;
NFEN0 |= _04_SAU_RXD1_FILTER_ON;
SIR03 = _0004_SAU_SIRMN_FECTMN | _0002_SAU_SIRMN_PECTMN |
_0001_SAU_SIRMN_OVCTMN; /* clear error flag */
SMR03 = _0020_SAU_SMRMN_INITIALVALUE | _0000_SAU_CLOCK_SELECT_CK00 |
_0100_SAU_TRIGGER_RXD | _0000_SAU_EDGE_FALL |
_0002_SAU_MODE_UART |
_0000_SAU_TRANSFER_END;
SCR03 = _4000_SAU_RECEPTION | _0400_SAU_INTSRE_ENABLE |
_0000_SAU_PARITY_NONE | _0080_SAU_LSB | _0010_SAU_STOP_1 |
_0007_SAU_LENGTH_8;
SDR03 = _CE00_UART1_RECEIVE_DIVISOR;
SO0 |= _0004_SAU_CH2_DATA_OUTPUT_1;
SOL0 |= _0000_SAU_CHANNEL2_NORMAL;
/* output level
normal */
SOE0 |= _0004_SAU_CH2_OUTPUT_ENABLE;
/* enable UART1
output */
/* Set RxD1 pin */
PMC0 &= 0xF7U;
PM0 |= 0x08U;
/* Set TxD1 pin */
PMC0 &= 0xFBU;
P0 |= 0x04U;
PM0 &= 0xFBU;
}
4.- Creamos las 2 interrupciones:
#pragma interrupt
r_uart1_interrupt_send(vect=INTST1)
static void __near r_uart1_interrupt_send(void)
{
STMK1
= 1U; /* disable INTST1 interrupt */
}
// interrupcion UART 1 RX PIN 94
#pragma interrupt
r_uart1_interrupt_receive(vect=INTSR1)
static void __near r_uart1_interrupt_receive(void)
{
data_uart = RXD1;
TXD1 = data_uart;
STMK1 = 0U; /* enable INTST1
interrupt */
}
Como se puede observar lo que recibe data_uart en su interrupción de vector INTSR1 es cargado al registro TXD1 y se habilita su interrupción STMK1 para que lo envié de regreso al puerto UART y así hacer eco de todo lo que se reciba.
- Agregar código, compilar y debug:
1.- Bajar el código de:
2.- Compilar con el icono del martillo, debug con el icono del insecto y correr software:
3.- Abrir Comm operator u alguna otra hypeterminal serial, configurarla a 9600 bps:
CONEXIÓN: