14931|16

484

帖子

12

TA的资源

纯净的硅(高级)

楼主
 

谈谈MSP432的编程方法 [复制链接]

 
MSP432的内核既然已经是ARM Cortex M4F,那么过去
430的基于寄存器的编程方法,如果继承下来或许不太恰当;
目前对M4的编程方法,普遍采用基于固件库的方式,
如果采用这种方式,那些熟悉MSP430的人,可能需要
花点时间,来学习这种新方法。不过,有些人
会“抵制”这种方法,就像国内目前大家还采用基于寄存器的
编程方法开发DSP程序,而不采用基于固件库的方法。
因为每个人都有定式,就像VC,都VC.十几,编译效率比VC6.0高得多,
但国内很多程序员目前还普遍使用VC6.0。
因此,如果一个对MSP430熟悉的人,可能不愿意接受MSP432芯片。
然而,对于一个熟悉ARM Cortex的人,可能很乐意使用MSP432,假如
这款芯片便宜的话,这款芯片是对MSP430单片机的颠覆。。。

最新回复

MSP432将固件库做到了芯片的ROM里面,以MAP_ 开头,可以直接调用 我对比了一下普通,执行效率与一般的函数库比,并没有优势,有可能还开销在一点 最要命的是芯片的版本不一样,这个内置库会不一样,我在用REV.B的样片就明显有BUG 在使用REV.C的时候这个BUG没有了 总的来说,这个芯片是TI新的产品,要慎用 做了一下功率对比,与MSP430F5做比较,使用的是8MHz主频,工作时间比较10%,MSP432的功耗,没有优越,不知道走更高频会不会有优势  详情 回复 发表于 2017-6-28 01:15
 
点赞 关注(2)

回复
举报

484

帖子

12

TA的资源

纯净的硅(高级)

沙发
 
本帖最后由 平湖秋月 于 2015-5-18 21:16 编辑

基于寄存器的编程示例

//******************************************************************************
//  MSP432P401 Demo - eUSCI_B0 I2C Master TX bytes to Multiple Slaves
//
//  Description: This demo connects two MSP432's via the I2C bus.
//  The master transmits to 4 different I2C slave addresses 0x0A,0x0B,0x0C&0x0D.
//  Each slave address has a specific related data in the array TXData[].
//  At the end of four I2C transactions the slave address rolls over and begins
//  again at 0x0A.
//  
//  Use with msp432p401_euscia0_i2c_multislave.c
//
//                                /|\  /|\
//               MSP432P401      10k  10k     MSP432P401
//                   slave         |    |        master
//             -----------------   |    |   -----------------
//            |     P1.6/UCB0SDA|<-|----|->|P1.6/UCB0SDA     |
//            |                 |  |       |                 |
//            |                 |  |       |                 |
//            |     P1.7/UCB0SCL|<-|------>|P1.7/UCB0SCL     |
//            |                 |          |                 |
//
//   Wei Zhao
//   Texas Instruments Inc.
//   June 2014
//   Built with Code Composer Studio V6.0
//******************************************************************************
#include "msp.h"
#include
uint8_t TXData[]= {0xA1,0xB1,0xC1,0xD1};        // Pointer to TX data
uint8_t SlaveAddress[]= {0x0A,0x0B,0x0C,0x0D};
uint8_t TXByteCtr;
uint8_t SlaveFlag = 0;
int main(void)
{
    volatile uint32_t i;
    WDTCTL = WDTPW | WDTHOLD;                         // Stop watchdog timer
    // Configure Pins for I2C
    P1SEL0 |= BIT6 | BIT7;                            // I2C pins
    __enable_interrupt();
    NVIC_ISER0 = 1 << ((INT_EUSCIB0 - 16) & 31); // Enable eUSCIB0 interrupt in NVIC module
    // Configure USCI_B0 for I2C mode
    UCB0CTLW0 |= UCSWRST;                             // put eUSCI_B in reset state
    UCB0CTLW0 |= UCMODE_3 | UCMST;                    // I2C master mode, SMCLK
    UCB0BRW = 0x0018;                                 // baudrate = SMCLK /24
    UCB0CTLW0 &=~ UCSWRST;                            // clear reset register
    UCB0IE |= UCTXIE0 | UCNACKIE;                     // transmit and NACK interrupt enable
    SlaveFlag =0;
    while(1)
    {
    SCB_SCR |= SCB_SCR_SLEEPONEXIT;                   // Don't wake up on exit from ISR
    for (i = 1000; i > 0; i--);                       // Delay between transmissions
    UCB0I2CSA = SlaveAddress[SlaveFlag];              // configure slave address
    TXByteCtr = 1;                                    // Load TX byte counter
    while (UCB0CTLW0 & UCTXSTP);                      // Ensure stop condition got sent
    UCB0CTLW0 |= UCTR | UCTXSTT;                      // I2C TX, start condition
    __sleep();
    __no_operation();
    // Change Slave address
    SlaveFlag++;
    if (SlaveFlag>3)                                  // Roll over slave address
      {
        SlaveFlag =0;
      }
    }
}
// I2C interrupt service routine
void eUSCIB0IsrHandler(void)
{
    if (UCB0IFG & UCNACKIFG)
    {
     UCB0IFG &= ~ UCNACKIFG;
        UCB0CTL1 |= UCTXSTT;                  // I2C start condition
    }
    if (UCB0IFG & UCTXIFG0)
    {
     UCB0IFG &= ~ UCTXIFG0;
        if (TXByteCtr)                                // Check TX byte counter
           {
            UCB0TXBUF = TXData[SlaveFlag];            // Load TX buffer
            TXByteCtr--;                              // Decrement TX byte counter
           }
        else
           {
            UCB0CTLW0 |= UCTXSTP;                     // I2C stop condition
            UCB0IFG &= ~UCTXIFG;                      // Clear USCI_B0 TX int flag
            SCB_SCR &= ~SCB_SCR_SLEEPONEXIT;          // Wake up on exit from ISR
           }
    }
}


点评

基于固件库的编程,目前比较流行的M4程序编程方法 /******************************************************************************* * MSP432 I2C - EUSCI_B0_MODULE I2C Slave RX multiple bytes from MSP4  详情 回复 发表于 2015-5-18 21:18
 
 

回复

484

帖子

12

TA的资源

纯净的硅(高级)

板凳
 
平湖秋月 发表于 2015-5-18 21:13
基于寄存器的编程示例

//******************************************************************************
//  MSP432P401 Demo - eUSCI_B0 I2C Master TX bytes to Multiple Slaves
//
//  Description: This demo connects two MSP432's via the I2C bus.
//  The master transmits to 4 different I2C slave addresses 0x0A,0x0B,0x0C&0x0D.
//  Each slave address has a specific related data in the array TXData[].
//  At the end of four I2C transactions the slave address rolls over and begins
//  again at 0x0A.
//  
//  Use with msp432p401_euscia0_i2c_multislave.c
//
//                                /|\  /|\
//               MSP432P401      10k  10k     MSP432P401
//                   slave         |    |        master
//             -----------------   |    |   -----------------
//            |     P1.6/UCB0SDA||P1.6/UCB0SDA     |
//            |                 |  |       |                 |
//            |                 |  |       |                 |
//            |     P1.7/UCB0SCL||P1.7/UCB0SCL     |
//            |                 |          |                 |
//
//   Wei Zhao
//   Texas Instruments Inc.
//   June 2014
//   Built with Code Composer Studio V6.0
//******************************************************************************
#include "msp.h"
#include
uint8_t TXData[]= {0xA1,0xB1,0xC1,0xD1};        // Pointer to TX data
uint8_t SlaveAddress[]= {0x0A,0x0B,0x0C,0x0D};
uint8_t TXByteCtr;
uint8_t SlaveFlag = 0;
int main(void)
{
    volatile uint32_t i;
    WDTCTL = WDTPW | WDTHOLD;                         // Stop watchdog timer
    // Configure Pins for I2C
    P1SEL0 |= BIT6 | BIT7;                            // I2C pins
    __enable_interrupt();
    NVIC_ISER0 = 1

基于固件库的编程,目前比较流行的M4程序编程方法
/*******************************************************************************
*  MSP432 I2C - EUSCI_B0_MODULE I2C Slave RX multiple bytes from MSP432 Master
*
*  Description: This demo connects two MSP432 's via the I2C bus. The master
*  transmits to the slave. This is the slave code. The interrupt driven
*  data reception is demonstrated using the USCI_B0 RX interrupt. Data is
*  stored in the RXData array.
*
*                                /|\  /|\
*                MSP432P401      10k  10k      MSP432P401
*                   slave         |    |         master
*             -----------------   |    |   -----------------
*            |     P1.6/UCB0SDA|<-|----+->|P1.6/UCB0SDA     |
*            |                 |  |       |                 |
*            |                 |  |       |                 |
*            |     P1.7/UCB0SCL|<-+------>|P1.7/UCB0SCL     |
*            |                 |          |                 |
*
* Author: Timothy Logan
******************************************************************************/
/* DriverLib Includes */
#include "driverlib.h"
/* Standard Includes */
#include
#include
/* Application Defines */
#define SLAVE_ADDRESS       0x48
#define NUM_OF_RX_BYTES     4
/* Statics */
static volatile uint8_t RXData[NUM_OF_RX_BYTES];
static volatile uint32_t xferIndex;
int main(void)
{
    /* Disabling the Watchdog */
    MAP_WDT_A_holdTimer();
    xferIndex = 0;
    /* Select Port 1 for I2C - Set Pin 6, 7 to input Primary Module Function,
     *   (UCB0SIMO/UCB0SDA, UCB0SOMI/UCB0SCL).
     */
    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,
            GPIO_PIN6 + GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);
    /* eUSCI I2C Slave Configuration */
    MAP_I2C_initSlave(EUSCI_B0_MODULE, SLAVE_ADDRESS, EUSCI_B_I2C_OWN_ADDRESS_OFFSET0,
            EUSCI_B_I2C_OWN_ADDRESS_ENABLE);
    /* Set in receive mode */
    MAP_I2C_setMode(EUSCI_B0_MODULE, EUSCI_B_I2C_RECEIVE_MODE);
    /* Enable the module and enable interrupts */
    MAP_I2C_enableModule(EUSCI_B0_MODULE);
    MAP_I2C_clearInterruptFlag(EUSCI_B0_MODULE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
    MAP_I2C_enableInterrupt(EUSCI_B0_MODULE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
    MAP_Interrupt_enableSleepOnIsrExit();
    MAP_Interrupt_enableInterrupt(INT_EUSCIB0);
    MAP_Interrupt_enableMaster();
    /* Sleeping while not in use */
    while (1)
    {
        MAP_PCM_gotoLPM0();
    }
}
/******************************************************************************
* The USCI_B0 data ISR RX vector is used to move received data from the I2C
* master to the MSP432 memory.
******************************************************************************/
void euscib0_isr(void)
{
    uint_fast16_t status;
    status = MAP_I2C_getEnabledInterruptStatus(EUSCI_B0_MODULE);
    MAP_I2C_clearInterruptFlag(EUSCI_B0_MODULE, status);
    /* RXIFG */
    if (status & EUSCI_B_I2C_RECEIVE_INTERRUPT0)
    {
        RXData[xferIndex++] = MAP_I2C_slaveGetData(EUSCI_B0_MODULE);
        /* Resetting the index if we are at the end */
        if (xferIndex == NUM_OF_RX_BYTES)
            xferIndex = 0;
    }
}

 
 
 

回复

846

帖子

0

TA的资源

纯净的硅(中级)

4
 
楼主这么找就开始准备学习了啊,很详细,有对比,比较能说明问题
 
 
 

回复

484

帖子

12

TA的资源

纯净的硅(高级)

5
 
呵呵,感觉MSP432这个固件库,比TM4C123G的固件库
乱多了,想必TI应该把TM4C123G的固件库移植到MSP432
才对,的确差得太多了。
 
 
 

回复

1301

帖子

0

TA的资源

纯净的硅(中级)

6
 
不错!
 
个人签名

 

 

 
 

回复

92

帖子

0

TA的资源

一粒金砂(中级)

7
 
我倒觉得影响不大,毕竟大部分人应该都玩过这两类MCU
 
 
 

回复

323

帖子

2

TA的资源

一粒金砂(高级)

8
 
还是支持寄存器操作,到了应用层才把程序对硬件抽象出来
 
 
 

回复

2886

帖子

0

TA的资源

五彩晶圆(初级)

9
 
影响不大,msp430f5xx/6xx,还有其他型号,都有提供库函数的
 
 
 

回复

2886

帖子

0

TA的资源

五彩晶圆(初级)

10
 
对于寄存器较多的mcu,还是库函数更方便一些
 
 
 

回复

3238

帖子

5

TA的资源

五彩晶圆(中级)

11
 
看了楼上列举的TI的库函数,个人感觉很乱,还不如TI的无线协议栈设计的库函数看起来好,对于寄存器操作,个人觉得除非编程能力比较强,不然看起来费力。
 
个人签名淘宝:https://viiot.taobao.com/Q群243090717
多年专业物联网行业经验,个人承接各类物联网外包项目
 
 

回复

103

帖子

0

TA的资源

一粒金砂(中级)

12
 
学习了,个人感觉对寄存器操作会对单片机的外设了解的更深入
当然如果寄存器太多的话那编程就太辛苦了
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(中级)

13
 
混搭
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

14
 
准呗入手432
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

15
 
楼主,能提供下固件库的下载地址么
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

16
 
楼主,能谈谈432程序的烧录方法么,我用MDK5编程的
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

17
 
MSP432将固件库做到了芯片的ROM里面,以MAP_ 开头,可以直接调用
我对比了一下普通,执行效率与一般的函数库比,并没有优势,有可能还开销在一点
最要命的是芯片的版本不一样,这个内置库会不一样,我在用REV.B的样片就明显有BUG
在使用REV.C的时候这个BUG没有了
总的来说,这个芯片是TI新的产品,要慎用
做了一下功率对比,与MSP430F5做比较,使用的是8MHz主频,工作时间比较10%,MSP432的功耗,没有优越,不知道走更高频会不会有优势
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表