Jump to content

    

Ekka

Участник
  • Content Count

    192
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Ekka

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

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Белгород

Recent Profile Visitors

1265 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 modbus master

    А кто-то может кинуть ссылку на документацию? документацию на libopencm3
  7. libopencm3 modbus master

    И вопрос не в тему, а по пути... собираю проект, о котором речь шла выше, и не могу потом в точки останова войти, CodeBlock их не видит как бы, не останавливается, а выполняет всю программу. Путь до Дебаггера прописан, в чем может быть проблема? Может, кто сталкивался, в инете все перерыла, ни один способ не помогает. 1. Перестройка проекта (не помогло) 2. Установка флага -g не помогает в настройках проекта и глобальных. 3. Проект пытаюсь отдалить с опцией Debug а не Release (ну так и было, в принципе). Все это не помогло. Как начать отлаживать с точками останова?
  8. libopencm3 modbus master

    Привет всем) Возникла такая потребность, как реализовать modbusmaster на библиотеке libopencm3 (не спрашивайте, зачем, надо). Пытаюсь настроить мастера, но пока безрезультатно, не работает. Может, кто-то настраивал модбас подобной библиотекой и сможет кинуть примерчик?
  9. CAN STM32 Ошибки отправки

    У меня поле 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 я все равно не попадаю. Почему так может быть?