This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2433:将 P1.1设置为 PWM 输出

Guru**** 1830000 points
Other Parts Discussed in Thread: MSP430FR2433
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1174519/msp430fr2433-set-p1-1-as-pwm-output

器件型号:MSP430FR2433

我正在尝试使用 TIMER_A_ex1_pwmSingle 示例作为模板将 P1.1设置为 PWM 输出。

我一直在讨论如何将 P1.1初始化为 PWM 输出。

根据我的理解、我需要设置寄存器 P1DIR = 0b01和寄存器 P1SEL1 = 0b01、以将 P1.1初始化为 PWM 输出。

函数时的示例

GPIO_setPeripheralModuleFunctionOutputPin (
GPIO_PORT_P1、
GPIO_PIN1、
GPIO_secondary 模块功能
);

而是以 P1SEL0寄存器为目标。

如前面提到的示例中所示、将 P1.1配置为 PWM 输出需要做什么?

下面是我的代码-首先让我们重点介绍71 - 76行、我尝试将 P1.1初始化为 PWM 输出。

/* --COPYRIGHT--,BSD
 * Copyright (c) 2017, Texas Instruments Incorporated
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * *  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * *  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * *  Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * --/COPYRIGHT--*/
//*******************************************************************************
//!  Timer_A3, PWM TA1.2, Up Mode, DCO SMCLK
//!
//!  Description: This program generates PWM outputs on P2.2 using
//!  Timer1_A configured for up mode. The value , TIMER_PERIOD, defines the PWM
//!  period and the value DUTY_CYCLE the PWM duty cycle. Using ~1.048MHz
//!  SMCLK as TACLK, the timer period is ~480us with a 75% duty cycle on P4.0
//!  ACLK = n/a, SMCLK = MCLK = TACLK = default DCO ~1.048MHz.
//!
//!  Tested On:   MSP430FR4133
//!            -------------------
//!        /|\|                   |
//!         | |                   |
//!         --|RST                |
//!           |                   |
//!           |         P4.0/TA1.1|--> CCR1 - 75% PWM
//!           |                   |
//!
//! This example uses the following peripherals and I/O signals.  You must
//! review these and change as needed for your own board:
//! - Timer peripheral
//! - GPIO peripheral
//!
//! This example uses the following interrupt handlers.  To use this example
//! in your own application you must add these interrupt handlers to your
//! vector table.
//! - NONE
//******************************************************************************
#include "driverlib.h"

#define TIMER_A_PERIOD 524
#define DUTY_CYCLE  393


void main (void)
{
    //Stop WDT
    WDT_A_hold(WDT_A_BASE);

    //P1.1 as PWM output
    GPIO_setAsPeripheralModuleFunctionOutputPin(
        GPIO_PORT_P1,
        GPIO_PIN1,
        GPIO_SECONDARY_MODULE_FUNCTION
        );

    /*
     * Disable the GPIO power-on default high-impedance mode to activate
     * previously configured port settings
     */
    PMM_unlockLPM5();

    //Generate PWM - Timer runs in Up-Down mode
	Timer_A_outputPWMParam param = {0};
    param.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    param.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
    param.timerPeriod = TIMER_A_PERIOD;
    param.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;
    param.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;
    param.dutyCycle = DUTY_CYCLE;
    Timer_A_outputPWM(TIMER_A1_BASE, &param);

    //Enter LPM0
    __bis_SR_register(LPM0_bits);

    //For debugger
    __no_operation();
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我运行此代码(CCSv9)时、我会按照预期的那样以 P1DIR=0x02和 P1SEL1=0x02结束。

    由于以下原因、我没有获得任何输出:

    > Timer_A_outputPWM (timer_A1_base、param);

    配置 TA1.1、但 P1.1是 TA0.1。  请尝试:

    > Timer_A_outputPWM (timer_A0_BASE、param);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我运行代码(CCSv12)时、我最终的 P1DIR = 0x02、但 P1SEL1不变(0x00)、P1SEL0也不变(0x00)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这看起来很奇怪、不像我看到的那样。  

    您是否获得 PWM 输出(假设我在上面建议的更改)? 我想知道这是否是(CCS)显示问题、而不是 操作问题。

    如果您将项目创建为"使用 driverlib 源代码的空项目"、则可以在此处使用源代码、然后您可以单步执行 driverlib 函数(我记得、它非常短)以查看意外情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不会获得任何 PWM 输出(或针对此情况的任何输出)。

    我直接从资源浏览器导入了项目、然后我只需从资源浏览器中编辑代码。

    我发现的另一个意外结果是、如果我尝试直接编辑 P1SEL1寄存器、即执行 P1SEL1 |= BIT1 (与直接寄存器示例中的情况类似)、我会收到一个错误、表示"P1SEL1"未定义。 我选中了、它肯定位于.h 文件中、但出于某种原因 CCS 不会检测到它或其他内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在导入项目时遇到了一些复杂的结果(包括一些非常奇怪的伪影)。

    由于只有一个源文件、您可能会考虑创建一个新项目并将整个 main.c 的内容粘贴到它创建的 main.c 上。 这使我几次“救了”。 (我假设它是一些模糊选项、已创建到.project 文件中。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如何创建已包含 driverlib.h 的项目? 我似乎无法弄清这一点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 create-project 对话框中、向下查看底部(您可能需要滚动)以查找类似于"empty project with driverlib source (具有 driverlib 源代码的空项目)"的项目类型。 (这就是我创建 CCSv9实验的方式。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  
    我在多台计算机上尝试过不同版本的 CCS、但没有成功。 当我尝试直接更改 P1SEL1寄存器时、仍然会收到错误"P1SEL1未定义"。 当我将"GPIO_secondary 模块_function"传递到函数中时、GPIO_setPeripheralModuleFunctionOutputPin ()函数不会更改 P1SEL1位。 我应该怎么做?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否将目标处理器设置(更改)为 MSP430FR2433? (Build Settings->CCS General->Variant)注释表明原始源代码(以及项目)在 FR4133上进行了测试、并且几乎可以告诉 FR4133没有 P1SEL1寄存器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我最终能够把所有事情都整理好、并且我得到 P1.1输出一个 PWM 信号。 现在、我尝试编写一个程序、在无限循环中将占空比增加到100%、然后再降低到0%。 单步执行代码时、我很困惑 PWM 信号何时实际执行。 我逐行进行、但在我按下绿色播放按钮之前、我没有在示波器上看到 PWM 信号(我逐行步直到程序结束、从未看到 PWM 信号)。 如何使其连续循环并增加/减少占空比?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SMCLK (以及您的计时器)在您处于断点时停止。

    要更改占空比、您需要更改(在本例中) TA0CCR1的值。 Driverlib 可以使用类似的方法来实现此目的

    > Timer_A_setCompareValue (timer_A0_BASE、timer_A_CAPTURECMPARE 寄存器_1、newvalue);

    在每个 PWM 周期中、更新比较寄存器的频率比更新一次更低(通常)、因此在周期开始(A0_vector)或比较触发(A1_vector)时、在 ISR 中更新比较寄存器通常是合适的。