2323#include "cmsis.h"
2424#include "pinmap.h"
2525#include "gpio_api.h"
26+ #include "mbed_critical.h"
2627
2728#include "scif_iodefine.h"
2829#include "cpg_iodefine.h"
@@ -570,21 +571,14 @@ static void serial_flow_irq_set(serial_t *obj, uint32_t enable) {
570571int serial_getc (serial_t * obj ) {
571572 uint16_t err_read ;
572573 int data ;
573- int was_masked ;
574574
575- #if defined ( __ICCARM__ )
576- was_masked = __disable_irq_iar ();
577- #else
578- was_masked = __disable_irq ();
579- #endif /* __ICCARM__ */
575+ core_util_critical_section_enter ();
580576 if (obj -> uart -> SCFSR & 0x93 ) {
581577 err_read = obj -> uart -> SCFSR ;
582578 obj -> uart -> SCFSR = (err_read & ~0x93 );
583579 }
584580 obj -> uart -> SCSCR |= 0x0040 ; // Set RIE
585- if (!was_masked ) {
586- __enable_irq ();
587- }
581+ core_util_critical_section_exit ();
588582
589583 if (obj -> uart -> SCLSR & 0x0001 ) {
590584 obj -> uart -> SCLSR = 0u ; // ORER clear
@@ -593,16 +587,12 @@ int serial_getc(serial_t *obj) {
593587 while (!serial_readable (obj ));
594588 data = obj -> uart -> SCFRDR & 0xff ;
595589
596- #if defined ( __ICCARM__ )
597- was_masked = __disable_irq_iar ();
598- #else
599- was_masked = __disable_irq ();
600- #endif /* __ICCARM__ */
590+ core_util_critical_section_enter ();
591+
601592 err_read = obj -> uart -> SCFSR ;
602593 obj -> uart -> SCFSR = (err_read & 0xfffD ); // Clear RDF
603- if (!was_masked ) {
604- __enable_irq ();
605- }
594+
595+ core_util_critical_section_exit ();
606596
607597 if (err_read & 0x80 ) {
608598 data = -1 ; //err
@@ -612,29 +602,16 @@ int serial_getc(serial_t *obj) {
612602
613603void serial_putc (serial_t * obj , int c ) {
614604 uint16_t dummy_read ;
615- int was_masked ;
616605
617- #if defined ( __ICCARM__ )
618- was_masked = __disable_irq_iar ();
619- #else
620- was_masked = __disable_irq ();
621- #endif /* __ICCARM__ */
606+ core_util_critical_section_enter ();
622607 obj -> uart -> SCSCR |= 0x0080 ; // Set TIE
623- if (!was_masked ) {
624- __enable_irq ();
625- }
608+ core_util_critical_section_exit ();
626609 while (!serial_writable (obj ));
627610 obj -> uart -> SCFTDR = c ;
628- #if defined ( __ICCARM__ )
629- was_masked = __disable_irq_iar ();
630- #else
631- was_masked = __disable_irq ();
632- #endif /* __ICCARM__ */
611+ core_util_critical_section_enter ();
633612 dummy_read = obj -> uart -> SCFSR ;
634613 obj -> uart -> SCFSR = (dummy_read & 0xff9f ); // Clear TEND/TDFE
635- if (!was_masked ) {
636- __enable_irq ();
637- }
614+ core_util_critical_section_exit ();
638615 uart_data [obj -> index ].count ++ ;
639616}
640617
@@ -647,83 +624,46 @@ int serial_writable(serial_t *obj) {
647624}
648625
649626void serial_clear (serial_t * obj ) {
650- int was_masked ;
651- #if defined ( __ICCARM__ )
652- was_masked = __disable_irq_iar ();
653- #else
654- was_masked = __disable_irq ();
655- #endif /* __ICCARM__ */
656-
627+ core_util_critical_section_enter ();
657628 obj -> uart -> SCFCR |= 0x06 ; // TFRST = 1, RFRST = 1
658629 obj -> uart -> SCFCR &= ~0x06 ; // TFRST = 0, RFRST = 0
659630 obj -> uart -> SCFSR &= ~0x0093u ; // ER, BRK, RDF, DR = 0
660-
661- if (!was_masked ) {
662- __enable_irq ();
663- }
631+ core_util_critical_section_exit ();
664632}
665633
666634void serial_pinout_tx (PinName tx ) {
667635 pinmap_pinout (tx , PinMap_UART_TX );
668636}
669637
670638void serial_break_set (serial_t * obj ) {
671- int was_masked ;
672- #if defined ( __ICCARM__ )
673- was_masked = __disable_irq_iar ();
674- #else
675- was_masked = __disable_irq ();
676- #endif /* __ICCARM__ */
639+ core_util_critical_section_enter ();
677640 // TxD Output(L)
678641 obj -> uart -> SCSPTR &= ~0x0001u ; // SPB2DT = 0
679642 obj -> uart -> SCSCR &= ~0x0020u ; // TE = 0 (Output disable)
680- if (!was_masked ) {
681- __enable_irq ();
682- }
643+ core_util_critical_section_exit ();
683644}
684645
685646void serial_break_clear (serial_t * obj ) {
686- int was_masked ;
687- #if defined ( __ICCARM__ )
688- was_masked = __disable_irq_iar ();
689- #else
690- was_masked = __disable_irq ();
691- #endif /* __ICCARM__ */
647+ core_util_critical_section_enter ();
692648 obj -> uart -> SCSCR |= 0x0020u ; // TE = 1 (Output enable)
693649 obj -> uart -> SCSPTR |= 0x0001u ; // SPB2DT = 1
694- if (!was_masked ) {
695- __enable_irq ();
696- }
650+ core_util_critical_section_exit ();
697651}
698652
699653void serial_set_flow_control (serial_t * obj , FlowControl type , PinName rxflow , PinName txflow ) {
700654 // determine the UART to use
701- int was_masked ;
702-
703655 serial_flow_irq_set (obj , 0 );
704656
705657 if (type == FlowControlRTSCTS ) {
706- #if defined ( __ICCARM__ )
707- was_masked = __disable_irq_iar ();
708- #else
709- was_masked = __disable_irq ();
710- #endif /* __ICCARM__ */
658+ core_util_critical_section_enter ();
711659 obj -> uart -> SCFCR = 0x0008u ; // CTS/RTS enable
712- if (!was_masked ) {
713- __enable_irq ();
714- }
660+ core_util_critical_section_exit ();
715661 pinmap_pinout (rxflow , PinMap_UART_RTS );
716662 pinmap_pinout (txflow , PinMap_UART_CTS );
717663 } else {
718- #if defined ( __ICCARM__ )
719- was_masked = __disable_irq_iar ();
720- #else
721- was_masked = __disable_irq ();
722- #endif /* __ICCARM__ */
664+ core_util_critical_section_enter ();
723665 obj -> uart -> SCFCR = 0x0000u ; // CTS/RTS diable
724- if (!was_masked ) {
725- __enable_irq ();
726- }
666+ core_util_critical_section_exit ();
727667 }
728668}
729669
0 commit comments