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

Axel

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    1

Весь контент Axel


  1. В FSMC STM32 есть подводные грабли - биты адреса переназначаются в зависимости от разрядности шины данных: "In case of a 16-bit external memory width, the FSMC will internally use HADDR[25:1] to generate the address for external memory FSMC_A[24:0]. Whatever the external memory width (16-bit or 8-bit), FSMC_A[0] should be connected to external memory address A[0]." Мне довелось по ним пробежаться (после "нормального" LPC24)...
  2. Часто используемый контроллер TFT-матрицы HX8352 имеет время обращения менее 150ns при ширине шины 16 бит. Кадр дисплея 240х400 в формате 5-6-5 можно загрузить быстрее 20ms. Проверено с экраном DLC0320BMG-T.
  3. АЦП в LPC1768

    LPC1778 тоже вроде не глючит (в смысле АЦП)...
  4. Есть (теоретически) 1.8V eMMC от Micron. А вот карточки не попадались.
  5. Некоторое время назад на службе купили пучек этих "Segger"-ов. Периодически у всех слетала прошивка. Вылечилось притягиванием к земле пина 55 (Erase) резистором 2.2к (первый, что попал под руку). Больше месяца у 3-х доработанных полет нормальный.
  6. Из практики: измерительная система, реализующая несколько различных измерений параметров одного объекта. Количество и последовательность измерений определяются пользователем. Оказалось удобным сделать классы конкретных измерений производными от общего базового виртуального класса. Структура программы получилась независимой от деталей (и изменений) каждой конкретной технологии.
  7. Сразу напрашивается развитие темы: прикрутить ботинки к носкам, трусы к ... ну и так далее. ООП и АРМы - давно и независимо существующие сушности, способные тем не менее прекрасно уживаться в рамках конкретного проекта и вобщем-то без какого-либо "прикручивания". А трудности постижения духа и сути ООП ИМХО несколько преувеличены.
  8. Работающий код: gAppParamPage = ((u32)&__FLASH_segment_used_end__ + FLASH_PAGE_SIZE) & ~(FLASH_PAGE_SIZE - 1); В .map: __FLASH_segment_used_end__ = (ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) + SIZEOF (.data)) Собирается без проблем.
  9. Без проблем находит... С Crossworks'ом я такое часто пользую.
  10. Попробуйте так: unsigned short *addr_start = (unsigned short *)((unsigned short)(&_start_metrology))
  11. Однажды было такое. Удалось проскочить случайными манипуляциями со сбросом в начале загрузки (правда не с Кейлом...)
  12. Вот один из вариантов: void ADC1_Init() { ADC1->CR1 = ADC_CR1_DISCEN | ADC_CR1_EOCIE; ADC1->CR2 = ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTTRIG; ADC1->SQR1 = 0x00; ADC1->SQR2 = 0x00; ADC1->SQR3 = ADC_SQR3_SQ1_0; ADC1->SMPR2 = ADC_SMPR2_SMP1_2; //0x08; ADC1->CR2 |= ADC_CR2_ADON; ADC1->CR2 |= ADC_CR2_RSTCAL; while(ADC1->CR2 & ADC_CR2_RSTCAL); ADC1->CR2 |= ADC_CR2_CAL; while(ADC1->CR2 & ADC_CR2_CAL); ADC1->SR = 0; } void TIM2_Init() { TIM2->CR1 = TIM_CR1_ARPE; TIM2->SMCR = 0; TIM2->ARR = 49; TIM2->PSC = 0x47; // TIM2->CCR2 = 50; // TIM2->CCMR1 = TIM_CCMR1_OC2PE | TIM_CCMR1_OC2CE; TIM2->CCMR1 = TIM_CCMR1_OC2M_0 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE; // TIM2->CCMR1 = TIM_CCMR1_OC2CE; TIM2->EGR = TIM_EGR_CC2G; TIM2->DIER = TIM_DIER_CC2IE; TIM2->CCER = TIM_CCER_CC2E; } Хедер прикрепил. stm32f10x_map.zip
  13. Контроллер STM32F103RD. Не могу заставить ADC1 тактироваться от Timer2. Вариантов перепробовал ...очень много. В чем может быть фишка?
  14. Если интересуют настрйки без использования ST-шных либов, то вот мои (кварц 12 MHz): static void RCC_Config() { FLASH->ACR |= FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_1; //flash latency = 2 wait states RCC->CR = RCC_CR_HSEON; RCC->CFGR = RCC_CFGR_MCO_PLL | RCC_CFGR_USBPRE | RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PPRE2_DIV2 | RCC_CFGR_PPRE1_DIV2; while (!(RCC->CR & RCC_CR_HSERDY)); RCC->CR |= RCC_CR_PLLON; while (!(RCC->CR & RCC_CR_PLLRDY)); RCC->CFGR |= RCC_CFGR_SW_PLL; while ((RCC->CFGR & (RCC_CFGR_SWS_HSE | RCC_CFGR_SWS_PLL)) != RCC_CFGR_SWS_PLL); //Enable clocking of the peripherals RCC->APB2ENR = RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_USART1EN | RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN; RCC->APB1ENR = RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM4EN | RCC_APB1ENR_USART2EN | RCC_APB1ENR_CANEN | RCC_APB1ENR_BKPEN | RCC_APB1ENR_PWREN; RCC->AHBENR = RCC_AHBENR_FLITFEN | RCC_AHBENR_CRCEN | RCC_AHBENR_DMA1EN; PWR->CR |= PWR_CR_DBP; } /* Parameters: u8 quantum number u32 baud rate u8 tseg1 u8 tseg2 u8 sjw */ void CAN_HwSetup(u8 *param) { u32 bpr; u8 tseg1, tseg2, sjw; CAN->MCR = (CAN_MCR_NART | CAN_MCR_INRQ | CAN_MCR_TXFP); // init mode, disable auto. retransmission CAN->IER = (CAN_IER_FMPIE0 | CAN_IER_TMEIE); // FIFO 0 msg pending, Transmit mbx empty if(!param) // 1Mb by default { bpr = 2; tseg1 = 12; tseg2 = 5; sjw = 4; } else { bpr = (36000000 / param[4]) / (param[0] + ((u32)param[1] << 8) + ((u32)param[2] << 16) + ((u32)param[3] << 24)); tseg1 = param[5]; tseg2 = param[6]; sjw = param[7]; } CAN->BTR = bpr | (((u32)tseg1 -1) << 16) | (((u32)tseg2 - 1) << 20) | (((u32)sjw - 1) << 24); }
  15. Угу, один из тех моментов, которые заставляют пересматривать проекты в пользу, например, STM8...
  16. Вряд-ли смогу помочь - лет шесть с ними не работал...
  17. Проверить трудно, поскольку Вы не указали тип контроллера.
  18. Если с пинами (W и HOLD) все в порядке, то замечание только одно: void WriteFM25L256(unsigned int adress, char *mass, int nbyte) { unsigned int a; CS_FRAM(); //чип-селект для FRAM while (!(IFG1 & UTXIFG0));//провека готовности ТХ-буфера U0TXBUF = WREN_FM25L; //разрешение записи в FM25L256 while(!(U0TCTL & TXEPT)); // __no_operation(); // __no_operation(); // __no_operation(); // __no_operation(); OFF_CS_FRAM(); //сброс чипселекта FRAM // ------- необходим таймаут хотя-бы на один такт SPI ------------ CS_FRAM(); //чип-селект для FRAM while (!(IFG1 & UTXIFG0));//провека готовности ТХ-буфера U0TXBUF = WRITE_FM25L; //разрешение записи в FM25L256 while(!(U0TCTL & TXEPT)); while (!(IFG1 & UTXIFG0));//провека готовности ТХ-буфера U0TXBUF = adress >> 8; //запись старшего байта адреса while(!(U0TCTL & TXEPT)); while (!(IFG1 & UTXIFG0));//провека готовности ТХ-буфера U0TXBUF = adress; //запись младшего байта адреса while(!(U0TCTL & TXEPT)); for(a = 0; a < nbyte; a++) { while (!(IFG1 & UTXIFG0)); //провека готовности ТХ-буфера U0TXBUF = mass[a]; //передать младший байт элемента массива while(!(U0TCTL & TXEPT)); }; OFF_CS_FRAM(); //сброс чипселекта FRAM }
  19. К сожалению сейчас некогда рассматривать Ваш код. Может попозже... И посмотрите, как включать код в сообщение, а то читать в таком виде затруднительно...
  20. Посмотрел сейчас даташит - действительно, Вы правы. Я пользовал Numonyx, а там совсем даже не ноль...
  21. Тот же. Только CS дважды дергать не надо.
  22. Важен порядок передачи байтов - начинать со старшего. Ну и обязательно дождаться статуса окончания записи. И еще пин разрешеня записи сбросить в "0".
×
×
  • Создать...