简介
本文内容对 UART 特性进行了介绍,基于 FC7300 Uart_Interrupt Demo 程序,用上位机发送数据 0X55,通过 UART 接收中断进入 UART 中断处理函数,在中断处理函数中判断接收 Rxbuffer 里的数据是否为 0X55,如果为 0X55,则能实现 LED 灯电平的翻转,此现象为:初始 LED 灯长亮,当 Rxbuffer 接收数据为 0X55 时,LED 灯灭。
硬件平台:旗芯微 FC7300 DEMO BOARD V1 开发板
软件平台:FC7300_SDK_V_0_2_0
一、 UART特性
▲ 图 1 来自 FC7300 Data Sheet V0.1.1
FC7300 有 18 个 UART,支持全双工、异步、NRZ 串行通信,包括波特率生成器、发送器和接收器块。发送器和接收器使用相同的波特率生成器,发送和接收具有独立 FIFO 结构,发送和接收数据 FIFO 深度均为 16 字,接收和发送请求是单独的可配置选项, FCUART 发送器可配置编程数据长度从 7 位到 10 位,发送和接收数据均可触发中断。
二、程序分析
2.1 Demo 函数概述
- main函数:程序对时钟、LED 引脚、UART TX /RX 引脚、UART 进行了初始化。
int main(void)
{
Bsp_CLOCK_Init(); //时钟初始化
BSP_PORT_Init(); //LED UART TX/RX 引脚初始化
BSP_FCUART_Init(); //UART 初始化
while (1)
{s
}
}
- BSP_FCUART_Init 函数: 程序初始化 UART 参数配置,UART 波特率为115200,使能了UART 接收数据中断,使能了UART。
void BSP_FCUART_Init(void)
{
uint8_t u8UartIndex;
#if UART_USED_INSTANCE1 == STD_ON
u8UartIndex = 1U;
FCUART_InitMemory(u8UartIndex);
BSP_FCUART_LL_Init(u8UartIndex,115200U); //初始化 UART参数配置,UART 波特率为115200,使能了UART 接收数据中断,使能了UART
#endif
}
- BSP_FCUART_LL_Init 函数:程序初始化 UART 参数配置,使能了接收 FIFO,设置了传输数据长度为 8 bit,1bit 停止位,UART 波特率为 115200 ,使能了UART,使能了UART 接收数据中断,中断回调函数为FCUART_RxInterrupt_CallBack 。
static void BSP_FCUART_LL_Init(uint8_t u8UartIndex, uint32_t u32Baud)
{
FCUART_ErrorType tRetVal;
FCUART_InitType tInitCfg;
uint32_t u32PccFuncClk = 0U;
#if UART_RECEIVE_POLLING == STD_OFF
FCUART_InterruptType tInterruptCfg;
#endif
#if UART_USED_INSTANCE1 == STD_ON
/* get function clock from PCC */
u32PccFuncClk = PCC_GetPccFunctionClock(PCC_CLK_FCUART1);
#endif /* end for UART_USED_INSTANCE1 == STD_ON */
/* check pcc clock if it is valid */
if(u32PccFuncClk != 0U)
{
tInitCfg.bEnRxFifo = TRUE; /、* UART fifo enable */
tInitCfg.u32Baudrate = u32Baud; /* UART baud-rate */
tInitCfg.eBitMode = UART_BITMODE_8; /* UART bit mode */
tInitCfg.bParityEnable = FALSE; /* UART parity check enable */
tInitCfg.eStopBit = UART_STOPBIT_NUM_1; /* UART stop bit number */
tInitCfg.u32ClkSrcHz = u32PccFuncClk; /* UART function clock */
tInitCfg.u32TransmitTimeout = 0xFFFFFFFFU;; /* Transmit timeout tick */
/* start initial UART */
tRetVal = FCUART_Init(u8UartIndex, &tInitCfg);
if(tRetVal == FCUART_ERROR_OK)
{
#if UART_RECEIVE_POLLING == STD_OFF
s_tFCUART_RxMsg.pDatas = s_a2RxDataBuf[u8UartIndex]; /* data buffer must set an array address */
tInterruptCfg.pRxBuf = &s_tFCUART_RxMsg;
tInterruptCfg.bEnErrorInterrupt = false;
tInterruptCfg.pErrorNotify = FCUART_ErrorInterrupt_CallBack;
tInterruptCfg.bEnRxInterrupt = true;
tInterruptCfg.pRxNotify = FCUART_RxInterrupt_CallBack;
tRetVal = FCUART_SetInterrupt(u8UartIndex, &tInterruptCfg);
IntMgr_SetPriority(FCUART_IRQ_INDEX, 0);
IntMgr_EnableInterrupt(FCUART_IRQ_INDEX);
#else
/* clear receive polling data length */
s_aRxDataLen[u8UartIndex] = 0U;
#endif /* end for #if UART_RECEIVE_POLLING == STD_OFF */
tRetVal = FCUART_StartReceive(u8UartIndex);
/* after initial UART, print start message */
tRetVal = FCUART_Printf(u8UartIndex,"System Start!!\n");
}
else
{
}
}
}
- FCUART_RxInterrupt_CallBack 函数:程序判断 接收 buffer 里的数据是否为 0X55, 如果为 0X55,则能实现 LED 电平的翻转,即 LED 灯灭。
static void FCUART_RxInterrupt_CallBack(uint8_t u8UartIndex, FCUART_DataType *pRxData)
{
FC_OwnMemcpy(&s_a2TxDataBuf[u8UartIndex][s_aRxDataLen[u8UartIndex]], pRxData->pDatas,(uint32_t)pRxData->u8DataLen);
s_aRxDataLen[u8UartIndex] += pRxData->u8DataLen;
if(s_a2RxDataBuf[UART_USER_NUM][0]=0X55) //如果接收的数据为 0X55
{
BSP_GPIO_Toggle(); //LED 灯电平翻转,即 LED 灯灭
}
}
三、 实验现象
3.1 板子初始状态 LED 灯长亮:
▲ 图 2 FC7300 DEMO BOARD V1 开发板
3.2 上位机发送数据 0X55:
▲ 图 3 来自开源串口助手 开源电子网: www.openedv.com
3.3 Debug 状态下,接收 buffer 里的数据:
▲ 图 4 FC7300_SDK_V_0_2_0 FC7300 Uart_Interrupt Demo Debug 数据
3.4 UART 接收到 0X55,板子上 LED 灯灭:
▲ 图 5 FC7300 DEMO BOARD V1 开发板
四、 总结
综上介绍了基于 Flagchip FC7300 UART接收到上位机发送的数据产生接收中断,通过对 FC7300 Uart_Interrupt Demo 程序解析,了解到 UART 可以通过接收上位机发送的数据,对其接收数据进行判断,判断数据为 0X55 时,则能实现 LED 灯的电平翻转,即 LED 灯灭。关于详细 UART 中断介绍及参数配置,请参考 FC7300 Reference Manual V3.0 用户手册及 FC7300_SDK_V_0_2_0 SDK包中的 FC7300 Uart_Interrupt Demo 程序。
五、 参考文献
(1) FC7300 Reference Manual V3.0、FC7300 Data Sheet V0.1.1
(2) FC7300_SDK_V_0_2_0
(3) 串口助手:XCOM V2.0 (开源电子网: www.openedv.com)
欢迎在博文下方留言评论,我们会及时回复您的问题。如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com
作者:Jim Zhang / 张傲
评论