2

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

4

1 回答 1

1

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

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

配置TIM3为输出具有非常高占空比的 PWM 信号,从两个周期的低电平开始,然后在其余 65536 个周期长周期内变为高电平。将其从属于 ,它以TIM22 个周期运行,并TIM3在计数器溢出时重置。因此,TIM3只要TIM2运行就被强制永久低,但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 滤波器,使其在干扰它所连接的任何组件时消失。TIM1使用高级定时器或的可重触发单脉冲模式可能会输出干净的信号TIM8,但我对这些没有任何经验。

于 2017-10-05T09:07:38.407 回答