我使用的是STM32F7系列的微控制器,如果能改变一些GPIO的值(切换、脉冲、高z等),那将是最有帮助的。每当内核被附加到JTAG接口的调试器停止时。有没有人知道有这样一个特性?
发布于 2017-10-05 17:07:38
DBGMCU
寄存器可以在内核停止时选择性地停止某些外围设备(主要是定时器)。
这个想法是想办法让一个定时器在运行时输出一个低电平信号,在不运行时输出一个高电平信号。单个定时器不能做到这一点,但在主从配置中有两个定时器是可能的。
配置TIM3
输出一个占空比非常高的脉宽调制信号,在两个周期内从低开始,然后在其65536个周期长周期的其余时间内变为高电平。将其从属于以2周期运行的TIM2
,并在计数器溢出时重置TIM3
。因此,只要TIM2
正在运行,TIM3
就会被强制为永久低电平,但当TIM2
停止时,它将输出99.997%高的脉宽调制信号。然后,将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上有一个发光二极管,这是TIM3
通道3。当我点击调试器中的暂停按钮时,发光二极管亮得很好,低电平脉冲用肉眼根本看不到。应用外部low pass RC filter,使其在干扰连接到的任何组件时消失。也许可以使用高级定时器TIM1
或TIM8
的可重新触发的单脉冲模式输出干净的信号,但我没有任何经验。
https://stackoverflow.com/questions/46564675
复制相似问题