Перейти к содержанию
    

Сломал мозг! STM32F107VCT6

Сломал весь мозг!

 

Есть процессор STM32F107VCT6

 

Светодиод на PE0 (выход)

Кнопка на PC13 (вход)

 

Делаю простою программу:

 

При замыкании кнопки на землю зажигаем светодиод (код ниже),

 

Но после программирования нога PC13 притянута к нулю!

Но на осциллографе видно, что ее притянуло к 0.

При этом внешне нога PC13 через внешний резистор 4к7 подтянута на +3.3

 

Если отключить питание и снова включить, то будет нормально - на ней уже будет +3.3

 

Парадокс, что только на этой ноге такие чудеса.

 

Уже все перепробовал. Есть подозрение, что как-то связанно с SWO/JTAG

 

Что это? и почему именно с этой ножкой такие чудеса? пробовали на разных платах и макетках разных производителей - одно и тоже!

 

 

#include "main.h"
#include "stm32f1xx_hal.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{

 HAL_Init();

 SystemClock_Config();

 MX_GPIO_Init();

 while (1)
 {
	if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) 
	{		 
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_RESET); 
	} 
	else 
	{
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_SET);
	}		
 }
}

void SystemClock_Config(void)
{

 RCC_OscInitTypeDef RCC_OscInitStruct;
 RCC_ClkInitTypeDef RCC_ClkInitStruct;

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
 RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV5;
 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 RCC_OscInitStruct.Prediv1Source = RCC_PREDIV1_SOURCE_PLL2;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
 RCC_OscInitStruct.PLL2.PLL2State = RCC_PLL2_ON;
 RCC_OscInitStruct.PLL2.PLL2MUL = RCC_PLL2_MUL8;
 RCC_OscInitStruct.PLL2.HSEPrediv2Value = RCC_HSE_PREDIV2_DIV5;
 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 {
_Error_Handler(__FILE__, __LINE__);
 }

 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
						  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
 {
_Error_Handler(__FILE__, __LINE__);
 }

 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 __HAL_RCC_PLLI2S_ENABLE();

 HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

static void MX_GPIO_Init(void)
{

 GPIO_InitTypeDef GPIO_InitStruct;

 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOE_CLK_ENABLE();

 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_RESET);

 GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_3;
 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

 GPIO_InitStruct.Pin = GPIO_PIN_3;
 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 GPIO_InitStruct.Pin = GPIO_PIN_0;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}

void _Error_Handler(char * file, int line)
{
 while(1) 
 {
 }
}

#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{

}

#endif

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проанализируйте этот код:

 

    // PC13, PC14 and PC15 as the common IO:
    RCC->APB1ENR |=  RCC_APB1ENR_BKPEN;     // включить тактирование Backup interface
    __DSB();

    if (1)
    {
        PWR->CR |= PWR_CR_DBP; // cancel the backup area write protection  
        RCC->BDCR &= ~ RCC_BDCR_LSEON; // close external low-speed oscillator, PC14, PC15 as ordinary IO  
        BKP->CR &= ~ BKP_CR_TPE; // TAMPER pin; intrusion detection (PC13) used as a universal IO port  
        PWR->CR &= ~ PWR_CR_DBP; // backup area write protection </span> 
    }
    RCC->APB1ENR &=  ~ RCC_APB1ENR_BKPEN;     // выключить тактирование Backup interface
    __DSB();

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно по подробнее для меня идиота ) Плиз

Изменено пользователем IgorKossak
бездумное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там всего пять строчек... Тогда просто вставьте в инициализацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...