📄 bsp_ser.c
字号:
/*
*********************************************************************************************************
*
* MICRIUM BOARD SUPPORT PACKAGE
*
* (c) Copyright 2003-2010; Micrium, Inc.; Weston, FL
*
* All rights reserved. Protected by international copyright laws.
*
* This BSP is provided in source form to registered licensees ONLY. It is
* illegal to distribute this source code to any third party unless you receive
* written permission by an authorized Micrium representative. Knowledge of
* the source code may NOT be used to develop a similar product.
*
* Please help us continue to provide the Embedded community with the finest
* software available. Your honesty is greatly appreciated.
*
* You can contact us at www.micrium.com.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* MICRIUM BOARD SUPPORT PACKAGE
* SERIAL (UART) INTERFACE
*
* Filename : bsp_ser.c
* Version : V1.00
* Programmer(s) : EHS
* SR
* AA
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#define BSP_SER_MODULE
#include <bsp.h>
/*
*********************************************************************************************************
* LOCAL DEFINES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL CONSTANTS
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL DATA TYPES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL TABLES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/
static BSP_OS_SEM BSP_SerTxWait;
static BSP_OS_SEM BSP_SerRxWait;
static BSP_OS_SEM BSP_SerLock;
static CPU_INT08U BSP_SerRxData;
#if (BSP_CFG_SER_CMD_HISTORY_LEN > 0u)
static CPU_CHAR BSP_SerCmdHistory[BSP_CFG_SER_CMD_HISTORY_LEN];
#endif
/*
*********************************************************************************************************
* LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static void BSP_Ser_WrByteUnlocked (CPU_INT08U c);
static CPU_INT08U BSP_Ser_RdByteUnlocked (void);
static void BSP_Ser_ISR_Handler (void);
/*
*********************************************************************************************************
* LOCAL CONFIGURATION ERRORS
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*********************************************************************************************************
** GLOBAL FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* BSP_Ser_Init()
*
* Description : Initialize a serial port for communication.
*
* Argument(s) : baud_rate The desire RS232 baud rate.
*
* Return(s) : none.
*
* Caller(s) : Application.
*
* Note(s) : none.
*********************************************************************************************************
*/
void BSP_Ser_Init (CPU_INT32U baud_rate)
{
FlagStatus tc_status;
GPIO_InitTypeDef gpio_init;
USART_InitTypeDef usart_init;
USART_ClockInitTypeDef usart_clk_init;
/* ------------------ INIT OS OBJECTS ----------------- */
BSP_OS_SemCreate(&BSP_SerTxWait, 0, "Serial Tx Wait");
BSP_OS_SemCreate(&BSP_SerRxWait, 0, "Serial Rx Wait");
BSP_OS_SemCreate(&BSP_SerLock, 1, "Serial Lock");
#if (BSP_CFG_SER_CMD_HISTORY_LEN > 0u)
BSP_SerCmdHistory[0] = (CPU_CHAR)'\0';
#endif
/* ----------------- INIT USART STRUCT ---------------- */
usart_init.USART_BaudRate = baud_rate;
usart_init.USART_WordLength = USART_WordLength_8b;
usart_init.USART_StopBits = USART_StopBits_1;
usart_init.USART_Parity = USART_Parity_No ;
usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
usart_clk_init.USART_Clock = USART_Clock_Disable;
usart_clk_init.USART_CPOL = USART_CPOL_Low;
usart_clk_init.USART_CPHA = USART_CPHA_2Edge;
usart_clk_init.USART_LastBit = USART_LastBit_Disable;
BSP_PeriphEn(BSP_PERIPH_ID_USART2);
BSP_PeriphEn(BSP_PERIPH_ID_IOPD);
BSP_PeriphEn(BSP_PERIPH_ID_AFIO);
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
/* ----------------- SETUP USART2 GPIO ---------------- */
/* Configure GPIOD.5 as push-pull. */
gpio_init.GPIO_Pin = GPIO_Pin_5;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &gpio_init);
/* Configure GPIOD.6 as input floating. */
gpio_init.GPIO_Pin = GPIO_Pin_6;
gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &gpio_init);
/* ------------------ SETUP USART2 -------------------- */
USART_Init(USART2, &usart_init);
USART_ClockInit(USART2, &usart_clk_init);
USART_Cmd(USART2, ENABLE);
USART_ITConfig(USART2, USART_IT_TC, DISABLE);
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
tc_status = USART_GetFlagStatus(USART2, USART_FLAG_TC);
while (tc_status == SET) {
USART_ClearITPendingBit(USART2, USART_IT_TC);
USART_ClearFlag(USART2, USART_IT_TC);
BSP_OS_TimeDlyMs(10);
tc_status = USART_GetFlagStatus(USART2, USART_FLAG_TC);
}
BSP_IntVectSet(BSP_INT_ID_USART2, BSP_Ser_ISR_Handler);
BSP_IntEn(BSP_INT_ID_USART2);
}
/*
*********************************************************************************************************
* BSP_Ser_ISR_Handler()
*
* Description : Serial ISR.
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Caller(s) : This is an ISR.
*
* Note(s) : none.
*********************************************************************************************************
*/
void BSP_Ser_ISR_Handler (void)
{
FlagStatus tc_status;
FlagStatus rxne_status;
rxne_status = USART_GetFlagStatus(USART2, USART_FLAG_RXNE);
if (rxne_status == SET) {
BSP_SerRxData = USART_ReceiveData(USART2) & 0xFF; /* Read one byte from the receive data register. */
USART_ClearITPendingBit(USART2, USART_IT_RXNE); /* Clear the USART2 receive interrupt. */
BSP_OS_SemPost(&BSP_SerRxWait); /* Post to the sempahore */
}
tc_status = USART_GetFlagStatus(USART2, USART_FLAG_TC);
if (tc_status == SET) {
USART_ITConfig(USART2, USART_IT_TC, DISABLE);
USART_ClearITPendingBit(USART2, USART_IT_TC); /* Clear the USART2 receive interrupt. */
BSP_OS_SemPost(&BSP_SerTxWait); /* Post to the semaphore */
}
}
/*
*********************************************************************************************************
* BSP_Ser_Printf()
*
* Description : Print formatted data to the output serial port.
*
* Argument(s) : format String that contains the text to be written.
*
* Return(s) : none.
*
* Caller(s) : Application.
*
* Note(s) : (1) This function output a maximum of BSP_SER_PRINTF_STR_BUF_SIZE number of bytes to the
* serial port. The calling function hence has to make sure the formatted string will
* be able fit into this string buffer or hence the output string will be truncated.
*********************************************************************************************************
*/
void BSP_Ser_Printf (CPU_CHAR *format, ...)
{
CPU_CHAR buf_str[BSP_SER_PRINTF_STR_BUF_SIZE + 1u];
va_list v_args;
va_start(v_args, format);
(void)vsnprintf((char *)&buf_str[0],
(size_t ) sizeof(buf_str),
(char const *) format,
v_args);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -