zf_uart.c
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口初始化
// @param uartn 串口模块号(UART_0,UART_1,UART_2,UART_3)
// @param baud 串口波特率
// @param tx_pin 串口发送引脚
// @param rx_pin 串口接收引脚
// @return uint32 实际波特率
// Sample usage: uart_init(UART_0,115200,UART0_TX_P14_0,UART0_RX_P14_1); // 初始化串口0 波特率115200 发送引脚使用P14_0 接收引脚使用P14_1
//-------------------------------------------------------------------------------------------------------------------
void uart_init(UARTN_enum uartn, uint32 baud, UART_PIN_enum tx_pin, UART_PIN_enum rx_pin)
{
boolean interrupt_state = disableInterrupts();
volatile Ifx_ASCLIN *moudle = IfxAsclin_getAddress((IfxAsclin_Index)uartn);
IfxAsclin_Asc_initModuleConfig(&uart_config, moudle); //初始化化配置结构体
uart_set_buffer(uartn);//设置缓冲区
uart_set_interrupt_priority(uartn);//设置中断优先级
uart_config.baudrate.prescaler = 4;
uart_config.baudrate.baudrate = (float32)baud;
uart_config.baudrate.oversampling = IfxAsclin_OversamplingFactor_8;
IfxAsclin_Asc_Pins pins;//设置引脚
pins.cts = NULL;
pins.rts = NULL;
uart_mux(uartn, tx_pin, rx_pin, (uint32 *)&pins.tx, (uint32 *)&pins.rx);
pins.rxMode = IfxPort_InputMode_pullUp;
pins.txMode = IfxPort_OutputMode_pushPull;
pins.pinDriver = IfxPort_PadDriver_cmosAutomotiveSpeed1;
uart_config.pins = &pins;
IfxAsclin_Asc_initModule(uart_get_handle(uartn), &uart_config);
restoreInterrupts(interrupt_state);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口字节输出
// @param uartn 串口模块号(UART_0,UART_1,UART_2,UART_3)
// @param dat 需要发送的字节
// @return void
// Sample usage: uart_putchar(UART_0, 0xA5); // 串口0发送0xA5
//-------------------------------------------------------------------------------------------------------------------
void uart_putchar(UARTN_enum uartn, uint8 dat)
{
// IfxAsclin_Asc_blockingWrite(uart_get_handle(uartn),dat);
Ifx_SizeT count = 1;
(void)IfxAsclin_Asc_write(uart_get_handle(uartn), &dat, &count, TIME_INFINITE);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口发送数组
// @param uartn 串口模块号(UART_0,UART_1,UART_2,UART_3)
// @param *buff 要发送的数组地址
// @param len 发送长度
// @return void
// Sample usage: uart_putbuff(UART_0,&a[0],5);
//-------------------------------------------------------------------------------------------------------------------
void uart_putbuff(UARTN_enum uartn, uint8 *buff, uint32 len)
{
while(len)
{
uart_putchar(uartn, *buff);
len--;
buff++;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口发送字符串
// @param uartn 串口模块号(UART_0,UART_1,UART_2,UART_3)
// @param *str 要发送的字符串地址
// @return void
// Sample usage: uart_putstr(UART_0,"i lvoe you");
//-------------------------------------------------------------------------------------------------------------------
void uart_putstr(UARTN_enum uartn, const int8 *str)
{
while(*str)
{
uart_putchar(uartn, *str++);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 读取串口接收的数据(whlie等待)
// @param uartn 串口模块号(UART_0,UART_1,UART_2,UART_3)
// @param *dat 接收数据的地址
// @return void
// Sample usage: uint8 dat; uart_getchar(UART_0,&dat); // 接收串口0数据 存在在dat变量里
//-------------------------------------------------------------------------------------------------------------------
void uart_getchar(UARTN_enum uartn, uint8 *dat)
{
while(!IfxAsclin_Asc_getReadCount(uart_get_handle(uartn)));
*dat = IfxAsclin_Asc_blockingRead(uart_get_handle(uartn));
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 读取串口接收的数据(查询接收)
// @param uartn 串口模块号(UART_0,UART_1,UART_2,UART_3)
// @param *dat 接收数据的地址
// @return uint8 1:接收成功 0:未接收到数据
// Sample usage: uint8 dat; uart_query(UART_0,&dat); // 接收串口0数据 存在在dat变量里
//-------------------------------------------------------------------------------------------------------------------
uint8 uart_query(UARTN_enum uartn, uint8 *dat)
{
if(IfxAsclin_Asc_getReadCount(uart_get_handle(uartn)) >0)
{
*dat = IfxAsclin_Asc_blockingRead(uart_get_handle(uartn));
return 1;
}
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 重定义printf 到串口
// @param ch 需要打印的字节
// @param stream 数据流
// @note 此函数由编译器自带库里的printf所调用
//-------------------------------------------------------------------------------------------------------------------
int fputc(int ch, FILE *stream)
{
uart_putchar(DEBUG_UART, (char)ch);
return(ch);
}
主函数
uint8 uart_buff;
int core0_main(void)
{
disableInterrupts();
get_clk();//获取时钟频率 务必保留
//用户在此处调用各种初始化函数等
uart_init(UART_0, 115200, UART0_TX_P14_0, UART0_RX_P14_1);
//在本库中,对于串口的接收与发送都是通过中断完成的,因此想要正常的使用串口功能务必保证中断是开启的,也就是调用了enableInterrupts()
enableInterrupts();
//调用enableInterrupts函数之后 才开始发送或者接收数据
uart_putstr(UART_0, "\n---uart test---\n");
//串口的中断函数全部都在isr.c中。
//串口中断相关的配置参数都在isr_config.h中
//可配置参数有 ERU_CH0_CH4_INT_SERVICE 和 ERU_CH0_CH4_INT_PRIO
//UART0_INT_SERVICE 中断服务者,表示改中断由谁处理
//UART0_TX_INT_PRIO 发送中断优先级 优先级范围1-255 越大优先级越高 与平时使用的单片机不一样
//UART0_RX_INT_PRIO 接收中断优先级
//UART0_ER_INT_PRIO 错误中断优先级
//其他串口中断参数同理
//需要特备注意的是 不可以有优先级相同的中断函数 每个中断的优先级都必须是不一样的
while (TRUE)
{
//查询是否有数据,如果有则接收
if(uart_query(UART_0, &uart_buff))
{
//将收到的数据,再发出去
uart_putchar(UART_0, uart_buff);
}
//使用usb转ttl连接单片机的串口,在电脑上打开串口助手,任意发送字符,
//单片机收到后会返回发送的字符,串口助手就会显示刚才发送的东西
}
}
使用变量uart_buff存储从串口收到的信息
使用putchar函数发出在串口助手上显示
串口中断分为三类:发送中断,接收中断,错误中断
UART0_TX_INT_PRIO 发送中断优先级
UART0_RX_INT_PRIO 接收中断优先级
UART0_ER_INT_PRIO 错误中断优先级
有四个串口UART0~3