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

aneox

Участник
  • Постов

    19
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о aneox

  • Звание
    Участник
    Участник
  1. нашел опечатку в коде, вместо pa14, переназначался pb14, проблема решена )
  2. @k155la3 errata первым делом глянул, ничего не углядел. Вот сейчас на второй плате проверил, тоже самое. Хотя чипы покупались в разных местах. буду искать косяк в либах, но пока ничего не нашел
  3. Помогите пожалуйста, заметил такой баг в самый последний момент, когда изделие нужно отдать. Использую stm32f303vct6, все его 4 ацп через ДМА и 32 входа(каждый отдельно). До тех пор пока не включаю защиту от чтения(хоть из программы, хоть через openocd), все работает хорошо. С активной защитой, вход №4 АЦП4, на ноге PB14 начинает показывать значения близкие к нулю(0-3 отсчета ацп) Видимо что-то подрубается к ноге или отрубается внутри чипа, но не могу найти информацию.
  4. stm32 uart kline 5baud slow init

    прерывание не срабатывает я имел ввиду, данные идут на линии, а прерывания нет. для переинита использую вот этот код kline_Serial_End(); vTaskDelay(100); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 300); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 400); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 400); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 600); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); kline_Serial_Start(); mr_smit стесняюсь спросить, неужели не видно задержки тут ? vTaskDelayUntil(&xLastWakeTime, 300); в тех двух функциях и видны таймауты по 5сек, в первых постах есть ведь код
  5. stm32 uart kline 5baud slow init

    отправку из прерывания убрал еще вчера, сегодня вот так пробую uint8_t data; if((UART4->SR & USART_SR_RXNE)) { data = UART4->DR; klineRecieveBuffer[klineRecieveIndex] = data; if (!slowInit) { if (data == 0x8F) { check_slow_init = 1; klineRecieveIndex = 0; } if (data == 0xEC) { slowInit = 1; klineRecieveIndex = 0; } return; } if (!fastInit && slowInit) { if (data == 0xBF) { fastInit = 1; klineRecieveIndex = 0; } return; } ................ и все как бы работает, но если эбу выключить и включить(типо обрыв), после 5ти таймаутов о не получении код начинается сначала и уже в прерывание уарт не входит после 5бод слоу инита, тут делаю ресет nvic reset и линк поднимается еслиб можно было без 5 бод слоу инита, я бы по вашему парился с ним?) тут только так у тойоты а на счет перемудрить с уартом, код перед вами ведь, довольно стандартный, как там перемудрить то можно а это if(USART_GetITStatus(UART4, USART_SR_ORE) == SET) проверка на прерывание переполнения аппаратного буфера и сброс флага
  6. stm32 uart kline 5baud slow init

    спасибо, но на сколько я знаю, считывания байта из UART4->DR сбросит нужный флаг, в лубом случае я бы заметил повисшее прерывание, подставил вашу строчку, ничего не изменилось
  7. stm32 uart kline 5baud slow init

    ариста, но повторюсь, на авр алгоритм работает. сейчас добавил NVIC_SystemReset(); в случае обрыва и оно как бы работает, почемуто уарт нормально запускается только после ресета(
  8. stm32 uart kline 5baud slow init

    так, ну проблема всетаки есть. обясню чтобы получить конект с эбу, нужно сначала софтово подергать ножки, потом уже аппаратно уартом. все это работает сейчас так kline_Serial_End(); vTaskDelay(100); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 300); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 400); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 400); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 600); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); kline_Serial_Start(); //после этого получаю данные в прерывании старт и енд описаны в первом посте. Все работает. Но иногда соединение рвется и нужно повторить софтовое дерганье, так вот на второй раз уже в рантайме после битбанга я в прерывание уарта не попадаю, не могу понять в чем причина. Работоспособность прерывания уарта восстанавливается только после ресета проца. при первом запуске даже так работает // kline_Serial_Start(); vTaskDelay(100); kline_Serial_End(); vTaskDelay(100); kline_Serial_Start(); // дважды переключаю, норм. vTaskDelay(100); kline_Serial_End(); vTaskDelay(100); // kline_Serial_Start(); ///а трижды уже не срабатывает прерывание // vTaskDelay(100); // kline_Serial_End(); // vTaskDelay(100); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 300); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 400); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 400); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 600); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); kline_Serial_Start(); //после этого получаю данные в прерывании
  9. stm32 uart kline 5baud slow init

    Спасибо за ответ) Просто опыта не хватает, первый раз со 105м работаю, он хотел кварц 25мгц а у мну 8, получилось что проц работал 115мгц и уарт глючил. Добавил дефайн "HSE_VALUE=8000000" и все заработало на 72мгц, сразу чето не дошло, старый код от 103 взял и все. Спасибо за внимание
  10. stm32 uart kline 5baud slow init

    Для начала диалога с автомобильным эбу нужно передать 0х13 на скорости 5бод, на авр все реализовал и прекрано работает Serial1.end(); pinMode(txPin, OUTPUT); digitalWrite(txPin, HIGH); delay(300); //W5 digitalWrite(txPin, LOW); //start bit delay(200); digitalWrite(txPin, HIGH); // 1 1 delay(400); digitalWrite(txPin, LOW); // 0 0 delay(400); digitalWrite(txPin, HIGH); // 1 delay(200); digitalWrite(txPin, LOW); // 0 0 0 delay(600); digitalWrite(txPin, HIGH); delay(200); //W1 Serial1.begin(9600); дальше все гуд терь задача сделать на 105м стме, сил моих больше нет void kline(void *pvParameters) { static TickType_t xLastWakeTime; UNUSED(pvParameters); xLastWakeTime = xTaskGetTickCount(); for(;;) { if(!ecuInit) { if (!slowInit) { kline_Serial_End(); vTaskDelay(10); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 300); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 400); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 400); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); GPIO_ResetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 600); GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelayUntil(&xLastWakeTime, 200); kline_Serial_Start(); uint32_t timeout = 0; while (!slowInit) { timeout++; if (timeout > 10)//0xAfffff) break; } if (!slowInit) { // kline_Reset_Pin(); // kline_Serial_End(); // GPIO_SetBits(GPIOC, GPIO_Pin_10); vTaskDelay(5000); slowInit = 0; // пауза и пробуем снова } } void kline_Serial_End(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); USART_DeInit(UART4); USART_Cmd(UART4, DISABLE); USART_ITConfig(UART4, USART_IT_RXNE, DISABLE); klineRecieveIndex = 0; } void kline_Serial_Start(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);//UART4 USART_DeInit(UART4); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(UART4, &USART_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(UART4, ENABLE); USART_ITConfig(UART4, USART_IT_RXNE, ENABLE); } void UART4_IRQHandler() { uint8_t data; // portBASE_TYPE xStatus; if((UART4->SR & USART_SR_RXNE)) { data = UART4->DR; klineRecieveBuffer[klineRecieveIndex] = data; if (klineRecieveIndex > 48) klineRecieveIndex = 0; else klineRecieveIndex++; if (!slowInit) { if (data == 0x8F) { Usart_Send_symbol(0x70, KLINE_UART); klineRecieveIndex = 0; } if (data == 0xEC) { slowInit = 1; klineRecieveIndex = 0; } if(USART_GetITStatus(UART4, USART_SR_ORE) == SET) { USART_ReceiveData(UART4); } } } Вообщем пару раз прилетает после первой попытки FF и все, при повторных молчок. Железка точно работает, на ноги стм тыкаю авку и она успешно коннектится к эбу. Трансивер стшный 9637 в ответ на бит банг эбу должен отвечать 55 E9 8F , но приходит FF FF, полагаю что битбанг успешно отрабатывает, проблема в приеме возможно чтото с частотами напутал, мож тут косяк подскажите void SetSysClockTo72(void) { /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------*/ /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready */ if (RCC_WaitForHSEStartUp() == SUCCESS) { FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1); RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while (RCC_GetSYSCLKSource() != 0x08) { }
  11. stm32f103 can шина

    вру я, вру GPIO_Pin_12 и GPIO_PinSource12 оказывается разные вещи, а я почем знал) мне что автодополнение подсунуло в креаторе, то я и оставил) сейчас перепишу и попробую с кан :smile3046: ЗАРАБОТАЛО :1111493779: на трех форумах кипишь навел) никто не заметил) GPIO_Pin_12 и GPIO_PinSource12 :laughing: но этот форум самый отзывчивый оказался, спасибо всем за помощь
  12. stm32f103 can шина

    на сколько я знаю в режиме лупбак наружу тх ногой должен дрыгать, а вот в режиме сайлентЛупбак полная изоляция. Вообщем выпаял трансивер, делаю так int main(void) { SystemInit(); GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_PinSource12 | GPIO_PinSource11 | GPIO_PinSource10 | GPIO_PinSource15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PinSource3 | GPIO_PinSource8 | GPIO_PinSource9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PinSource15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_PinSource12); GPIO_SetBits(GPIOA, GPIO_PinSource11); GPIO_SetBits(GPIOA, GPIO_PinSource10); GPIO_SetBits(GPIOA, GPIO_PinSource15); GPIO_SetBits(GPIOB, GPIO_PinSource3); GPIO_SetBits(GPIOB, GPIO_PinSource8); GPIO_SetBits(GPIOB, GPIO_PinSource9); GPIO_SetBits(GPIOC, GPIO_PinSource15); while (1) { } } ни на одной ноге не горит светодиод, что не так то или финит аля комедия?
  13. stm32f103 can шина

    если в режиме loopback то выставляется, tx status = ok кое что нащюпал, убрал питание с mcp2551 трансивера, ноги опустились, перевел в режим лупбак, отключил от авто, начал слать сам себе. Беру резистор 100ком, на кантх и к 3.3в, а нога то внизу, чето шлет думаю, беру резистор 4.7ком вместо сотки, и начинаю наблюдать какието импульсы на ноге, но в то же время импульсы появились и на canrx, хотя их там не должно быть. Куда копать дальше не знаю. mcp2551 питается от 5в, мож ей всетаки не хватает 3,3 импульса с стма? хотя встречал много примеров в сети использования такой связки( мож с процом чтото, нога померла или еще чего, пойду светодиод прикручу поморгаю ей
  14. stm32f103 can шина

    сегодня проверил без ремапа, затактировал RCC_APB2Periph_AFIO, результат тот же, данные получаю, отправить не могу Уже не знаю куда смотреть. Переписать все на hal или грешить на железо. Есть в наличии такие же камни только в другом корпусе, травить плату для проверки, времени много отнимет( линия rx в промежутках между импульсами тоже вверху, думаю это свободное состояние
  15. stm32f103 can шина

    Все тесты проводил с подключением к шине авто. Ноги смотрю лог анализатором на базе ардуины. На canrx отчетливо вижу импульсы. На счет того что авто не отдает ack подтверждение тоже думал. Но если всетаки пакет ушел, то должен придти ответ с данными, а его нет. Ноги никто больше не занимает. Беда прям какаято. Если бы были проблемы с шиной, getLastErrorCode давал бы 0x50 bitDominantError. Это я наблюдал в начале, потом выпаял все подтяжки на плате, там был распаян юсб, сейчас все проверено и getLastErrorCode говорит noError
×
×
  • Создать...