/**
****************************************************************************************************
* @file usart.c
* @author ÕýµãÔ×ÓÍŶÓ(ALIENTEK)
* @version V1.1
* @date 2023-06-05
* @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf
* @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
****************************************************************************************************
* @attention
*
* ʵÑéÆ½Ì¨:ÕýµãÔ×Ó Ì½Ë÷Õß F407¿ª·¢°å
* ÔÚÏßÊÓÆµ:www.yuanzige.com
* ¼¼ÊõÂÛ̳:www.openedv.com
* ¹«Ë¾ÍøÖ·:www.alientek.com
* ¹ºÂòµØÖ·:openedv.taobao.com
*
* ÐÞ¸Ä˵Ã÷
* V1.0 20211014
* µÚÒ»´Î·¢²¼
* V1.1 20230605
* ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback()
****************************************************************************************************
*/
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
/* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */
#if SYS_SUPPORT_OS
#include "os.h" /* os ʹÓà */
#endif
/******************************************************************************************/
/* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */
#if 1
#if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */
__asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */
__asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */
#else
/* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */
#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
/* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */
int _ttywrch(int ch)
{
ch = ch;
return ch;
}
/* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */
void _sys_exit(int x)
{
x = x;
}
char *_sys_command_string(char *cmd, int len)
{
return NULL;
}
/* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */
FILE __stdout;
/* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */
USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */
return ch;
}
#endif
/***********************************************END*******************************************/
#if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */
/* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */
uint8_t g_usart_rx_buf[USART_REC_LEN];
/* ½ÓÊÕ״̬
* bit15£¬ ½ÓÊÕÍê³É±êÖ¾
* bit14£¬ ½ÓÊÕµ½0x0d
* bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
*/
uint16_t g_usart_rx_sta = 0;
uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */
UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */
/**
* @brief ´®¿ÚX³õʼ»¯º¯Êý
* @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ
* @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£.
* ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾÉèÖùýÁË.
* @retval ÎÞ
*/
void usart_init(uint32_t baudrate)
{
g_uart1_handle.Instance = USART_UX; /* USART1 */
g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */
g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */
g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */
HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */
/* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
/**
* @brief UARTµ×²ã³õʼ»¯º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷ÓÃ
* Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖÃ
* @retval ÎÞ
*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */
{
USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */
USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */
USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */
gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */
gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */
gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */
gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */
gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */
#if USART_EN_RX
HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */
HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */
#endif
}
}
/**
* @brief Rx´«Ê仨µ÷º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @retval ÎÞ
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */
{
if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */
{
if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */
{
if(g_rx_buffer[0] != 0x0a)
{
g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */
}
else
{
g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */
}
}
else /* »¹Ã»ÊÕµ½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; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */
}
}
}
}
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
}
/**
* @brief ´®¿Ú1ÖжϷþÎñº¯Êý
* @param ÎÞ
* @retval ÎÞ
*/
void USART_UX_IRQHandler(void)
{
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntEnter();
#endif
HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntExit();
#endif
}
#endif
/**
****************************************************************************************************
* @file usart.c
* @author ÕýµãÔ×ÓÍŶÓ(ALIENTEK)
* @version V1.1
* @date 2023-06-05
* @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf
* @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
****************************************************************************************************
* @attention
*
* ʵÑéÆ½Ì¨:ÕýµãÔ×Ó Ì½Ë÷Õß F407¿ª·¢°å
* ÔÚÏßÊÓÆµ:www.yuanzige.com
* ¼¼ÊõÂÛ̳:www.openedv.com
* ¹«Ë¾ÍøÖ·:www.alientek.com
* ¹ºÂòµØÖ·:openedv.taobao.com
*
* ÐÞ¸Ä˵Ã÷
* V1.0 20211014
* µÚÒ»´Î·¢²¼
* V1.1 20230605
* ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback()
****************************************************************************************************
*/
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
/* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */
#if SYS_SUPPORT_OS
#include "os.h" /* os ʹÓà */
#endif
/******************************************************************************************/
/* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */
#if 1
#if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */
__asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */
__asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */
#else
/* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */
#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
/* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */
int _ttywrch(int ch)
{
ch = ch;
return ch;
}
/* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */
void _sys_exit(int x)
{
x = x;
}
char *_sys_command_string(char *cmd, int len)
{
return NULL;
}
/* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */
FILE __stdout;
/* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */
USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */
return ch;
}
#endif
/***********************************************END*******************************************/
#if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */
/* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */
uint8_t g_usart_rx_buf[USART_REC_LEN];
/* ½ÓÊÕ״̬
* bit15£¬ ½ÓÊÕÍê³É±êÖ¾
* bit14£¬ ½ÓÊÕµ½0x0d
* bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
*/
uint16_t g_usart_rx_sta = 0;
uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */
UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */
/**
* @brief ´®¿ÚX³õʼ»¯º¯Êý
* @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ
* @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£.
* ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾÉèÖùýÁË.
* @retval ÎÞ
*/
void usart_init(uint32_t baudrate)
{
g_uart1_handle.Instance = USART_UX; /* USART1 */
g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */
g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */
g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */
HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */
/* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
/**
* @brief UARTµ×²ã³õʼ»¯º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷ÓÃ
* Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖÃ
* @retval ÎÞ
*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */
{
USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */
USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */
USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */
gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */
gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */
gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */
gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */
gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */
#if USART_EN_RX
HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */
HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */
#endif
}
}
/**
* @brief Rx´«Ê仨µ÷º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @retval ÎÞ
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */
{
if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */
{
if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */
{
if(g_rx_buffer[0] != 0x0a)
{
g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */
}
else
{
g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */
}
}
else /* »¹Ã»ÊÕµ½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; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */
}
}
}
}
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
}
/**
* @brief ´®¿Ú1ÖжϷþÎñº¯Êý
* @param ÎÞ
* @retval ÎÞ
*/
void USART_UX_IRQHandler(void)
{
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntEnter();
#endif
HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntExit();
#endif
}
#endif
/**
****************************************************************************************************
* @file usart.c
* @author ÕýµãÔ×ÓÍŶÓ(ALIENTEK)
* @version V1.1
* @date 2023-06-05
* @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf
* @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
****************************************************************************************************
* @attention
*
* ʵÑéÆ½Ì¨:ÕýµãÔ×Ó Ì½Ë÷Õß F407¿ª·¢°å
* ÔÚÏßÊÓÆµ:www.yuanzige.com
* ¼¼ÊõÂÛ̳:www.openedv.com
* ¹«Ë¾ÍøÖ·:www.alientek.com
* ¹ºÂòµØÖ·:openedv.taobao.com
*
* ÐÞ¸Ä˵Ã÷
* V1.0 20211014
* µÚÒ»´Î·¢²¼
* V1.1 20230605
* ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback()
****************************************************************************************************
*/
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
/* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */
#if SYS_SUPPORT_OS
#include "os.h" /* os ʹÓà */
#endif
/******************************************************************************************/
/* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */
#if 1
#if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */
__asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */
__asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */
#else
/* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */
#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
/* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */
int _ttywrch(int ch)
{
ch = ch;
return ch;
}
/* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */
void _sys_exit(int x)
{
x = x;
}
char *_sys_command_string(char *cmd, int len)
{
return NULL;
}
/* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */
FILE __stdout;
/* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */
USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */
return ch;
}
#endif
/***********************************************END*******************************************/
#if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */
/* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */
uint8_t g_usart_rx_buf[USART_REC_LEN];
/* ½ÓÊÕ״̬
* bit15£¬ ½ÓÊÕÍê³É±êÖ¾
* bit14£¬ ½ÓÊÕµ½0x0d
* bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
*/
uint16_t g_usart_rx_sta = 0;
uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */
UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */
/**
* @brief ´®¿ÚX³õʼ»¯º¯Êý
* @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ
* @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£.
* ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾÉèÖùýÁË.
* @retval ÎÞ
*/
void usart_init(uint32_t baudrate)
{
g_uart1_handle.Instance = USART_UX; /* USART1 */
g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */
g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */
g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */
HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */
/* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
/**
* @brief UARTµ×²ã³õʼ»¯º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷ÓÃ
* Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖÃ
* @retval ÎÞ
*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */
{
USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */
USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */
USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */
gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */
gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */
gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */
gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */
gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */
#if USART_EN_RX
HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */
HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */
#endif
}
}
/**
* @brief Rx´«Ê仨µ÷º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @retval ÎÞ
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */
{
if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */
{
if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */
{
if(g_rx_buffer[0] != 0x0a)
{
g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */
}
else
{
g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */
}
}
else /* »¹Ã»ÊÕµ½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; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */
}
}
}
}
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
}
/**
* @brief ´®¿Ú1ÖжϷþÎñº¯Êý
* @param ÎÞ
* @retval ÎÞ
*/
void USART_UX_IRQHandler(void)
{
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntEnter();
#endif
HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntExit();
#endif
}
#endif
/**
****************************************************************************************************
* @file usart.c
* @author ÕýµãÔ×ÓÍŶÓ(ALIENTEK)
* @version V1.1
* @date 2023-06-05
* @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf
* @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
****************************************************************************************************
* @attention
*
* ʵÑéÆ½Ì¨:ÕýµãÔ×Ó Ì½Ë÷Õß F407¿ª·¢°å
* ÔÚÏßÊÓÆµ:www.yuanzige.com
* ¼¼ÊõÂÛ̳:www.openedv.com
* ¹«Ë¾ÍøÖ·:www.alientek.com
* ¹ºÂòµØÖ·:openedv.taobao.com
*
* ÐÞ¸Ä˵Ã÷
* V1.0 20211014
* µÚÒ»´Î·¢²¼
* V1.1 20230605
* ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback()
****************************************************************************************************
*/
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
/* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */
#if SYS_SUPPORT_OS
#include "os.h" /* os ʹÓà */
#endif
/******************************************************************************************/
/* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */
#if 1
#if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */
__asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */
__asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */
#else
/* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */
#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
/* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */
int _ttywrch(int ch)
{
ch = ch;
return ch;
}
/* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */
void _sys_exit(int x)
{
x = x;
}
char *_sys_command_string(char *cmd, int len)
{
return NULL;
}
/* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */
FILE __stdout;
/* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */
USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */
return ch;
}
#endif
/***********************************************END*******************************************/
#if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */
/* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */
uint8_t g_usart_rx_buf[USART_REC_LEN];
/* ½ÓÊÕ״̬
* bit15£¬ ½ÓÊÕÍê³É±êÖ¾
* bit14£¬ ½ÓÊÕµ½0x0d
* bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
*/
uint16_t g_usart_rx_sta = 0;
uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */
UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */
/**
* @brief ´®¿ÚX³õʼ»¯º¯Êý
* @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ
* @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£.
* ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾÉèÖùýÁË.
* @retval ÎÞ
*/
void usart_init(uint32_t baudrate)
{
g_uart1_handle.Instance = USART_UX; /* USART1 */
g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */
g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */
g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */
HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */
/* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
/**
* @brief UARTµ×²ã³õʼ»¯º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷ÓÃ
* Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖÃ
* @retval ÎÞ
*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */
{
USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */
USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */
USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */
gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */
gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */
gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */
gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */
gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */
#if USART_EN_RX
HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */
HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */
#endif
}
}
/**
* @brief Rx´«Ê仨µ÷º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @retval ÎÞ
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */
{
if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */
{
if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */
{
if(g_rx_buffer[0] != 0x0a)
{
g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */
}
else
{
g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */
}
}
else /* »¹Ã»ÊÕµ½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; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */
}
}
}
}
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
}
/**
* @brief ´®¿Ú1ÖжϷþÎñº¯Êý
* @param ÎÞ
* @retval ÎÞ
*/
void USART_UX_IRQHandler(void)
{
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntEnter();
#endif
HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntExit();
#endif
}
#endif
/**
****************************************************************************************************
* @file usart.c
* @author ÕýµãÔ×ÓÍŶÓ(ALIENTEK)
* @version V1.1
* @date 2023-06-05
* @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf
* @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
****************************************************************************************************
* @attention
*
* ʵÑéÆ½Ì¨:ÕýµãÔ×Ó Ì½Ë÷Õß F407¿ª·¢°å
* ÔÚÏßÊÓÆµ:www.yuanzige.com
* ¼¼ÊõÂÛ̳:www.openedv.com
* ¹«Ë¾ÍøÖ·:www.alientek.com
* ¹ºÂòµØÖ·:openedv.taobao.com
*
* ÐÞ¸Ä˵Ã÷
* V1.0 20211014
* µÚÒ»´Î·¢²¼
* V1.1 20230605
* ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback()
****************************************************************************************************
*/
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
/* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */
#if SYS_SUPPORT_OS
#include "os.h" /* os ʹÓà */
#endif
/******************************************************************************************/
/* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */
#if 1
#if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */
__asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */
__asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */
#else
/* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */
#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
/* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */
int _ttywrch(int ch)
{
ch = ch;
return ch;
}
/* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */
void _sys_exit(int x)
{
x = x;
}
char *_sys_command_string(char *cmd, int len)
{
return NULL;
}
/* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */
FILE __stdout;
/* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */
USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */
return ch;
}
#endif
/***********************************************END*******************************************/
#if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */
/* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */
uint8_t g_usart_rx_buf[USART_REC_LEN];
/* ½ÓÊÕ״̬
* bit15£¬ ½ÓÊÕÍê³É±êÖ¾
* bit14£¬ ½ÓÊÕµ½0x0d
* bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
*/
uint16_t g_usart_rx_sta = 0;
uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */
UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */
/**
* @brief ´®¿ÚX³õʼ»¯º¯Êý
* @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ
* @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£.
* ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾÉèÖùýÁË.
* @retval ÎÞ
*/
void usart_init(uint32_t baudrate)
{
g_uart1_handle.Instance = USART_UX; /* USART1 */
g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */
g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */
g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */
HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */
/* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
/**
* @brief UARTµ×²ã³õʼ»¯º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷ÓÃ
* Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖÃ
* @retval ÎÞ
*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */
{
USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */
USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */
USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */
gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */
gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */
gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */
gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */
gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */
#if USART_EN_RX
HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */
HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */
#endif
}
}
/**
* @brief Rx´«Ê仨µ÷º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @retval ÎÞ
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */
{
if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */
{
if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */
{
if(g_rx_buffer[0] != 0x0a)
{
g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */
}
else
{
g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */
}
}
else /* »¹Ã»ÊÕµ½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; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */
}
}
}
}
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
}
/**
* @brief ´®¿Ú1ÖжϷþÎñº¯Êý
* @param ÎÞ
* @retval ÎÞ
*/
void USART_UX_IRQHandler(void)
{
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntEnter();
#endif
HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntExit();
#endif
}
#endif
/**
****************************************************************************************************
* @file usart.c
* @author ÕýµãÔ×ÓÍŶÓ(ALIENTEK)
* @version V1.1
* @date 2023-06-05
* @brief ´®¿Ú³õʼ»¯´úÂë(Ò»°ãÊÇ´®¿Ú1)£¬Ö§³Öprintf
* @license Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
****************************************************************************************************
* @attention
*
* ʵÑéÆ½Ì¨:ÕýµãÔ×Ó Ì½Ë÷Õß F407¿ª·¢°å
* ÔÚÏßÊÓÆµ:www.yuanzige.com
* ¼¼ÊõÂÛ̳:www.openedv.com
* ¹«Ë¾ÍøÖ·:www.alientek.com
* ¹ºÂòµØÖ·:openedv.taobao.com
*
* ÐÞ¸Ä˵Ã÷
* V1.0 20211014
* µÚÒ»´Î·¢²¼
* V1.1 20230605
* ɾ³ýUSART_UX_IRQHandler()º¯ÊýµÄ³¬Ê±´¦ÀíºÍÐÞ¸ÄHAL_UART_RxCpltCallback()
****************************************************************************************************
*/
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
/* Èç¹ûʹÓÃos,Ôò°üÀ¨ÏÂÃæµÄÍ·Îļþ¼´¿É */
#if SYS_SUPPORT_OS
#include "os.h" /* os ʹÓà */
#endif
/******************************************************************************************/
/* ¼ÓÈëÒÔÏ´úÂë, Ö§³Öprintfº¯Êý, ¶ø²»ÐèҪѡÔñuse MicroLIB */
#if 1
#if (__ARMCC_VERSION >= 6010050) /* ʹÓÃAC6±àÒëÆ÷ʱ */
__asm(".global __use_no_semihosting\n\t"); /* ÉùÃ÷²»Ê¹ÓðëÖ÷»úģʽ */
__asm(".global __ARM_use_no_argv \n\t"); /* AC6ÏÂÐèÒªÉùÃ÷mainº¯ÊýΪÎÞ²ÎÊý¸ñʽ£¬·ñÔò²¿·ÖÀý³Ì¿ÉÄܳöÏÖ°ëÖ÷»úģʽ */
#else
/* ʹÓÃAC5±àÒëÆ÷ʱ, ÒªÔÚÕâÀﶨÒå__FILE ºÍ ²»Ê¹ÓðëÖ÷»úģʽ */
#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
/* ²»Ê¹ÓðëÖ÷»úģʽ£¬ÖÁÉÙÐèÒªÖØ¶¨Òå_ttywrch\_sys_exit\_sys_command_stringº¯Êý,ÒÔͬʱ¼æÈÝAC6ºÍAC5ģʽ */
int _ttywrch(int ch)
{
ch = ch;
return ch;
}
/* ¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ */
void _sys_exit(int x)
{
x = x;
}
char *_sys_command_string(char *cmd, int len)
{
return NULL;
}
/* FILE ÔÚ stdio.hÀïÃæ¶¨Òå. */
FILE __stdout;
/* ÖØ¶¨Òåfputcº¯Êý, printfº¯Êý×îÖÕ»áͨ¹ýµ÷ÓÃfputcÊä³ö×Ö·û´®µ½´®¿Ú */
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0); /* µÈ´ýÉÏÒ»¸ö×Ö·û·¢ËÍÍê³É */
USART1->DR = (uint8_t)ch; /* ½«Òª·¢Ë͵Ä×Ö·û ch дÈëµ½DR¼Ä´æÆ÷ */
return ch;
}
#endif
/***********************************************END*******************************************/
#if USART_EN_RX /* Èç¹ûʹÄÜÁ˽ÓÊÕ */
/* ½ÓÊÕ»º³å, ×î´óUSART_REC_LEN¸ö×Ö½Ú. */
uint8_t g_usart_rx_buf[USART_REC_LEN];
/* ½ÓÊÕ״̬
* bit15£¬ ½ÓÊÕÍê³É±êÖ¾
* bit14£¬ ½ÓÊÕµ½0x0d
* bit13~0£¬ ½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
*/
uint16_t g_usart_rx_sta = 0;
uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL¿âʹÓõĴ®¿Ú½ÓÊÕ»º³å */
UART_HandleTypeDef g_uart1_handle; /* UART¾ä±ú */
/**
* @brief ´®¿ÚX³õʼ»¯º¯Êý
* @param baudrate: ²¨ÌØÂÊ, ¸ù¾Ý×Ô¼ºÐèÒªÉèÖò¨ÌØÂÊÖµ
* @note ×¢Òâ: ±ØÐëÉèÖÃÕýÈ·µÄʱÖÓÔ´, ·ñÔò´®¿Ú²¨ÌØÂʾͻáÉèÖÃÒì³£.
* ÕâÀïµÄUSARTµÄʱÖÓÔ´ÔÚsys_stm32_clock_init()º¯ÊýÖÐÒѾÉèÖùýÁË.
* @retval ÎÞ
*/
void usart_init(uint32_t baudrate)
{
g_uart1_handle.Instance = USART_UX; /* USART1 */
g_uart1_handle.Init.BaudRate = baudrate; /* ²¨ÌØÂÊ */
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; /* ×Ö³¤Îª8λÊý¾Ý¸ñʽ */
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; /* Ò»¸öֹͣλ */
g_uart1_handle.Init.Parity = UART_PARITY_NONE; /* ÎÞÆæÅ¼Ð£Ñéλ */
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* ÎÞÓ²¼þÁ÷¿Ø */
g_uart1_handle.Init.Mode = UART_MODE_TX_RX; /* ÊÕ·¢Ä£Ê½ */
HAL_UART_Init(&g_uart1_handle); /* HAL_UART_Init()»áʹÄÜUART1 */
/* ¸Ãº¯Êý»á¿ªÆô½ÓÊÕÖжϣº±ê־λUART_IT_RXNE£¬²¢ÇÒÉèÖýÓÊÕ»º³åÒÔ¼°½ÓÊÕ»º³å½ÓÊÕ×î´óÊý¾ÝÁ¿ */
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
/**
* @brief UARTµ×²ã³õʼ»¯º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @note ´Ëº¯Êý»á±»HAL_UART_Init()µ÷ÓÃ
* Íê³ÉʱÖÓʹÄÜ£¬Òý½ÅÅäÖã¬ÖжÏÅäÖÃ
* @retval ÎÞ
*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1£¬½øÐд®¿Ú1 MSP³õʼ»¯ */
{
USART_UX_CLK_ENABLE(); /* USART1 ʱÖÓʹÄÜ */
USART_TX_GPIO_CLK_ENABLE(); /* ·¢ËÍÒý½ÅʱÖÓʹÄÜ */
USART_RX_GPIO_CLK_ENABLE(); /* ½ÓÊÕÒý½ÅʱÖÓʹÄÜ */
gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* TXÒý½Å */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ¸´ÓÃÍÆÍìÊä³ö */
gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */
gpio_init_struct.Alternate = USART_TX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯·¢ËÍÒý½Å */
gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* RXÒý½Å */
gpio_init_struct.Alternate = USART_RX_GPIO_AF; /* ¸´ÓÃΪUSART1 */
HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* ³õʼ»¯½ÓÊÕÒý½Å */
#if USART_EN_RX
HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* ʹÄÜUSART1ÖжÏͨµÀ */
HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); /* ÇÀÕ¼ÓÅÏȼ¶3£¬×ÓÓÅÏȼ¶3 */
#endif
}
}
/**
* @brief Rx´«Ê仨µ÷º¯Êý
* @param huart: UART¾ä±úÀàÐÍÖ¸Õë
* @retval ÎÞ
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART_UX) /* Èç¹ûÊÇ´®¿Ú1 */
{
if((g_usart_rx_sta & 0x8000) == 0) /* ½ÓÊÕδÍê³É */
{
if(g_usart_rx_sta & 0x4000) /* ½ÓÊÕµ½ÁË0x0d */
{
if(g_rx_buffer[0] != 0x0a)
{
g_usart_rx_sta = 0; /* ½ÓÊÕ´íÎó,ÖØÐ¿ªÊ¼ */
}
else
{
g_usart_rx_sta |= 0x8000; /* ½ÓÊÕÍê³ÉÁË */
}
}
else /* »¹Ã»ÊÕµ½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; /* ½ÓÊÕÊý¾Ý´íÎó,ÖØÐ¿ªÊ¼½ÓÊÕ */
}
}
}
}
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
}
/**
* @brief ´®¿Ú1ÖжϷþÎñº¯Êý
* @param ÎÞ
* @retval ÎÞ
*/
void USART_UX_IRQHandler(void)
{
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntEnter();
#endif
HAL_UART_IRQHandler(&g_uart1_handle); /* µ÷ÓÃHAL¿âÖжϴ¦Àí¹«Óú¯Êý */
#if SYS_SUPPORT_OS /* ʹÓÃOS */
OSIntExit();
#endif
}
#endif
(我要使输入的在LCD上面显示应该怎么做)
最新发布