历史上的今天
返回首页

历史上的今天

今天是:2025年01月26日(星期日)

2021年01月26日 | MSP430F5529 多通道ADC定时器触发+DMA传输

2021-01-26 来源:eefocus

竞赛之前学习了一下从没有使用过的MSP430单片机,使用的是MSP430F5529的demo板,这块板子应该是MSP430中比较流行的一块了。使用这块板子实现了一个双通道ADC的定时器触发DMA传输,这里记录一下给别人一点参考,同时也为以后需要用到的时候提供笔记。废话不多说直接上源码,代码如下。


#include  

#include


int data_buf0[100];

int data_buf1[100];

/**

 * main.c

 */

int main(void)

{

    unsigned int i;

WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer

    P1DIR |= BIT0;              // P1.0 output

    P1OUT &= ~BIT0;             // P1.0 clear

    P5SEL |= BIT7;              // P5.7/TB1 option select

    P5DIR |= BIT7;              // Output direction

    P6SEL |= 0x03;              // Enable A/D channel A0 A1


    //Setup Timer B0

    TBCCR0 = 0xfffe;

    TBCCR1 = 0x8000;

    TBCCTL1 = OUTMOD_3;                       // CCR1 set/reset mode

    TBEX0 = TBIDEX_7;                         //CLK/8 divide

    TBCTL = TBSSEL_2+MC_1+TBCLR + ID_3;       // SMCLK, Up-Mode


    // Setup ADC12

    ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_8;   // Turn on ADC12, extend sampling time

                                                // to avoid overflow of results

    ADC12CTL1 = ADC12SHS_3+ADC12CONSEQ_3;       // Use sampling timer, repeated sequence

    ADC12MCTL0 = ADC12INCH_0;                  // ref+=AVcc, channel = A0

    ADC12MCTL1 = ADC12INCH_1 + ADC12EOS;       // ref+=AVcc, channel = A1

    ADC12CTL0 |= ADC12ENC;                    // Enable conversions


    // Setup DMA COMMON

    DMACTL0 = DMA0TSEL_24 + DMA1TSEL_24;      // ADC12IFGx triggered

    DMACTL4 = DMARMWDIS;                      // Read-modify-write disable

    // Setup DMA0

    DMA0CTL &= ~DMAIFG;

    DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_3;     // Rpt single tranfer, Destination address is incremented.

    DMA0SZ = 100;        // DMA0 size = 100


    __data20_write_long((uintptr_t) &DMA0SA,(uintptr_t) &ADC12MEM0); // Source block address

    __data20_write_long((uintptr_t) &DMA0DA,(uintptr_t) &data_buf0[0]);


    // Setup DMA1

    DMA1CTL &= ~DMAIFG;

    DMA1CTL = DMADT_4+DMAEN+DMADSTINCR_3; // Rpt single tranfer, Destination address is incremented.

    DMA1SZ = 100;       // DMA0 size = 100


    __data20_write_long((uintptr_t) &DMA1SA,(uintptr_t) &ADC12MEM1); // Source block address

    __data20_write_long((uintptr_t) &DMA1DA,(uintptr_t) &data_buf1[0]);


    while (1) {

        P1OUT ^= BIT0;

        for (i = 0; i < 50000; i++);

    }

return 0;

}

       首先是IO的初始化配置,之后配置TB定时器,由于程序中没有修改单片机的主频,所以单片机的主频默认是1M的,TB定时器的时钟源SMCLK也是1M,设置TBCCR0 = 65534,并且配置了TBEX0 = TBIDEX_7;和TBCTL 的ID_3字段,所以时钟分频为8*8=64分频,相关的寄存器的位详解请参考MSP430f5529的User’s Guide。所以最终的定时器定时频率为1000000/64/65535=0.238,周期就是4.2s。
       接下是ADC配置ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_8;就是开启ADC、多次采样、设置周期。ADC12CTL1 = ADC12SHS_3+ADC12CONSEQ_3;设置触发源为TB1_CCR1(ADC12SHS_3),工作在重复队列转换模式Repeat-sequence-of-channels(ADC12CONSEQ_3)。然后就是设置队列使能ADC。
       之后就是DMA配置了,先是配置DMA的共同寄存器部分。DMACTL0 = DMA0TSEL_24 + DMA1TSEL_24;设置DMA0和DMA1的触发源,选择24号触发源,通过查看数据手册可以知道24号触发源对应的就是ADC_12。然后就是特定DMA的配置了,这里就介绍一下DMA0的配置,DMA1的配置都是相同的。DMA0CTL &= ~DMAIFG;清除中断标志。DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_3;重复单次传输Repeated single transfer(DMADT_4),开启DMA,目标地址递增Destination address is incremented(DMADSTINCR_3)。然后设置传输的数据量、源地址、目标地址即可。

注意
       在使用过程中我发现一个问题,那就是ADC的转换周期 = 定时器周期 x ADC通道数,例如我的定时器周期为4.2s,ADC通道为2,ADC转换周期就是4.22=8.4s。开启ADC转换8.4s后DMA同时将两个通道的ADC数据传输到缓存中。为此我开启了3个ADC通道进行了实验,TB的周期还是4.2s,MCU主频1M,实验结果如下所示。
在这里插入图片描述
在这里插入图片描述
       可以看出程序运行了21s后缓存中还是只有一次转换结果。使程序继续运行看一下两次转换需要多久。
在这里插入图片描述
在这里插入图片描述
       28s的时候已经完成了两次转换,按照计算两次转换的时间为4.23*2=25.2s。结合上面一次转换的时间,12.6<21<25.2<28,结果是符合推论的。


       所以这个ADC12定时器触发配合DMA关于转换周期的问题在实际应用中还是需要注意的。


推荐阅读

史海拾趣

Curtis Electromusic Specialties Inc公司的发展小趣事

随着全球环保意识的不断提高,电子行业对环保材料的需求也日益增长。CUI公司敏锐地抓住了这一市场机遇,积极投入研发,成功开发出了一种绿色环保型的碘化亚铜生产工艺。这种工艺不仅降低了生产过程中的能耗和排放,而且提高了产品的纯度和质量。通过推广这一工艺,CUI公司不仅赢得了客户的青睐,也为行业的绿色发展做出了积极贡献。

帝特(DTECH)公司的发展小趣事

广州帝特电子科技有限公司成立于2000年4月,公司创始团队凭借对市场趋势的敏锐洞察和坚定信心,决定将主营业务定位于电脑外设产品的研发和生产。在创立初期,帝特就注重产品质量和技术创新,通过不断的技术研发和产品优化,逐渐在电脑外设领域崭露头角。

FCI [First Components International]公司的发展小趣事

近年来,帝特积极寻求与行业内优秀企业的合作机会。2024年3月,帝特科技与技象科技在广州帝特总部签署战略合作框架协议,双方就物联网通信产品展开深入合作。这一合作不仅有助于帝特在物联网领域的技术积累和业务拓展,也为公司未来的发展注入了新的活力。

Aydin Corp公司的发展小趣事

在国内市场取得一定成绩后,Aydin Corp开始积极拓展国际市场。通过与全球知名企业的合作,公司成功将产品打入多个国家和地区的市场。同时,Aydin Corp还积极参加国际电子展会和交流活动,与业界同行建立了广泛的合作关系。这些举措不仅提升了公司的国际知名度,也为公司的持续发展注入了新的动力。

G-Two Inc公司的发展小趣事

背景:2003年,福斯特的创始人林建华,一位在纺织业和化工领域有着丰富经验的工程师,决定跨界进入光伏材料行业。当时,国内光伏组件封装所需的光伏胶膜几乎全部依赖进口,被国外几家大公司垄断。

发展:林建华凭借在热熔网膜领域的技术积累,带领团队成功研发出EVA胶膜,打破了国外技术垄断。这一技术突破不仅降低了国内光伏组件的生产成本,也为福斯特在光伏材料领域的崛起奠定了坚实基础。

成果:2008年,福斯特的EVA胶膜产品凭借优异的性能和价格优势,成功打入国内光伏组件企业的供应名录,并跻身全球EVA胶膜供应商前三强。

Blue Giga公司的发展小趣事

随着技术的不断进步,Blue Giga在无线网络连接领域取得了重要突破。其研发的超低功耗Bluetooth Smart和Bluetooth Classic模块,以及Wi-Fi模块,受到了市场的广泛欢迎。同时,公司还推出了配套的软件栈、开发工具和SDK,进一步丰富了产品线,满足了不同领域的需求。

问答坊 | AI 解惑

急需!!! 汽车电子方案!!!

急需!!! 电子技术研发设计开发方案!!! 急需!!! 方案!!! 公司拓展,急需方案,请拥有方案或部分技术的公司和个人迅速与我联系, 邮箱 rdeasy@yahoo.cn 请注明公司全名或个人的姓,详细准确的联系方式和方案,否则不予考。 ...…

查看全部问答>

TI关于DC-DC电源芯片有哪些呀

TI关于DC-DC电源芯片有哪些呀 还能提供一些完整的资料吗    集思广益 谢谢大家…

查看全部问答>

问大家关于串口通讯的问题

我做一个232的通讯,希望传一个16进制数比如0XFE到PC,然后PC端通过DELPHI写的程序能读出这个16进制数.哪位有这个例子,PC端怎么读(是通过自己写程序,还是有现成的调试工具)我到现在还不知道呢,哪位讲下啊…

查看全部问答>

红、黄、绿灯的控制系统设计

控制一组红绿黄灯,通过反复检测开关S1、S2,要求由S1、S2 的“闭合”和“断开”控制红、 绿、黄3灯的点亮。 当S1断,S2断时,黄灯亮; 当S1断,S2合时,绿灯亮; 当S1合,S2断时,红灯闪亮,闪烁周期为2s; 当S1合,S2合时,红灯亮。 要求:1 ...…

查看全部问答>

就我个人经历,大家在无线选型上常会有的一些误区:

就我个人经历,大家在无线选型上常会有的一些误区: 1,通信速率,比如很多公司是这样宣传的NRF2401速率是1MBPS,    但,实际上这只是发射速率,而实际真正完成一次发送速率需要涉及到具体的功能,因为功能越复杂,完成一次数据采集的 ...…

查看全部问答>

请教144脚FSMC的问题

我现在要接2片8位的SRAM,没有其他用外总线的器件,请问我现在的接法对不对 CPU                  SRAM1 D0-D7              ...…

查看全部问答>

想知道某些STMCU报价,有什么方法

                                 最近选型中,想知道一些型号的MCU报价,上哪找去?…

查看全部问答>

JX51开发板小批量喽 ~~~~~~~~~~~~~·

  所有板子的大集合,现在共有40多块,全部手工焊接哦。。   相关教程将会陆续发布 [ 本帖最后由 youki12345 于 2011-12-7 21:57 编辑 ]…

查看全部问答>

什么是自动化控制

什么是自动化控制系统呢?     准确来说是指在没有人直接参与的情况下,利用外加的设备或装置,使机器、设备或生产过程的某个工作状态或参数自动地按照预定的规律运行。自动控制是相对人工控制概念而言的。指的是在没人参与的情况下,利 ...…

查看全部问答>

AD15和谐故障

各位好,升级至AD15,但无法添加License。如图所示 …

查看全部问答>