#include "sys.h" #include "usart.h" #include "hal_led.h" #include "sys_queue.h" #include "board.h" ////////////////////////////////////////////////////////////////////////////////// //���ʹ��ucos,����������ͷ�ļ�����. #if SYSTEM_SUPPORT_OS #include "includes.h" //ucos ʹ�� #endif ////////////////////////////////////////////////////////////////// //�������´���,֧��printf����,������Ҫѡ��use MicroLIB #if 1 #pragma import(__use_no_semihosting) //��׼����Ҫ��֧�ֺ��� struct __FILE { int handle; }; FILE __stdout; //����_sys_exit()�Ա���ʹ�ð�����ģʽ void _sys_exit(int x) { x = x; } //�ض���fputc���� int fputc(int ch, FILE *f) { while ((USART1->SR & 0X40) == 0); //ѭ������,ֱ��������� USART1->DR = (u8) ch; return ch; } #endif #if EN_USART1_RX //���ʹ���˽��� //����1�жϷ������ //ע��,��ȡUSARTx->SR�ܱ���Ī������Ĵ��� u8 USART_RX_BUF[USART_REC_LEN]; //���ջ���,���USART_REC_LEN���ֽ�. //����״̬ //bit15�� ������ɱ�־ //bit14�� ���յ�0x0d //bit13~0�� ���յ�����Ч�ֽ���Ŀ u16 USART_RX_STA = 0; //����״̬��� u8 aRxBuffer[RXBUFFERSIZE];//HAL��ʹ�õĴ��ڽ��ջ��� UART_HandleTypeDef UART1_Handler; //UART��� //��ʼ��IO ����1 //bound:������ void uart_init(u32 bound) { //UART ��ʼ������ UART1_Handler.Instance = USART1; //USART1 UART1_Handler.Init.BaudRate = bound; //������ UART1_Handler.Init.WordLength = UART_WORDLENGTH_8B; //�ֳ�Ϊ8λ���ݸ�ʽ UART1_Handler.Init.StopBits = UART_STOPBITS_1; //һ��ֹͣλ UART1_Handler.Init.Parity = UART_PARITY_NONE; //����żУ��λ UART1_Handler.Init.HwFlowCtl = UART_HWCONTROL_NONE; //��Ӳ������ UART1_Handler.Init.Mode = UART_MODE_TX_RX; //�շ�ģʽ HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()��ʹ��UART1 HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//�ú����Ὺ�������жϣ���־λUART_IT_RXNE���������ý��ջ����Լ����ջ��������������� } // extern queue_list_t g_s_uart_rx_list; //���ڷ��͵Ķ��� uart_inter_callback_fp g_s_uart_isr_callback; void HAL_UartIsrCallbackRegister(uart_inter_callback_fp fp) { g_s_uart_isr_callback = fp; } //UART�ײ��ʼ����ʱ��ʹ�ܣ��������ã��ж����� //�˺����ᱻHAL_UART_Init()���� //huart:���ھ�� void HAL_UART_MspInit(UART_HandleTypeDef *huart) { //GPIO�˿����� GPIO_InitTypeDef GPIO_Initure; if (huart->Instance == USART1) //����Ǵ���1�����д���1 MSP��ʼ�� { __HAL_RCC_GPIOA_CLK_ENABLE(); //ʹ��GPIOAʱ�� __HAL_RCC_USART1_CLK_ENABLE(); //ʹ��USART1ʱ�� __HAL_RCC_AFIO_CLK_ENABLE(); GPIO_Initure.Pin = UART1_TX_PIN; //PA9 GPIO_Initure.Mode = GPIO_MODE_AF_PP; //����������� GPIO_Initure.Pull = GPIO_PULLUP; //���� GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH; //���� HAL_GPIO_Init(UART1_GPIO, &GPIO_Initure); //��ʼ��PA9 GPIO_Initure.Pin = UART1_RX_PIN; //PA10 GPIO_Initure.Mode = GPIO_MODE_AF_INPUT; //ģʽҪ����Ϊ��������ģʽ�� HAL_GPIO_Init(UART1_GPIO, &GPIO_Initure); //��ʼ��PA10 #if EN_USART1_RX HAL_NVIC_EnableIRQ(USART1_IRQn); //ʹ��USART1�ж�ͨ�� HAL_NVIC_SetPriority(USART1_IRQn, 3, 3); //��ռ���ȼ�3�������ȼ�3 #endif } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) //����Ǵ���1 { if ((USART_RX_STA & 0x8000) == 0) //����δ��� { if (USART_RX_STA & 0x4000) //���յ���0x0d { if (aRxBuffer[0] != 0x0a) { USART_RX_STA = 0; //���մ���,���¿�ʼ } else { USART_RX_STA |= 0x8000; //��������� g_s_uart_isr_callback((uint8_t *)USART_RX_BUF, USART_RX_STA & 0x3fff); // queue_in(&g_s_uart_rx_list, (uint8_t *)USART_RX_BUF, USART_RX_STA & 0x3fff); USART_RX_STA = 0; } } else //��û�յ�0X0D { if (aRxBuffer[0] == 0x0d) { USART_RX_STA |= 0x4000; } else { USART_RX_BUF[USART_RX_STA & 0X3FFF] = aRxBuffer[0] ; USART_RX_STA++; if (USART_RX_STA > (USART_REC_LEN - 1)) { USART_RX_STA = 0; //�������ݴ���,���¿�ʼ���� } } } } } } //����1�жϷ������ void USART1_IRQHandler(void) { u32 timeout = 0; #if SYSTEM_SUPPORT_OS //ʹ��OS OSIntEnter(); #endif HAL_UART_IRQHandler(&UART1_Handler); //����HAL���жϴ������ú��� timeout = 0; while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)//�ȴ����� { timeout++;////��ʱ���� if (timeout > HAL_MAX_DELAY) { break; } } timeout = 0; while (HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK) //һ�δ������֮�����¿����жϲ�����RxXferCountΪ1 { timeout++; //��ʱ���� if (timeout > HAL_MAX_DELAY) { break; } } #if SYSTEM_SUPPORT_OS //ʹ��OS OSIntExit(); #endif } #endif void HAL_Usart1SendData(uint8_t* data, uint8_t len) { HAL_UART_Transmit(&UART1_Handler, data, len, 1000); }