Skip to content

sdk模板程序:axi_uart_irq

minichao9901 edited this page May 1, 2024 · 1 revision

说明

  • 这个程序是中断程序的框架的典范。典型的do...while架构,也就是先执行,后轮询标志变量。标志变量在isr中设置。
  • 这个程序可以被用作范例
#include "ACZ702_Lib/COMMON.h"

uint8_t Receive_Buffer[10];

int main(void)
{
	uint8_t Data[10];
	uint32_t Timeout;
	uint8_t i;

	//开启通用中断控制器
	ScuGic_Init();

	//初始化AXI_UART
	AXI_UartLite_Init(&AXI_UART0, XPAR_AXI_UARTLITE_0_DEVICE_ID);

	//初始化AXI_UART中断
	AXI_UARTLite_Intr_Init(&AXI_UART0, XPAR_FABRIC_AXI_UARTLITE_0_INTERRUPT_INTR,
			AXI_UART0_Send_IRQ_Handler,AXI_UART0_Recv_IRQ_Handler);

	//UART发送
	AXI_UARTLite_SendString(&AXI_UART0,"00 01 02 03 04 05 06 07 08 09 10 "
			"11 12 13 14 15 16 17 18 19 20 21 22 23 24 25\n");

	//等待上一轮发送完成
	while(!All_Send_Flag);
	All_Send_Flag = 0;

	AXI_UARTLite_SendString(&AXI_UART0,"UART send done!!!\n");

	//等待上一轮发送完成
	while(!All_Send_Flag);
	All_Send_Flag = 0;

	while(1) {
		//UART接收10个字符
		AXI_UARTLite_RecvData(&AXI_UART0, Receive_Buffer, 10);

		//等待10字节接收完成或接收超时
		Timeout = 10000;
		while((!All_Recv_Flag) && (Timeout)) {
			usleep(10);
			Timeout--;
		}

		if(All_Recv_Flag) {
			//清除接收完成标志
			All_Recv_Flag = 0;

			//处理接受到的数据,帧头'S' 帧尾'E',中间有效数据长度为8字节
			if((Receive_Buffer[0] == 'S') && (Receive_Buffer[9] == 'E')) {
				for(i=0;i<8;i++) {
					Data[i] = Receive_Buffer[i+1];
				}

				for(i=0;i<10; i++){/*重复发送10遍*/
					//回发8位有效数据
					XUartLite_Send(&AXI_UART0,Data,8);

					//换行
					AXI_UARTLite_SendString(&AXI_UART0,"\n");
					while(!All_Send_Flag);
					All_Send_Flag = 0;
				}
			}
		}
	}

	return 0;
}
/**
  *****************************************************************************
  * 					存放用户中断处理函数,方便统一处理
  *****************************************************************************
  *
  * @File   : ISR.c
  * @By     : Sun
  * @Version: V0.5
  * @Date   : 2022 / 06 / 01
  * @Shop	: https://xiaomeige.taobao.com/
  *
  *****************************************************************************
**/

#include "ISR.h"

//中断里使用的标志位
volatile int All_Send_Flag = 0;	//全部发送标志
volatile int All_Recv_Flag = 0;	//全部接收标志

/**
  *****************************************************
  * @brief	私有定时器中断处理程序
  * @tag	本函数用来处理私有定时器中断,在内部加入用户程序即可
  *****************************************************
**/
void ScuTimer_IRQ_Handler(void *CallBackRef)
{
	/* ↓↓↓用户处理↓↓↓ */

	/* ↑↑↑结束处理↑↑↑ */
    XScuTimer_ClearInterruptStatus(&ScuTimer);
}

/**
  *****************************************************
  * @brief	私有定时器中断处理程序
  * @tag	本函数用来处理私有定时器中断,在内部加入用户程序即可
  *****************************************************
**/
void ScuF2P_IRQ_Handler(void *CallBackRef)
{
	/* ↓↓↓用户处理↓↓↓ */

	/* ↑↑↑结束处理↑↑↑ */
}


void AXI_UART0_Send_IRQ_Handler(void *CallBackRef, unsigned int EventData)
{
	/* ↓↓↓用户处理↓↓↓ */
	All_Send_Flag = 1;
	/* ↑↑↑结束处理↑↑↑ */
}

void AXI_UART0_Recv_IRQ_Handler(void *CallBackRef, unsigned int EventData)
{
	/* ↓↓↓用户处理↓↓↓ */
	All_Recv_Flag = 1;
	/* ↑↑↑结束处理↑↑↑ */
}

中断的波形

image image

注意:rx是每接收到1个byte都要产生irq,而tx则一次发完(至少是fifo中发完)才产生irq。

Clone this wiki locally