SLAU533D September   2013  – April 2017

 

  1.   MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP)
    1.     Trademarks
    2. 1 Getting Started
      1. 1.1 Key Features
      2. 1.2 Kit Contents
      3. 1.3 Out-of-Box Experience
        1. 1.3.1 Step 1: Install a Software Development Platform
        2. 1.3.2 Step 2: Connect the Hardware
        3. 1.3.3 Step 3: Verify the storage volume has been loaded
        4. 1.3.4 Step 4: Open a text editor, and press the buttons
        5. 1.3.5 Step 5: Customize the strings
    3. 2 Hardware
      1. 2.1 Block Diagram
      2. 2.2 Hardware Features
        1. 2.2.1 MSP430F5529
        2. 2.2.2 eZ-FET lite Onboard Emulator
        3. 2.2.3 Integrated Full-Speed USB Hub
        4. 2.2.4 Power
        5. 2.2.5 Clocking
        6. 2.2.6 Application (or "Backchannel") UART
        7. 2.2.7 Emulator and Target Isolation Jumper Block
        8. 2.2.8 Isolation Jumper Block: 3.3-V and 5-V Jumpers
        9. 2.2.9 Isolation Jumper Block: Emulator Connection and Application UART
      3. 2.3 Measure Current Draw of MSP430 MCU
      4. 2.4 Using an External Power Source
        1. 2.4.1 External 3.3-V Power Source
        2. 2.4.2 External 5-V Power Source Without USB Connection
        3. 2.4.3 External 5-V Power Source With USB Connection
      5. 2.5 Using the eZ-FET lite Emulator With a Different Target
      6. 2.6 USB BSL Button
      7. 2.7 BoosterPack Plug-in Module Pinout
      8. 2.8 Design Files
      9. 2.9 Hardware Change Log
    4. 3 Software Examples
      1. 3.1 MSP430 Software Libraries: driverlib and the USB API
      2. 3.2 Viewing the Code
        1. 3.2.1 CCS
        2. 3.2.2 IAR
      3. 3.3 Example Project Software Organization
      4. 3.4 USB Configuration Files
      5. 3.5 Out-of-Box Experience: emulStorageKeyboard
        1. 3.5.1  Flowchart
        2. 3.5.2  Pre-Initialization
        3. 3.5.3  Initialization
          1. 3.5.3.1 Configuring the Keyboard
          2. 3.5.3.2 Configuring the MSC Interface
        4. 3.5.4  Handling SCSI Commands
        5. 3.5.5  LPM0 Entry
        6. 3.5.6  LPM0 Exit
        7. 3.5.7  Emulated Storage Volume
        8. 3.5.8  Sending Data as a USB Keyboard
        9. 3.5.9  Properly Handling USB Unplug Events
        10. 3.5.10 Non-Maskable Interrupt (NMI) Vector
      6. 3.6 Example: simpleUsbBackchannel
        1. 3.6.1 What It Does
        2. 3.6.2 Installing the CDC Interface
        3. 3.6.3 Operating the Example
        4. 3.6.4 Backchannel UART Library: bcUart.c, bcUart.h
        5. 3.6.5 Code Description: Initialization
          1. 3.6.5.1 Stopping the Watchdog
          2. 3.6.5.2 Configuring VCORE
          3. 3.6.5.3 Configuring Clocks
          4. 3.6.5.4 Configuring Ports
          5. 3.6.5.5 Initializing the Backchannel UART
          6. 3.6.5.6 Configuring USB
        6. 3.6.6 Code Description: Main Loop
        7. 3.6.7 Modifying to Use an HID-Datapipe Interface
      7. 3.7 Starting Device Manager
    5. 4 Additional Resources
      1. 4.1 LaunchPad Development Kit Websites
      2. 4.2 Information on the MSP430F5529
      3. 4.3 Download CCS, IAR, mspgcc, or Energia
      4. 4.4 USB Developers Package
      5. 4.5 MSP430Ware and TI Resource Explorer
      6. 4.6 F5529 Code Examples
      7. 4.7 MSP430 Application Notes
      8. 4.8 TI E2E Community
      9. 4.9 Community at Large
    6. 5 FAQs
    7. 6 Schematics
  2.   Revision History

LPM0 Entry

Developing low-power applications is not just about finding the MCU with the lowest-current low-power modes, although that is an important step. The software also must be written to effectively control the circuitry and make good use of the low-power modes that are available.

In an application based on a main loop, one way to do this is to have a single location in the loop where a low-power mode is conditionally entered. Various events can wake it from this sleep and allow the main loop to resume execution, check flags, and handle any waiting events, and then eventually loop back and sleep again.

The primary low-power modes are for MSP430 MCUs are LPM0, LPM3, and LPM4 (see Table 9 for a brief description of these modes). Lower numbers represent "lighter" sleep, while higher numbers generally mean "heavier" sleep. When the MCU is not in an LPM mode, it is considered to be in "active mode", which means that all clocks are enabled and the CPU is executing code. (See the MSP430 family user's guides for complete descriptions of these modes.)

The developer's choice of low-power mode is based on what functionality the MCU needs to keep alive while sleeping. In the case of USB, the MSP430 can enter LPM0 while the USB connection is active (not suspended by the USB host), but this is the deepest possible sleep state. When suspended, it can go into LPM3, which is significantly lower power than LPM0.

With this in mind, refer back to the flowchart in Figure 28. The main loop begins by trying to enter LPM0, but to do so it evaluates several conditions: the return value of USBMSC_poll(), the number of characters waiting to be typed to the host, and whether a LaunchPad development kit pushbutton has been pressed. This code was shown in the previous section.

If USBMSC_poll() returns kUSBMSC_processbuffer, it means the API is waiting for the application to finish the READ or WRITE operation, and thus it is important to skip LPM0 and proceed to mscProcessBuffer().

Similarly, code checks for these other interrupt-driven events that may have occurred after the main loop checked their flags. If execution enters sleep while these flags are set, they are not handled until yet another interrupt occurs. This could cause the device to be unresponsive.

For similar reasons, interrupts are disabled prior to evaluating any of these flags. It takes several cycles to evaluate these conditions, and because these events can occur at any time, the status of the early flags could potentially change before LPM0 is actually entered. If LPM0 were then entered, they would get missed. Disabling interrupts prevents that from happening; the events are simply queued up. When interrupts are reenabled, any interrupts that came in take effect immediately.

Therefore, the code simultaneously enters LPM0 and reenables interrupts by setting the GIE bit:

_bis_SR_register(LPM0_bits + GIE);

If an interrupt had come in while interrupts were disabled, the CPU will wake again in the very next cycle after entry.