80 #define UART0_OSR 0x0F
86 #define UART_C2_TeRe 0x0C
87 #define UART_S1_Err 0x0F
92 static void (*UART0_callback)(char);
93 static void (*UART1_callback)(char);
94 static void (*UART2_callback)(char);
100 void serial_init(uint32_t UART0_baudrate, uint32_t UART1_baudrate, uint32_t UART2_baudrate)
102 UART0_init(UART0_baudrate);
103 UART1_init(UART1_baudrate);
104 UART2_init(UART2_baudrate);
108 void UART0_init(uint32_t baudrate)
115 SIM_SCGC4 |= SIM_SCGC4_UART0_MASK;
116 SIM_SOPT2 = (uint32_t)((SIM_SOPT2 & ~SIM_SOPT2_UART0SRC_MASK) | 0x04000000);
125 UART0_callback =
NULL;
143 bauddiv = CORECLK / ((UART0_OSR + 1) * baudrate);
144 UART0_BDL = (uint8_t)(bauddiv & 0x00FF);
145 UART0_BDH |= (uint8_t)((bauddiv >> 8) & 0x001F);
146 UART0_C4 = (UART0_C4 & ~UART0_C4_OSR_MASK) | ((UART0_OSR) & 0x1F);
147 UART0_C1 &= ~(UART0_C1_M_MASK);
148 UART0_C1 &= ~(UART0_C1_PE_MASK);
149 UART0_BDH &= ~(UART0_BDH_SBNS_MASK);
150 if ( 4 <= UART0_OSR && UART0_OSR <= 7)
152 UART0_C5 |= UART0_C5_BOTHEDGE_MASK;
156 UART0_S1 |= (uint8_t)(UART_S1_IDLE_MASK | UART_S1_Err);
157 UART0_S2 = (uint8_t)0x00;
160 UART0_C2 |= (uint8_t)UART_C2_TeRe;
164 void UART1_init(uint32_t baudrate)
171 SIM_SCGC4 |= SIM_SCGC4_UART1_MASK;
180 UART1_callback =
NULL;
196 bauddiv = BUSCLK / baudrate;
197 UART1_BDH = (uint8_t)((bauddiv >> 8) & 0x001F);
198 UART1_BDL = (uint8_t)(bauddiv & 0x00FF);
203 UART1_S2 = (uint8_t)0x00;
206 UART1_C2 |= (uint8_t)UART_C2_TeRe;
210 void UART2_init(uint32_t baudrate)
217 SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;
220 PORTE_PCR23 |= 0x400;
221 PORTE_PCR22 |= 0x400;
226 UART2_callback =
NULL;
241 bauddiv = BUSCLK / baudrate;
242 UART2_BDH = (uint8_t)((bauddiv >> 8) & 0x001F);
243 UART2_BDL = (uint8_t)(bauddiv & 0x00FF);
248 UART2_S2 = (uint8_t)0x00;
251 UART2_C2 |= (uint8_t)UART_C2_TeRe;
255 void UART0_reg_callback(
void* UART0_Callback_Ptr)
257 UART0_callback = UART0_Callback_Ptr;
260 void UART1_reg_callback(
void* UART1_Callback_Ptr)
262 UART1_callback = UART1_Callback_Ptr;
265 void UART2_reg_callback(
void* UART2_Callback_Ptr)
267 UART2_callback = UART2_Callback_Ptr;
273 void UART_PutChar(uint8_t uart,
char outchar)
276 case 0: UART0_PutChar(outchar);
278 case 1: UART1_PutChar(outchar);
280 case 2: UART2_PutChar(outchar);
287 void UART0_PutChar(
char outChar)
289 while(!(UART0_S1 & UART_S1_TDRE_MASK));
291 UART0_D = (uint8_t)outChar;
294 void UART1_PutChar(
char outChar)
296 while(!(UART1_S1 & UART_S1_TDRE_MASK));
298 UART1_D = (uint8_t)outChar;
301 void UART2_PutChar(
char outChar)
303 while(!(UART2_S1 & UART_S1_TDRE_MASK));
305 UART2_D = (uint8_t)outChar;
310 void UART_SendString(uint8_t uart,
const unsigned char *str)
313 case 0: UART0_SendString(str);
315 case 1: UART1_SendString(str);
317 case 2: UART2_SendString(str);
325 void UART0_SendString(
const unsigned char *str)
329 UART0_PutChar(*str++);
333 void UART1_SendString(
const unsigned char *str)
337 UART1_PutChar(*str++);
341 void UART2_SendString(
const unsigned char *str)
345 UART2_PutChar(*str++);
352 void UART0_IRQ_en(
void)
354 UART0_C2 |= UART_C2_RIE_MASK;
357 void UART1_IRQ_en(
void)
359 UART1_C2 |= UART_C2_RIE_MASK;
362 void UART2_IRQ_en(
void)
364 UART2_C2 |= UART_C2_RIE_MASK;
368 void UART0_IRQ_dis(
void)
370 UART0_C2 &= ~UART_C2_RIE_MASK;
373 void UART1_IRQ_dis(
void)
375 UART1_C2 &= ~UART_C2_RIE_MASK;
378 void UART2_IRQ_dis(
void)
380 UART2_C2 &= ~UART_C2_RIE_MASK;
386 void UART0_IRQHandler(
void)
388 register uint16_t UART0_IntStatReg = UART0_S1;
390 if (UART0_IntStatReg & (UART_S1_OR_MASK | UART_S1_NF_MASK | UART_S1_FE_MASK | UART_S1_PF_MASK))
392 UART0_S1 = (uint8_t)UART_S1_Err;
394 UART0_IntStatReg &= (uint8_t)~UART_S1_RDRF_MASK;
396 if (UART0_C2 & UART_C2_TIE_MASK)
398 UART0_C2 &= (uint8_t)~UART_C2_TIE_MASK;
400 if (UART0_IntStatReg & UART_S1_RDRF_MASK)
402 register uint8_t inChar = UART0_D;
403 if (UART0_callback !=
NULL)
405 (*UART0_callback)(inChar);
417 void UART1_IRQHandler(
void)
419 register uint16_t UART1_IntStatReg = UART1_S1;
421 if (UART1_IntStatReg & (UART_S1_OR_MASK | UART_S1_NF_MASK | UART_S1_FE_MASK | UART_S1_PF_MASK))
424 UART1_IntStatReg &= (uint8_t)~UART_S1_RDRF_MASK;
426 if (UART1_C2 & UART_C2_TIE_MASK)
428 UART1_C2 &= (uint8_t)~UART_C2_TIE_MASK;
430 if (UART1_IntStatReg & UART_S1_RDRF_MASK)
432 register uint8_t inChar = UART1_D;
433 if (UART1_callback !=
NULL)
435 (*UART1_callback)(inChar);
446 void UART2_IRQHandler(
void)
448 register uint16_t UART2_IntStatReg = UART2_S1;
450 if (UART2_IntStatReg & (UART_S1_OR_MASK | UART_S1_NF_MASK | UART_S1_FE_MASK | UART_S1_PF_MASK))
453 UART2_IntStatReg &= (uint8_t)~UART_S1_RDRF_MASK;
455 if (UART2_C2 & UART_C2_TIE_MASK)
457 UART2_C2 &= (uint8_t)~UART_C2_TIE_MASK;
459 if (UART2_IntStatReg & UART_S1_RDRF_MASK)
461 register uint8_t inChar = UART2_D;
462 if (UART2_callback !=
NULL)
464 (*UART2_callback)(inChar);
void NVIC_Set_Priority(uint32_t IRQ, uint8_t priority)
Set the priority of the specified interrupt in the ARM NVIC.
CMSIS Peripheral Access Layer for MKL25Z4.
#define NULL
The null pointer.
void NVIC_ENABLE_INT(uint32_t IRQ)
Enable specified interrupt in the ARM NVIC.