Jump to content

    

stm32f4

Участник
  • Content Count

    45
  • Joined

  • Last visited

Community Reputation

0 Обычный

About stm32f4

  • Rank
    Участник
  1. Всем доброго дня) Люди кто сталкивался с ADE7758? Не могу понять что не так я делаю( Собрал стандартную схему из даташита, все данные нормально читаются и записываются! как я понял для начала работы с ADE нужно произвести калибровку смещения напряжения "Calibration of IRMS and VRMS Offset". Делаю все по пунктам из DS, но почему-то какое я бы не подавал напряжение на вход, значение в регистрах AVRMS,AIRMS не меняется( Может кто сталкивался с этой микросхемой?
  2. Всем доброго дня)Программеры подскажите, что я не так делаю при записи во FLASH(STM32F4) ? Я уже и с библиотеками и просто на CMSIS пробовал-толку нет(((((((((((( С использованием "stm32f4xx_flash.h" : FLASH_Unlock(); FLASH_EraseSector(FLASH_Sector_2,VoltageRange_4); while ((FLASH->SR & FLASH_SR_BSY) != 0 ); FLASH_ProgramHalfWord(0x08008000,4); FLASH_Lock(); ну и на CMSIS : void FLASH_WRITE_16BIT(uint32_t Address,uint16_t data) { FLASH->CR &= CR_PSIZE_MASK; FLASH->CR |= FLASH_PSIZE_HALF_WORD; FLASH->CR |= FLASH_CR_PG; //Запись данных по адресу Address *(__IO uint16_t*)Address = data; while ((FLASH->SR & FLASH_SR_BSY) != 0 ); FLASH->CR &= (~FLASH_CR_PG); }
  3. Блин, как меня задолбал этот АЦП, все никак не могу настроить((((((((( Не могу понять почему ацп не тактируется от таймера!!!!!!!! //*********************TIM3************************* RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // тактирование таймера TIM2->PSC = 160-1; // предделитель TIM2->ARR = 1000-1; // переполнение TIM2->CR2 |= TIM_CR2_MMS_1; // output (TRGO) TIM2->CR1 |= TIM_CR1_CEN; // запуск счета RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; //********************ADC1**CH6 PA6*************** RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //********************DMA*************************** RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; DMA2_Stream0->CR&=~ DMA_SxCR_CHSEL; // 000: channel 0 selected DMA2_Stream0->PAR= (uint32_t)&ADC1->DR; // DMA2_Stream0->M0AR=(uint32_t)&BUFF[0]; // Массив DMA2_Stream0->NDTR=100; // Длина буфера DMA2_Stream0->CR|= DMA_SxCR_MINC; // Инкремент адреса DMA2_Stream0->CR|= DMA_SxCR_MSIZE_0; // 16 бит DMA2_Stream0->CR|= DMA_SxCR_PSIZE_0; // 16 бит DMA2_Stream0->CR|= DMA_SxCR_CIRC; // Непрерывный режим DMA2_Stream0->CR&=~ DMA_SxCR_DIR; // 01: peripheral-to-Memory DMA2_Stream0->CR|= DMA_SxCR_PL; // 11: Very high приоритет DMA2_Stream0->CR|= DMA_SxCR_EN; // Вкл. передачу GPIOA->MODER |= GPIO_MODER_MODER6; //ADC1 CH6 PA6 ADC1->CR1 |= ADC_CR1_SCAN; ADC1->CR2 |= (ADC_CR2_EXTSEL_1|ADC_CR2_EXTSEL_2);// 0110 tim 2 (TRGO) ADC1->CR2 |=ADC_CR2_DMA; //разрешаем рабуту DMA // ADC1->CR2 |=ADC_CR2_CONT; ADC1->SQR3 =6; ADC1->CR2 |=ADC_CR2_SWSTART; ADC1->CR2 |=ADC_CR2_ADON; Если установить бит "ADC_CR2_CONT" то данные попадают в буфер, но меня такой режим не устраивает! мне необходимо чтобы ацп измерял по таймеру!Все биты для тактирования, от таймера, я установил ADC1->CR2|=DC_CR2_EXTSEL_1|ADC_CR2_EXTSEL_2);// 0110 tim 2 (TRGO) но толку нет ((((( Подскажите пожалуйста, в чем может быть причина? Спасибо, за совет)Форма записи-действительно удобней!!!
  4. Всем доброго дня! Подскажите, что я мог сделать неправильно? Хочу настроить АЦП так что бы он передавал измеряемые данные в буфер, с использованием ДМА(ПДП)! АЦП все измеряет, но данные так и не попадают в буфер((( uint32_t BUFF[100]; RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //********************DMA*************************** RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; DMA2_Stream0->CR&=~ DMA_SxCR_CHSEL; // 000: channel 0 selected DMA2_Stream0->PAR= (uint32_t)&ADC1->JDR1; // DMA2_Stream0->M0AR=(uint32_t)&BUFF[0]; // Массив DMA2_Stream0->NDTR=10; // Длина буфера DMA2_Stream0->CR|= DMA_SxCR_MINC; // Инкремент адреса DMA2_Stream0->CR|= DMA_SxCR_MSIZE_0; // 16 бит DMA2_Stream0->CR|= DMA_SxCR_PSIZE_0; // 16 бит DMA2_Stream0->CR|= DMA_SxCR_CIRC; // Непрерывный режим DMA2_Stream0->CR&=~ DMA_SxCR_DIR; // 01: peripheral-to-Memory DMA2_Stream0->CR|= DMA_SxCR_PL; // 11: Very high приоритет DMA2_Stream0->CR|= DMA_SxCR_EN; // Вкл. передачу GPIOA->MODER |= GPIO_MODER_MODER6; //ADC1 CH6 PA6 GPIOA->MODER |= GPIO_MODER_MODER1; //ADC1 CH2 PA1 ADC1->CR1 |= ADC_CR1_DISCNUM_0; //Discontinuous mode channel count 001: 2 channels ADC1->CR1 |= ADC_CR1_JDISCEN; //1: Discontinuous mode on injected channels enabled ADC1->CR1 |= ADC_CR1_SCAN; ADC1->CR2 |= (ADC_CR2_JEXTSEL_3|ADC_CR2_JEXTSEL_0);//tim 4 (TRGO) ADC1->CR1 |=ADC_CR1_JAUTO; //автоматическое преобразование для каналов в инжектированной группе после каналов регулярной группы. ADC1->JSQR |=ADC_JSQR_JL_0; //выбор кол-ва каналов для преобразования (2 каналa инжектированной группы) ADC1->CR2 |=ADC_CR2_DMA; //разрешаем рабуту DMA // ADC1->CR2 |=ADC_CR2_DDS; ADC1->CR1 |=ADC_CR1_JEOCIE; ADC1->CR2 |=ADC_CR2_CONT; // ADC->CCR |= ADC_CCR_DMA_0; //01: DMA mode 1 enabled (2 / 3 half-words one by one - 1 then 2 then 3) // ADC->CCR |= ADC_CCR_DDS; ADC1->JSQR |=(ADC_JSQR_JSQ3_1|ADC_JSQR_JSQ3_2);// CH6 PA6 ADC1->JSQR |= ADC_JSQR_JSQ4_0; // CH1 PA1 ADC1->CR2 |=ADC_CR2_JEXTEN_0; //01: Запуск обнаружения по фронту ADC1->CR2 |=ADC_CR2_JSWSTART; ADC1->CR2 |=ADC_CR2_ADON;
  5. Разобравшись с Keil стало понятно как научить считать Coocox!Если в двух словах то нужно было включить FPU hard и прикрепить библиотеку (arm-none-eabi\lib\armv7e-m\fpu\libm.a) для работы с мат функциями!
  6. неее мне нужна arm_math.h но в Coocox не все так гладко(
  7. Всем доброго дня! Люди подскажите, где взять библиотеки для осуществления мат операций (извлечение корня, возведение в степень, вычисление логарифмов и т.д) для CooCox (stm32f4) ?
  8. а как? если можно с примером)
  9. Всем пивет!подскажите, как правильно менять тактовую частоту MK на лету?Это нужно для повышения точности генерации ЦАП-ом различных частот. stm32f405VG
  10. Огромное спасибо всем откликнувшимся)Вообщем помог танец с бубном))))Закоротил NRST на землю и пытался прошить, он долго не прошивался, в итоге после смены проекта- прошился, что на мой взгляд немного странно, т.к строки : я давно убрал!Ну и после очистки памяти изначальный проект заработал)))) Кстати в интернете нашел еще один 100 пудовый вариант: Просто подтянуть линию BOOT1 к единичке и подать питание. Контроллер войдет в bootloader, но при этом будет прекрасно прошиваться)
  11. Сразу к делу, пару часов назад случайно в проекте допустил ошибку, изменил состояние регистра MODER порта A 13-той ноги на OUTPUT, а это одна из линий(SWDIO) интерфейса SWD !!!!! RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; GPIOA->MODER |= GPIO_MODER_MODER13_0; Собственно теперь никак не могу ни стереть не прошить МК(STM32f405) ((((((( Я уже и через CooCox,Keil и даже STM32 ST-LINK Utility пробовал, не помогают((Контроллер живет своей жизнью!!! Неужели из-за такой ерунды выбрасывать проц:-? что делать?
  12. OTG_FS_GAHBCFG |= 1; //установка нулевого бита в 1 OTG_FS_GAHBCFG |= 128; //установка восьмого бита в 1
  13. Вообщем решил я по странке, обрабатывать нажатие кнопки программно) В итоге: написал процедуру опроса ножки порта- все работает на ура, но проблема в том что я не очень хорошо знаю язык С и поэтому процедура получилась очень громоздкой(((( Господа-программёры подскажите, как можно грамотно сократить сей код????????????