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

STM32 для чайника


ART_ME

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Опять странности.)

Точнее моя не догоняет...

Подключил счетчик воды с датчиком холла. Настроил прерывания на PA1 режим по умолчанию Rising

Кручу счетчик считаю импульсы анализатором и смотрю что считает контроллер... и офигеваю)) контроллер считает в 7 раз больше чем было импульсов по анализатору.

Что то делаю не так.

Считаю импульсы 

void EXTI1_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI1_IRQn 0 */

  /* USER CODE END EXTI1_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  /* USER CODE BEGIN EXTI1_IRQn 1 */
		counter++;
		
  /* USER CODE END EXTI1_IRQn 1 */
}

или так 

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == COUNT_Pin) {
		counter++;
		
	}
}

Результат одинаковый.

Как надо считать правильно?

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

7 минут назад, Alex сказал:

только суффикс.

Попробовал суффикс Y - тоже не получилось.

Работает только с hex.

2 часа времени потеряны на ровном месте. При том, что префикс 0b прекрасно работал в Atmel Studio 7 и в Code Composer Studio 6.

Век живи - век учись.

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

Только что, Вуйко сказал:

MihaNN52

А сброс флага прерывания где? Может за время между импульсами прерывание, как раз, еще 6 лишних раз вызывается?

скорее всего все так оно и есть... как сбросить этот флаг?

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

В регистре EXTI_PR записать "1" в бит соответствующий выводу, на котором используется прерывание. Например как-то так:

EXTI->PR |= EXTI_PR_PR1;

 

Снимок.JPG

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

 я правильно понял?

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{

	if(GPIO_Pin == COUNT_Pin) {
		counter++;
		printf("%d\r\n" , counter);
		__HAL_GPIO_EXTI_CLEAR_IT(COUNT_Pin);
	
	} 
}

Изменений нет. Подключил счетчик к есп, он работает исправно.

дописал сюда 

void EXTI1_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI1_IRQn 0 */

  /* USER CODE END EXTI1_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  /* USER CODE BEGIN EXTI1_IRQn 1 */
		
	if(__HAL_GPIO_EXTI_GET_IT(COUNT_Pin) != RESET) 
  { 
    __HAL_GPIO_EXTI_CLEAR_IT(COUNT_Pin);
    HAL_GPIO_EXTI_Callback(COUNT_Pin);
  }
  /* USER CODE END EXTI1_IRQn 1 */
}

из колбека убрал __HAL_GPIO_EXTI_CLEAR_IT(COUNT_Pin);

так же не помогло...

Изменено пользователем MihaNN52
Ссылка на комментарий
Поделиться на другие сайты

MihaNN52

Можно просто прочитать PR в переменную и передать на ПК через отладочный print, а там уже проанализировать.

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

Но лучше, все таки, разобраться с отладчиком. В Keil и IAR он с минимумом усилий запускается, если Eclipse + OpenOCD - то как повезет: может сразу начать работать, а может потребоваться дополнительная настройка.

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

@Darth_Vader  попробуй функции HAL_I2C_Mem_Write()  HAL_I2C_Mem_Read()  без каких либо флагов и прочего

 у меня какого то рожна зависает шина часов через 5 работы МК, но я пока думаю что это подтяжка в модуле не та, ее с осциллографом подбирать чтоб фронты ровные были

Изменено пользователем MihaNN52
Ссылка на комментарий
Поделиться на другие сайты



@Darth_Vader  попробуй функции HAL_I2C_Mem_Write()  HAL_I2C_Mem_Read()  без каких либо флагов и прочего


Что интересно - у меня DS1307 на AVR с софтовым I²C заводится с пол-пинка, а на STM32F103 клин да палка

Отправлено с моего NEM-L51 через Tapatalk

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

55 минут назад, Darth_Vader сказал:

Подскажите, а правда, что это не я криворукий, а аппаратный i2c в stm32f103 нормально не работает?

Скорее первое, чем второе, увы :(
Вы лучше расскажите, что не так.

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

В результате HAL_I2C_Master_Transmit(&hi2c1, (DS1307_ADDR), 0, 1, 1000);

получаю HAL_ERROR c кодом HAL_I2C_ERROR_AF

Скрытый текст

 


	LCD_Init();
	LCD_Clear();
	HAL_StatusTypeDef result;
	result = HAL_I2C_Master_Transmit(&hi2c1, (DS1307_ADDR), 0, 1, 1000);
	LCD_GoTo(0,0);	
	if(result != HAL_OK)
	{
		switch(result){
			case HAL_ERROR:
				LCD_PrintStr("HAL_ERROR    ");
				break;
			case HAL_BUSY:
				LCD_PrintStr("HAL_BUSY     ");
				break;
			case HAL_TIMEOUT:
				LCD_PrintStr("HAL_TIMEOUT  ");
				break;
		}
		uint32_t err;
		err = HAL_I2C_GetError(&hi2c1);
		LCD_GoTo(1,0);
		switch(err){
			case	HAL_I2C_ERROR_NONE:
				LCD_PrintStr("HAL_I2C_ERROR_NONE   ");
				break;
			case HAL_I2C_ERROR_BERR:
				LCD_PrintStr("HAL_I2C_ERROR_BERR   ");
				break;
			case HAL_I2C_ERROR_ARLO:
				LCD_PrintStr("HAL_I2C_ERROR_ARLO   ");
				break;
			case HAL_I2C_ERROR_AF:
				LCD_PrintStr("HAL_I2C_ERROR_AF     ");
				break;
			case HAL_I2C_ERROR_OVR:
				LCD_PrintStr("HAL_I2C_ERROR_OVR    ");
				break;
			case HAL_I2C_ERROR_DMA:
				LCD_PrintStr("HAL_I2C_ERROR_DMA    ");
				break;
			case HAL_I2C_ERROR_TIMEOUT:
				LCD_PrintStr("HAL_I2C_ERROR_TIMEOUT");
				break;
		}

 

 

 

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

<<1 адрес сдвинь

HAL_I2C_Master_Transmit(&hi2c1, DS1307_ADDR <<1, 0, 1, 1000);

 

эта ошибка означает....внимание.... смотрим в документацию...

59f1b46fd7383_26-10-2017131538.jpg.b85e4a643cd40af0edc4d0b4963f45f0.jpg

Верно AF error. А что это? да ктож знает)))

Изменено пользователем MihaNN52
Ссылка на комментарий
Поделиться на другие сайты

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

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