cursada_mc2
Base de control de temperatura para EDU-CIAA-NXP
Loading...
Searching...
No Matches
uart_driver_irq.c
Go to the documentation of this file.
1
6#include "uart_driver_irq.h"
7
8#include <ring_buffer.h>
9
10typedef struct {
11 LPC_USART_T* peripheral;
12 IRQn_Type irq;
13 uint8_t channel;
15 RINGBUFF_T rx_ring;
16 RINGBUFF_T tx_ring;
17 uint8_t rx_data[UART_IRQ_RX_BUFFER_SIZE];
18 uint8_t tx_data[UART_IRQ_TX_BUFFER_SIZE];
20
28
29static bool driver_uart_irq_select_channel(uint8_t channel)
30{
37 switch (channel) {
40 driver_uart_irq_state_.irq = USART0_IRQn;
42 Chip_SCU_PinMux(9, 5, MD_PDN, FUNC7);
43 Chip_SCU_PinMux(9, 6, MD_PLN | MD_EZI | MD_ZI, FUNC7);
44 return true;
47 driver_uart_irq_state_.irq = USART2_IRQn;
49 Chip_SCU_PinMux(7, 1, MD_PDN, FUNC6);
50 Chip_SCU_PinMux(7, 2, MD_PLN | MD_EZI | MD_ZI, FUNC6);
51 return true;
54 driver_uart_irq_state_.irq = USART3_IRQn;
56 Chip_SCU_PinMux(2, 3, MD_PDN, FUNC2);
57 Chip_SCU_PinMux(2, 4, MD_PLN | MD_EZI | MD_ZI, FUNC2);
58 return true;
59 default:
60 return false;
61 }
62}
63
64bool driver_uart_irq_init(uint8_t channel, uint32_t baudrate)
65{
66 if (!driver_uart_irq_select_channel(channel)) {
67 return false;
68 }
69
76 RingBuffer_Init(&driver_uart_irq_state_.rx_ring,
80 RingBuffer_Init(&driver_uart_irq_state_.tx_ring,
84
85 Chip_UART_Init(driver_uart_irq_state_.peripheral);
86 Chip_UART_SetBaud(driver_uart_irq_state_.peripheral, baudrate);
87 Chip_UART_SetupFIFOS(driver_uart_irq_state_.peripheral,
88 UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS | UART_FCR_TRG_LEV0);
89 Chip_UART_TXEnable(driver_uart_irq_state_.peripheral);
90
91 Chip_UART_IntDisable(driver_uart_irq_state_.peripheral,
92 UART_IER_RBRINT | UART_IER_THREINT | UART_IER_RLSINT);
93 Chip_UART_IntEnable(driver_uart_irq_state_.peripheral, UART_IER_RBRINT | UART_IER_RLSINT);
94
95 NVIC_ClearPendingIRQ(driver_uart_irq_state_.irq);
96 NVIC_EnableIRQ(driver_uart_irq_state_.irq);
97
99 return true;
100}
101
103{
105 return;
106 }
107
108 NVIC_DisableIRQ(driver_uart_irq_state_.irq);
109 Chip_UART_IntDisable(driver_uart_irq_state_.peripheral,
110 UART_IER_RBRINT | UART_IER_THREINT | UART_IER_RLSINT);
111 Chip_UART_DeInit(driver_uart_irq_state_.peripheral);
113}
114
115int driver_uart_irq_write(const void* data, uint16_t num_bytes)
116{
117 if (!driver_uart_irq_state_.initialized || (data == 0) || (num_bytes == 0U)) {
118 return 0;
119 }
120
121 return (int) Chip_UART_SendRB(driver_uart_irq_state_.peripheral,
123 data,
124 (int) num_bytes);
125}
126
127int driver_uart_irq_read(void* data, uint16_t num_bytes)
128{
129 if (!driver_uart_irq_state_.initialized || (data == 0) || (num_bytes == 0U)) {
130 return 0;
131 }
132
133 return Chip_UART_ReadRB(driver_uart_irq_state_.peripheral,
135 data,
136 (int) num_bytes);
137}
138
140{
142 return 0;
143 }
144
145 return RingBuffer_GetCount(&driver_uart_irq_state_.rx_ring);
146}
147
149{
151 return 0;
152 }
153
154 return RingBuffer_GetFree(&driver_uart_irq_state_.tx_ring);
155}
156
158{
160 return;
161 }
162
163 RingBuffer_Flush(&driver_uart_irq_state_.rx_ring);
164 RingBuffer_Flush(&driver_uart_irq_state_.tx_ring);
165}
166
171
173{
175 return;
176 }
177
184 Chip_UART_IRQRBHandler(driver_uart_irq_state_.peripheral,
187}
188
200
207
uint8_t tx_data[UART_IRQ_TX_BUFFER_SIZE]
uint8_t rx_data[UART_IRQ_RX_BUFFER_SIZE]
void driver_uart_irq_handler(void)
Handler generico del driver para ser invocado desde la IRQ activa.
bool driver_uart_irq_is_initialized(void)
Informa si el driver ya fue inicializado.
static driver_uart_irq_state_t driver_uart_irq_state_
Estado global de una unica instancia activa del driver.
void UART3_IRQHandler(void)
void driver_uart_irq_flush(void)
Vacia los buffers de recepcion y transmision.
void UART0_IRQHandler(void)
void driver_uart_irq_deinit(void)
Desinicializa la UART configurada y deshabilita sus interrupciones.
int driver_uart_irq_write(const void *data, uint16_t num_bytes)
Encola datos para transmision por UART.
static bool driver_uart_irq_select_channel(uint8_t channel)
int driver_uart_irq_tx_free(void)
Informa cuanto espacio libre queda en el buffer de transmision.
bool driver_uart_irq_init(uint8_t channel, uint32_t baudrate)
Inicializa un canal UART para operar por interrupciones.
void UART2_IRQHandler(void)
int driver_uart_irq_read(void *data, uint16_t num_bytes)
Lee datos disponibles desde el buffer de recepcion.
int driver_uart_irq_available(void)
Informa cuantos bytes hay disponibles para leer.
Driver UART por interrupciones basado en ring buffers de LPCOpen.
#define UART_IRQ_CHANNEL_3
Identificador del canal UART3.
#define UART_IRQ_CHANNEL_0
Identificador del canal UART0.
#define UART_IRQ_RX_BUFFER_SIZE
Tamano del buffer circular de recepcion.
#define UART_IRQ_TX_BUFFER_SIZE
Tamano del buffer circular de transmision.
#define UART_IRQ_CHANNEL_2
Identificador del canal UART2.