sdk模板程序:axi_uart_irq - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki
说明
- 这个程序是中断程序的框架的典范。典型的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;
/* ↑↑↑结束处理↑↑↑ */
}
中断的波形
注意:rx是每接收到1个byte都要产生irq,而tx则一次发完(至少是fifo中发完)才产生irq。