| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #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);
- }
|