STM32 在目标停止时切换 PIN



我使用的是STM32F7系列微控制器,每当内核被连接到JTAG接口的调试器停止时,有一些GPIO变化值(切换,脉冲,高z等)将是最有帮助的。有人知道这样的功能吗?

DBGMCU寄存器,它可以在内核停止时选择性地停止某些外设(主要是定时器)。

这个想法是以某种方式使计时器在运行时输出低电平信号,在不运行时输出高电平信号。单个计时器无法做到这一点,但在主从配置中使用两个计时器是可能的。

TIM3配置为输出具有非常高占空比的PWM信号,从低电平开始两个周期,然后在其余的65536周期中长时间变为高电平。将其从属到TIM2,以 2 个周期运行,并在计数器溢出时重置TIM3。因此,只要TIM2正在运行,TIM3就会被强制永久低电平,但是当TIM2停止时,它将输出99.997%高的PWM信号。然后TIM2配置为在内核被调试器停止时停止,但TIM3继续运行。

RCC->AHBENR |= RCC_AHBENR_GPIOBEN; // enable peripheral clocks, that might be different on your board
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN;
// consult your datasheet for the right AF value
GPIOB->AFR[0] = (GPIOB->AFR[0] & ~GPIO_AFRL_AFRL0) | 2; // set PB0 to Alternate Function 2, TIM3
GPIOB->MODER = (GPIOB->MODER & ~GPIO_MODER_MODER0) | GPIO_MODER_MODER0_1; // set PB0 to Alternate Function
DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_TIM2_STOP; // stop TIM2 when core is stopped
DBGMCU->APB1FZ &= ~DBGMCU_APB1_FZ_DBG_TIM3_STOP; // but don't stop TIM3
TIM2->ARR = 1;                  // master timer period
TIM2->CR2 = TIM_CR2_MMS_1;      // master mode selection MMS=010 Update event
TIM2->CR1 = TIM_CR1_CEN;        // enable timer 2
TIM3->ARR = 65535;              // PWM period
TIM3->CCR3 = 2;                 // channel 3 PWM duty cycle
TIM3->CCMR2 = TIM_CCMR2_OC3M;   // set channel 3 to PWM mode 2
TIM3->CCER = TIM_CCER_CC3E      // enable channel 3 compare output
/* | TIM_CCER_CC3P */;  // it's possible to invert output polarity
TIM3->SMCR = TIM_SMCR_TS_0      // trigger selection TS=001 ITR1 = TIM2 is master
| TIM_SMCR_SMS_2;       // slave mode SMS=100 reset mode
TIM3->CR1 = TIM_CR1_CEN;        // enable timer 3

我没有 F7,它在我的STM32L151板上运行,碰巧在 PB0 上有一个 LED,这是TIM3通道 3。当我点击调试器中的挂起按钮时,LED 亮得很好,肉眼根本察觉不到低脉冲。应用外部低通RC滤波器,使其在干扰所连接的任何组件时消失。可以使用高级定时器TIM1TIM8的可重新触发一个脉冲模式输出干净的信号,但我对这些没有任何经验。

最新更新