Other Parts Discussed in Thread: MSPM0C1104, MSPM0C1103
主题: MSPM0C1103 中讨论的其他器件
MSPM0C1104 上的 GPIO 引脚是否可以在输入(真高阻态)和输出(推挽)之间动态切换、而无需重新配置 IOMUX? 如果是、哪个 driverlib 函数可以保证引脚完全处于高阻抗状态(无保持器,无拉电阻,无漏电流)?
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.
Other Parts Discussed in Thread: MSPM0C1104, MSPM0C1103
MSPM0C1104 上的 GPIO 引脚是否可以在输入(真高阻态)和输出(推挽)之间动态切换、而无需重新配置 IOMUX? 如果是、哪个 driverlib 函数可以保证引脚完全处于高阻抗状态(无保持器,无拉电阻,无漏电流)?
我尝试用这个测试代码,但 PA27 切换不输入:
#include "ti_msp_dl_config.h"
#include <stdint.h>
#define PORTA GPIO_GRP_0_PORT
#define CP0_PIN GPIO_GRP_0_CP0_PIN // PA26 (anode LED1)
#define CP1_IOMUX GPIO_GRP_0_CP1_IOMUX // PA27 (vrije pin)
#define CP2_PIN GPIO_GRP_0_CP2_PIN // PA28 (cathode LED1)
#define CP0_IOMUX GPIO_GRP_0_CP0_IOMUX
#define CP2_IOMUX GPIO_GRP_0_CP2_IOMUX
static inline void dly(volatile uint32_t n){ while(n--) __NOP(); }
int main(void)
{
SYSCFG_DL_init();
for(;;)
{
/* ---------- ON: wissel IOMUX INPUT -> OUTPUT (glitchvrij) ---------- */
// 0) vrije pin echt vrij (kies 1 van de 2 regels)
DL_GPIO_initDigitalInput(CP1_IOMUX); // PA27 = input, no pull (SysCfg)
// DL_GPIO_initAnalog(CP1_IOMUX); // (alternatief) PA27 = Analog (zeker high-Z)
// 1) PRELOAD OUT-latch (pads nog géén output!)
DL_GPIO_clearPins(PORTA, CP2_PIN); // PA28 latch = LOW (cathode)
DL_GPIO_setPins (PORTA, CP0_PIN); // PA26 latch = HIGH (anode)
dly(50); // korte guard
// 2) IOMUX → DigitalOutput (runtime switch)
DL_GPIO_initDigitalOutput(CP2_IOMUX); // PA28 wordt nu echt LOW
DL_GPIO_initDigitalOutput(CP0_IOMUX); // PA26 wordt nu echt HIGH
dly(600000); // ~0.6 s AAN (LED1 zou nu alleen moeten branden)
/* ---------- OFF: terug naar INPUT (IOMUX terug) ---------- */
DL_GPIO_initDigitalInput(CP0_IOMUX); // PA26 terug naar input
DL_GPIO_initDigitalInput(CP2_IOMUX); // PA28 terug naar input
// (optioneel) latches wissen, heeft geen effect op inputs:
DL_GPIO_clearPins(PORTA, CP0_PIN);
DL_GPIO_clearPins(PORTA, CP2_PIN);
dly(300000); // ~0.3 s UIT
}
}
尊敬的 Diego:
好的、我尝试对引脚的每个功能更改都进行正确处理 、通过 IOMUX 进行更改 需要完全重新启动。
因此,简单的设计与 charlieplex LED 是不可用的。 我本来希望使用 MSPM0C1104。
但我不明白、引脚不可能从输出切换到输入或悬空。
我相信这应该是可能的,并产生 100 PCBA 的:(
我将您的第一个答案标记为“此解决了我的问题“ (此回答了我的问题)
谢谢、
此致、
Rob keij
#include "ti_msp_dl_config.h"
#include <stdint.h>
#define PA26_MASK DL_GPIO_PIN_26
#define PA27_MASK DL_GPIO_PIN_27
#define PA28_MASK DL_GPIO_PIN_28
static inline void dly(volatile uint32_t n){ while(n--) __NOP(); }
/* -------------------------------------------------------------- */
/* Tri-state en output helpers – alléén GPIO-registers */
/* -------------------------------------------------------------- */
static inline void make_input_hiz(uint32_t mask)
{
// maak pin input (DOE bit = 0)
GPIOA->DOE31_0 &= ~mask;
}
static inline void make_output(uint32_t mask)
{
// maak pin output (DOE bit = 1)
GPIOA->DOE31_0 |= mask;
}
/* -------------------------------------------------------------- */
/* Eén LED aansturen: A=anode, C=kathode, F=vrije pin */
/* -------------------------------------------------------------- */
static void drive_one(uint32_t A_mask, uint32_t C_mask, uint32_t F_mask, uint32_t on_ticks)
{
// alles los
make_input_hiz(PA26_MASK | PA27_MASK | PA28_MASK);
// vrije pin blijft input (high-Z)
make_input_hiz(F_mask);
// vooraf: kathode laag, anode hoog
GPIOA->DOUT31_0 &= ~C_mask;
GPIOA->DOUT31_0 |= A_mask;
// outputs activeren
make_output(C_mask);
make_output(A_mask);
dly(on_ticks);
// terug los
make_input_hiz(A_mask | C_mask);
}
/* -------------------------------------------------------------- */
/* main – sequentieel alle zes LED-combinaties */
/* -------------------------------------------------------------- */
int main(void)
{
SYSCFG_DL_init();
while (1)
{
drive_one(PA26_MASK, PA28_MASK, PA27_MASK, 500000); // L1
drive_one(PA27_MASK, PA28_MASK, PA26_MASK, 500000); // L2
drive_one(PA26_MASK, PA27_MASK, PA28_MASK, 500000); // L3
drive_one(PA28_MASK, PA26_MASK, PA27_MASK, 500000); // L5
drive_one(PA28_MASK, PA27_MASK, PA26_MASK, 500000); // L6
drive_one(PA27_MASK, PA26_MASK, PA28_MASK, 500000); // L7
dly(300000);
}
}