Jump to content

    

Ekka

Участник
  • Content Count

    191
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Ekka

  • Rank
    Частый гость

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

1391 profile views
  1. EmWin STM32F429 Таймер

    Привет всем. Снова поднимаю тему. Кто-то делал спрайты на STEmwin keil HAL? Может кто-нибудь скинуть рабочий пример? Очень надо. Спрайты почему-то не работают. В CooCox все прекрасно отрабатывает. Анимация движется. В KEIL с HAL лажа полная, спрайт отображается, но не двигается. Ребята, кому не жалко, поделитесь рабочим примером.
  2. очень смешно) имею ввиду, почему может не зашивать в память? страницы не залочены
  3. Привет, снова сижу с этим проектом. Как думаете, почему программа из беремиза "шьет" в память через загрузчик, а по факту программы в памяти нет?
  4. SPI 74HC595 x 2

    Спасибо всем, кто отвечал. Сделано ногодрыгом. Так понятней и быстрее работает. может, кому пригодиться - вот #define DATA_PIN GPIO_PIN_7 #define LATCH_PIN GPIO_PIN_4 #define CLOCK_PIN GPIO_PIN_5 #define INP_PIN GPIO_PIN_6 #define PORT GPIOA #define LATCH_LOW() HAL_GPIO_WritePin(PORT, LATCH_PIN, GPIO_PIN_RESET) #define LATCH_HIGH() HAL_GPIO_WritePin(PORT, LATCH_PIN, GPIO_PIN_SET) #define DATA_LOW() HAL_GPIO_WritePin(PORT, DATA_PIN, GPIO_PIN_RESET) #define DATA_HIGH() HAL_GPIO_WritePin(PORT, DATA_PIN, GPIO_PIN_SET) #define CLOCK_LOW() HAL_GPIO_WritePin(PORT, CLOCK_PIN, GPIO_PIN_RESET) #define CLOCK_HIGH() HAL_GPIO_WritePin(PORT, CLOCK_PIN, GPIO_PIN_SET) void sendData_74hc595(uint16_t data) { LATCH_LOW(); for(int i=0; i<16; i++) { if(((data >> i) & 0x01) == 1) DATA_HIGH(); else DATA_LOW(); CLOCK_LOW(); CLOCK_HIGH(); } LATCH_HIGH(); } uint16_t receiveData_74hc595(void) { uint16_t receive_data = 0; LATCH_HIGH(); for(int i=0; i<16; i++) { CLOCK_LOW(); if(HAL_GPIO_ReadPin(PORT, GPIO_PIN_6) == 1) receive_data = receive_data |1 << (15-i); CLOCK_HIGH(); } return receive_data; } void init_74hc595(void) { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = LATCH_PIN|CLOCK_PIN|DATA_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(PORT, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(PORT, LATCH_PIN, GPIO_PIN_SET); } Правда, здесь прием сделан на предмет просто того 0 или есть данные на ноге (так по задаче) отправка работает без ошибок, а вот прием вроде должен быть с той же А7 (у меня нужна 6 нога - так требуется), исправьте, если есть ошибки
  5. SPI 74HC595 x 2

    Здравствуйте, возник такой вопрос. У меня соединены две микросхемы 74hc595, первая отвечает за выбор сегментов семисегментного индикатора, вторая - за выбор позиции (DIG1 или DIG2). По идее, нужно отправить по SPI 2 байта. Первый байт - указываем позицию dig (1 или 2), второй байт - сегменты. Передача старшим битом вперед. Не могу понять, как нужно переслать эти два байта. Сначала один байт, потом сразу второй и защелкнуться? Или как-то по-другому? код-говно. Но пока, все, что есть. Глупый вопрос, наверное, но все же. while(1) { CS_SET(); mas[0] = 0x01; mas[1] = 0x07; HAL_SPI_Transmit(&hspi1, mas, 2, 5000); while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY); CS_STROB(); HAL_Delay(500); CS_SET(); mas[0] = 0; mas[1] = 0; HAL_SPI_Transmit(&hspi1, mas, 2, 5000); while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY); CS_STROB(); HAL_Delay(500); CS_SET(); mas[0] = 0x10; mas[1] = 0x07;; HAL_SPI_Transmit(&hspi1, mas, 2, 5000); while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY); CS_STROB(); HAL_Delay(500); }
  6. А кто-то может кинуть ссылку на документацию? документацию на libopencm3
  7. И вопрос не в тему, а по пути... собираю проект, о котором речь шла выше, и не могу потом в точки останова войти, CodeBlock их не видит как бы, не останавливается, а выполняет всю программу. Путь до Дебаггера прописан, в чем может быть проблема? Может, кто сталкивался, в инете все перерыла, ни один способ не помогает. 1. Перестройка проекта (не помогло) 2. Установка флага -g не помогает в настройках проекта и глобальных. 3. Проект пытаюсь отдалить с опцией Debug а не Release (ну так и было, в принципе). Все это не помогло. Как начать отлаживать с точками останова?
  8. Привет всем) Возникла такая потребность, как реализовать modbusmaster на библиотеке libopencm3 (не спрашивайте, зачем, надо). Пытаюсь настроить мастера, но пока безрезультатно, не работает. Может, кто-то настраивал модбас подобной библиотекой и сможет кинуть примерчик?
  9. У меня поле hcan Lock встает в единицу, когда все виснет, потом вишу в этом самом ожидании таймаута или т.п. Скажите, а как решили проблему того, что HAL лочится, а назад нет? Чисто вручную отлочить HAL? версия HAL 1.0.4 У меня отправка идет отлично, а вот прием пакетов чуть пойдет, и виснет, или сразу виснет...
  10. Здравствуйте, битый день сижу с одной проблемой. Есть у меня CAN, заинициализированный от HAL (знаю, HAL - та еще ...рень, но требования). Через какое-то время происходят куча ошибок отправки и CAN виснет от переполнения ошибок отправки. Точнее он уходит в ожидание, переменная системного таймера uwTick, используемая в CAN_TRANSMIT перестает меняться и все виснет. вишу в этой функции HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout) { uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX; uint32_t tickstart = 0; /* Check the parameters */ assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE)); assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR)); assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC)); /* Process locked */ __HAL_LOCK(hcan); if(hcan->State == HAL_CAN_STATE_BUSY_RX) { /* Change CAN state */ hcan->State = HAL_CAN_STATE_BUSY_TX_RX; } else { /* Change CAN state */ hcan->State = HAL_CAN_STATE_BUSY_TX; } /* Select one empty transmit mailbox */ if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME0)) { transmitmailbox = 0; } else if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME1)) { transmitmailbox = 1; } else if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME2)) { transmitmailbox = 2; } else { transmitmailbox = CAN_TXSTATUS_NOMAILBOX; } if (transmitmailbox != CAN_TXSTATUS_NOMAILBOX) { /* Set up the Id */ hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ; if (hcan->pTxMsg->IDE == CAN_ID_STD) { assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId)); hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << CAN_TI0R_STID_BIT_POSITION) | hcan->pTxMsg->RTR); } else { assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId)); hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << CAN_TI0R_EXID_BIT_POSITION) | hcan->pTxMsg->IDE | hcan->pTxMsg->RTR); } /* Set up the DLC */ hcan->pTxMsg->DLC &= (uint8_t)0x0000000F; hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0; hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC; /* Set up the data field */ WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR, ((uint32_t)hcan->pTxMsg->Data[3] << CAN_TDL0R_DATA3_BIT_POSITION) | ((uint32_t)hcan->pTxMsg->Data[2] << CAN_TDL0R_DATA2_BIT_POSITION) | ((uint32_t)hcan->pTxMsg->Data[1] << CAN_TDL0R_DATA1_BIT_POSITION) | ((uint32_t)hcan->pTxMsg->Data[0] << CAN_TDL0R_DATA0_BIT_POSITION) ); WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR, ((uint32_t)hcan->pTxMsg->Data[7] << CAN_TDL0R_DATA3_BIT_POSITION) | ((uint32_t)hcan->pTxMsg->Data[6] << CAN_TDL0R_DATA2_BIT_POSITION) | ((uint32_t)hcan->pTxMsg->Data[5] << CAN_TDL0R_DATA1_BIT_POSITION) | ((uint32_t)hcan->pTxMsg->Data[4] << CAN_TDL0R_DATA0_BIT_POSITION) ); /* Request transmission */ SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ); /* Get timeout */ tickstart = HAL_GetTick(); /* Check End of transmission flag */ while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox))) { /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout)) { hcan->State = HAL_CAN_STATE_TIMEOUT; /* Process unlocked */ __HAL_UNLOCK(hcan); return HAL_TIMEOUT; } } } if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX) { /* Change CAN state */ hcan->State = HAL_CAN_STATE_BUSY_RX; /* Process unlocked */ __HAL_UNLOCK(hcan); } else { /* Change CAN state */ hcan->State = HAL_CAN_STATE_READY; } /* Process unlocked */ __HAL_UNLOCK(hcan); /* Return function status */ return HAL_OK; } else { /* Change CAN state */ hcan->State = HAL_CAN_STATE_ERROR; /* Process unlocked */ __HAL_UNLOCK(hcan); /* Return function status */ return HAL_ERROR; } } в строке .... /* Get timeout */ tickstart = HAL_GetTick(); /* Check End of transmission flag */ while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox))) { /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout)) { ...} может, кто-нибудь знает, почему N-го количества отправок CAN виснет, и отчего эти ошибки отправки могут возникать.
  11. EmWin STM32F429 Таймер

    Здравствуйте, что правда, никто не знает...( весь код уже перекопан, а оно не хотит. Хоть скажите куда копать?
  12. EmWin STM32F429 Таймер

    То есть получается один раз после выполнения GUI_Exec() оно дрыгается (одно движение из анимации) и больше не хочет. Инициализируют так hSprite= GUI_SPRITE_CreateAnim(apbmvent_anim, 200, 100, 0, aDelayvent_anim, GUI_COUNTOF(apbmvent_anim)); Сам спрайт создаю с помощью BMP Converter от GUI
  13. EmWin STM32F429 Таймер

    Спасибо за ответы, сделано. Есть такой вопрос, может, знает кто-нибудь, почему анимационный спрайт только один раз прокручивается (одно изображения из 20 для анимации) и виснет?
  14. EmWin STM32F429 Таймер

    Другой вопрос по GUI - Как задать Font для шапки таблицы. Компонент LISTVIEW. Для строк таблицы задается без проблем. А вот для шапки не могу найти функцию. Когда задаешь общий Font для всего LISTVIEW для шапки почему-то не задается. Кто-нибудь, подскажите, в чем может быть проблема, или какую функцию вызывать?
  15. EmWin STM32F429 Таймер

    Делаю иначе: hWin и hTimer вынесены в глобальные переменные. В main пишу hWin = CreateWindow();//создаем окно hTimer = WM_CreateTimer(hWin,0,100,0);//создаем таймер в while while (1) { GUI_Exec(); //GUI_TOUCH_Exec(); } и в обработчике у меня так static void _cbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; // USER START (Optionally insert additional variables) #define SIZE_GRAPH_X 460.0 // USER END switch (pMsg->MsgId) { case WM_INIT_DIALOG: // // Initialization of 'Window' // hItem = pMsg->hWin; WINDOW_SetBkColor(hItem, GUI_MAKE_COLOR(0x00F9EBFE)); // // Initialization of 'Graph' // hItem = WM_GetDialogItem(pMsg->hWin, ID_GRAPH_0); GRAPH_SetBorder(hItem, 50, 0, 50, 0); // // Initialization of 'Text' // hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1); TEXT_SetText(hItem, "ADC ="); break; case WM_TIMER: WM_RestartTimer(hTimer, 100); break; case WM_NOTIFY_PARENT: break; default: WM_DefaultProc(pMsg); break; } } НО в WM_TIMER я все равно не попадаю. Почему так может быть?