MSP430的USART串口通信中断和ADC12转换中断设置顺序影响吗

yqs09 2011-06-09 09:58:20
最近做作业时遇到一个问题,USART_INIT()函数初始化USART0,将会接收从PC机的串口中发送字符。ADC12_INIT()初始化模数转换。调程序时发现,把ADC12_INIT()放在USART_INIT()前时,串口中断将不会发生,中断标志都不会置位。但如果把两个初始化函数换一个顺序则能正常进行,求解释
...全文
247 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yqs09 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jq_whh 的回复:]

两个中断设置的区别是,USART_INIT()需要在关闭中断的情况下设置,ADC12_INIT()则不必,你再看看手册,时间有点长了,我不管确定。
[/Quote]
上面是两个函数具体内容,程序结构如下,麻烦看一看
_DINT();
USART_INIT();
ADC12_INIT();
_EINT();
yqs09 2011-06-10
  • 打赏
  • 举报
回复
void ADC12_INIT()
{
P6SEL_bit.P6SEL_0 = 1;
P6DIR_bit.P6DIR_0 = 0; //设置温度输入引脚P6.0
P6SEL_bit.P6SEL_6 = 1;
P6DIR_bit.P6DIR_6 = 0; //设置A相电流信号输入引脚P6.6
ADC12CTL0_bit.ADC12ON = 1; //给ADC12内核供电
ADC12CTL0_bit.MSC = 1;
ADC12CTL1_bit.SHP = 1; //采样定时器方式
ADC12CTL1_bit.CONSEQ = 1; //选择通道序列单次
ADC12CTL1_bit.CSTARTADD = 0; //选择通道0为起始通道
ADC12MCTL0_bit.INCH = 0; //通道0选择A0为输入信号源
ADC12MCTL1_bit.INCH = 6; //通道1选择A6为输入信号源
ADC12MCTL1_bit.EOS = 1; //选择通道1为通道序列末尾
ADC12IE = 2; //允许通道1中断
ADC12IFG = 0; //清除中断标志
ADC12CTL0_bit.ENC = 1; //允许转换
}
yqs09 2011-06-10
  • 打赏
  • 举报
回复
void USART_INIT()
{
U0CTL_bit.SWRST = 1; //软件复位
P3SEL_bit.P3SEL_4 = 1;
P3SEL_bit.P3SEL_5 = 1;
U0CTL_bit.SYNC = 0; //异步通信方式
U0CTL_bit.CHAR = 1; //数据位长度为8位
U0CTL_bit.PENA = 0; //无奇偶校验
U0TCTL_bit.SSEL1 = 1; //选择SMCLK为时钟源
U0BR1 = 0x03;
U0BR0 = 0x41;
U0MCTL = 0x11; //设置波特率为9600bps
ME1_bit.UTXE0 = 1; //模块选择发送控制
ME1_bit.URXE0 = 1; //模块选择接受控制
U0CTL_bit.SWRST = 0;
IE1_bit.URXIE0 = 1; //接受中断使能
IFG1_bit.URXIFG0 = 0; //清空中断标志
}
AnYidan 2011-06-10
  • 打赏
  • 举报
回复
跟踪一下相关的 register 内容
lbing7 2011-06-10
  • 打赏
  • 举报
回复
用过430,没发现这样的问题

呵呵。按里说,外设先初始化谁并没有逻辑上的先后关系
jq_whh 2011-06-10
  • 打赏
  • 举报
回复
两个中断设置的区别是,USART_INIT()需要在关闭中断的情况下设置,ADC12_INIT()则不必,你再看看手册,时间有点长了,我不管确定。
yqs09 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jq_whh 的回复:]

我就不看你的代码了,下面是我一直在用的代码
C/C++ code

void ADC12_init( void )
{
ADC12CTL0 = 0;
ADC12CTL1 = SHP + // Extended sample mode
SHS_0 + // ADC12SC is sampling star……
[/Quote]
其实我只是想知道原因,代码都测试好了。不过你的代码确实不错,多谢。
jq_whh 2011-06-10
  • 打赏
  • 举报
回复
我就不看你的代码了,下面是我一直在用的代码

void ADC12_init( void )
{
ADC12CTL0 = 0;
ADC12CTL1 = SHP + // Extended sample mode
SHS_0 + // ADC12SC is sampling start source
//ADC12SSEL_2 + // MCLK
CONSEQ_1;// + // Sequence of channels conversion
//ADC12DIV_4; // Clock Divider

ADC12MCTL0 = SREF_1 +
INCH_3; // 选择通道A1 A2
ADC12MCTL1 = SREF_1 +
EOS + // 最后一个通道
INCH_4; // 选择通道A1 A2

ADC12CTL0 = ADC12ON + // 允许转换功能
REFON + // 打开片上参考电压源
SHT0_4 + // 1024 cycles in sampling period
REF2_5V; // 2.5V reference
ADC12CTL0 |= ENC; // Conversion enabled

ADC12IE = 0x0002; // 允许中断

}



#if oscilator==8
// 8.0MHz
const char br_table[] = {0x0a,0x1a,0x5b, 0x05,0x0d,0x92, 0x82,0x06,0x5b, 0x41,0x03,0x49, 0xa0,0x01,0x5b, 0xd0,0x00,0x49, 0x8a,0x00,0x7f };
#endif

void init_USART0(char bps)
{
U0CTL |= SWRST;
U0CTL |= CHAR;// + SPB;// + LISTEN; // 8 N 2
U0TCTL = SSEL0;// + SSEL1; // UCLK = SMCLK

baudrate = bps;
bps = (bps-1)*3;
U0BR0 = br_table[bps++];
U0BR1 = br_table[bps++];
U0MCTL = br_table[bps];

ME1 = URXE0 + UTXE0; // 允许发送和接收
U0CTL -= SWRST;
IE1 |= URXIE0 + UTXIE0; // 使能 USART0 RX 中断
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
P3DIR |= 0x10; // P3.4 为输出
P3OUT |= 0x30;
}

jq_whh 2011-06-10
  • 打赏
  • 举报
回复

void ADC12_init( void )

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧