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

STM32 HAL IRQHandler


homeniuk

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

Добрый день!

Пишу свой код в файлах .h и подключаю их в main.c

все норм, включаю в main.c CallBack для SPI - прерывание работает и обрабатывается

Но если хочу обаратывать прерывания от таймера, то TIM2_IRQHandler находится в другом файле и там моих функций и переменных не видно

Помогите разобраться, бо в интернете примеры на уровне TooglePIn

Мне нужно для таймера и для DMA

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

17 минут назад, homeniuk сказал:

Добрый день!

Пишу свой код в файлах .h и подключаю их в main.c

 

В хэдерах не должно быть кода и вообще сущностей , только объявление функций , констант и extern переменных.

Пишите тело функции в исходнике(*.с) объявляйте в хэдере , подключайте хэдер в исходнике с прерыванием и вызывайте функцию.

Одно но - захламление хэндлеров вызовом функций ( читай колбэки) - есть моветон, что прекрасно демонстрирует калокуб своей бесполезностью.

Проще и действенней глобальные флаги ...

Цитата

Мне нужно для таймера и для DMA

Что конкретно хотите изобразить? И на каком камне...

 

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

21 минуту назад, dosikus сказал:

Что конкретно хотите изобразить? И на каком камне...

 

На STM32F103, нужно по таймеру пустить внешнее АЦП и изменить пару переменных

А вот для DMA хочу прием передача по I2C и про приему запускать функцию обработки

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

Первое делается элементарно, вопросов не возникнет. Внешнее ADC висит на SPI?

I2c в F1 весьма глючный. 

Транзакции DMA - прием с i2c -обработка- отправка на i2c , я правильно понял - вы ваяете slave?

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

46 minutes ago, homeniuk said:

Добрый день!

Пишу свой код в файлах .h и подключаю их в main.c

все норм, включаю в main.c CallBack для SPI - прерывание работает и обрабатывается

Но если хочу обаратывать прерывания от таймера, то TIM2_IRQHandler находится в другом файле и там моих функций и переменных не видно

Помогите разобраться, бо в интернете примеры на уровне TooglePIn

Мне нужно для таймера и для DMA

.С файлы обычно используются для самого кода, а .Н файлы - для связки этих С файлов. То есть в С файле вы пишете саму функцию  (реализацию), а в h файле - только ее обьявление (имя), а потом этот h файл включаете (с помощью #include)  в другие .c файлы, где эту функцию хотите вызвать. Получается что другие .c файлы видят обьявление вашей функции, но реализация по прежнему одна (в одном из c файлов).

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

1. Запуск SPI легко, но не умею к переменным обратиться сейчас перепишу на .h external а там видно будет

2. А на F4 I2C тоже глючной? Хочу хранить информацию в EEPROM (I2C)  или мож взять EEPROM (SPI) ?

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

4 minutes ago, dosikus said:

I2c в F1 весьма глючный. 

А что именно глючного в hal в f103? Показалось что учтены и обойдены все ошибки (по сравнению с сырой реализацией на spl), по крайней мере все заработало сразу как перешел на хал

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

6 минут назад, bobbjenkins сказал:

А что именно глючного в hal в f103? Показалось что учтены и обойдены все ошибки (по сравнению с сырой реализацией на spl), по крайней мере все заработало сразу как перешел на хал

Я взял EEPROM Atmel AT24C256C-SSHL-T и от ST 24C32N  - первая 2 из 10 сработала (чего то цена на нее дешевая) а вот от ST работала каждый раз на F103

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

У меня i2c устройство сбоило, пока не добавил небольшую задержку после включения МК перед началом передачи данных. Не знаю с чем это связано, наверное не успевало проинициализироваться (как только питание подавалось я отправлял первую и2с команду).

Теперь работает без проблем.

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

21 минуту назад, bobbjenkins сказал:

.С файлы обычно используются для самого кода, а .Н файлы - для связки этих С файлов. То есть в С файле вы пишете саму функцию  (реализацию), а в h файле - только ее обьявление (имя), а потом этот h файл включаете (с помощью #include)  в другие .c файлы, где эту функцию хотите вызвать. Получается что другие .c файлы видят обьявление вашей функции, но реализация по прежнему одна (в одном из c файлов).

А в каком месте объявить глобальую переменную и присвоить значение, или лучше присваивать через функцию.

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

Переменная определяется в одном из .c файлов (int a, например), а в .h файле (или можно напрямую в других .c файлах) пишется "extern int a" - так она становится видна остальным .с файлам.

Присваивать где хотите. Или при обьявлении (если значение заранее известно), или из другой функции (если сложная инициализация вызовом функции).

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

35 минут назад, homeniuk сказал:

А в каком месте объявить глобальую переменную и присвоить значение, или лучше присваивать через функцию.

Ну да, для многих глобальное моветон, но в случае с прерываниями иногда единственный выход.

Главное не забудьте объявить ее как volatile , сие укажет компилятору что данная переменная может быть изменена  и не стоит ее х****ить.

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

3 минуты назад, dosikus сказал:

что данная переменная может быть изменена

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

Вы раздаете очень много поверхностных советов практически как будто гуру STM. А что именно глючит в I2C так и не удосужились пояснить, но уверенно об этом заявили. Теперь кто-то будет думать так же.

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

 

Вы раздаете очень много поверхностных советов практически как будто гуру STM. А что именно глючит в I2C так и не удосужились пояснить, но уверенно об этом заявили. Теперь кто-то будет думать так же.

Вы о качестве советов со своей колокольни заценяете? А лавры "гуру" пусть остаются за вами, я на них не претендую...

I2C в F1 глючный и это факт, подробности изучайте в eerata.

В F4 улучшен но не намного. в F0 изменен кардинально и это радует...

 

Зы . да и кстати вся линейка F1 скоро пустят под нож. Китайцы  своим GD32 завалят рынок

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

1 час назад, dosikus сказал:

захламление хэндлеров вызовом функций ( читай колбэки) - есть моветон

далеко не всегда. Бывает что надо обеспечить некоторый функционал сразу по прерыванию, чтобы не потерять данные. Например переключить буфер приема, а потом уже обрабатывать данные по глобальному флагу. Просто каждому инструменту свое место. При чем тут моветоны?

1 минуту назад, dosikus сказал:

I2C в F1 глючный и это факт,

а своими словами слабО? Я то errata изучал, но не все туда будут заглядывать

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

3 минуты назад, mail_robot сказал:

 

а своими словами слабО? Я то errata изучал, но не все туда будут заглядывать

Я на слабо не ведусь с детского сада.

Если вам нужен перевод еерата - будет время и желание и главное спрос, переведу и выложу.

Но для меня F1  более не интересен.

Если хотца, могу недавнюю писанину рассчетов PLL и таймингов i2c для F4 скинуть в личку ...

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

5 минут назад, dosikus сказал:

Если хотца, могу недавнюю писанину рассчетов PLL и таймингов i2c для F4 скинуть в личку ...

совершенно не интересно

По поводу I2C не трудитесь. В целом он отлично работает. Глюки возникают только при весьма специфических условиях, которые на практике воссоздать не так то просто, если не знаешь заранее. В HAL эти все особенности учтены и для рядового пользователя совершенно незаметны.

Я не защищаю ST. Модуль I2C у них действительно криво вышел, но обычно его вполне достаточно. Спасибо что хоть есть

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

mail_robot, я вообще-то речь веду о F1. 

А о "учтении особенностей" в калокубе просто смешно слышать, впрочем дискутировать на тему вашего идола с вами не собираюсь.

Свистоперделки в виде калокуба нужны только тем кто не в состоянии осознать железо.

Любая периферия достаточно  легко конфигурируется ручками.

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

тон очень менторский, прямо располагает к диалогу. Однако свою точку зрения не поменял - все ваши рассуждения и советы по прежнему выглядят весьма поверхностными

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Раскидал код по .h .c файлам - переменные в 1.h, обьявление функций в 2.h  и оба закинул в all.h - и его подключаю в main.c и function.c

В main.c  вызваю функцию из function.c , собираю прогу но пишет что  multiply defined (by function.o and main.o).

Я переделал переменные на extern и новая ошибка

M_2_c\M_2_c.axf: Error: L6218E: Undefined symbol B_off (referred from function.o).

Сделал extern volatile  ничего не поменялось.

Можете подсказать че за ошибка?

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

5 минут назад, homeniuk сказал:

собираю прогу но пишет что  multiply defined

при таких сообщениях не лишним было бы добавить в .h защиту от рекурсивного подключения

ifndef __HEADER.h

define __HEADER.h

ваш код

endif

ну и лучше все в одном файле .h писать. Меньше будет проблем с областями видимости и структурой программы

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

файл extfile.c

#include "extfile.h"
int extvar;
float extfunc(int x){ return x*extvar; }

файл extfule.h

#ifndef EXTFILE_H
#define EXTFILE_H

extern int extvar;
extern float extfunc(int);

#endif

файл main.c

#include "extfile.h"
int main(){
  extval = 1;
  extfunc(2);
  return 0;
}

Компилировать отдельно extfile.c и main.c в объектные файлы, потом слинковать, например, так

gcc extfile.c -c extfile.o
gcc main.c -c main.o
gcc -o res extfile.o main.o

Ну либо можно тоже самое настроить в Makefile или среде разработки (там это делается добавлением *.c файлов в проект)

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

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

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

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

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

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

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

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

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

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

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