Привет.
Хочу выразить благодарность автору статей. Очень много полезного для начинающих и не только в работе с микроконтроллерами (очень рад что есть такие люди :)).
Столкнулся с проблемой разного времени выхода на вектор прерывания. В 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. Подскажите что делать ?
Спасибо за хороший отзыв! =)
Вполне возможно, что HAL вносит задержку, все-таки пока контроллер доходит до callback'а там куча флагов проверяется, сбрасывается и т.д.
Разобрался в чем была проблема. Оказалось все куда проще по своей не внимательности установил не там приоритет, нужно было у tim3 HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); а у всех остальных HAL_NVIC_SetPriority(x, 1, 0); вот тогда все нормально работает.
Чтобы не создавать новой темы спрошу здесь. Как правильно сделать процесс передачи данных с hid девайса на хост? Вот сделал я устройств которое раз в минуту делает измерение и получает уравнение экс. кривой. Хочу передавать данные на компьютер и записывать эти данные в файл. Мне для этого нужно каждую минуту отправлять с хоста данные девайсу о передачи информации или есть какая возможность чтобы девайс после измерения сразу передал данные и хост смог поймать и обработать (записать в файл, набираю статистику)? Пользуюсь библиотекой hidapi работаю в wisual studio.
Запрос не обязательно посылать, просто высылай данные с устройства, например так:
while (1)
{
HAL_Delay(100);
USBD_CUSTOM_HID_SendReport(hUsbDevice_0, dataToSend, 4);
}
Пример грубый - отправка будет каждые 100 мс, соответственно, так же можно высылать через другие промежутки времени или по завершению сбора данных.
Столкнулся с проблемой запуска 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
}
Прием работает а передача нет. В чем может быть проблема ? Вектор прерывания по приему не вызывается.
Посмотри какой-нибудь программой типа USBLyzer есть ли данные в линии. И если есть, то проблема в программе для ПК, если нет, то в МК.
Не работает почему-то программа на пк не передает данные.
Есть какие нибудь программы для проверки приема передачи hid?
Я пользовался usblyzer
Не я про программу типо терминал в котором можно было прописать pid vid ид приемника и передатчика и передавать данные.
А может система как-то запрещать передачу данных с пк на hid? Просто не понятно почему пк не предает данные. Скачал тестовый пример hid api запустил и снова не передает.
А может проблема в принимающей стороне?
Я в usblyzer не увидал строчки передачи данных с пк.
А программы на том ПК, на котором все работало и на том, где не работает одинаковые? Какие ОС?