UART6接收中断问题
UART6 接收中断后,用IAR观察器检测接受中断标志没有置1,并且在中断函数里给全局变量复制,出中断函数后全局变量变为0,为什么? 你是在中断函数里看的吧?进中断函数后可能IF位已经清零了.全局变量是不是被优化掉了? 应该是没有配置选项字节,没有设置看门狗或“喂狗”,程序被看门狗复位了 是没有设置看门狗,但是同样的情况在AD中断函数中不存在。我把代码给大家贴上,大家帮我看看。谢谢!
#include "io78f0453.h"
#include "nec78f0xb.h"
#include <intrinsics.h>
#include "UART6_intal.h"
void UART6_inital(void);
void Clock_inital(void);
__interrupt void INTSR6_jieshou( void );
unsigned char jieshou_tem;
unsigned char jieshou_flag=0; //----------------接受完毕标志
unsigned char reciv_tem;//-------------------接受缓冲全局变量数组
float k=5;//------------------------------接受缓冲计数全局变量
// unsigned char a=0;
void main( void )
{
// unsigned char i;
unsigned int j;
Clock_inital();//---------------时钟模块初始话
UART6_inital();//---------------UART6初始化,波特率19200
__enable_interrupt();//---------中断使能
while(1)
{
if( jieshou_flag==1)//--------判断数据是否接受完毕
{
TXB6=jieshou_tem; //--------发送数据
for(j=0;j<600;j++);
jieshou_flag=0;//-------------发送完毕,接受标志清零
}
}
}
void UART6_inital(void)
{
/* |------|------|------|------|------|------|------|------|*
|7 |6 |5 |4 |3 | 2|1 |0 |
ASIM6 |------|------|------|------|------|------|------|------|
|POWER6|TXE6|RXE6|PS61|PS60| CL6|SL6 |ISRM6 |
|------|------|------|------|------|------|------|------|*/
POWER6=1;//-----------POWER6=0:禁止内部操作时钟操作POWER6=1:允许内部操作时钟操作
TXE6=1;//-----------TXE6=0:禁止发送,TXE6=1:允许发送
RXE6=1;//-----------RXE6=0:禁止接受,REX6=1:允许接受
PS61=0;//-----------| PS61 | PS60 |
PS60=1;//-----------|0 |0 |:发送不输出校验位,接收无校验接受
//-----------|0 |1 |:发送输出零校验,接收按零校验接受
//-----------|1 |0 |:发送输出奇校验,接收按奇校验判断
//-----------|1 |1 |:发送输出偶校验,接收按偶校验判断
CL6=1; //-----------CL6=0传输数据的字符宽度为7位,CL6=1传输数据的字符宽度为8位
SL6=0; //-----------SL6=0发送数据停止位个数为1位,SL6=1:发送数据停止位个数为2位
ISRM6=1; //-----------ISRM6=0:出错时产生INTSRE6,ISRM6=1:出错时产生INTSR6
SBRF6=1;
SBRT6=0;
/* |------|------|------|------|------|------|------|------|*
|7 |6 |5 |4 |3 | 2|1 |0 |
ISC |------|------|------|------|------|------|------|------|
| 0|0 |ISC5|ISC4 |ISC3| ISC2 |ISC1|ISC0|
|------|------|------|------|------|------|------|------|*/
ISC5=1;//-------------|ISC5|ISC4|
ISC4=0;//-------------| 0| 0|:输入源选择TXD6-P112,RXD6-P113
//-------------| 1| 0|:输入源选择TXD6-P13,RXD6-P12
ISC3=0;//-------------ISC3=0:RXD6/113输入禁止,ISC3=1:RXD6/P113输入允许
ISC2=0;//-------------ISC2=0:不允许控制TI52输入(P34)ISC2=1:允许控制TI52输入(P34)
ISC1=0;//-------------TI000=0输入源选择P33,TI000=1输入源选择RXD6(P12或P113)
ISC0=0;//-------------ISC0=0:INTP0输入源选择为INTP0(P120),ISC0=1:INTP0输入源选择为RXD6(P12或P113)
PF13=1;//-------------USRT6的输出选择P13
PM13=0;//-------------选择P13为TXD6
PM12=1;//-------------选择P12为RXD6
P13=1; //-----------预置P13为1
CKSR6=0X03;//---------选择串口基本时钟fxclk6为fPRS/8
BRGC6=0x1a;//---------设置分频系数k为52,波特率为9600
SRMK6=0;//------------SRMK6=0,打开UART6接收中断,SRMK6=1,屏蔽UART6接收中断
STMK6=1;//------------STMK6=0;打开UART6发送中断, STMK6=1,屏蔽UART6发送中断
}
void Clock_inital(void)
{
// AMPH=0;//---------------------------AMPH
//---------------------------| 0 |主系统时钟小于10MHz
//---------------------------| 1 |主系统时钟大于10MHz小于20MHz
EXCLK=0;//----------- |EXCLK|OSCSEL|
OSCSEL=0;//---------|0| 0|:X1振荡器停止
//---------|0| 1|:X1振荡器运行,引脚接晶振
//---------|1| 0|:X1振荡器停止,引脚为IO
//---------|1| 1|:外部时钟输入模式,引脚P121为IO,P122为外部时钟输入
// XTSTART=0;//----------|XTSTART|EXCLKS|OSCSELS|
// EXCLKS=0;//-----------|0|0|0|:XT1副系统时钟关闭,连接引脚为IO
// OSCSELS=0;//----------|0|0|1|:XT1副系统时钟振荡,引脚连接32768Hz晶振
//----------|0|1|0|:XT1副系统时钟关闭,引脚为IO
//----------|0|1|1|:XT1副系统时钟为外部时钟输入模式P123为IO ,P124为外部时钟输入引脚
//----------|1|*|*|:XT1副系统时钟振荡,引脚连接32768晶振
CLS=0;//--------------CLS=0:选择CPU时钟为主系统时钟,CSL=1:选择CPU时钟为副系统时钟
CSS=1;//--------------| CSS | PCC2 | PCC1 | PCC0 |
PCC2=0;//-------------|0| 0|0 |0 |:CPU时钟选择为fxp
PCC1=0;//-------------|0| 0|0 |1 |:CPU时钟选择为fxp/2
PCC0=0;//-------------|0| 0|1 |0 |:CPU时钟选择为fxp/4
//-------------|0| 0|1 |1 |:CPU时钟选择为fxp/8
//-------------|0| 1|0 |0 |:CPU时钟选择为fxp/16
//-------------|1| 0|0 |0 |:CPU时钟选择为fsub/2
RSTS=0;//-------------RSTS=0:内部高速振荡器为精确稳定,RSTS=1:内部高速振荡器为稳定工作
LSRSTOP=1;//----------LSRSTOP=0:内部低速振荡器运行,LSRSTOP=1:内部低速振荡器停止运行
RSTOP=0;//------------RSTOP=0内部高速振荡器振荡,RSTOP=1:内部高速振荡器停止
MSTOP=1;//------------MSTOP=0:外部高速振荡器X1振荡,MSTOP=1:外部高速振荡器X1停止
MCS=0; //-------------MCS=0:主系统时钟选择为内部高速振荡器,MCS=1主系统时钟使用外部高速振荡时钟
XSEL=0;//-------------|XSEL|MCM0|
MCM0=0;//-------------| 0|0 |:主系统时钟fxp和外部硬件时钟fprs选择为内部高速振荡时钟frh
//-------------| 0|1 |:主系统时钟fxp和外部硬件时钟fprs选择为内部高速振荡时钟frh
//-------------| 1|0 |:主系统时钟fxp和选择为内部高速振荡时钟frh,外部硬件时钟fprs选择为fxh
//-------------| 1|1 |:主系统时钟fxp和外部硬件时钟fprs选择为高速系统时钟fxh
//---------------------------时钟fPRS选择为内部高速振荡
//---------------------------时钟fRH
}
#pragma vector = INTSR6_vect
__interrupt void INTSR6_jieshou( void )
{
k=65;
SRIF6=0;
jieshou_flag=1;
jieshou_tem=RXB6;
} #include "nec78f0xb.h" 头文件是原头文件里没定义的选项
/*----------------------------------------------
* SFR bits (default names)
*--------------------------------------------*/
#ifndef __78K_BIT_STRUCTURE__
#define __78K_BIT_STRUCTURE__
typedef struct
{
unsigned char no0:1;
unsigned char no1:1;
unsigned char no2:1;
unsigned char no3:1;
unsigned char no4:1;
unsigned char no5:1;
unsigned char no6:1;
unsigned char no7:1;
} __BITS8;
#endif
#define P00 P0_bit.no0
#define P01 P0_bit.no1
#define P02 P0_bit.no2
#define P03 P0_bit.no3
#define P04 P0_bit.no4
#define P06 P0_bit.no6
#define P07 P0_bit.no7
#define PM00 PM0_bit.no0
#define PM01 PM0_bit.no1
#define PM02 PM0_bit.no2
#define PM03 PM0_bit.no3
#define PM04 PM0_bit.no4
#define PM05 PM0_bit.no5
#define PM06 PM0_bit.no6
#define PM07 PM0_bit.no7
#define P10 P1_bit.no0
#define P11 P1_bit.no1
#define P12 P1_bit.no2
#define P13 P1_bit.no3
#define P14 P1_bit.no4
#define P16 P1_bit.no6
#define P17 P1_bit.no7
#define PM10 PM1_bit.no0
#define PM11 PM1_bit.no1
#define PM12 PM1_bit.no2
#define PM13 PM1_bit.no3
#define PM14 PM1_bit.no4
#define PM15 PM1_bit.no5
#define PM16 PM1_bit.no6
#define PM17 PM1_bit.no7
#define P20 P2_bit.no0
#define P21 P2_bit.no1
#define P22 P2_bit.no2
#define P23 P2_bit.no3
#define P24 P2_bit.no4
#define P26 P2_bit.no6
#define P27 P2_bit.no7
#define PM20 PM2_bit.no0
#define PM21 PM2_bit.no1
#define PM22 PM2_bit.no2
#define PM23 PM2_bit.no3
#define PM24 PM2_bit.no4
#define PM25 PM2_bit.no5
#define PM26 PM2_bit.no6
#define PM27 PM2_bit.no7
#define P30 P3_bit.no0
#define P31 P3_bit.no1
#define P32 P3_bit.no2
#define P33 P3_bit.no3
#define P34 P3_bit.no4
#define P36 P3_bit.no6
#define P37 P3_bit.no7
#define PM30 PM3_bit.no0
#define PM31 PM3_bit.no1
#define PM32 PM3_bit.no2
#define PM33 PM3_bit.no3
#define PM34 PM3_bit.no4
#define PM35 PM3_bit.no5
#define PM36 PM3_bit.no6
#define PM37 PM3_bit.no7
#define P40 P4_bit.no0
#define P41 P4_bit.no1
#define P42 P4_bit.no2
#define P43 P4_bit.no3
#define P44 P4_bit.no4
#define P46 P4_bit.no6
#define P47 P4_bit.no7
#define PM40 PM4_bit.no0
#define PM41 PM4_bit.no1
#define PM42 PM4_bit.no2
#define PM43 PM4_bit.no3
#define PM44 PM4_bit.no4
#define PM45 PM4_bit.no5
#define PM46 PM4_bit.no6
#define PM47 PM4_bit.no7
#define P60 P6_bit.no0
#define P61 P6_bit.no1
#define P62 P6_bit.no2
#define P63 P6_bit.no3
#define P64 P6_bit.no4
#define P66 P6_bit.no6
#define P67 P6_bit.no7
#define PM60 PM6_bit.no0
#define PM61 PM6_bit.no1
#define PM62 PM6_bit.no2
#define PM63 PM6_bit.no3
#define PM64 PM6_bit.no4
#define PM65 PM6_bit.no5
#define PM66 PM6_bit.no6
#define PM67 PM6_bit.no7
#define P70 P7_bit.no0
#define P71 P7_bit.no1
#define P72 P7_bit.no2
#define P73 P7_bit.no3
#define P74 P7_bit.no4
#define P76 P7_bit.no6
#define P77 P7_bit.no7
#define PM70 PM7_bit.no0
#define PM71 PM7_bit.no1
#define PM72 PM7_bit.no2
#define PM73 PM7_bit.no3
#define PM74 PM7_bit.no4
#define PM75 PM7_bit.no5
#define PM76 PM7_bit.no6
#define PM77 PM7_bit.no7
#define P80 P8_bit.no0
#define P81 P8_bit.no1
#define P82 P8_bit.no2
#define P83 P8_bit.no3
#define P84 P8_bit.no4
#define P86 P8_bit.no6
#define P87 P8_bit.no7
#define PM80 PM8_bit.no0
#define PM81 PM8_bit.no1
#define PM82 PM8_bit.no2
#define PM83 PM8_bit.no3
#define PM84 PM8_bit.no4
#define PM85 PM8_bit.no5
#define PM86 PM8_bit.no6
#define PM87 PM8_bit.no7
#define PM110 PM11_bit.no0
#define PM111 PM11_bit.no1
#define PM112 PM11_bit.no2
#define PM113 PM11_bit.no3
//////////16位定时器控制寄存器位定义//////////
/*********16位定时器模式控制寄存器TMC00位补充定义********/
#define TMC001 TMC00_bit.no1
#define TMC002 TMC00_bit.no2
#define TMC003 TMC00_bit.no3
/*********16位定时器捕捉/比较控制寄存器CRC00位补充定义********/
/* |-----|------|------|------|------|------|------|------|*
|7|6 |5 |4 |3 | 2|1 |0 |
CRC00 |-----|------|------|------|------|------|------|------|
|0| 0| 0| 0| 0|CRC002|CRC001|CRC000|
|-----|------|------|------|------|------|------|------|*/
#define CRC000 CRC00_bit.no0
#define CRC001 CRC00_bit.no1
#define CRC002 CRC00_bit.no2
/****************16位定时器输出控制寄存器00(TOC00)位补充定义*************/
/*|-----|------|------|------|------|-----|------|------|*
|7|6 |5 |4 |3 |2|1 |0 |
TOC00 |-----|------|------|------|------|-----|------|------|
|0|OSPT00|OSPE00|TOC004|LVS00 |LVR00|TOC001|TOE00 |
|-----|------|------|------|------|-----|------|------|*/
#define TOC001 TOC00_bit.no1
#define TOC004 TOC00_bit.no4
/*************************预分频器模式寄存器00(PRM00)位补充定义*************/
/* |-----|-----|-----|-----|-----|-----|------|------|*
|7|6|5|4|3|2|1 |0 |
PRM00 |-----|-----|-----|-----|-----|-----|------|------|
|ES101|ES100|ES001|ES000|0|0|PRM001|PRM000|
|-----|-----|-----|-----|-----|-----|------|------|*/
#define PRM000PRM00_bit.no0
#define PRM001PRM00_bit.no1
#define ES000 PRM00_bit.no4
#define ES001 PRM00_bit.no5
#define ES100 PRM00_bit.no6
#define ES101 PRM00_bit.no7
/* |-----|------|------|------|------|------|------|------|*
|7|6 |5 |4 |3 | 2|1 |0 |
TMC50 |-----|------|------|------|------|------|------|------|
|TCE50|TMC506| 0| 0|LVS50 |LVR50 |TMC501|TOE50 |
|-----|------|------|------|------|------|------|------|*/
#define TMC501 TMC50_bit.no1
#define TMC506 TMC50_bit.no6
/* |-----|------|------|------|------|------|------|------|*
|7|6 |5 |4 |3 | 2|1 |0 |
TMC51 |-----|------|------|------|------|------|------|------|
|TCE51|TMC516| 0| 0|LVS51 |LVR51 |TMC511|TOE51 |
|-----|------|------|------|------|------|------|------|*/
#define TMC511 TMC51_bit.no1
#define TMC516 TMC51_bit.no6
/* |-----|------|------|------|------|------|------|------|*
|7|6 |5 |4 |3 | 2|1 |0 |
TCL50 |-----|------|------|------|------|------|------|------|
|0 | 0| 0| 0| 0 TCL502|TCL501|TCL500|
|-----|------|------|------|------|------|------|------|*/
#define TCL502 TCL50_bit.no2
#define TCL501 TCL50_bit.no1
#define TCL500 TCL50_bit.no0
/* |-----|------|------|------|------|------|------|------|*
|7|6 |5 |4 |3 | 2|1 |0 |
TCL51 |-----|------|------|------|------|------|------|------|
|0 | 0| 0| 0| 0 TCL512|TCL511|TCL510|
|-----|------|------|------|------|------|------|------|*/
#define TCL512 TCL51_bit.no2
#define TCL511 TCL51_bit.no1
#define TCL510 TCL51_bit.no0
//UART6
/* |------|------|------|------|------|------|------|------|*
|7 |6 |5 |4 |3 | 2|1 |0 |
ASIM6 |------|------|------|------|------|------|------|------|
|POWER6|TXE6|RXE6|PS61|PS60| CL6|SL6 |ISRM6 |
|------|------|------|------|------|------|------|------|*/
#define ISRM6; ASIM6_bit.no0
#define SL6; ASIM6_bit.no1
#define CL6; ASIM6_bit.no2
#define PS60; ASIM6_bit.no3
#define PS61; ASIM6_bit.no4
#define RXE6 ASIM6_bit.no5
/* |------|------|------|------|------|------|------|------|*
|7 |6 |5 |4 |3 | 2|1 |0 |
ISC |------|------|------|------|------|------|------|------|
| 0|0 |ISC5|ISC4 |ISC3| ISC2 |ISC1|ISC0|
|------|------|------|------|------|------|------|------|*/
#define ISC0 ISC_bit.no0
#define ISC1 ISC_bit.no1
#define ISC2 ISC_bit.no2
#define ISC3 ISC_bit.no3
#define ISC4 ISC_bit.no4
#define ISC5 ISC_bit.no5
/* |------|------|------|------|------|------|------|------|*
|7 |6 |5 |4 |3 | 2|1 |0 |
PF1 |------|------|------|------|------|------|------|------|
| 0|0 |0 |0 |PF13| 0 |0 |0 |
|------|------|------|------|------|------|------|------| 适用于0453以下芯片*/
#define PF13 PF1_bit.no3
//CLOCK
/* |------|------|------|-------|------|------|------|------|*
|7 |6 |5 |4 |3 | 2|1 |0 |
OSCCTL |------|------|------|-------|------|------|------|------|
|EXCLK |OSCSEL|EXCLKS|OSCSELS| 0 |0 |0 |AMPH|
|------|------|------|-------|------|------|------|------| 适用于0453以不含EXCLKS和AMPH*/
#define AMPH OSCCTL_bit.no0
#define EXCLKS OSCCTL_bit.no5
/* |------|-------|------|-------|------|------|------|------|*
|7 |6 |5 |4 |3 | 2|1 |0 |
PCC |------|-------|------|-------|------|------|------|------|
|0 |XTSTART|CLS |CSS| 0 | PCC2 | PCC1 | PCC0 |
|------|-------|------|-------|------|------|------|------| 适用于0453以不含XTSTART*/
#define PCC0 PCC_bit.no0
#define PCC1 PCC_bit.no1
#define PCC2 PCC_bit.no2
#define XTSTART PCC_bit.no6 大家可以把上面的代码贴在自己的系统下试一下,编译器是IAR。 初步判断就有没有设置选项字节的原因,AD中断没有出问题原因有可能是由于AD一次的时间很短,虽然在复位但是又不停地在AD所以看不出来,对于上面的程序有仿真器的话可以看看复位标志。
在主函数前添加这样两行语句
#pragma location = "OPTBYTE"
__root const unsigned char option_bytes[]={0x6E,0x01,0x00,0x00};
关闭看门狗,在试一下。 问题解决了,是狗没关的问题。谢谢! 请问zhouli3339926老兄,有没有IAR for NEC的中文资料,给我发一个?好多关于软件的操作都不清楚!我的邮箱是n_q1998@126.com
谢谢! IAR 的安装目录里面自带有英文的实用说明手册,目前还没有中文的资料。 楼3兄弟:
我是想设置9600bps用业UART6通信,也是和你的那样设置:
CKSR6=0X03;//---------选择串口基本时钟fxclk6为fPRS/8
BRGC6=0x1a;
为什么我的不能通信啊?但是我的1200bps,2400bps,4800bps,是可以能通信的。请你帮忙解决一下,谢谢啊! 我用楼主的程序,可以跑起来,但是出现一个奇怪的现象。。。。
昨天晚上测试的时候我输入hello,串口输出hello
今天我输入hello,输出只有一个h
即一次只能输出一个字符了,昨天可以一次输出一个字符段。
哪位可以解释一下呢。
谢谢。。。。。。。。。。。。。。。。。。。。。。。。。。
页:
[1]