共2条
1/1 1 跳转至页
UART0 求救:UART0中断接收、查询发送
问
如题,小弟用UART0中断接收、查询发送,上位机软件用的是ZLG提供的EasyARM串口调试助手,本人试图从上位机发送数据,存储于接收缓存区,然后将接收到的数据发回上位机,我是根据ZLG提供的试验改的程序,但现在不能触发中断,程序如下:
uint8 UART0_Rx_Buff[8]; //定义UART0接收缓冲区
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
void IRQ_UART0_Rx_Set(void) //设置UART0中断
{
U0FCR=0x81; //使能FIFO,并设置触发深度为8字节
U0IER=0x01; //使能接收数据可用中断和接收超时中断
VICIntSelect=0x00000000; //使能所有通道为IRQ中断
VICVectCntl2=0x26; //UART0中断分配到IRQ slot2,
//优先级次与I2C和外部中断3(键盘中断)
VICVectAddr2=(int)IRQ_UART0_Rx; //设置UART0向量地址
VICIntEnable=0x00000040; //使能UART0中断
}
void UART0_SendByte(uint8 data)
{ U0THR = data; // 发送数据
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
}
void ISendBuf(void)
{
uint8 i;
for(i=0;i<8;i++)
{
UART0_SendByte(UART0_Rx_Buff[i]);//发送缓冲区
//UART0_Rx_Buff[]数据
}
while((U0LSR&0x20)==0);
}
void __irq IRQ_UART0_Rx(void)
{
uint8 i;
// if(0x04==(U0IIR&0x0F))
for(i=0;i<8;i++)
{
UART0_Rx_Buff[i]=U0RBR; //读取FIFO中的数据存储与
//缓冲区UART0_Rx_Buff[8],该操作自动清除标志位
}
ISendBuf(); //将接收到的数据发回
VICVectAddr=0x00;
}
void main(void)
{
PINSEL0 =0x800A8055;//设置引脚功能(PWM2.4.5.6;P0.15.16.30(EIN0/2/3);
PINSEL1 =0x20000402; //P0.0/1为UART0;P0.2/3为I2C有效;其他均为I/O,
UART0_Ini(); //初始化串口模式
IRQ_UART0_Rx_Set();//接收中断设置
.
.
.
.
}
程序运行中,用ZLG提供的软件发送数据30 31 32 33 34 35 36 37,不能触发中断,发14个字节也不能触发,郁闷阿,急!!!!!!!
另,在观察存储单元0xe0000c008时,显示c1,应该表示的是U0IIR的内容吧,应为U0IIR与U0FCR地址同为0xe0000c008,所以有点儿晕~~~~
还望高手指教阿~~~~~谢谢啦先!! 答 1: 顶上去难道周末大家都休息??诸位不要这么吝啬嘛~~~帮帮忙~~~~ 答 2: 通讯速率对不对啊 答 3: 通讯速率都是115200啊,通讯速率都是115200啊,而且内核IRQ中断也打开了,把原来的0xdf改成0x5f了~~~我晕了!! 答 4: 刚试了一下ZLG的例程也不行刚试了一下ZLG的例程也不行,用的是EasyARM2210的开发板,简直郁闷死了,例程不是都调试通过了的吗??ZLG公司的高手们赶紧给支个招儿啊~~~急!! 答 5: 晶振和例程的一样吗?把波特率降低一些看看 答 6: 降了晶振和例程的一样,我把波特率改成9600也不成啊~~~ 答 7: re:可以先使用ISP软件测试一下串口和开发板是否正常通讯(开发板上的ISP跳线要短接,使用串口延长线将开发板的UART0与PC串口连接)。
使用EasyARM软件时,要正确配置使用的串口及波特率、数据位数等。
答 8: 开发板可以通过UART0向PC发数据,但不能产生接收中断串口和开发板能正常通讯,因为可以通过UART0向PC发送数据。但即使用ZLG提供的历程也不能产生接收中断,实在不知如何解决阿~~~还请帮忙!! 答 9: 倒塌了~~~我可以做到海量随意收发呀~~~看例程void UartObj::Exec(void)
{
static unsigned char cData = 0;
unsigned char ch;
Status = U0->IIR & 0x0f;
switch (Status) {
case 0x06://接收线状态
switch (U0->LSR) {
case 0x63:
break;
}
break;
case 0x04://接收数据可用
case 0x0c://字符超时指示
do{
ch = U0->RBR;
if (ch == '$') {
cData = '$';
RxBuffer[RxCount ++] = ch;
}
else if(cData == '$'){
if (ch >= 0x20) {
RxBuffer[RxCount ++] = ch;
}
else if (ch == 0x0d) {
RxBuffer[RxCount ++] = ch;
}
else if (ch == 0x0a) {
// if (RxBuffer[(RxCount - 1) & 0x7f] == 0x0d) {
cData = 0;
RxBuffer[RxCount ++] = ch;
//isr_evt_set (DefBeep_1, Beep_Task);
isr_evt_set (1, Uart_Task);
// }
}
}
}while(U0->LSR & (1 << RDR));
break;
case 0x01://LPCARM保留中断,可用于软件模拟激活UART0中断
if (!(VIC->SoftInt & (1 << VICIntSel_UART0))) {//硬件UART0中断
break;//正常的UART0中断退出
}
case 0x02://THRE中断
TxBusy = TxCount != TxdCount;//保证FIFO发送全部结束时,缓冲区空不拒绝发送
for (int i = 0; (i < 16) && (TxCount != TxdCount); i ++) {//1次写入FIFO最多16个字节
ch = TxBuffer[TxdCount ++];//取出缓冲区1个字节数据
if (ch >= 0x0a) {//防止非法字符漏入
U0->THR = ch;//将缓冲区1个字节数据写入FIFO
}
}
break;
// case 0x0f://保留中断
// break;
}
}
答 10: re hotpower:大哥您千万别倒,你瞧我都这样了不还得挺直了~~~~
我现在的问题是为什么不能触发UART0中断,用ZLG光盘带的例程在EasyARM2210的开发板上都不行啊~~~~~大哥给点儿思路?? 答 11: 倒了~~~触发UART0中断只有2个办法~~~经典的是发送首个字节,非典的是用软中断触发,就像51用TI=1触发一样~~~ 答 12: 实际上串口程序是世上最好编写的程序之一~~~用以下这个小玩意,100%调试成功率~~~.想错都难~~~ 答 13: 我的建议1)首先硬件是否ok?查询法检查一遍或者示波器观察。前面买过zlg一块开发板,串口1的电平转换ic是坏的。3232的芯片损坏情况并不少见。
2)中断是否ok?如果其它中断正常,跳过。因为隐约记得程序状态寄存器CPSR有一个全局中断允许位,没有正确设置会导致所有IRQ中断不运作。我吃过亏。 答 14: 那都是"魔板"搞得鬼~~~哈哈 答 15: re 大家:其他中断都能正常触发和响应,就是串口接收中断无法触发!怀疑是串口的Tx线有问题!刚检查了电路板串口硬件连接,一块儿是自己做的,一块儿是ZLG的,板子都没问题,也检查了串口线,也没问题,现在开始怀疑是不是PC的串口有问题了~~~
对了,据说可以用ISP读PC的CPU id,不知怎么操作??哪位大虾搞过,还望不吝赐教,越详细越好,谁让咱太菜呢~~~~都让不知多少高手倒塌了~~~哭!!还得感谢大虾hotpower,小弟正在down你说的那个串口软件,再次感谢,还望继续支持!!! 答 16: re hotpower:大虾~~~不是吧,你说的那个软件我down了,“请先运行Keil uVersion,然后进入软件仿真调试状态打开串口调试窗口。将需要模拟发送的数据在本程序中输入。”???????我用的是ADS也行吗,疑问ing....... 答 17: 正常状态的PC串口各个脚是什么状态??敢问大家正常状态的PC串口各个脚是什么状态??我的PC状态如下:1脚:地;
2脚:地;3脚低电平(-9V左右);4、7脚:高电平(9V左右);5、6、8、9脚:地;
不知道这种状态是否正常~~~~
另:兄弟我找到一个软件,串口调试助手V2.2,比Hotpower大虾提供的可能更适合我一些。再用串口调试助手V2.2发送数据时,PC串口3脚无变化,这是不是意味着我的PC串口有问题啊~~~~~
各位给个建议阿,焦急阿~~~~~~~~~~~~~~~~~~~~~~~~~~~ 答 18: 谢谢大家谢谢大家,问题解决了,还是PC的串口有问题,换了台PC就ok了!
感谢大家几天来的出谋划策~~~~ 答 19: 建议用汽车人的串口通V3.20倒塌了~~~ADS~~~我眩晕~~~
uint8 UART0_Rx_Buff[8]; //定义UART0接收缓冲区
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
void IRQ_UART0_Rx_Set(void) //设置UART0中断
{
U0FCR=0x81; //使能FIFO,并设置触发深度为8字节
U0IER=0x01; //使能接收数据可用中断和接收超时中断
VICIntSelect=0x00000000; //使能所有通道为IRQ中断
VICVectCntl2=0x26; //UART0中断分配到IRQ slot2,
//优先级次与I2C和外部中断3(键盘中断)
VICVectAddr2=(int)IRQ_UART0_Rx; //设置UART0向量地址
VICIntEnable=0x00000040; //使能UART0中断
}
void UART0_SendByte(uint8 data)
{ U0THR = data; // 发送数据
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
}
void ISendBuf(void)
{
uint8 i;
for(i=0;i<8;i++)
{
UART0_SendByte(UART0_Rx_Buff[i]);//发送缓冲区
//UART0_Rx_Buff[]数据
}
while((U0LSR&0x20)==0);
}
void __irq IRQ_UART0_Rx(void)
{
uint8 i;
// if(0x04==(U0IIR&0x0F))
for(i=0;i<8;i++)
{
UART0_Rx_Buff[i]=U0RBR; //读取FIFO中的数据存储与
//缓冲区UART0_Rx_Buff[8],该操作自动清除标志位
}
ISendBuf(); //将接收到的数据发回
VICVectAddr=0x00;
}
void main(void)
{
PINSEL0 =0x800A8055;//设置引脚功能(PWM2.4.5.6;P0.15.16.30(EIN0/2/3);
PINSEL1 =0x20000402; //P0.0/1为UART0;P0.2/3为I2C有效;其他均为I/O,
UART0_Ini(); //初始化串口模式
IRQ_UART0_Rx_Set();//接收中断设置
.
.
.
.
}
程序运行中,用ZLG提供的软件发送数据30 31 32 33 34 35 36 37,不能触发中断,发14个字节也不能触发,郁闷阿,急!!!!!!!
另,在观察存储单元0xe0000c008时,显示c1,应该表示的是U0IIR的内容吧,应为U0IIR与U0FCR地址同为0xe0000c008,所以有点儿晕~~~~
还望高手指教阿~~~~~谢谢啦先!! 答 1: 顶上去难道周末大家都休息??诸位不要这么吝啬嘛~~~帮帮忙~~~~ 答 2: 通讯速率对不对啊 答 3: 通讯速率都是115200啊,通讯速率都是115200啊,而且内核IRQ中断也打开了,把原来的0xdf改成0x5f了~~~我晕了!! 答 4: 刚试了一下ZLG的例程也不行刚试了一下ZLG的例程也不行,用的是EasyARM2210的开发板,简直郁闷死了,例程不是都调试通过了的吗??ZLG公司的高手们赶紧给支个招儿啊~~~急!! 答 5: 晶振和例程的一样吗?把波特率降低一些看看 答 6: 降了晶振和例程的一样,我把波特率改成9600也不成啊~~~ 答 7: re:可以先使用ISP软件测试一下串口和开发板是否正常通讯(开发板上的ISP跳线要短接,使用串口延长线将开发板的UART0与PC串口连接)。
使用EasyARM软件时,要正确配置使用的串口及波特率、数据位数等。
答 8: 开发板可以通过UART0向PC发数据,但不能产生接收中断串口和开发板能正常通讯,因为可以通过UART0向PC发送数据。但即使用ZLG提供的历程也不能产生接收中断,实在不知如何解决阿~~~还请帮忙!! 答 9: 倒塌了~~~我可以做到海量随意收发呀~~~看例程void UartObj::Exec(void)
{
static unsigned char cData = 0;
unsigned char ch;
Status = U0->IIR & 0x0f;
switch (Status) {
case 0x06://接收线状态
switch (U0->LSR) {
case 0x63:
break;
}
break;
case 0x04://接收数据可用
case 0x0c://字符超时指示
do{
ch = U0->RBR;
if (ch == '$') {
cData = '$';
RxBuffer[RxCount ++] = ch;
}
else if(cData == '$'){
if (ch >= 0x20) {
RxBuffer[RxCount ++] = ch;
}
else if (ch == 0x0d) {
RxBuffer[RxCount ++] = ch;
}
else if (ch == 0x0a) {
// if (RxBuffer[(RxCount - 1) & 0x7f] == 0x0d) {
cData = 0;
RxBuffer[RxCount ++] = ch;
//isr_evt_set (DefBeep_1, Beep_Task);
isr_evt_set (1, Uart_Task);
// }
}
}
}while(U0->LSR & (1 << RDR));
break;
case 0x01://LPCARM保留中断,可用于软件模拟激活UART0中断
if (!(VIC->SoftInt & (1 << VICIntSel_UART0))) {//硬件UART0中断
break;//正常的UART0中断退出
}
case 0x02://THRE中断
TxBusy = TxCount != TxdCount;//保证FIFO发送全部结束时,缓冲区空不拒绝发送
for (int i = 0; (i < 16) && (TxCount != TxdCount); i ++) {//1次写入FIFO最多16个字节
ch = TxBuffer[TxdCount ++];//取出缓冲区1个字节数据
if (ch >= 0x0a) {//防止非法字符漏入
U0->THR = ch;//将缓冲区1个字节数据写入FIFO
}
}
break;
// case 0x0f://保留中断
// break;
}
}
答 10: re hotpower:大哥您千万别倒,你瞧我都这样了不还得挺直了~~~~
我现在的问题是为什么不能触发UART0中断,用ZLG光盘带的例程在EasyARM2210的开发板上都不行啊~~~~~大哥给点儿思路?? 答 11: 倒了~~~触发UART0中断只有2个办法~~~经典的是发送首个字节,非典的是用软中断触发,就像51用TI=1触发一样~~~ 答 12: 实际上串口程序是世上最好编写的程序之一~~~用以下这个小玩意,100%调试成功率~~~.想错都难~~~ 答 13: 我的建议1)首先硬件是否ok?查询法检查一遍或者示波器观察。前面买过zlg一块开发板,串口1的电平转换ic是坏的。3232的芯片损坏情况并不少见。
2)中断是否ok?如果其它中断正常,跳过。因为隐约记得程序状态寄存器CPSR有一个全局中断允许位,没有正确设置会导致所有IRQ中断不运作。我吃过亏。 答 14: 那都是"魔板"搞得鬼~~~哈哈 答 15: re 大家:其他中断都能正常触发和响应,就是串口接收中断无法触发!怀疑是串口的Tx线有问题!刚检查了电路板串口硬件连接,一块儿是自己做的,一块儿是ZLG的,板子都没问题,也检查了串口线,也没问题,现在开始怀疑是不是PC的串口有问题了~~~
对了,据说可以用ISP读PC的CPU id,不知怎么操作??哪位大虾搞过,还望不吝赐教,越详细越好,谁让咱太菜呢~~~~都让不知多少高手倒塌了~~~哭!!还得感谢大虾hotpower,小弟正在down你说的那个串口软件,再次感谢,还望继续支持!!! 答 16: re hotpower:大虾~~~不是吧,你说的那个软件我down了,“请先运行Keil uVersion,然后进入软件仿真调试状态打开串口调试窗口。将需要模拟发送的数据在本程序中输入。”???????我用的是ADS也行吗,疑问ing....... 答 17: 正常状态的PC串口各个脚是什么状态??敢问大家正常状态的PC串口各个脚是什么状态??我的PC状态如下:1脚:地;
2脚:地;3脚低电平(-9V左右);4、7脚:高电平(9V左右);5、6、8、9脚:地;
不知道这种状态是否正常~~~~
另:兄弟我找到一个软件,串口调试助手V2.2,比Hotpower大虾提供的可能更适合我一些。再用串口调试助手V2.2发送数据时,PC串口3脚无变化,这是不是意味着我的PC串口有问题啊~~~~~
各位给个建议阿,焦急阿~~~~~~~~~~~~~~~~~~~~~~~~~~~ 答 18: 谢谢大家谢谢大家,问题解决了,还是PC的串口有问题,换了台PC就ok了!
感谢大家几天来的出谋划策~~~~ 答 19: 建议用汽车人的串口通V3.20倒塌了~~~ADS~~~我眩晕~~~
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |