Top.Mail.Ru
Уведомления
Очистить все

[Решено] Прерывания stm32f429i-disco

 Alex
(@alex)
Level 1

Привет.
Хочу выразить благодарность автору статей. Очень много полезного для начинающих и не только в работе с микроконтроллерами (очень рад что есть такие люди :)).

Столкнулся с проблемой разного времени выхода на вектор прерывания. В cube установил высокий приоритет HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); у всех остальных HAL_NVIC_SetPriority(x, 0, 1);
Вот код void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
counter_time ++;
switch (counter_time)
{
case 1:
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);
break;

case 2: HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_SET); flag_1 = 1; break;

case 3: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); break;

case 4: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); counter_time =0;break;

}
}

void MX_TIM3_Init(void)
{

TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;

htim3.Instance = TIM3;
htim3.Init.Prescaler = 83;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 20;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim3);

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);

}

Смотрел осциллографом GPIO_PIN_14 stm32f429i-disco. Все болтается (разное время между импульсами. Разница составляет около 2,5 мкс ) такое ощущение что, что-то выполняет какие то операции и не дает сразу перейти на вектор но что не понятно.
Работаю в iar. Подскажите что делать ?

Цитата
Создатель темы Размещено : 16.02.2016 17:10
Aveal
(@aveal)
Top level Admin

Спасибо за хороший отзыв! =)

Вполне возможно, что HAL вносит задержку, все-таки пока контроллер доходит до callback'а там куча флагов проверяется, сбрасывается и т.д.

ОтветитьЦитата
Размещено : 17.02.2016 21:50
 Alex
(@alex)
Level 1

Разобрался в чем была проблема. Оказалось все куда проще по своей не внимательности установил не там приоритет, нужно было у tim3 HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); а у всех остальных HAL_NVIC_SetPriority(x, 1, 0); вот тогда все нормально работает.

Чтобы не создавать новой темы спрошу здесь. Как правильно сделать процесс передачи данных с hid девайса на хост? Вот сделал я устройств которое раз в минуту делает измерение и получает уравнение экс. кривой. Хочу передавать данные на компьютер и записывать эти данные в файл. Мне для этого нужно каждую минуту отправлять с хоста данные девайсу о передачи информации или есть какая возможность чтобы девайс после измерения сразу передал данные и хост смог поймать и обработать (записать в файл, набираю статистику)? Пользуюсь библиотекой hidapi работаю в wisual studio.

ОтветитьЦитата
Создатель темы Размещено : 18.02.2016 09:07
Aveal
(@aveal)
Top level Admin

Запрос не обязательно посылать, просто высылай данные с устройства, например так:

while (1)
 {
   HAL_Delay(100);
   USBD_CUSTOM_HID_SendReport(hUsbDevice_0, dataToSend, 4);
 }

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

ОтветитьЦитата
Размещено : 19.02.2016 01:57
 Alex
(@alex)
Level 1

Столкнулся с проблемой запуска hid на другом компьютере. Создал проект приема передачи по hid на своем дом компе (проект простой хост отсылает данные девайс принимает и эти же данные отсылает обратно что-то типа эха). Запустил проверил все работает пришел за другой комп. запускаю и не чего не работает. Консоль показывает пусто в приеме. Типо приняла пустой массив. Вот мой репорт:
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_HS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 1 */
0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Vendor Usage 1)
// System Parameters
0xa1, 0x01, // COLLECTION (Application)

0x19,0x01,
0x29,0x40,
0x15,0x00,
0x26,0xff,0x00,
0x75,0x08,
0x95,CUSTOM_HID_EPIN_SIZE,
0x81,0x02,

0x19,0x01,
0x29,0x40,
0x25,0x08,
0x95,CUSTOM_HID_EPIN_SIZE,
0x91,0x02,

/* USER CODE END 1 */
0xC0 /* END_COLLECTION */
};
вот код передачи hid api
hid_set_nonblocking(handle, 1);

buf[0] = 1; // В первом байте находится номер репорта
buf[1] = 'A';
buf[2] = 'B';
buf[3] = 'C';
buf[4] = 'D';
buf[5] = 'E';
res = hid_write(handle, buf, 65);
вот прием
res = 0;
while (res == 0) {
res = hid_read(handle, buf, sizeof(buf));
if (res == 0)
printf("waiting...n");
if (res < 0)
printf("Unable to read()n");
#ifdef WIN32
Sleep(500);
#else
usleep(500*1000);
#endif
}
Прием работает а передача нет. В чем может быть проблема ? Вектор прерывания по приему не вызывается.

ОтветитьЦитата
Создатель темы Размещено : 02.03.2016 11:15
Aveal
(@aveal)
Top level Admin

Посмотри какой-нибудь программой типа USBLyzer есть ли данные в линии. И если есть, то проблема в программе для ПК, если нет, то в МК.

ОтветитьЦитата
Размещено : 02.03.2016 12:31
 Alex
(@alex)
Level 1

Не работает почему-то программа на пк не передает данные.

ОтветитьЦитата
Создатель темы Размещено : 02.03.2016 15:21
 Alex
(@alex)
Level 1

Есть какие нибудь программы для проверки приема передачи hid?

ОтветитьЦитата
Создатель темы Размещено : 02.03.2016 15:22
Aveal
(@aveal)
Top level Admin

Я пользовался usblyzer

ОтветитьЦитата
Размещено : 03.03.2016 01:12
 Alex
(@alex)
Level 1

Не я про программу типо терминал в котором можно было прописать pid vid ид приемника и передатчика и передавать данные.

ОтветитьЦитата
Создатель темы Размещено : 03.03.2016 10:31
 Alex
(@alex)
Level 1

А может система как-то запрещать передачу данных с пк на hid? Просто не понятно почему пк не предает данные. Скачал тестовый пример hid api запустил и снова не передает.

ОтветитьЦитата
Создатель темы Размещено : 03.03.2016 10:35
Aveal
(@aveal)
Top level Admin

А может проблема в принимающей стороне?

ОтветитьЦитата
Размещено : 03.03.2016 14:59
 Alex
(@alex)
Level 1

Я в usblyzer не увидал строчки передачи данных с пк. usblyser

ОтветитьЦитата
Создатель темы Размещено : 03.03.2016 15:09
 Alex
(@alex)
Level 1

Вот так лучше видно

ОтветитьЦитата
Создатель темы Размещено : 03.03.2016 15:12
Aveal
(@aveal)
Top level Admin

А программы на том ПК, на котором все работало и на том, где не работает одинаковые? Какие ОС?

ОтветитьЦитата
Размещено : 03.03.2016 23:19
Поделиться: