Axel
Свой-
Постов
552 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Весь контент Axel
-
В 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)...
-
Часто используемый контроллер TFT-матрицы HX8352 имеет время обращения менее 150ns при ширине шины 16 бит. Кадр дисплея 240х400 в формате 5-6-5 можно загрузить быстрее 20ms. Проверено с экраном DLC0320BMG-T.
-
LPC1778 тоже вроде не глючит (в смысле АЦП)...
-
Есть (теоретически) 1.8V eMMC от Micron. А вот карточки не попадались.
-
China-Link, Вариант отладчика из Китая
Axel ответил krestnick тема в Отладочные платы
Некоторое время назад на службе купили пучек этих "Segger"-ов. Периодически у всех слетала прошивка. Вылечилось притягиванием к земле пина 55 (Erase) резистором 2.2к (первый, что попал под руку). Больше месяца у 3-х доработанных полет нормальный. -
Из практики: измерительная система, реализующая несколько различных измерений параметров одного объекта. Количество и последовательность измерений определяются пользователем. Оказалось удобным сделать классы конкретных измерений производными от общего базового виртуального класса. Структура программы получилась независимой от деталей (и изменений) каждой конкретной технологии.
-
Сразу напрашивается развитие темы: прикрутить ботинки к носкам, трусы к ... ну и так далее. ООП и АРМы - давно и независимо существующие сушности, способные тем не менее прекрасно уживаться в рамках конкретного проекта и вобщем-то без какого-либо "прикручивания". А трудности постижения духа и сути ООП ИМХО несколько преувеличены.
-
Работающий код: 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)) Собирается без проблем.
-
Без проблем находит... С Crossworks'ом я такое часто пользую.
-
Попробуйте так: unsigned short *addr_start = (unsigned short *)((unsigned short)(&_start_metrology))
-
Однажды было такое. Удалось проскочить случайными манипуляциями со сбросом в начале загрузки (правда не с Кейлом...)
-
Вот один из вариантов: 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
-
Контроллер STM32F103RD. Не могу заставить ADC1 тактироваться от Timer2. Вариантов перепробовал ...очень много. В чем может быть фишка?
-
Если интересуют настрйки без использования 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); }
-
Угу, один из тех моментов, которые заставляют пересматривать проекты в пользу, например, STM8...
-
Работа с внешней памятью
Axel ответил SidAlex тема в Программирование
Вряд-ли смогу помочь - лет шесть с ними не работал... -
Работа с внешней памятью
Axel ответил SidAlex тема в Программирование
Проверить трудно, поскольку Вы не указали тип контроллера. -
Работа с внешней памятью
Axel ответил SidAlex тема в Программирование
Если с пинами (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 } -
Работа с внешней памятью
Axel ответил SidAlex тема в Программирование
К сожалению сейчас некогда рассматривать Ваш код. Может попозже... И посмотрите, как включать код в сообщение, а то читать в таком виде затруднительно... -
Работа с внешней памятью
Axel ответил SidAlex тема в Программирование
Посмотрел сейчас даташит - действительно, Вы правы. Я пользовал Numonyx, а там совсем даже не ноль... -
Работа с внешней памятью
Axel ответил SidAlex тема в Программирование
Тот же. Только CS дважды дергать не надо. -
Работа с внешней памятью
Axel ответил SidAlex тема в Программирование
Важен порядок передачи байтов - начинать со старшего. Ну и обязательно дождаться статуса окончания записи. И еще пин разрешеня записи сбросить в "0".