为什么我的msp430f5438a原理图 ADC12 采样出来的结果老是0XFFF

21ic官方微信
后使用快捷导航没有帐号?
查看: 1437|回复: 5
MSP430F5438A内部AD问题
&&已结帖(20)
主题帖子积分
实习生, 积分 12, 距离下一级还需 38 积分
实习生, 积分 12, 距离下一级还需 38 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
实习生, 积分 12, 距离下一级还需 38 积分
实习生, 积分 12, 距离下一级还需 38 积分
是用内部AD采样,参考电压用内部参考电压2.0V& &
//P6口,P6.4~7 (A4~A7) 4-20mA电流 采集输入
&&P6SEL = 0XF0;
&&P6DIR = 0X00;
&&P6OUT = 0;
///////////
REFCTL0 = REFON + REFTCOFF + REFMSTR + REFVSEL_1;
ADC12CTL0 = ADC12SHT0_2 + ADC12MSC + ADC12ON;
ADC12CTL1 = ADC12CSTARTADD_4+ ADC12SHP + ADC12CONSEQ_3;
ADC12CTL2 = ADC12RES_2;
现在问题是为什么没有加任何电压的情况下,A4~A7引脚上有1.4V-1.5V电压,请教高手帮忙解答一下啊,
另外,硬件电路因为是采样电路与主电路分开的,所以现在调试的时候A4~A7引脚是悬空的,请问引脚悬空是否会产生1.4~1.5V的电压?先谢谢了……
主题帖子积分
高级工程师, 积分 7761, 距离下一级还需 239 积分
高级工程师, 积分 7761, 距离下一级还需 239 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:20.00
主题帖子积分
高级工程师, 积分 7761, 距离下一级还需 239 积分
高级工程师, 积分 7761, 距离下一级还需 239 积分
空载电流?
主题帖子积分
资深工程师, 积分 14402, 距离下一级还需 5598 积分
资深工程师, 积分 14402, 距离下一级还需 5598 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
资深工程师, 积分 14402, 距离下一级还需 5598 积分
资深工程师, 积分 14402, 距离下一级还需 5598 积分
没有加任何电压的情况下确实有可能是空载的原因,你先加上一个确定的电压试试
暗恋失败,分手未遂,入赘无果,破保险套!!!
主题帖子积分
资深工程师, 积分 10472, 距离下一级还需 9528 积分
资深工程师, 积分 10472, 距离下一级还需 9528 积分
主题帖子积分
专家等级:结帖率:66%打赏:0.00受赏:15.00
主题帖子积分
资深工程师, 积分 10472, 距离下一级还需 9528 积分
资深工程师, 积分 10472, 距离下一级还需 9528 积分
这个是单片机系统默认的电平状态的,在你没有用的时候,该电平状态是单片机给的
主题帖子积分
初级技术员, 积分 84, 距离下一级还需 16 积分
初级技术员, 积分 84, 距离下一级还需 16 积分
主题帖子积分
专家等级:结帖率:83%
主题帖子积分
初级技术员, 积分 84, 距离下一级还需 16 积分
初级技术员, 积分 84, 距离下一级还需 16 积分
内部有2v参考电压?
本帖子中包含更多资源
才可以下载或查看,没有帐号?
主题帖子积分
助理工程师, 积分 1073, 距离下一级还需 927 积分
助理工程师, 积分 1073, 距离下一级还需 927 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
助理工程师, 积分 1073, 距离下一级还需 927 积分
助理工程师, 积分 1073, 距离下一级还需 927 积分
5438A 中不支持 ADC12 使用 REFMSTR=1模式。 如下图 但是在程序中使用REFMSTR=1模式也能得到正确的电压值 不知道为什么?
本帖子中包含更多资源
才可以下载或查看,没有帐号?
技术新星奖章
人才类勋章
技术高手奖章
人才类勋章
沉静之湖泊
发帖类勋章
突出贡献奖章
等级类勋章
时间类勋章
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
湍急之河流
发帖类勋章
时间类勋章
技术奇才奖章
人才类勋章
时间类勋章
欢快之小溪
发帖类勋章
社区建设奖章
等级类勋章后使用快捷导航没有帐号?
查看: 126|回复: 0
msp430FR6972通过串口引导升级应用程序后,发现应用程序中的ADC采样中断触发失效
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
最近在做msp430FR6972的远程升级,目前情况如下:
我做了一个引导程序,引导程序内容只是通过扫描串口数据来接收应用程序的代码,然后实现升级;更改.xcl配置文件,引导程序代码存储在4400~4FFF,中断向量:FF80~FFFF。
应用程序的.xcl文件配置更改为:代码区域在4500~EFFF,虚拟向量:FE80~FEFF。
相关向量映射代码如下:
// 描述: 中断向量列表
#pragma vector=0
__interrupt void intec_0(void)
asm(& br &0xFE80;&);
#pragma vector=2
__interrupt void intec_1(void)
asm(& br &0xFE82;&);
#pragma vector=4
__interrupt void intec_2(void)
asm(& br &0xFE84;&);
#pragma vector=6
__interrupt void intec_3(void)
asm(& br &0xFE86;&);
#pragma vector=8
__interrupt void intec_4(void)
asm(& br &0xFE88;&);
#pragma vector=10
__interrupt void intec_5(void)
asm(& br &0xFE8A;&);
#pragma vector=AES256_VECTOR
__interrupt void intec_27(void)
asm(& br &0xFEC6;&);
#pragma vector=RTC_VECTOR
__interrupt void intec_28(void)
asm(& br &0xFEC8;&);
#pragma vector=LCD_C_VECTOR
__interrupt void intec_29(void)
asm(& br &0xFECA;&);
#pragma vector=PORT4_VECTOR
__interrupt void intec_30(void)
asm(& br &0xFECC;&);
#pragma vector=PORT3_VECTOR
__interrupt void intec_31(void)
asm(& br &0xFECE;&);
#pragma vector=TIMER3_A1_VECTOR
__interrupt void intec_32(void)
asm(& br &0xFED0;&);
#pragma vector=TIMER3_A0_VECTOR
__interrupt void intec_33(void)
asm(& br &0xFED2;&);
#pragma vector=PORT2_VECTOR
__interrupt void intec_34(void)
asm(& br &0xFED4;&);
#pragma vector=TIMER2_A1_VECTOR
__interrupt void intec_35(void)
asm(& br &0xFED6;&);
#pragma vector=TIMER2_A0_VECTOR
__interrupt void intec_36(void)
asm(& br &0xFED8;&);
#pragma vector=PORT1_VECTOR
__interrupt void intec_37(void)
asm(& br &0xFEDA;&);
#pragma vector=TIMER1_A1_VECTOR
__interrupt void intec_38(void)
asm(& br &0xFEDC;&);
#pragma vector=TIMER1_A0_VECTOR
__interrupt void intec_39(void)
asm(& br &0xFEDE;&);
#pragma vector=DMA_VECTOR
__interrupt void intec_40(void)
asm(& br &0xFEE0;&);
#pragma vector=USCI_B1_VECTOR
__interrupt void intec_41(void)
asm(& br &0xFEE2;&);
#pragma vector=USCI_A1_VECTOR
__interrupt void intec_42(void)
asm(& br &0xFEE4;&);
#pragma vector=TIMER0_A1_VECTOR
__interrupt void intec_43(void)
asm(& br &0xFEE6;&);
#pragma vector=TIMER0_A0_VECTOR
__interrupt void intec_44(void)
asm(& br &0xFEE8;&);
#pragma vector=ADC12_VECTOR
__interrupt void intec_45(void)
asm(& br &0xFEEA;&);
#pragma vector=USCI_B0_VECTOR
__interrupt void intec_46(void)
asm(& br &0xFEEC;&);
#pragma vector=USCI_A0_VECTOR
__interrupt void intec_47(void)
asm(& br &0xFEEE;&);
#pragma vector=WDT_VECTOR
__interrupt void intec_49(void)
asm(& br &0xFEF2;&);
#pragma vector=TIMER0_B1_VECTOR
__interrupt void intec_50(void)
asm(& br &0xFEF4;&);
#pragma vector=TIMER0_B0_VECTOR
__interrupt void intec_51(void)
asm(& br &0xFEF6;&);
#pragma vector=COMP_E_VECTOR
__interrupt void intec_52(void)
asm(& br &0xFEF8;&);
#pragma vector=UNMI_VECTOR
__interrupt void intec_53(void)
asm(& br &0xFEFA;&);
#pragma vector=SYSNMI_VECTOR
__interrupt void intec_54(void)
asm(& br &0xFEFC;&);
这种情况下,我升级成功后,发现ADC采样测量温度,发现程序卡死在采集等待那里,说明中断未触发,到底是什么原因呢?
麻烦帮忙解释一下,谢谢!
;JTAG软件/Flash烧写;
Powered by
逛了这许久,何不进去瞧瞧?msp430f5438a的dma有严重bug???adc12先读一次后dma就不触发了。 - MSP430(TM)16 位超低功耗 MCU - 德州仪器在线技术支持社区
msp430f5438a的dma有严重bug???adc12先读一次后dma就不触发了。
发表于2年前
<input type="hidden" id="hGroupID" value="37"
如题,最近在调试&a href=&.cn/product/cn/msp430f5438a& target=&extwin&>msp430f5438a&/a>的dma,今天发现一个bug???&/p>
&p>如果把下面的语句屏蔽掉,则dma工作正常,如果不屏蔽,则dma就死了,永远不中断了。&/p>
&p>&&&br>& //uint8_t j=0;&br>& //for(j=0;j&128;j++)&br>& //{&br>& //& while(!(ADC12IFG & BIT0))//等待采样结束&br>& //& {&br>& //&&& ;&br>& //& }&br>& //& DMA_DST_AD0[j] = ADC12MEM0;// Move A1 results, IFG is cleared&br>& //}&/p>
&p>具体见程序:&/p>
&pre class=&brush: fontsize: 100; first-line: 1; &>__no_init uint16_t DMA_DST_AD0[2048];
int main(void)
WDTCTL = WDTPW+WDTHOLD;
// Stop WDT
P6SEL |=BIT0;
// Enable VeREF+ & A/D channel A0
ADC12CTL0 = ADC12ON
// 打开ADC内核
// 连续采样
+ADC12SHT0_2;
// 保持时间为16个cycles
ADC12CTL1 = ADC12SSEL_2
// 时钟选择为:MCLK
+ADC12DIV_4
// 时钟分频为:4+1=5,即25M/5=5MHz
// 采样信号源自采样定时器
+ADC12CONSEQ_2;
// 单通道多次采样
ADC12MCTL0 = ADC12INCH_0+ADC12EOS;
// ref+=AVcc, channel = A0
ADC12CTL0 |= ADC12ENC;
// Enable conversions
ADC12CTL0 |= ADC12SC;
// Start conversion - software trigger
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//如果把下面的这些语句屏蔽掉,dma读取ad值正常,但是放开这些语句,即先
//直接读一次ad值后再用dma读,此时dma就永远不触发了,这是怎么回事?
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//uint8_t j=0;
//for(j=0;j&128;j++)
while(!(ADC12IFG & BIT0))//等待采样结束
DMA_DST_AD0[j] = ADC12MEM0;// Move A1 results, IFG is cleared
//DMA0设置
//触发源选择
DMACTL0 = DMA0TSEL_24;
// 通道0 ADC12IFGx triggered
//DMA0通道参数设置
DMA0CTL = 0;
// 寄存器清零
DMA0CTL = DMADT_4
// 单次重复传输模式
// 使能DMA
+DMADSTINCR_3
// 目标地址自增,源地址不变
// 使能DMA传输完成中断
DMA0SZ = 2048;
// DMA0传输大小
__data16_write_addr((uint16_t) &DMA0SA,(uint32_t) &ADC12MEM0);
//源地址:ADC12MEM0
__data16_write_addr((uint16_t) &DMA0DA,(uint32_t) &DMA_DST_AD0);//目的地址:DMA_DST[]
__bis_SR_register(GIE);//enable interrupts
//------------------------------------------------------------------------------
// DMA Interrupt Service Routine
//------------------------------------------------------------------------------
#pragma vector=DMA_VECTOR
__interrupt void DMA_ISR(void)
switch(__even_in_range(DMAIV,16))
// DMA0IFG = DMA Channel 0
__no_operation();
// DMA1IFG = DMA Channel 1
// DMA2IFG = DMA Channel 2
// DMA3IFG = DMA Channel 3
// DMA4IFG = DMA Channel 4
// DMA5IFG = DMA Channel 5
// DMA6IFG = DMA Channel 6
// DMA7IFG = DMA Channel 7
&pre class=&brush: fontsize: 100; first-line: 1; &> &/pre>&div style=&clear:&>&/div>" />
msp430f5438a的dma有严重bug???adc12先读一次后dma就不触发了。
此问题尚无答案
All Replies
如题,最近在调试的dma,今天发现一个bug???
如果把下面的语句屏蔽掉,则dma工作正常,如果不屏蔽,则dma就死了,永远不中断了。
&&& //uint8_t j=0;& //for(j=0;j&128;j++)& //{& //& while(!(ADC12IFG & BIT0))//等待采样结束& //& {& //&&& ;& //& }& //& DMA_DST_AD0[j] = ADC12MEM0;// Move A1 results, IFG is cleared& //}
具体见程序:
__no_init uint16_t DMA_DST_AD0[2048];
int main(void)
WDTCTL = WDTPW+WDTHOLD;
// Stop WDT
P6SEL |=BIT0;
// Enable VeREF+ & A/D channel A0
ADC12CTL0 = ADC12ON
// 打开ADC内核
// 连续采样
+ADC12SHT0_2;
// 保持时间为16个cycles
ADC12CTL1 = ADC12SSEL_2
// 时钟选择为:MCLK
+ADC12DIV_4
// 时钟分频为:4+1=5,即25M/5=5MHz
// 采样信号源自采样定时器
+ADC12CONSEQ_2;
// 单通道多次采样
ADC12MCTL0 = ADC12INCH_0+ADC12EOS;
// ref+=AVcc, channel = A0
ADC12CTL0 |= ADC12ENC;
// Enable conversions
ADC12CTL0 |= ADC12SC;
// Start conversion - software trigger
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//如果把下面的这些语句屏蔽掉,dma读取ad值正常,但是放开这些语句,即先
//直接读一次ad值后再用dma读,此时dma就永远不触发了,这是怎么回事?
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//uint8_t j=0;
//for(j=0;j&128;j++)
while(!(ADC12IFG & BIT0))//等待采样结束
DMA_DST_AD0[j] = ADC12MEM0;// Move A1 results, IFG is cleared
//DMA0设置
//触发源选择
DMACTL0 = DMA0TSEL_24;
// 通道0 ADC12IFGx triggered
//DMA0通道参数设置
DMA0CTL = 0;
// 寄存器清零
DMA0CTL = DMADT_4
// 单次重复传输模式
// 使能DMA
+DMADSTINCR_3
// 目标地址自增,源地址不变
// 使能DMA传输完成中断
DMA0SZ = 2048;
// DMA0传输大小
__data16_write_addr((uint16_t) &DMA0SA,(uint32_t) &ADC12MEM0);
//源地址:ADC12MEM0
__data16_write_addr((uint16_t) &DMA0DA,(uint32_t) &DMA_DST_AD0);//目的地址:DMA_DST[]
__bis_SR_register(GIE);//enable interrupts
//------------------------------------------------------------------------------
// DMA Interrupt Service Routine
//------------------------------------------------------------------------------
#pragma vector=DMA_VECTOR
__interrupt void DMA_ISR(void)
switch(__even_in_range(DMAIV,16))
// DMA0IFG = DMA Channel 0
__no_operation();
// DMA1IFG = DMA Channel 1
// DMA2IFG = DMA Channel 2
// DMA3IFG = DMA Channel 3
// DMA4IFG = DMA Channel 4
// DMA5IFG = DMA Channel 5
// DMA6IFG = DMA Channel 6
// DMA7IFG = DMA Channel 7
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
探花15233分
你的问题我已经收藏记录下来,因为手上暂时没有 demo板,我先尝试在下跑一下你的程序。
有结果通知你。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼26410分
& 我对你的程序有点疑问,你既然采用的是DMA硬件触发ADC12MEM0数据的传输,为什么还需要手动去进行一次读取的操作呢。你这样一读取的话,ADC12MEM0里面的数据就被清楚了,当然触发不了DMA了。硬件触发DMA的原理就是ADC12MEM0里面有了转换完成的结果就会自动触发DMA将数据从ADC12MEM0搬到DMA_DST_AD0数组里面。其中间过程不需要手动操作或是CPU的干预。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
1、首先感谢回复啊,这帖子好多天了都没有TI员工来回复,今天终于等到一个。
2、5438a我用了ad0,ad1,ad2分别采集3个模拟量,前两个要采集传感器,我想用dma去读数据。
& & & &后面一个通道采集电池电量,当系统待机时才采集,我想直接读mem寄存器数据后求平均处理。
& & & 上面的程序是为了演示dma手动读一次后dma再去读会读不到这个现象。
& & & 我实际测试时,先把ad初始化,开启3个通道,序列通道重复采样模式。再用ad2读了一次电池电量,
& & & 后才初始化dma,使ad0 ad1的数据让dma0 dma1去读,这样dma就死活不触发了,dma有关联性?
& & & &3个dma通道不独立???我手动读了一次ad2的数据,和ad0 ad1的数据有什么关系???
3、按照我发的程序来讨论:我们先不谈为什么要用dma了,还要手动去读一次数据。首先我把ad初始化了,
& & & 手动去读一次数据,然后再初始化dma,让dma去读ad的数据。在这个过程中,我手动读过一次ad数据
& & &后,ifg标志置位了,我也清零了。这个总该不影响dma吧。再者你说mem中的数据读没了,dma就不触
& & &发了?????????
& & 1)从仿真来看,虽然dma不触发了,但是ad的数据是变化的,即说明ad工作正常,新的数据也放到了mem
& & & & &寄存器,ifg标志也置位了,你dma为什么还不触发,再等什么???
& & 2)即使我在dma初始化前再把ad初始化一次也不管用,dma照样不触发。
& & 3)以上两点说明dma没有触发和我先读一次ad数据没有关系
4、用户的需求是千奇百怪的,总不能我要用dma了,那这个ad的数据寄存器我都不能读了吧???
& & &有可能我一段时间用dma去读ad数据,过段时间我又得读寄存器去判断ad值。。。。什么需求都
& & 有可能发生的。
5、我要知道为什么我读了一次ad值后dma就不触发了呢?
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
我先读一次ad数据,在dma初始化前再初始化一次ad,dma还是不触发
P6SEL |=BIT0;
// Enable VeREF+ & A/D channel A0
ADC12CTL0 = ADC12ON
// 打开ADC内核
// 连续采样
+ADC12SHT0_2;
// 保持时间为16个cycles
ADC12CTL1 = ADC12SSEL_2
// 时钟选择为:MCLK
+ADC12DIV_4
// 时钟分频为:4+1=5,即25M/5=5MHz
// 采样信号源自采样定时器
+ADC12CONSEQ_2;
// 单通道多次采样
ADC12MCTL0 = ADC12INCH_0+ADC12EOS;
// ref+=AVcc, channel = A0
ADC12CTL0 |= ADC12ENC;
// Enable conversions
ADC12CTL0 |= ADC12SC;
// Start conversion - software trigger
//DMA0设置
//触发源选择
DMACTL0 = DMA0TSEL_24;
// 通道0 ADC12IFGx triggered
//DMA0通道参数设置
DMA0CTL = 0;
// 寄存器清零
DMA0CTL = DMADT_4
// 单次重复传输模式
// 使能DMA
+DMADSTINCR_3
// 目标地址自增,源地址不变
// 使能DMA传输完成中断
DMA0SZ = 2048;
// DMA0传输大小
__data16_write_addr((uint16_t) &DMA0SA,(uint32_t) &ADC12MEM0);
//源地址:ADC12MEM0
__data16_write_addr((uint16_t) &DMA0DA,(uint32_t) &DMA_DST_AD0);//目的地址:DMA_DST[]
__bis_SR_register(GIE);//enable interrupts
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
在dma初始化前我这样再初始化ad一次,dma就可以正常触发了。
ADC12CTL0=0;
ADC12CTL1=0;
ADC12MCTL0=0;
P6SEL |=BIT0;
// Enable VeREF+ & A/D channel A0
ADC12CTL0 = ADC12ON
// 打开ADC内核
// 连续采样
+ADC12SHT0_2;
// 保持时间为16个cycles
ADC12CTL1 = ADC12SSEL_2
// 时钟选择为:MCLK
+ADC12DIV_4
// 时钟分频为:4+1=5,即25M/5=5MHz
// 采样信号源自采样定时器
+ADC12CONSEQ_2;
// 单通道多次采样
ADC12MCTL0 = ADC12INCH_0+ADC12EOS;
// ref+=AVcc, channel = A0
ADC12CTL0 |= ADC12ENC;
// Enable conversions
ADC12CTL0 |= ADC12SC;
// Start conversion - software trigger
//DMA0设置
//触发源选择
DMACTL0 = DMA0TSEL_24;
// 通道0 ADC12IFGx triggered
//DMA0通道参数设置
DMA0CTL = 0;
// 寄存器清零
DMA0CTL = DMADT_4
// 单次重复传输模式
// 使能DMA
+DMADSTINCR_3
// 目标地址自增,源地址不变
// 使能DMA传输完成中断
DMA0SZ = 2048;
// DMA0传输大小
__data16_write_addr((uint16_t) &DMA0SA,(uint32_t) &ADC12MEM0);
//源地址:ADC12MEM0
__data16_write_addr((uint16_t) &DMA0DA,(uint32_t) &DMA_DST_AD0);//目的地址:DMA_DST[]
__bis_SR_register(GIE);//enable interrupts
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼26410分
& &首先在430里面DMA硬件触发ADC的结果转换,它的trigger resource是DMACTL0 = DMA0TSEL_24;//ADC12IFGx也就是说DMA是在ADC转换结束以后置位的标识符来触发DMA。如果说你手动去读的话,清掉了这个标志位,那DMA就不能硬件触发.
考虑到你的程序里里面用了两个DMA通道,而且ADC采用的是sequence的方式,在这种情况下ADC12IFGx的置位是在sequence complete的情况下才去置位的。换句话说,只有在这种情况下你的DMA操作才能被触发。你去读数据可以根据你的需求,什么时候读都可以,单前提是如果你需要DMA按你的需求工作的话,你的保证有ADC12IFGx的标志位去触发它。不然DMA 的硬件触发还真没法工作。
& 还有一种解决办法,就是选择触发源为DMA,采用类似于软件触发的操作。通过在程序中去设置DMAREQ这个位来触发DMA的操作。这样就和ADC12IFGx的标志位没任何关系了。什么时候你想用DMA都行,但有一个小小的问题,就是要等ADC12MEMx寄存器里面有数据。
最后总结一下,客户的需求确实多变的,关键是要看程序怎么设计以及相应的硬件有哪些功能可以支持。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼26410分
& &关于ADC初始化方式的问题,你可以通过在线调试的方式,比较一下这两种操作过后,ADC相应的寄存器里面的值是否是真的都处于reset状态了。这样比较直观的看出你的初始化操作是否有效。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼26410分
你两次初始化的ADC操作,前面一次应该是没有成功,因为你在ADC12EN=1的情况下是修改不了ADC12CTL0这个寄存器的,只有在将ADC12EN清零以后,针对ADC12CTL0的操作才是有效的。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
1、楼主位的程序可以很好说明我的问题。现在拿他来说明问题。到目前为止大家好像还没明白我的问题根源之所在。
& & &我只用了ad0,是单通道重复采样,即ad0转换完毕后ADC12IFG0位置会被置位。虽然我在dma初始化前读了一次
& & &ADC12MEM0寄存器,当然ADC12IFG0标志也会被自动清零;但是我用的是单通道重复采样,当dma初始化完毕
& & 后,我仿真发现ADC12MEM0寄存器的内容是新的,即ad0在采集数据,ADC12IFG0标志也被置位了,但是此时
& &dma还是没有触发。ADC12MEM0寄存器有新的内容了,ADC12IFG0标志也置位了,你为什么还不触发。
2、ls可以把我的楼主位的程序放到你的开发板上仿真试一试就知道我要说明什么问题了。你先屏蔽我那段,仿真看看能否进
& & &中断,即dma是否在工作。再把屏蔽的那段放开,看看dma还工作吗?
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
嗯,第一次初始化确实没成功。
我们先讨论那个楼主位的程序哈,你先在你的板子上跑一下那个例子就知道我要问的问题了。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼26410分
行,明白你的意思了。我待会就用板子跑一下这个程序试试。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
我一直在线,有进展我们这里讨论也行,qq也行,邮箱也行。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼26410分
& &刚测试了一下,前面确实如你所说,不加那段程序,DMA是工作正常的,但是加了那段程序以后,DMA就不在触发了。
但是现在我发现一个有趣的现象,如果我们LPM0这个去掉的话,即使加上那段程序,DMA还是能一直触发的。参考程序如下
//******************************************************************************
#include &msp430.h&
unsigned int DMA_DST;unsigned int DMA_DST_AD0;unsigned char flag=0;
int main(void){ WDTCTL = WDTPW+WDTHOLD; // Hold WDT
P1OUT &= ~BIT0; // P1.0 clear P1DIR |= BIT0; // P1.0 output// P4DIR |= BIT1; // P4.1 output// P4SEL |= BIT1; // P4.1 select // P6SEL |= BIT7; //AD7 //Setup Timer B0// TBCCR0 = 0xFFFE;// TBCCR1 = 0x8000;// TBCCTL1 = OUTMOD_3; // CCR1 set/reset mode// TBCTL = TBSSEL_2+MC_1+TBCLR; // SMCLK, Up-Mode
// Setup ADC12 P6SEL |=BIT0; // Enable VeREF+ & A/D channel A0 ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC; // Turn on ADC12, set sampling time // set multiple sample conversion ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2; // Use sampling timer, set mode// ADC12IE = 0x01; // Enable ADC12IFG.0 ADC12MCTL0 = ADC12SREF_0+ADC12INCH_0; // V+=AVcc V-=AVss, A0 channel
ADC12CTL0 |= ADC12ENC; // Enable conversions ADC12CTL0 |= ADC12SC;////////////////////////////////////////////////////////////////////////////////// // unsigned char j=0;// for(j=0;j&128;j++) // { while(!(ADC12IFG0 & BIT0))//等待采样结束 {
} DMA_DST_AD0 = ADC12MEM0;// Move A1 results, IFG is cleared// flag = ADC12IFG0; // }
// Setup DMA0 DMACTL0 = DMA0TSEL_24; // ADC12IFGx triggered DMACTL4 = DMARMWDIS; // Read-modify-write disable DMA0CTL &= ~DMAIFG; DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_3+DMAIE; // Rpt single tranfer, inc dst, Int DMA0SZ = 1; // DMA0 size = 1 __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC12MEM0); // ... from ADC12MEM0 __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &DMA_DST); // ... to destination in RAM
__bis_SR_register(GIE); // LPM0 w/ interrupts // __no_operation(); // used for debugging while(1);}
//------------------------------------------------------------------------------// DMA Interrupt Service Routine//------------------------------------------------------------------------------#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)#pragma vector=DMA_VECTOR__interrupt void DMA_ISR(void)#elif defined(__GNUC__)void __attribute__ ((interrupt(DMA_VECTOR))) DMA_ISR (void)#else#error Compiler not supported!#endif{ switch(__even_in_range(DMAIV,16)) { case 0: case 2: // DMA0IFG = DMA Channel 0 P1OUT ^= BIT0; // Toggle P1.0 case 4: // DMA1IFG = DMA Channel 1 case 6: // DMA2IFG = DMA Channel 2 case 8: // DMA3IFG = DMA Channel 3 case 10: // DMA4IFG = DMA Channel 4 case 12: // DMA5IFG = DMA Channel 5 case 14: // DMA6IFG = DMA Channel 6 case 16: // DMA7IFG = DMA Channel 7 default: }}
你可以测试一下,我正在找原因。我们也可以讨论一下。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
嗯,我测试一下。多谢啊
下次粘代码时用插入代码那个功能粘贴的代码看起来舒服一些呢
You have posted to a forum that requires a moderator to approve posts before they are publicly available.}

我要回帖

更多关于 msp430f5438a原理图 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信