2222 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2323 * THE SOFTWARE.
2424 */
25-
25+
2626#include < cstdint>
2727
2828#include " gd32.h"
2929
30- #if defined(GD32H7XX)
31- #define TIMERx TIMER15
32- #define RCU_TIMERx RCU_TIMER15
30+ #if defined(GD32H7XX) // GD32H7XX
31+ #define TIMERx TIMER15
32+ #define RCU_TIMERx RCU_TIMER15
3333#define TIMERx_IRQHandler TIMER15_IRQHandler
34- #define TIMERx_IRQn TIMER15_IRQn
35- #elif defined(GD32F30X)
36- #define TIMERx TIMER7
37- #define RCU_TIMERx RCU_TIMER7
38- #if defined (GD32F30X_XD)
34+ #define TIMERx_IRQn TIMER15_IRQn
35+ #elif defined(GD32F30X) // GD32F30X
36+ #define TIMERx TIMER7
37+ #define RCU_TIMERx RCU_TIMER7
38+ #if defined(GD32F30X_XD) // GD32F30X_XD
3939#define TIMERx_IRQHandler TIMER7_UP_TIMER12_IRQHandler
40- #define TIMERx_IRQn TIMER7_UP_TIMER12_IRQn
40+ #define TIMERx_IRQn TIMER7_UP_TIMER12_IRQn
4141#else
4242#define TIMERx_IRQHandler TIMER7_UP_IRQHandler
43- #define TIMERx_IRQn TIMER7_UP_IRQn
43+ #define TIMERx_IRQn TIMER7_UP_IRQn
4444#endif
4545#else
46- #define TIMERx TIMER9
47- #define RCU_TIMERx RCU_TIMER9
46+ #define TIMERx TIMER9
47+ #define RCU_TIMERx RCU_TIMER9
4848#define TIMERx_IRQHandler TIMER0_UP_TIMER9_IRQHandler
49- #define TIMERx_IRQn TIMER0_UP_TIMER9_IRQn
49+ #define TIMERx_IRQn TIMER0_UP_TIMER9_IRQn
5050#endif
5151
5252#if defined(GD32H7XX)
53- #define TIMER_CLOCK_FREQ (AHB_CLOCK_FREQ )
53+ #define TIMER_CLOCK_FREQ (AHB_CLOCK_FREQ )
5454#elif defined(GD32F4XX)
55- #define TIMER_CLOCK_FREQ (APB2_CLOCK_FREQ * 2 )
55+ #define TIMER_CLOCK_FREQ (APB2_CLOCK_FREQ * 2 )
5656#else
57- #define TIMER_CLOCK_FREQ (APB2_CLOCK_FREQ )
57+ #define TIMER_CLOCK_FREQ (APB2_CLOCK_FREQ )
5858#endif
5959
6060#if !defined(SOFTUART_TX_PINx)
61- #define SOFTUART_TX_PINx GPIO_PIN_9
62- #define SOFTUART_TX_GPIOx GPIOA
63- #define SOFTUART_TX_RCU_GPIOx RCU_GPIOA
61+ #define SOFTUART_TX_PINx GPIO_PIN_9
62+ #define SOFTUART_TX_GPIOx GPIOA
63+ #define SOFTUART_TX_RCU_GPIOx RCU_GPIOA
6464#endif
6565
6666#if defined(SOFTUART0_ENABLE_RX)
6767#if !defined(SOFTUART_RX_PINx)
68- #define SOFTUART_RX_PINx GPIO_PIN_10
69- #define SOFTUART_RX_GPIOx GPIOA
70- #define SOFTUART_RX_RCU_GPIOx RCU_GPIOA
68+ #define SOFTUART_RX_PINx GPIO_PIN_10
69+ #define SOFTUART_RX_GPIOx GPIOA
70+ #define SOFTUART_RX_RCU_GPIOx RCU_GPIOA
7171#if defined(GD32H7XX)
7272#error
7373#else
74- #define SOFTUART_RX_TIMERx TIMER0
75- #define SOFTUART_RX_RCU_TIMERx RCU_TIMER0
76- #define SOFTUART_RX_EXTIx_IRQHandler EXTI10_15_IRQHandler
77- #define SOFTUART_RX_EXTIx_IRQn EXTI10_15_IRQn
78- #define SOFTUART_RX_GPIO_PORT_SOURCE_GPIOx GPIO_PORT_SOURCE_GPIOB
79- #define SOFTUART_RX_GPIO_PIN_SOURCE_x GPIO_PIN_SOURCE_14
74+ #define SOFTUART_RX_TIMERx TIMER11
75+ #define SOFTUART_RX_RCU_TIMERx RCU_TIMER11
76+ #define SOFTUART_RX_EXTIx_IRQHandler EXTI10_15_IRQHandler
77+ #define SOFTUART_RX_EXTIx_IRQn EXTI10_15_IRQn
78+ #define SOFTUART_RX_GPIO_PORT_SOURCE_GPIOx GPIO_PORT_SOURCE_GPIOB
79+ #define SOFTUART_RX_GPIO_PIN_SOURCE_x GPIO_PIN_SOURCE_14
8080#endif
8181#endif // !defined(SOFTUART_RX_PINx)
8282static_assert (TIMERx != SOFTUART_RX_TIMERx);
@@ -92,7 +92,7 @@ static constexpr uint32_t kTimerPeriod = ((TIMER_CLOCK_FREQ / kBaudRate) - 1U);
9292static constexpr uint32_t kBufferSize = 128U ;
9393
9494enum class TxState { kIdle , kStartBit , kData , kStopBit };
95- enum class RxState { kIdle , kVerifyStart , kData , kStopBit };
95+ enum class RxState { kIdle , kStart , kData , kStop };
9696
9797struct CircularBuffer {
9898 uint8_t buffer[kBufferSize ];
@@ -108,6 +108,8 @@ static volatile uint8_t s_tx_shift;
108108#if defined(SOFTUART0_ENABLE_RX)
109109static volatile CircularBuffer s_rx_buffer __attribute__ ((aligned(4 )));
110110static volatile RxState s_rx_state;
111+ static volatile uint8_t s_rx_data;
112+ static volatile uint8_t s_rx_shift;
111113#endif // defined(SOFTUART0_ENABLE_RX)
112114
113115extern " C" {
@@ -156,6 +158,35 @@ void TIMERx_IRQHandler() {
156158}
157159#if defined(SOFTUART0_ENABLE_RX)
158160void SOFTUART_RX_EXTIx_IRQHandler () {
161+ if (RESET == exti_interrupt_flag_get (EXTI_14 )) {
162+ return ;
163+ }
164+
165+ exti_interrupt_flag_clear (EXTI_14 );
166+
167+ if (s_rx_state != RxState::kIdle ) {
168+ return ;
169+ }
170+
171+ if ((GPIO_ISTAT (SOFTUART_RX_GPIOx) & SOFTUART_RX_PINx) != 0U ) {
172+ return ;
173+ }
174+
175+ s_rx_state = RxState::kStart ;
176+ s_rx_data = 0 ;
177+ s_rx_shift = 0 ;
178+
179+ exti_interrupt_disable (EXTI_14 );
180+
181+ timer_disable (SOFTUART_RX_TIMERx);
182+ timer_counter_value_config (SOFTUART_RX_TIMERx, 0 );
183+
184+ // First sample = middle of first data bit
185+ // = 1.5 bit times after falling edge.
186+ timer_channel_output_pulse_value_config (SOFTUART_RX_TIMERx, TIMER_CH_0 , (kTimerPeriod * 3U ) / 2U );
187+
188+ timer_interrupt_flag_clear (SOFTUART_RX_TIMERx, TIMER_INT_FLAG_CH0 );
189+ timer_enable (SOFTUART_RX_TIMERx);
159190}
160191#endif
161192}
0 commit comments