usart.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "sys.h"
  2. #include "usart.h"
  3. #include "hal_led.h"
  4. #include "sys_queue.h"
  5. #include "board.h"
  6. //////////////////////////////////////////////////////////////////////////////////
  7. //���ʹ��ucos,����������ͷ�ļ�����.
  8. #if SYSTEM_SUPPORT_OS
  9. #include "includes.h" //ucos ʹ��
  10. #endif
  11. //////////////////////////////////////////////////////////////////
  12. //�������´���,֧��printf����,������Ҫѡ��use MicroLIB
  13. #if 1
  14. #pragma import(__use_no_semihosting)
  15. //��׼����Ҫ��֧�ֺ���
  16. struct __FILE
  17. {
  18. int handle;
  19. };
  20. FILE __stdout;
  21. //����_sys_exit()�Ա���ʹ�ð�����ģʽ
  22. void _sys_exit(int x)
  23. {
  24. x = x;
  25. }
  26. //�ض���fputc����
  27. int fputc(int ch, FILE *f)
  28. {
  29. while ((USART1->SR & 0X40) == 0); //ѭ������,ֱ���������
  30. USART1->DR = (u8) ch;
  31. return ch;
  32. }
  33. #endif
  34. #if EN_USART1_RX //���ʹ���˽���
  35. //����1�жϷ������
  36. //ע��,��ȡUSARTx->SR�ܱ���Ī������Ĵ���
  37. u8 USART_RX_BUF[USART_REC_LEN]; //���ջ���,���USART_REC_LEN���ֽ�.
  38. //����״̬
  39. //bit15�� ������ɱ�־
  40. //bit14�� ���յ�0x0d
  41. //bit13~0�� ���յ�����Ч�ֽ���Ŀ
  42. u16 USART_RX_STA = 0; //����״̬���
  43. u8 aRxBuffer[RXBUFFERSIZE];//HAL��ʹ�õĴ��ڽ��ջ���
  44. UART_HandleTypeDef UART1_Handler; //UART���
  45. //��ʼ��IO ����1
  46. //bound:������
  47. void uart_init(u32 bound)
  48. {
  49. //UART ��ʼ������
  50. UART1_Handler.Instance = USART1; //USART1
  51. UART1_Handler.Init.BaudRate = bound; //������
  52. UART1_Handler.Init.WordLength = UART_WORDLENGTH_8B; //�ֳ�Ϊ8λ���ݸ�ʽ
  53. UART1_Handler.Init.StopBits = UART_STOPBITS_1; //һ��ֹͣλ
  54. UART1_Handler.Init.Parity = UART_PARITY_NONE; //����żУ��λ
  55. UART1_Handler.Init.HwFlowCtl = UART_HWCONTROL_NONE; //��Ӳ������
  56. UART1_Handler.Init.Mode = UART_MODE_TX_RX; //�շ�ģʽ
  57. HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()��ʹ��UART1
  58. HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer,
  59. RXBUFFERSIZE);//�ú����Ὺ�������жϣ���־λUART_IT_RXNE���������ý��ջ����Լ����ջ���������������
  60. }
  61. // extern queue_list_t g_s_uart_rx_list; //���ڷ��͵Ķ���
  62. uart_inter_callback_fp g_s_uart_isr_callback;
  63. void HAL_UartIsrCallbackRegister(uart_inter_callback_fp fp)
  64. {
  65. g_s_uart_isr_callback = fp;
  66. }
  67. //UART�ײ��ʼ����ʱ��ʹ�ܣ��������ã��ж�����
  68. //�˺����ᱻHAL_UART_Init()����
  69. //huart:���ھ��
  70. void HAL_UART_MspInit(UART_HandleTypeDef *huart)
  71. {
  72. //GPIO�˿�����
  73. GPIO_InitTypeDef GPIO_Initure;
  74. if (huart->Instance == USART1) //����Ǵ���1�����д���1 MSP��ʼ��
  75. {
  76. __HAL_RCC_GPIOA_CLK_ENABLE(); //ʹ��GPIOAʱ��
  77. __HAL_RCC_USART1_CLK_ENABLE(); //ʹ��USART1ʱ��
  78. __HAL_RCC_AFIO_CLK_ENABLE();
  79. GPIO_Initure.Pin = UART1_TX_PIN; //PA9
  80. GPIO_Initure.Mode = GPIO_MODE_AF_PP; //�����������
  81. GPIO_Initure.Pull = GPIO_PULLUP; //����
  82. GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH; //����
  83. HAL_GPIO_Init(UART1_GPIO, &GPIO_Initure); //��ʼ��PA9
  84. GPIO_Initure.Pin = UART1_RX_PIN; //PA10
  85. GPIO_Initure.Mode = GPIO_MODE_AF_INPUT; //ģʽҪ����Ϊ��������ģʽ��
  86. HAL_GPIO_Init(UART1_GPIO, &GPIO_Initure); //��ʼ��PA10
  87. #if EN_USART1_RX
  88. HAL_NVIC_EnableIRQ(USART1_IRQn); //ʹ��USART1�ж�ͨ��
  89. HAL_NVIC_SetPriority(USART1_IRQn, 3, 3); //��ռ���ȼ�3�������ȼ�3
  90. #endif
  91. }
  92. }
  93. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  94. {
  95. if (huart->Instance == USART1) //����Ǵ���1
  96. {
  97. if ((USART_RX_STA & 0x8000) == 0) //������
  98. {
  99. if (USART_RX_STA & 0x4000) //���յ���0x0d
  100. {
  101. if (aRxBuffer[0] != 0x0a)
  102. {
  103. USART_RX_STA = 0; //���մ���,���¿�ʼ
  104. }
  105. else
  106. {
  107. USART_RX_STA |= 0x8000; //���������
  108. g_s_uart_isr_callback((uint8_t *)USART_RX_BUF, USART_RX_STA & 0x3fff);
  109. // queue_in(&g_s_uart_rx_list, (uint8_t *)USART_RX_BUF, USART_RX_STA & 0x3fff);
  110. USART_RX_STA = 0;
  111. }
  112. }
  113. else //��û�յ�0X0D
  114. {
  115. if (aRxBuffer[0] == 0x0d)
  116. {
  117. USART_RX_STA |= 0x4000;
  118. }
  119. else
  120. {
  121. USART_RX_BUF[USART_RX_STA & 0X3FFF] = aRxBuffer[0] ;
  122. USART_RX_STA++;
  123. if (USART_RX_STA > (USART_REC_LEN - 1))
  124. {
  125. USART_RX_STA = 0; //�������ݴ���,���¿�ʼ����
  126. }
  127. }
  128. }
  129. }
  130. }
  131. }
  132. //����1�жϷ������
  133. void USART1_IRQHandler(void)
  134. {
  135. u32 timeout = 0;
  136. #if SYSTEM_SUPPORT_OS //ʹ��OS
  137. OSIntEnter();
  138. #endif
  139. HAL_UART_IRQHandler(&UART1_Handler); //����HAL���жϴ������ú���
  140. timeout = 0;
  141. while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)//�ȴ�����
  142. {
  143. timeout++;////��ʱ����
  144. if (timeout > HAL_MAX_DELAY)
  145. {
  146. break;
  147. }
  148. }
  149. timeout = 0;
  150. while (HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer,
  151. RXBUFFERSIZE) != HAL_OK) //һ�δ������֮�����¿����жϲ�����RxXferCountΪ1
  152. {
  153. timeout++; //��ʱ����
  154. if (timeout > HAL_MAX_DELAY)
  155. {
  156. break;
  157. }
  158. }
  159. #if SYSTEM_SUPPORT_OS //ʹ��OS
  160. OSIntExit();
  161. #endif
  162. }
  163. #endif
  164. void HAL_Usart1SendData(uint8_t* data, uint8_t len)
  165. {
  166. HAL_UART_Transmit(&UART1_Handler, data, len, 1000);
  167. }