2017-10-04 37 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有特殊的機制 –