串口
//* 函数名称:void UART_Init(void)
//* 功能说明:UART初始化函数
void UART0_Init(void)
{
//关闭CPU中断
IfxCpu_disableInterrupts();
//新建串口配置结构体
IfxAsclin_Asc_Config ascConfig;
//初始化模块
IfxAsclin_Asc_initModuleConfig(&ascConfig, &MODULE_ASCLIN0);
//设置波特率
ascConfig.baudrate.prescaler = 1; //分频值
ascConfig.baudrate.baudrate = 115200; //波特率
//ascConfig.baudrate.oversampling =IfxAsclin_OversamplingFactor_8; //LQ
ascConfig.frame.frameMode = IfxAsclin_FrameMode_asc;//数据帧模式
ascConfig.frame.dataLength = IfxAsclin_DataLength_8; //数据长度
ascConfig.frame.stopBit = IfxAsclin_StopBit_1; //停止位
ascConfig.frame.shiftDir = IfxAsclin_ShiftDirection_lsbFirst;//移位方向
ascConfig.frame.parityBit = FALSE;//无奇偶校验
//中断优先级配置
ascConfig.interrupt.txPriority = IFX_INTPRIO_ASCLIN0_TX;
ascConfig.interrupt.rxPriority = IFX_INTPRIO_ASCLIN0_RX;
ascConfig.interrupt.erPriority = IFX_INTPRIO_ASCLIN0_ER;
ascConfig.interrupt.typeOfService = IfxSrc_Tos_cpu0;
//ascConfig.interrupt.typeOfService = (IfxSrc_Tos)IfxCpu_getCoreId();//LQ
//ascConfig.interrupt.typeOfService =IfxCpu_Irq_getTos(IfxCpu_getCoreIndex());
//接收和发送FIFO的配置
ascConfig.txBuffer = &ascTxBuffer;
ascConfig.txBufferSize = ASC_TX_BUFFER_SIZE;
ascConfig.rxBuffer = &ascRxBuffer;
ascConfig.rxBufferSize = ASC_RX_BUFFER_SIZE;
//管脚配置
ascConfig.pins = &uart_pins;
//调用上面结构体所预设的参数,完成模块的初始化
IfxAsclin_Asc_initModule(&asc, &ascConfig);
//接收,发送和错误中断配置
IfxCpu_Irq_installInterruptHandler(&asclin0TxISR, IFX_INTPRIO_ASCLIN0_TX);
IfxCpu_Irq_installInterruptHandler(&asclin0RxISR, IFX_INTPRIO_ASCLIN0_RX);
IfxCpu_Irq_installInterruptHandler(&asclin0ErISR, IFX_INTPRIO_ASCLIN0_ER);
//开启CPU中断
IfxCpu_enableInterrupts();
}
//ASC模块中断参数获取
IfxAsclin_Asc* UART_GetHandle(void)
{
return &asc;
}
//* 函数名称:uint8 UART_ReadByte(void)
//* 功能说明:UART读取字节
uint8 UART_ReadByte(void)
{
uint8 data=0;
Ifx_SizeT count = 1;
IfxAsclin_Asc_read(&asc, &data, &count, TIME_INFINITE);
return data;
}
//* 函数名称:void UART_WriteByte(uint8 data)
//* 功能说明:UART发送字节函数
void UART_WriteByte(uint8 data)
{
IfxAsclin_Asc_blockingWrite(&asc, data);
}
/*************************************************************************
* 函数名称:void UART_WriteStr(uint8 *p_data, Ifx_SizeT count)
* 功能说明:UART发送字符串函数
*************************************************************************/
void UART_WriteStr(uint8 *p_data, Ifx_SizeT count)
{
uint8 *p_send = p_data;
if(count > 0)//不是空字符串则发送之
IfxAsclin_Asc_write(&asc, p_data, &count, TIME_INFINITE);
else //空字符串发送null
{
while(*p_send != (uint8)'\0')
UART_WriteByte(*p_send++);
}
}
/*************************************************************************
* 函数名称:void UART_Put_Str (uint8 *str)
* 功能说明:UART发送字符串函数(遇 NULL 停止发送)
* 备 注:UART_Put_Str("ABC123456\n");
*************************************************************************/
void UART_Put_Str (uint8 *str)
{
while(*str)
{
UART_WriteByte(*str++);
}
}
/*************************************************************************
* 函数名称:asclin0TxISR
* 功能说明:UART发送中断函数
*************************************************************************/
IFX_INTERRUPT(asclin0TxISR, 0, IFX_INTPRIO_ASCLIN0_TX)
{
IfxAsclin_Asc_isrTransmit(UART_GetHandle());
}
/*************************************************************************
* 函数名称:uint8 IfxAsclin_Asc_Receive(IfxAsclin_Asc *asclin)
* 功能说明:UART接收函数
*************************************************************************/
uint8 IfxAsclin_Asc_Receive(IfxAsclin_Asc *asclin)
{
uint8 ascData=0;
switch (asclin->dataBufferMode)
{
case Ifx_DataBufferMode_normal:
{
/* FIXME optimize usage of HW fifo */
/* FIXME add support for data size != 8 bit */
IfxAsclin_read8(asclin->asclin, &ascData, 1);
if (Ifx_Fifo_write(asclin->rx, &ascData, 1, TIME_NULL) != 0)
{
/* Receive buffer is full, data is discard */
asclin->rxSwFifoOverflow = TRUE;
}
break;
}
case Ifx_DataBufferMode_timeStampSingle:
{
Ifx_DataBufferMode_TimeStampSingle packedData;
packedData.timestamp = now();
IfxAsclin_read8(asclin->asclin, &ascData, 1);
packedData.data = ascData;
if (Ifx_Fifo_write(asclin->rx, &packedData, sizeof(packedData), TIME_NULL) != 0)
{
/* Receive buffer is full, data is discard */
asclin->rxSwFifoOverflow = TRUE;
}
}
break;
}
return ascData;
}
/*************************************************************************
* 函数名称:
* 功能说明:UART接收中断函数,返回接收的数据
*************************************************************************/
IFX_INTERRUPT(asclin0RxISR, 0, IFX_INTPRIO_ASCLIN0_RX)
{
UART_WriteByte(IfxAsclin_Asc_Receive(UART_GetHandle()));
}
/*************************************************************************
* 函数名称:
* 功能说明:UART错误中断函数
*************************************************************************/
IFX_INTERRUPT(asclin0ErISR, 0, IFX_INTPRIO_ASCLIN0_ER)
{
IfxAsclin_Asc_isrError(UART_GetHandle());
}
例子
void Test_UART0(void)
{
GPIO_init(); //GPIO P10.5和P10.6
UART0_Init();
while(1)
{
UART_WriteByte('B'); //发送 字节到UART口
IfxPort_togglePin(&MODULE_P10, 6); //闪灯
IfxStm_waitTicks(&MODULE_STM0, 5000000); //延时等待,注意不要跟别的地方STM中断冲突
UART_WriteByte('b'); //发送 字节到UART口
//UART_WriteByte('\n'); //发送 字节到UART口
UART_Put_Str("Bobby\n"); //发送字符串到上位机
IfxPort_togglePin(&MODULE_P10, 6);//LED电平翻转,闪烁
delayms(500); //延时等待
}
}