我正在使用 STM32F7 系列微控制器,每当内核被连接到 JTAG 接口的调试器停止时,让一些 GPIO 更改值(切换、脉冲、高阻抗等)将是最有帮助的。有人知道这样的功能吗?
问问题
579 次
1 回答
1
有DBGMCU
寄存器可以在内核停止时选择性地停止某些外围设备(主要是定时器)。
这个想法是以某种方式使计时器在运行时输出低电平信号,而在不运行时输出高电平。单个计时器无法做到这一点,但可以在主从配置中使用两个计时器。
配置TIM3
为输出具有非常高占空比的 PWM 信号,从两个周期的低电平开始,然后在其余 65536 个周期长周期内变为高电平。将其从属于 ,它以TIM2
2 个周期运行,并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 回答