terminal_usartbridge.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "terminal_usartbridge.h"
  2. #include "terminal_sbs.h"
  3. #include <string.h>
  4. #include <stdio.h>
  5. //Usart bridge object for global terminal
  6. UsartBridgeTerminal terminalUsartBridge;
  7. //Pointer to global terminal object
  8. extern Terminal* pTerminal;
  9. #ifdef __GNUC__
  10. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  11. #else
  12. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  13. #endif
  14. PUTCHAR_PROTOTYPE
  15. {
  16. while (usart_flag_get(USART_BRIDGE_USART, USART_TDBE_FLAG) == RESET);
  17. usart_data_transmit(USART_BRIDGE_USART, (uint16_t)ch);
  18. while (usart_flag_get(USART_BRIDGE_USART, USART_TDC_FLAG) == RESET);
  19. return ch;
  20. }
  21. //-----------------------------------------------------------------------------
  22. // Connect usartBridge objectt with ANSI C Interfaces
  23. //-----------------------------------------------------------------------------
  24. //Configure usart bridge
  25. void configure_usartbridge() {
  26. terminalUsartBridge.configure();
  27. }
  28. //Print callback for terminal object
  29. void print_usartbridge(const char * str) {
  30. terminalUsartBridge.print(str);
  31. }
  32. //-----------------------------------------------------------------------------
  33. // Usart Bridge for terminal
  34. //-----------------------------------------------------------------------------
  35. UsartBridgeTerminal::UsartBridgeTerminal():
  36. m_readIndex(0),
  37. m_state(true)
  38. {
  39. }
  40. UsartBridgeTerminal::~UsartBridgeTerminal()
  41. {
  42. }
  43. //Configure hardware and link with terminal
  44. void UsartBridgeTerminal::configure()
  45. {
  46. m_sizeCache = 0;
  47. m_readIndex = 0;
  48. InitUsart();
  49. //Add usart print to global terminal object
  50. pTerminal->addPrint(::print_usartbridge);
  51. }
  52. //print function
  53. void UsartBridgeTerminal::print(const char *str)
  54. {
  55. uint16_t index = 0;
  56. uint16_t len = strlen(str);
  57. if (len <= 0)
  58. return;
  59. while (index < len) {
  60. sendByte(str[index++]);
  61. }
  62. }
  63. //-----------------------------------------------------------------------------
  64. // Hardware usart function
  65. //-----------------------------------------------------------------------------
  66. extern "C" {
  67. void USART_BRIDGE_IRQHandler(void)
  68. {
  69. if (usart_flag_get(USART_BRIDGE_USART, USART_RDBF_FLAG) != RESET)
  70. {
  71. if (terminalUsartBridge.m_state) {
  72. terminalUsartBridge.recvByte();
  73. }
  74. }
  75. }
  76. }
  77. // Recv byte from usart
  78. void UsartBridgeTerminal::recvByte()
  79. {
  80. sbsTerminal.put_byte((char)USART_BRIDGE_USART->dt);
  81. }
  82. // Send byte to usart
  83. void UsartBridgeTerminal::sendByte(uint8_t byte)
  84. {
  85. USART_BRIDGE_USART->dt = (byte & 0x01FF);
  86. while (usart_flag_get(USART_BRIDGE_USART, USART_TDC_FLAG) == RESET) {}
  87. }
  88. // Init USART
  89. void UsartBridgeTerminal::InitUsart()
  90. {
  91. gpio_init_type gpio_init_struct;
  92. USART_BRIDGE_TX_PORT_CLK_ENABLE
  93. USART_BRIDGE_RX_PORT_CLK_ENABLE
  94. USART_BRIDGE_CLK_ENABLE
  95. gpio_default_para_init(&gpio_init_struct);
  96. /* configure the uart tx pin */
  97. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  98. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  99. gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  100. gpio_init_struct.gpio_pins = USART_BRIDGE_TX_PIN | USART_BRIDGE_RX_PIN;
  101. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  102. gpio_init(USART_BRIDGE_TX_PORT, &gpio_init_struct);
  103. gpio_init_struct.gpio_pins = USART_BRIDGE_RX_PIN;
  104. gpio_init(USART_BRIDGE_RX_PORT, &gpio_init_struct);
  105. /* configure uart param */
  106. usart_init(USART_BRIDGE_USART, USART_BRIDGE_SPEED,
  107. USART_DATA_8BITS, USART_STOP_1_BIT);
  108. usart_transmitter_enable(USART_BRIDGE_USART, TRUE);
  109. usart_receiver_enable(USART_BRIDGE_USART, TRUE);
  110. usart_enable(USART_BRIDGE_USART, TRUE);
  111. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  112. NVIC_ClearPendingIRQ(USART_BRIDGE_IRQn);
  113. nvic_irq_enable(USART_BRIDGE_IRQn, 6, 0);
  114. usart_interrupt_enable(USART_BRIDGE_USART, USART_RDBF_INT, TRUE);
  115. }