terminal_usartbridge.cpp 4.2 KB

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