STM32 Переключить PIN-код, когда цель остановлена

Я использую микроконтроллеры серии STM32F7, и было бы очень полезно иметь какое-либо значение изменения GPIO (либо переключать, пульс, и высокий z,...), когда ядро останавливается отладчиком, подключенным к интерфейсу JTAG. Кто-нибудь знает о такой возможности?

1 ответ

Существуют DBGMCU, которые могут выборочно останавливать определенные периферийные устройства (в основном таймеры), когда ядро остановлено.

Идея состоит в том, чтобы каким-то образом заставить таймер выдать сигнал низкого уровня во время его работы и высокий уровень, если это не так. Один таймер не может этого сделать, но это возможно с двумя таймерами в конфигурации ведущий-ведомый.

Настройте TIM3 для вывода сигнала ШИМ с очень высоким рабочим циклом, начиная с низкого уровня в течение двух циклов, а затем оставаясь высоким для остальной части 65536 циклов. TIM2 его к TIM2, который работает с периодом 2 цикла и сбрасывает TIM3 при переполнении счетчика. Таким образом, TIM3 принудительно перегружается до тех пор, пока TIM2 работает, но при выходе из TIM2 он выдаст сигнал с высокой 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 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. Светодиод хорошо загорается, когда я нажимаю кнопку suspend в отладчике, низкий импульс не заметным невооруженным глазом. Примените внешний RC-фильтр нижних частот, чтобы он исчез, когда он беспокоит любой компонент, к которому он подключен. Возможно, вы получите чистый сигнал, используя режим повторного запуска одного импульса для расширенных таймеров TIM1 или TIM8, но у меня нет опыта с ними.

licensed under cc by-sa 3.0 with attribution.