发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
[问答] PIC32 UART中断困难该怎么办?
143 UART 管脚 LED
分享
大家好。我试图在我的pic32mx(PIC32MX795F512L)和我的电脑(窗口和串行到usb转换器)之间建立串行通信(UART)。我触发RX中断有困难,我知道我的电脑正在发送数据。我打开LED只是想看看中断是否正常,但是什么也没发生。这是我的代码,如果某人能对这个话题给出一些提示,我将不胜感激。//////////////////////////////////////CODE/////////////////////////////pragma config FPLLIDIV=DIV_10//PLL输入分配器(10xDivider)#pragma配置FPLLMUL=MUL_20//PLL乘法器(20x乘法器)\\\\\\\\\\\\\\\\MUL_20///PLL乘法器(20x乘法器)\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\24242424242424242424内部外部切换(启用)\#pragma配置PO外部切换(启用)\\\\\\\\\\\\\\\\\\\24242424语法切换配置POSCMO配置POSCMOD = XT/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\SWDTEN位控制)//DEVCFG0#pragma配置debug=OFF//后台调试器启用(调试器被禁用)#pragma配置ICESEL=ICS_PGx2//ICE/ICD命令通道选择(与PGC2/PGD2共享的ICE EMUC2/EMUD2管脚)#pragma配置PWP=OFF//程序闪存保护(禁用)#pragma配置BWP=BWPOFF//启动闪写保护位(保护禁用)\启动闪写保护保护位(保护禁用)#pragma配置CP=OFF///代码保护(保护禁用)#pragma配置CP=OFF////代码保护(保护禁用)\#pragma config config CP CP CP CP CP CP CP CP配置CP=OFF//OFF//代码保护(保护禁用)\#包括< xc.h<&xc.h>;包括<&stdio.h>&包括<&stdlib.h<<&stdlib.h>>>\\\\#包括&sys/attribs/attribs/2BRG=259;//BAUD RATE 960040MHz U2MODEBITS?BRGH=0;/标准速度模式?16x波特时钟启用U2MODE位.PDSEL=0b00;//8位数据,无奇偶U2MODE位,无奇偶校验U2MODE位。STSEL=0;//8位数据,无奇偶校验U2MODE位。STSEL=0;0//1停止位TRISF比特TRISF比特.TRISF比特.TRISF4=1;TRISF比特.TRISF比特.TRISF比特.TRISF5=0;0;0;IEC1bits.U2Fbits.TRISFbits.TRISFbits.TRISFF5=0;0;IEC1bits.U2RX1.U2RX1;U2RX中断RX启用IPC8位.U2RXflag位被断言,而接收缓冲区不是空的(即,至少有一个数据字符)U2STAbits.URXEN=1;//UARTx接收器被启用。UxRX管脚由UARTx(如果ON=1)U2MODEbits.ON=1;//在IFS1位.U2RXIF=0;//清除标志INTCON比特.U2RXIF=0;//清除标志INTCONTCONTCON比特.MVEC=1;TRISB比特.TRISB比特.TRIsb1=0;//LED同时(1){{{}}}}}void_u ISR(_UART_2_VECTOR,IPL5AUTO)uart(void){TB比特{LATB比特.LATB1=1;//LATB比特{LATBB比特.LATB比特.LATBB比特.LATB1;}
0
2019-11-1 10:25:41   评论 分享淘帖 邀请回答

相关问题

19个回答
尝试全局中断:ASM易失性(“EI”);
2019-11-1 10:44:59 评论

举报

已经做了那个,没有工作。
2019-11-1 11:01:45 评论

举报

对于较小的处理器(甚至说PIC24),用CPU寄存器直接控制UART并不太困难;但是,PIC32要复杂得多。现在(遗留的)外围图书馆使事情变得更容易得到一个UART工作…尤其是中断。看看PIC32 MX PLIB文档和如何使用PIC32 UART“玩得好”的例子。注意,在更新的MPLLABX版本中,PIC32MX PLIB显然需要作为单独的项目下载/安装。
2019-11-1 11:10:59 评论

举报

不是真的。???尝试FPLLIDEV=DIVIG2
2019-11-1 11:22:13 评论

举报

以FRCPLL为FNOSC,您的时钟频率实际上是80 MHz,而不是40。所以您的UART频率当前为19200。您用子优先级行清除了IP,它关闭了中断。因此,您可能指的是:IPC8bit.U2IS=0;然后在.(1):asm("ei")之前,必须使用该行启用内核的中断处理;最后,UART中断是一个持久中断,这意味着必须在mo中清除标志之前清除中断源。都尔要做到这一点,在清除标志之前,先读取U2RXRG寄存器。
2019-11-1 11:41:38 评论

举报

我看不出来:启用多向量中断,使JTAGConfiguring等待状态中断,使PB时钟启用缓存。
2019-11-1 11:58:30 评论

举报

谢谢大家的回复!拉里:我做了次要修正,但是你能解释一下导致你进入1920年的数学吗?不过,我已经改变了一些语法,应该是正确的。Max RubMn:多向量已经启用,我禁用JTAG。高速缓存和等待状态我理解得不够,所以需要一些时间。所有这些都让我看到这个代码://///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////agma配置FPLDIV_2//在PLL之前分割FRC(现在4MHz)\#pragma配置FPLLMUL=MUL_20//PLL倍乘(现在80MHz)\\\#pragma配置FPLLPLL_2//PLL之前分割FRC(现在4MHz)=DIV_2//DIV_2//DIV_2//分割FRDIV_2//分PLL之后(现在40MHz)///DEVDEVCFG1 G1\\\\\\\#pragma配置FSCFCFCFCFCFCFCFCFCFCFCFCFG1\\\\\\配置FSCPCPCPCP/外部的开关切换(启用)\\pragma配置POSCMOD=XT///\\\\\\\\\\\\\\\\\\\\\\\\\\2424244444444444444444程序配置POSC切换\\\\\\\\\\\\\\\\\\\\\\\\比特控制///DEVCFG0)///DEVCFG0#pragma配置DEBUG=OFF//背景调试器启用(调试器禁用)////背景调试器启用(调试器禁用)//////背景调试器启用(调试器禁用))\\\\\\\\\pragma配置ICESESESESESESESESELICS_PGESEL=ICS_PGS_PGXXPGS_PGXXXXXXXXXXx2////////////ICE/ICE/ICE/ICE/ICE/ICE/ICE/ICE/ICE/ICE/ICD命令通道选择命令通道选择(ICot Flash Write Protect bit(Protection.bled)\pragma config CP=OFF//Code Protect(Protection.bled)/\pragma config语句应该在项目文件include.//Use project enums之前而不是define for ON and OFF.include<xc.h&gt\include<stdio.h&gt\include<stdlib.h&gtinclude<sys/attribs.h>/****/void main(void){asm volatile(“di”);AD1PCFG=0xFFFFFF;U2BRG=259;//BAUD RATE 9600段40MHz DDPCONbits.JTAGEN=0;//禁用JTAG U2MODEbits.BRGH=0;//标准速度模式?16x波特时钟启用U2MODEbits.PDSEL=0b00;PDSEL=0b00;//8位数据,无奇偶U2MODE位,无奇偶校验U2MODE位。STSEL=0;//8位数据,无奇偶校验U2MODE位。STSEL=0;0//1停止位TRISF比特TRISF1=1/1停止位TRISF比特TRISFbits.TRISF5=1;TRISFFbits.TRISFbits.TRISFF5=0;IEC1bits.U2RXIE=1;IEC1bits.U2U2RXIE=1;//中断RX启用IPCX启用IPCX启用IPC8X启用IPC8X中断RX启用IPCXXISEL =0;//中断标志位被断言,而接收缓冲区不是空的(即,具有至少一个数据字符)U2STAbits.URXEN=1;//UARTx接收器被启用。UxRX管脚由UARTx(如果ON=1)U2MODEbits.ON=1;//ONIFS1位.U2RXIF=0;//清除标志INTCON比特.U2RXIF=0;//清除标志INTCONONONONON比特.MVEC=1;//多矢量TRISB比特.TRISB比特.TRISB1=0;asm volatile("ei");同时(1){}}}void_ISR_void_ISR(_UART_2_VECTOR_UART_2_VECTOR,IPL5AUTO)uart(void){TB比特{_LATB比特.LATB比特.LATB1=1;IFIFIF=1;S1位.U2RXIF=0;}
2019-11-1 12:04:50 评论

举报

您对PLL输出除法器的更改现在是正确的。早期版本是DIVIG1,所以它是80兆赫。PBCLK也是80兆赫,所以19200就是从那里来的。现在,在ISR中,在清除U2RXIF位之前,您需要读取U2RXREG。否则位将不清楚。
2019-11-1 12:23:13 评论

举报

再次感谢您的回复,我只是想打开LED知道是否中断工作。我需要阅读U2RXREG使LED打开?
2019-11-1 12:28:22 评论

举报

不,如果你不希望中断运行一次后继续火,这是唯一需要的。
2019-11-1 12:37:14 评论

举报

问题是LED没有打开,所以中断不起作用。一个问题:在视觉演播室里,我不选择握手。这样行吗?提前感谢所有的帮助
2019-11-1 12:54:52 评论

举报

嗨,首先在ISR的声明部分中声明,1/检查和标记UART.2/Read U2RXREG.3/LATBbits.LATB1=1;4/IFS1bits.U2RXIF=0;//在读缓冲区之后,最后一个命令不要使用汇编命令中断asm volatile("ei");asm volatile("di");指令CPU连续随机重启。在某处有线程详细讨论了它。在编译器中使用两个命令。在不同版本的编译器中,语法是不同的,而且是在不同的模块中声明的。对于XC32之前的编译器,1.4是:(1.34)简单地使用write:DI;EI;RI;MVI;现在我不能对编译器1.4x说确切的语法,因为我不使用它。在IN之前,不要对中断使用任何命令MVEC=1;//多矢量,此外,这必须是在开始。这将切换CPU中的所有中断逻辑和表。所描述的各个函数必须以相同的顺序声明它们!否则,将不会中断。这是我在实验中发现的.//.e-OKfunc1 isr;func2 isr;func3 isr;...func1 isr{.}func2 isr{.}func3 isr{.}//.e-BADfunc1 isr;func3 isr;...func3 isr{.}func1 isr{.}func2 isr{.}
2019-11-1 13:10:39 评论

举报

大家好,谢谢你们的回复。我考虑了你们所说的,改变了我的代码。我添加了发送部分和另一个中断胡斯托,看看它是否工作,至少它是这样的,所以UART应该是好的,但是接收器中断仍然不能工作!!!!!!!我真的不知道要改变什么!!!!!!!信息:我使用的是FT32转换器;////////////////////////////////////////////////////////////////-//y,PrasMac,FRCPLL//内部快速RC振荡器(8 MHz)W/PLL,Pracl配置,FPLLIdIV= DIVIO2//FLC,在PLL(现在为4 MHz)α-PracMA配置FPLLMUL= Mule20//PLL乘法之前。为了更多(现在80 MHz)后,PrLoLoDVI= DIVIO2/D/PLAL(现在40 MHz)//DVCFG1α-PrAPMA配置FSFOCEN=OF//次级振荡器使能(禁用)在OSCO PIN(禁用)上的信号OpCo Prima配置文件FPBDIV= DIVIO1/ /外围时钟除数(PBY-CK是SysSLCK/1)α-PrAPMA配置FFDTEN= OF//看门狗定时器启用(WDT禁用(SWDTEN位控制))//DVCFG0*PracMA配置调试=关闭/背景调试器启用(调试器禁用)ragma配置ICESEL=ICS_PGx2//ICE/ICD通信通道选择(与PGC2/PGD2共享的ICE EMUC2/EMUD2管脚)\pragma配置PWP=OFF//程序闪存写入保护(禁用)\pragma配置BWP=OFF//引导闪存写入保护位(保护禁用)\pragma配置CP=OFF//代码保护(保护)n.bled)//pragma配置语句应该在项目文件include.//Use project enums之前,而不是define for ON和OFF。include<xc.h>include<stdio.h>include<stdlib.h>include<sys/attribs.h>/***/unsigned intstatus;define DI int.=INT.bleInterrupts()\定义EI int.=INTEnable中断()\#定义RI INTRestore中断(int状态)\定义RI INTR INTRestestore中断(int状态)\#定义RI INTR INTR INTR INTR INTRestestestestestore中断()\#定义MVI INTEINININININININTR INTR INTR INTR INTR INTR INTR(int状态)\#定义MVI INTEMVI INTEinterinterINTEININININININININININININININININININININININININININININININININININININININININININININININININININTEINTEINTEIBIBIBIBIPL5AUTO)uart{void){read=U2RXREG;LATB比特.LATB1=1;IFS1比特.LATB1=1;IFS1比特.LATB1=1;IFS1比特.LATB1=1;LATB1=U2RB1=1;IFS1B1=U2RB1=1;IFS1比特=1;IFS1比特.U2RXIF=0;U2RXIF=0;U2RXIF=0;}U2RXIF=0;U2RXIF=0;0;}void_ISR_vovoid_ISR(_ISR(_CHANGNGNGNGE_NOTITI_NOTI_NOTI_矢量_矢量,IPL3AUT=0xFFFF;U2BRG=259;//BAUD速率9600段40MHzDDPCOntj.jtEng= 0;//禁用JTAUG2MODEBITS.ON=1;//ONU2MODEBITS.BRGH=0;/标准速度模式?16x波特时钟启用U2MODEbits.PDSEL=0b00;//8位数据,无奇偶U2MODE位,无奇偶,8位数据,无奇偶校验U2U2MODEbits2U2U2MODEbits.STSEL=0;//8位U2U2U2BBBBBBB2MODE位,STSEL=0;STSEL=0;//1停止比特TRIS1停止比特TRISFTRISF4=1;TRISFbits.TRISFbits.TRISF5=0.TRISFbits.TRISF5=0;IEC1bits.TRISF5=0;IEC1bits.U22RX1=0;IEC1bits.U2R2RXIE=1 xU2STAbits.URXISEL=0;//中断标志位被断言,而接收缓冲区不是空的(即,至少有一个数据字符)U2STAbits.URXEN=1;//UARTx接收器被启用。UxRX pin由UARTx控制(如果ON=1)U2STATITITS。UTXEN=1;//UARTX发射器被启用。UxTX管脚由UARTx(如果ON=1)IFS1位控制.U2RXIF=0;U2RXIF=0;U2RXIF=0;清除标志IFS1位.U2TXIF=0;EI;}voidiniinit_change(void){DI;AD1PCFG=0xFFFFFFFFFFFF;IEC1bits.CNIEIEIE=0;IE/禁用TCON位.MVEC=1;INTCONbits.MVEC=1;INTCON位.TPC=0b000;TRISD位.TRISD7=1;TRISD6=1;TRISD6=1;TRISD6=1;TRISD6=1.TRISD6=1.TRISD6=1。CNCONbits.ON=1;[启用变化通知模块]CNEN15=1;CNEN16=1;CNEN16 CNEN16 CNEN16=1;PORTD;IPC6位.CNIP=3;IPC6位.CNIP=3;IPC6位.CNIS=3;IPC6位.CNIS=2;IFS1位.CNIS=2;IFS1位.CNIFIFIFIFIF=0;IEC1位.CNIFIFIF=0;IECNIE=0;IEC1位.CNIE=1.CNIE=1.CNIE=1;1位.CNIE=1;EI;EI;}主无效(void){{init_chang{init_chang{init_change(;init_change();uart_change();uart_init_/按下按钮发送{U2TxReg='c';//发送'c'字符以查看它是否工作sButhon=0;} IITION CUTIONE();}
2019-11-1 13:22:44 评论

举报

如果你有办法这样做,如示波器或逻辑分析仪,检查以确保信号本身正在到达PIC,如果你还没有。在信号到达收发信机之前先看一下信号,确定它正在进入,之后再确定它正在离开PIC的另一边的TTL电平。在尝试调试我的中断之前,我已经被烧伤了,结果RS232收发器坏了,或者焊接得不好,并且没有把数据传入。
2019-11-1 13:35:00 评论

举报

你好,KTrenholm,谢谢你的答复,我认为这不是问题,因为我只是用这个电路到一个pic18 uart,它工作得很好。
2019-11-1 13:41:31 评论

举报

目前是晚上0.25点。只是用这个处理器,我没有工作。明天我会详细地复习一下,并给出答案。对我来说,PIC32 MX150,整个程序是用5行写的。
2019-11-1 13:52:29 评论

举报

嗨,StefiffI,谢谢你的帮助!
2019-11-1 14:08:26 评论

举报

嗨,LMF,试试这个。我没有测试过,因为我没有位置。试着从计算机发送一个字节,然后检查LED。===使用下面的语法来设置启用中断的地方不是个好主意。LATBbits.LATB1=1;这是C中的一个命令,但是是汇编语言中的几个命令。如果有中断,当执行时,得到的结果可能是不可预知的。这种类型只用于检查某物。要设置必须使用函数集、CLR、In。
2019-11-1 14:21:18 评论

举报

嗨,史蒂夫,明天我会试试你的代码。谢谢你的帮助。
2019-11-1 14:40:12 评论

举报

只有小组成员才能发言,加入小组>>

72个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /6 下一条

快速回复 返回顶部 返回列表