【APT32F102 学习记录之printf 重定向】

  • Post author:
  • Post category:其他





前言

首次接触RISC-V CPU内核芯片,特作此博客记录。

芯片:APT32F1023是由爱普特微电子推出的基于RISC-V CPU内核开发的32位高性能高可靠性单片机。



一、printf 重定向



1.引入库

#include <stdio.h>



2.main.c 文件添加 fputc 函数,实现printf

 // 发送数据 
int fputc(int ch, FILE *f) 
{ 
	UARTTxByte (UART1,ch); //发送 
	return (ch); 
}



二、问题



1.读取串口数据,在中断函数中使用,会导致 程序死机



(1) UART_ReturnRxByte(UART0); //中断 读取 会导致死机

/*************************************************************/
//UART0 Interrupt
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void UART0IntHandler(void) 
{
   // ISR content ...
   if ((UART0->ISR&UART_RX_INT_S)==UART_RX_INT_S)				//RX interrupt
   {
   	UART0->ISR=UART_RX_INT_S;
   	RxDataFlag = TRUE;	
   	//char uart_data =  UART_ReturnRxByte(UART0);  //中断 读取 会导致死机
   	//uart0_rx_buff_write(uart_data);  
   }
   else if( (UART0->ISR&UART_TX_INT_S)==UART_TX_INT_S ) 		//TX interrupt
   {
   	UART0->ISR=UART_TX_INT_S;
   	TxDataFlag = TRUE;
   }
   else if ((UART0->ISR&UART_RX_IOV_S)==UART_RX_IOV_S)			//RX overrun interrupt
   {
   	UART0->ISR=UART_RX_IOV_S;
   }
   else if ((UART0->ISR&UART_TX_IOV_S)==UART_TX_IOV_S)			//TX overrun interrupt
   {
   	UART0->ISR=UART_TX_IOV_S;
   }
}
/*************************************************************/
//UART RX Return Byte 
//EntryParameter:UART0,UART1,UART2
//ReturnValue:(uart)->DATA
/*************************************************************/
U8_T UART_ReturnRxByte(CSP_UART_T *uart)
{
	RxDataFlag = FALSE;
	while(RxDataFlag != TRUE);
	return CSP_UART_GET_DATA(uart);
}



(2)原因

RxDataFlag 在中断中设置 TRUE,进入 UART_ReturnRxByte(UART0) 中,又设置为FALSE,在while(RxDataFlag != TRUE); 位置,一直等待。

修改 串口接收函数 U8_T UART_ReturnRxByte(CSP_UART_T *uart)

/*************************************************************/
//UART RX Return Byte  UART RX返回字节
//EntryParameter:UART0,UART1,UART2
//ReturnValue:(uart)->DATA
/*************************************************************/
U8_T UART_ReturnRxByte(CSP_UART_T *uart)
{
	//RxDataFlag = FALSE;
	//while(RxDataFlag != TRUE);
	return CSP_UART_GET_DATA(uart);
}



总结

以上就是今天要讲的内容,本文仅仅简单介绍了APT 串口 printf 重定向 ,及串口接收函数的问题。



版权声明:本文为qq_33142783原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。