233 lines
7.0 KiB
C
233 lines
7.0 KiB
C
![]() |
#include "./SYSTEM/sys/sys.h"
|
|||
|
#include "./SYSTEM/usart/usart.h"
|
|||
|
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>os,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
#if SYS_SUPPORT_OS
|
|||
|
#include "includes.h" /* os ʹ<><CAB9> */
|
|||
|
#endif
|
|||
|
|
|||
|
/******************************************************************************************/
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD>, ֧<><D6A7>printf<74><66><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫѡ<D2AA><D1A1>use MicroLIB */
|
|||
|
|
|||
|
#if 1
|
|||
|
#if (__ARMCC_VERSION >= 6010050) /* ʹ<><CAB9>AC6<43><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ */
|
|||
|
__asm(".global __use_no_semihosting\n\t"); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD>ģʽ */
|
|||
|
__asm(".global __ARM_use_no_argv \n\t"); /* AC6<43><36><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>main<69><6E><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><DEB2><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F2B2BFB7><EFBFBD><EFBFBD>̿<EFBFBD><CCBF>ܳ<EFBFBD><DCB3>ְ<EFBFBD><D6B0><EFBFBD><EFBFBD><EFBFBD>ģʽ */
|
|||
|
|
|||
|
#else
|
|||
|
/* ʹ<><CAB9>AC5<43><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ, Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD>ﶨ<EFBFBD><EFB6A8>__FILE <20><> <20><>ʹ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD>ģʽ */
|
|||
|
#pragma import(__use_no_semihosting)
|
|||
|
|
|||
|
struct __FILE
|
|||
|
{
|
|||
|
int handle;
|
|||
|
/* Whatever you require here. If the only file you are using is */
|
|||
|
/* standard output using printf() for debugging, no file handling */
|
|||
|
/* is required. */
|
|||
|
};
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
/* <20><>ʹ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ض<EFBFBD><D8B6><EFBFBD>_ttywrch\_sys_exit\_sys_command_string<6E><67><EFBFBD><EFBFBD>,<2C><>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD>AC6<43><36>AC5ģʽ */
|
|||
|
int _ttywrch(int ch)
|
|||
|
{
|
|||
|
ch = ch;
|
|||
|
return ch;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>_sys_exit()<29>Ա<EFBFBD><D4B1><EFBFBD>ʹ<EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD>ģʽ */
|
|||
|
void _sys_exit(int x)
|
|||
|
{
|
|||
|
x = x;
|
|||
|
}
|
|||
|
|
|||
|
char *_sys_command_string(char *cmd, int len)
|
|||
|
{
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
/* FILE <20><> stdio.h<><68><EFBFBD>涨<EFBFBD><E6B6A8>. */
|
|||
|
FILE __stdout;
|
|||
|
|
|||
|
/* <20>ض<EFBFBD><D8B6><EFBFBD>fputc<74><63><EFBFBD><EFBFBD>, printf<74><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>fputc<74><63><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
int fputc(int ch, FILE *f)
|
|||
|
{
|
|||
|
while ((USART3->SR & 0X40) == 0); /* <20>ȴ<EFBFBD><C8B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
|||
|
USART3->DR = (uint8_t)ch; /* <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5>ַ<EFBFBD> ch д<>뵽DR<44>Ĵ<EFBFBD><C4B4><EFBFBD> */
|
|||
|
return ch;
|
|||
|
}
|
|||
|
#endif
|
|||
|
/***********************************************END*******************************************/
|
|||
|
|
|||
|
#if USART_EN_RX /* <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>˽<EFBFBD><CBBD><EFBFBD> */
|
|||
|
|
|||
|
/* <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>, <20><><EFBFBD><EFBFBD>USART_REC_LEN<45><4E><EFBFBD>ֽ<EFBFBD>. */
|
|||
|
uint8_t g_usart_rx_buf[USART_REC_LEN];
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>״̬
|
|||
|
* bit15<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
|
|||
|
* bit14<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>0x0d
|
|||
|
* bit13~0<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>Ŀ
|
|||
|
*/
|
|||
|
uint16_t g_usart_rx_sta = 0;
|
|||
|
|
|||
|
uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL<41><4C>ʹ<EFBFBD>õĴ<C3B5><C4B4>ڽ<EFBFBD><DABD>ջ<EFBFBD><D5BB><EFBFBD> */
|
|||
|
|
|||
|
UART_HandleTypeDef g_uart1_handle; /* UART<52><54><EFBFBD><EFBFBD> */
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param baudrate: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
* @note ע<EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Դ, <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣.
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>USART<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>sys_stm32_clock_init()<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
void usart_init(uint32_t baudrate)
|
|||
|
{
|
|||
|
g_uart1_handle.Instance = USART_UX; /* USART1 */
|
|||
|
g_uart1_handle.Init.BaudRate = baudrate; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* <20>ֳ<EFBFBD>Ϊ8λ<38><CEBB><EFBFBD>ݸ<EFBFBD>ʽ */
|
|||
|
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* һ<><D2BB>ֹͣλ */
|
|||
|
g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* <20><><EFBFBD><EFBFBD>żУ<C5BC><D0A3>λ */
|
|||
|
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* <20><>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* <20>շ<EFBFBD>ģʽ */
|
|||
|
HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()<29><>ʹ<EFBFBD><CAB9>UART1 */
|
|||
|
|
|||
|
/* <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD>Ὺ<EFBFBD><E1BFAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD>־λUART_IT_RXNE<4E><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><C3BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief UART<EFBFBD>ײ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param huart: UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* @note <EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᱻHAL_UART_Init()<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
|
|||
|
{
|
|||
|
GPIO_InitTypeDef gpio_init_struct;
|
|||
|
if(huart->Instance == USART_UX) /* <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>1 MSP<53><50>ʼ<EFBFBD><CABC> */
|
|||
|
{
|
|||
|
USART_UX_CLK_ENABLE(); /* USART1 ʱ<><CAB1>ʹ<EFBFBD><CAB9> */
|
|||
|
USART_TX_GPIO_CLK_ENABLE(); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9> */
|
|||
|
USART_RX_GPIO_CLK_ENABLE(); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9> */
|
|||
|
|
|||
|
gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TX<54><58><EFBFBD><EFBFBD> */
|
|||
|
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
gpio_init_struct.Pull = GPIO_PULLUP; /* <20><><EFBFBD><EFBFBD> */
|
|||
|
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* <20><><EFBFBD><EFBFBD> */
|
|||
|
gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* <20><><EFBFBD><EFBFBD>ΪUSART1 */
|
|||
|
HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
|||
|
gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RX<52><58><EFBFBD><EFBFBD> */
|
|||
|
gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* <20><><EFBFBD><EFBFBD>ΪUSART1 */
|
|||
|
HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
|||
|
#if USART_EN_RX
|
|||
|
HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹ<><CAB9>USART1<54>ж<EFBFBD>ͨ<EFBFBD><CDA8> */
|
|||
|
HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* <20><>ռ<EFBFBD><D5BC><EFBFBD>ȼ<EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>3 */
|
|||
|
#endif
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief Rx<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param huart: UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
|
|||
|
{
|
|||
|
if(huart->Instance == USART_UX) /* <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD>1 */
|
|||
|
{
|
|||
|
if((g_usart_rx_sta & 0x8000) == 0) /* <20><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD> */
|
|||
|
{
|
|||
|
if(g_usart_rx_sta & 0x4000) /* <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>0x0d */
|
|||
|
{
|
|||
|
if(g_rx_buffer[0] != 0x0a)
|
|||
|
{
|
|||
|
g_usart_rx_sta = 0; /* <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>,<2C><><EFBFBD>¿<EFBFBD>ʼ */
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
g_usart_rx_sta |= 0x8000; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
}
|
|||
|
}
|
|||
|
else /* <20><>û<EFBFBD>յ<EFBFBD>0X0D */
|
|||
|
{
|
|||
|
if(g_rx_buffer[0] == 0x0d)
|
|||
|
{
|
|||
|
g_usart_rx_sta |= 0x4000;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0] ;
|
|||
|
g_usart_rx_sta++;
|
|||
|
if(g_usart_rx_sta > (USART_REC_LEN - 1))
|
|||
|
{
|
|||
|
g_usart_rx_sta = 0; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>,<2C><><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD> */
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param <EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
void USART_UX_IRQHandler(void)
|
|||
|
{
|
|||
|
uint32_t timeout = 0;
|
|||
|
uint32_t maxDelay = 0x1FFFF;
|
|||
|
|
|||
|
#if SYS_SUPPORT_OS /* ʹ<><CAB9>OS */
|
|||
|
OSIntEnter();
|
|||
|
#endif
|
|||
|
|
|||
|
HAL_UART_IRQHandler(&g_uart1_handle); /* <20><><EFBFBD><EFBFBD>HAL<41><4C><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD> */
|
|||
|
|
|||
|
timeout = 0;
|
|||
|
while (HAL_UART_GetState(&g_uart1_handle) != HAL_UART_STATE_READY) /* <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
{
|
|||
|
timeout++; /* <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> */
|
|||
|
if(timeout > maxDelay)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
timeout=0;
|
|||
|
|
|||
|
/* һ<>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD><C2BF><EFBFBD><EFBFBD>жϲ<D0B6><CFB2><EFBFBD><EFBFBD><EFBFBD>RxXferCountΪ1 */
|
|||
|
while (HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE) != HAL_OK)
|
|||
|
{
|
|||
|
timeout++; /* <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> */
|
|||
|
if (timeout > maxDelay)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if SYS_SUPPORT_OS /* ʹ<><CAB9>OS */
|
|||
|
OSIntExit();
|
|||
|
#endif
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|