terminal_usartbridge.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include "terminal_usartbridge.h"
  2. #include "terminal_user.h"
  3. #include <string.h>
  4. #include <stdio.h>
  5. UsartBridgeTerminal terminalUsartBridge;
  6. extern Terminal* pTerminal;
  7. #if 0
  8. #ifdef __GNUC__
  9. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  10. #else
  11. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  12. #endif
  13. #endif
  14. //PUTCHAR_PROTOTYPE
  15. int putchar(int ch)
  16. {
  17. terminalUsartBridge.uart.Instance->TDR = (uint16_t)(ch & 0x01FF);
  18. while (!(terminalUsartBridge.uart.Instance->ISR & UART_FLAG_TC)) {}
  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. m_isTxNoEmpty(false)
  39. {
  40. }
  41. UsartBridgeTerminal::~UsartBridgeTerminal()
  42. {
  43. }
  44. //Configure hardware and link with terminal
  45. void UsartBridgeTerminal::configure()
  46. {
  47. m_sizeCache = 0;
  48. m_readIndex = 0;
  49. m_isTxNoEmpty = false;
  50. InitUsart();
  51. //Add usart print to global terminal object
  52. pTerminal->addPrint(::print_usartbridge);
  53. }
  54. //print function
  55. void UsartBridgeTerminal::print(const char *str)
  56. {
  57. uint16_t index = 0;
  58. uint16_t len = strlen(str);
  59. if (len <= 0)
  60. return;
  61. while (index < len) {
  62. sendByte(str[index++]);
  63. }
  64. }
  65. //-----------------------------------------------------------------------------
  66. // Hardware usart function
  67. //-----------------------------------------------------------------------------
  68. extern "C" {
  69. void USART_BRIDGE_IRQHandler(void)
  70. {
  71. HAL_UART_IRQHandler(&terminalUsartBridge.uart);
  72. }
  73. }
  74. //void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  75. void HAL_UART_RxCpltCallbackTerminal(void)
  76. {
  77. if (terminalUsartBridge.m_state) {
  78. terminalUsartBridge.recvByte();
  79. }
  80. HAL_UART_Receive_IT(&terminalUsartBridge.uart, (uint8_t*)&terminalUsartBridge.m_uartByte, 1);
  81. }
  82. //void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  83. void HAL_UART_TxCpltCallbackTerminal(void)
  84. {
  85. terminalUsartBridge.clearTxNoEmpty();
  86. }
  87. //Recv byte from usart
  88. void UsartBridgeTerminal::recvByte()
  89. {
  90. sbsTerminal.put_byte((char)(uart.Instance->RDR & (uint16_t)0x01FF));
  91. }
  92. //Send byte to usart
  93. void UsartBridgeTerminal::sendByte(uint8_t byte)
  94. {
  95. m_isTxNoEmpty = true;
  96. terminalUsartBridge.uart.Instance->TDR = (uint16_t)(byte & 0x01FF);
  97. while (!(terminalUsartBridge.uart.Instance->ISR & UART_FLAG_TC)) {}
  98. }
  99. //Clear TX No Empty flag
  100. void UsartBridgeTerminal::clearTxNoEmpty()
  101. {
  102. m_isTxNoEmpty = false;
  103. }
  104. //Init USART
  105. void UsartBridgeTerminal::InitUsart()
  106. {
  107. GPIO_InitTypeDef GPIO_InitStruct;
  108. USART_BRIDGE_TX_PORT_CLK_ENABLE
  109. USART_BRIDGE_RX_PORT_CLK_ENABLE
  110. GPIO_InitStruct.Pin = USART_BRIDGE_TX_PIN;
  111. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  112. GPIO_InitStruct.Pull = GPIO_PULLUP;
  113. GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  114. GPIO_InitStruct.Alternate = USART_BRIDGE_AF;
  115. HAL_GPIO_Init(USART_BRIDGE_TX_PORT, &GPIO_InitStruct);
  116. GPIO_InitStruct.Pin = USART_BRIDGE_RX_PIN;
  117. HAL_GPIO_Init(USART_BRIDGE_RX_PORT, &GPIO_InitStruct);
  118. USART_BRIDGE_CLK_ENABLE
  119. uart.Instance = USART_BRIDGE_USART;
  120. uart.Init.BaudRate = USART_BRIDGE_SPEED;
  121. uart.Init.WordLength = UART_WORDLENGTH_8B;
  122. uart.Init.StopBits = UART_STOPBITS_1;
  123. uart.Init.Parity = UART_PARITY_NONE;
  124. uart.Init.Mode = UART_MODE_TX_RX;
  125. uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  126. uart.Init.OverSampling = UART_OVERSAMPLING_8;
  127. uart.Init.OneBitSampling= UART_ONE_BIT_SAMPLE_DISABLE;
  128. HAL_UART_Init(&uart);
  129. HAL_NVIC_SetPriority(USART_BRIDGE_IRQn, 6, 0);
  130. HAL_NVIC_EnableIRQ(USART_BRIDGE_IRQn);
  131. HAL_UART_Receive_IT(&uart, (uint8_t*)&m_uartByte, 1);
  132. }