2017-10-04 106 views
2

我使用的是STM32F7系列微控制器,当核心处于暂停状态时,有一些GPIO改变值(切换,脉冲,高-z ...)调试器连接到JTAG接口。有谁知道这样的功能?当目标暂停时,STM32切换PIN

+0

国际海事组织它不能做,因为停止核心不应该改变国家的uC。也许一些探针有一个引脚来标示它 - 但我不知道。 –

回答

1

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是很好的照亮了,当我在打暂停按钮调试器,低脉冲肉眼根本不明显。应用一个外部的low pass RC filter,使它消失时,它会影响它连接到的任何组件。使用高级定时器TIM1TIM8的Retriggerable单脉冲模式输出干净的信号也许是可能的,但我对这些信号没有任何经验。

+0

这个任务的两个定时器(包括宝贵的32位tim2),这是矫枉过正。 –

+0

它当然适用于任何可能的主从定时器对。 – berendi

+0

但我不明白为什么?在多处理器环境中停止另一个微处理器jtag有特殊的机制 –