关注分享主机优惠活动
国内外VPS云服务器

K210应用程序5-在中断模式下通过uart接收数据(UART中断)。

摘要:本实验的目的是利用中断方式接收数据,实现串口发送和接收。如果两个设备需要通过一个串行端口进行通信,上述必要的参数,如波特率数据停止位和奇偶校验位,必须一致设置后才能进行串行通信。

使用中断模式通过UART接收数据

实验目的本节的目的是实现串口发送和接收。本节计划通过中断实现串口接收。当K210接收到0x00时,它将关闭前面提到的红色Led,并通过串行端口打印红色LED。否则,它将点亮前面提到的红色Led,并通过串行端口打印红色LED。

实验准备1)用一个带UART和发光二极管(LED)的K210开发板来练习和检查实验现象;

2)官方裸机编程说明手册:Kendryte _ Standalone _ Programming _ Guide,用来参考SDK中的接口描述。

实验原理串行通信是指外设与计算机之间通过数据线、地线、控制线逐位传输数据的一种通信方式。传输方式是一个字符一个字符的传输,每个字符都是一位一位的传输。首先传输低位,然后传输高位。传输每个字符时,总是以起始位开始,以停止位结束。比特之间的时间间隔可以根据自己的需要设置,这个时间间隔对应的就是波特率。对于某些场景,为了保证数据的可靠性,需要添加奇偶校验位,称为奇偶校验位,用于检查传输数据的正确性。如果两台设备需要通过串口进行通信,上面提到的波特率、数据位、停止位、校验位等必要参数必须设置一致,才能进行串行通信。此外,串行通信支持全双工通信,即一条数据线可以用来发送数据,而另一条数据线可以用来接收数据。

硬件设计硬件电路图如下:

软件设计软件流程图如下:

软件实现根据硬件设计和软件设计,本节的应用实现步骤如下:

1)设置管脚复用功能:根据硬件原理图,我们需要设置IO12为GPIOHS功能,IO4和IO5为UART的RX和TX功能,如下图所示:

2)、LED初始化,如下图:

3) UART初始化,如下图所示:

4)实现uart3接收中断回调函数。在接收中断回调函数中,实现串口接收并记录接收数据的长度,如下图所示:

5)通过UART发送提示信息,如下图所示:

6)判断是否收到数据。如果接收到数据,判断接收到的控制命令的类型,并根据接收到的控制命令进行相应的操作,如下图所示:

根据以上步骤,最终代码如下:

# include # include # include # include # include # Define LED _ R _ PIN(12)# Define LED _ R _ GPIOHSNUM(0)# Define LED _ R _ FUNC(FUNC _ gpiohs 小编LED _ R _ GPIOHSNUM)# Define UART 3 _ RX _ PIN(4)# Define UART 3 _ TX _ PIN(5)# Define UART 3 _ NUM(UART _ DEVICE _ 3)# Define UART 3 _ RX _ func(func _ UART 1 _ RX+UART 3 _ NUM * 2) */void init _ hardware(void){//重用红色LED引脚设置为gpiohsfpioa _ set _ func(LED _ r _ pin,LED _ r _ func); //复用UART引脚设置为UART fpioa _ set _ function(UART 3 _ rx _ pin,UART 3 _ rx _ func);fpioa _ set _ function(UART 3 _ TX _ PIN,UART 3 _ TX _ FUNC);* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LED初始化* * * * * * * * * * * * * * * * * * *//设置初始电平状态gpiohs _ set _ pin (led _ r _ gpiohsnum,value);}/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * } struct RCVBUF { char buf[128];无符号字符长度;};/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * rcv _ buf -> len = UART _ receive _ data(UART 3 _ NUM,rcv_buf->buf,1);返回0;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//设置uart工作模式UART _ set _ work _ mode (UART 3 _ num,UART _ normal);//设置UART _ config (UART 3 _ num,115200,UART _ bit width _ 8bit,UART _ stop _ 1,UART _ parity _ none);//初始化外部中断plic _ init();//注册UART中断函数UART _ IRQ _ Register (UART 3 _ NUM,UART _ RECEIVE,IRQ _ UART 3 _ RCV,RCV _ BUF,1);//设置接收中断触发器UART _ Set _ receive _ trigger(UART 3 _ num,UART _ receive _ FIFO _ 1)的FIFO深度;//启用系统中断。如果使用中断,一定要打开系统中断sysctl _ enable _ IRQ();}int main(int argc,char * * argv){ init _ hardware();init _ led(GPIO _ PV _ HIGH);struct RCVBUF rcv_buf = {。len = 0,};init _ UART(& rcv _ buf);uart_send_data(UART3_NUM," CTL LED:[0:OFF/1:ON] /r/n ",sizeof(" CTL LED:[0:OFF/1:ON]/r/n "));while (1) { if(rcv_buf.len!= 0) { uart_send_data(UART3_NUM," rcv_buf.len:",sizeof(" rcv _ buf . len:"));uart_send_data(UART3_NUM,(char *)&rcv_buf.len,sizeof(rcv _ buf . len));if(rcv _ buf . buf[0]= = 0){ UART _ send _ data(UART 3 _ NUM," LER_R OFF!/r/n ",sizeof("LER_R OFF!/r/n "));CTL _ led(GPIO _ PV _ HIGH);} else { uart_send_data(UART3_NUM," LER_R ON!/r/n ",sizeof("LER_R ON!/r/n "));CTL _ led(GPIO _ PV _ LOW);} uart_send_data(UART3_NUM," CTL LED:[0:OFF/1:ON] /r/n ",sizeof(" CTL LED:[0:OFF/1:ON]/r/n ");rcv _ buf . len = 0;} us LEEP(20000);}返回0;}编译1)。与上一节类似,在SDK中创建一个uart_irq文件夹,在新创建的文件夹中创建一个main.c文件,然后将本节的代码输入到main.c文件中,如下所示:

2)编制方法与上一节类似。打开vscode终端,在终端中输入上一节中创建的构建文件夹,然后输入:cmake../-dproj = UART _ IRQ -g " mingw makefiles "生成makefile,如下所示:

3)生成makefile后,输入:make开始编译,如下图:

4)编译完成后,编译目录下会生成一个烧录文件:uart_irq.bin,如下图所示:

烧法和上一节的烧法差不多。注意:固件选项选择我们刚刚编译的uart_irq.bin文件。

实验现象通过串口助手,发送0x00,红色LED灯灭,发送其他非零数字,红色LED灯亮。如下图所示:

1)、打开LED

2)、关闭LED。

实验总结1) K210串口中断包括接收中断和发送中断,用户可以根据要求设置想要的中断方式;

K210串口的中断可以设置触发FIFO深度,用户可以根据需要设置想要的FIFO深度。

未经允许不得转载:主机频道 » K210应用程序5-在中断模式下通过uart接收数据(UART中断)。

评论 抢沙发

评论前必须登录!