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

STM32 для чайника


ART_ME

Рекомендуемые сообщения

Ну ок вот последний "работающий" код:

void inits_timer3(void)
{    
  RCC->APB1ENR |=RCC_APB1ENR_TIM3EN;
  TIM3->PSC|=3500 - 1; // Настраиваем делитель что таймер тикал 1000 раз в секунду        
  TIM3->ARR|= 100-1;    
  TIM3->DIER |= TIM_DIER_UIE;
  NVIC_SetPriority(TIM3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
  NVIC_EnableIRQ(TIM3_IRQn);
  TIM3->CR1|=   TIM_CR1_CEN;
}

Тактируем от HSI т.е. частота 16МГц, тебе нужно 1 раз в секунду это 1 Гц, а у тебя 16000000 / 3500 / 100 не 1 это точно. Да еще и через |=. Офигенный работающий код))

Попробуй так:

void inits_timer3(void)
{    
  RCC->APB1ENR |=RCC_APB1ENR_TIM3EN;
  
  TIM3->PSC = 15999; // Настраиваем делитель что таймер тикал 1000 раз в секунду        
  TIM3->ARR = 999;    
  TIM3->DIER |= TIM_DIER_UIE;
  TIM3->CR1 |= TIM_CR1_CEN;
  
  NVIC_EnableIRQ(TIM3_IRQn);
}

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Постоялец зтот работающий код у меня работает в Atolic truestudio на stm32f103  а на  stm32f407ve не работает? В прерывании вписывается  GPIO и он должен периодически выбрасывать"1" и"0".Да автоматом выставляется HSI16000000U а дальше мёртвые с косами стоят извените за афоризм.Ничего не происходит.

LL .Я имею ввиду что настраивать проект можно кубом.А писать программу на регистрах.Работает иstm32f407vet и настраивать тактирование и шыни в ручную не нужно я не всё знаю но вижу преймущество в быстроте написани проекта.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@Ivan Rusev В прерывание входит по таймеру? http://progcortex.mybb.ru/viewtopic.php?id=6 пробуй как тут. Надо же забыл пароль и не могу удалить весь этот мусор.

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

Спасибо за инфу.У меня вопрос по 4 варианту как же он будет работать в  main.Буду изучать ДМА.Я ученик.Даже не знаю дай Бог вам здоровья.Вы услышали меня.

Ссылка на комментарий
Поделиться на другие сайты

@Ivan Rusev ДМА в циклическом режиме будет переключать светодиоды, таймер делает запрос ДМА. Уроки больше не пишу это очень скучно, да и времени нет.

Ссылка на комментарий
Поделиться на другие сайты

@Ivan Rusev Ограничений нет включай хоть все. ДМА это одно, а прерывания это другое. 

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

Может кто встречал такую проблему есть плата с STM32F407VET6 100пинов, https://aliexpress.ru/item/32868515918.html?dp=42q3aas018wp9218eb0dtt6ldaj3mk66&af=359030&cv=37464770&cn=42q3aas018wp9218eb0dtt6ldaj3mk66&aff_platform=default&cpt=1577639953995&sk=mun2n2V&aff_trace_key=4f5e281d87a34010a99f355b9410370b-1577639953995-04989-mun2n2V&terminal_id=933ecc3fb09c4d7e8a1ed4f4dda610e9 , когда-то на ней кодил, и вроде изначально была проблема с инверсией выходов, и настройкой тактирования, потом я замкнул камень случайно, а потом в Украине взял этот камень за 160грн., запаял и вот не помню изначально такое было или нет, но все GPIO работают с инверсией на выход, то есть ставлю лог. 1, а на выходе 0 и наоборот, как регистрами так и через HAL 

GPIOD->BSRR = GPIO_BSRR_BR13// получаем лог.1
GPIOD->BSRR = GPIO_BSRR_BS13// получаем лог.0

Так же с тактированием непонятки ставлю от кварца 8МГц так

 

Скрытый текст

Screenshot_22.jpg.c18451746d5ef7d9a8e358f646a664ff.jpg

 так работает но HAL_Delay задержка не работает так же и так не работает

void delay_us(uint32_t us) 
{
volatile uint32_t i = (HAL_RCC_GetSysClockFreq()/11000000)*us;      

  for (; i != 0; i--);
}
void delay_ms(uint32_t us) 

    volatile uint32_t i = (HAL_RCC_GetSysClockFreq()/11000)*us;    

 for (; i != 0; i--);
}

 

А как ставлю так 

Скрытый текст

Screenshot_23.jpg.909794942066a07db117760ae5463f88.jpg

Вообщем даже если настройку тактирования регистрами делать, все равно проблема с задержками. Может камень поддельный, или это баги в IAR? Причем юзал как и 7.50, так и 8.30, проблемы одни и те же

Ссылка на комментарий
Поделиться на другие сайты

Получается камень поддельный? Или сам IAR? Вы в чем пишите в IAR? А есть кусок кода с тактированием? Чтобы помигать светиком проверить есть ли инверсия, и что с тактированием

Ссылка на комментарий
Поделиться на другие сайты

коллеги с таймером вопрос решён.Даже в cmsis adc запустил правда в режиме непрерывного преобразования регулярного канала.А вот с прерыванием по ацп пока не получается пишу в atolic truestudio использую тактирование по умолчанию  

/*
 * main.c
 *
 *  Created on: 2 лист. 2019 р.
 *      Author: Ivan
 */


#include "main.h"

 volatile unsigned char flag=0;
 volatile unsigned char program=0;
//uint32_t adc_data = 0;
 volatile unsigned int adc_data=0;
 volatile unsigned int pauza1=0;
 volatile unsigned int pauza2=0;
 void pauza (int T)//ввод самой паузы(программы) она написана отдельно и введеннием #include "paua.h"можно писать в основном цыкле pauza()с вводом целой переменной T
 {
    int i=0;//введение целойперемменой i
    char t=0;// введение вещественной переменной t считает такты микроконтролера
    for(i=0;i<T;t++) //програмама в цыкле
   {
     if(t==255)i=i+1;// условия одного цыкла счёта пределитель i определяется регистром TCCR2 определяется 0.1.2 битами это делителем частоты работы таймера
   }
 }

 void TIM3_IRQHandler(void)
 {
    // TIM1->DIER&=~TIM_DIER_UIE;
     TIM3->SR &= ~ TIM_SR_UIF;
     pauza1++;
      if(pauza1>10)
            {
                  GPIOC-> BSRR |=GPIO_BSRR_BS1;
             }
             if(pauza1>20)
              {
                  GPIOC-> BSRR |=GPIO_BSRR_BR1;
                  pauza1=0;
               }

     //  GPIOC->ODR ^= GPIO_ODR_OD1;
 }
void TIM5_IRQHandler(void)
{
    //TIM2->DIER&=~TIM_DIER_UIE;
    if(TIM5->SR& TIM_SR_UIF)
    {
     TIM5->SR &= ~ TIM_SR_UIF;
      pauza2++;
    //if(!(GPIOC->IDR& GPIO_IDR_ID0))
    //{
    //    pauza(20);
         if(pauza2>10)
         {
             // GPIOC-> BSRR |=GPIO_BSRR_BS13;
         }
         if(pauza2>20)
          {
            //  GPIOC-> BSRR |=GPIO_BSRR_BR13;
              pauza2=0;
           }
         //TIM3->SR &= ~ TIM_SR_UIF;
    }
 }


void PROGRAM(void)
{
    //GPIOC-> BSRR |=GPIO_BSRR_BS1;
        //        pauza(2000);
        //       GPIOC-> BSRR |=GPIO_BSRR_BR1;
        //         pauza(2000);
}
void inits_timer1(void)
{
    RCC->APB2ENR |=RCC_APB2ENR_TIM1EN;

        TIM1->PSC = 2000-1;//24000 - 1; // Настраиваем делитель что таймер тикал 1000 раз в секунду
              TIM1->ARR = 10 ;

              TIM1->DIER |= TIM_DIER_UIE;//устанавливаем флаг 1по таймеру
              TIM1->EGR = TIM_EGR_UG;
              TIM1->CR1|= TIM_CR1_CEN;//разрешаем работу таймера
              NVIC_EnableIRQ (TIM1_UP_TIM10_IRQn   );
}
void inits_timer5(void)
{
    RCC->APB1ENR |=RCC_APB1ENR_TIM5EN;

    TIM5->PSC = 3500 - 1; // Настраиваем делитель что таймер тикал 1000 раз в секунду

          TIM5->ARR = 100 ;


          TIM5->DIER = TIM_DIER_UIE;//устанавливаем флаг 1по таймеру
          TIM5->EGR = TIM_EGR_UG;
          TIM3->SR =0;
          TIM5->CR1|=   TIM_CR1_CEN;//разрешаем работу таймера
        //  NVIC_SetPriority(TIM5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
          NVIC_EnableIRQ ( TIM5_IRQn  );

}
void inits_timer3(void)
{


      RCC->APB1ENR |=RCC_APB1ENR_TIM3EN;

        TIM3->PSC=3500-1; // Настраиваем делитель что таймер тикал 1000 раз в секунду

        TIM3->ARR=100;

        TIM3->DIER = TIM_DIER_UIE;
          TIM3->EGR=TIM_EGR_UG;
          TIM3->SR =0;

         TIM3->CR1|=   TIM_CR1_CEN;
       //  NVIC_SetPriority(TIM3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
         NVIC_EnableIRQ(TIM3_IRQn);
}
void adc_IRQhanler(void)
{
    // uint16_t adc_data = 0;
     //adc_data =  ADC1->DR;
    if(ADC1->SR & ADC_SR_EOC)
    {
       ADC1->SR &=~ ADC_SR_EOC;
    // ADC1->SR = 0;
       adc_data =  ADC1->DR;
    if(adc_data>2045)
     {
         GPIOC-> BSRR |=GPIO_BSRR_BS13;
     }
     else
     {
         GPIOC-> BSRR |=GPIO_BSRR_BR13;
     }
      //ADC1->SR &=~ ADC_SR_EOC;
   }
}
void inits_adc(void)
{
     RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN;
     RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
                     GPIOA->MODER |= GPIO_MODER_MODER0_1;
                   GPIOA->MODER |= GPIO_MODER_MODER0_0;
                   GPIOA->PUPDR &=~GPIO_PUPDR_PUPDR0_1;
                   GPIOA->PUPDR &=~ GPIO_PUPDR_PUPDR0_0;


     ADC->CCR&= ~ ADC_CCR_ADCPRE;
   // ADC1->CR1|= ADC_CR1_EOCIE;
     // ADC1->SR = 0;
     ADC1->CR2 =ADC_CR2_CONT;
     // ADC1->CR2 |=ADC_CR2_EXTEN;
     ADC1->DR=0;
          ADC1->CR2|=ADC_CR2_EXTSEL;
          ADC1->CR2 |=ADC_CR2_EXTEN;
   ADC1->SMPR2 &= ~(ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0);

            /* номер канал                             */
    ADC1->SQR3 &=~ ADC_SQR3_SQ1_0;   //1 IN0
    ADC1->SQR3   &= ~ ADC_SQR3_SQ3_1;     //0
    ADC1->SQR3   &= ~ADC_SQR3_SQ1_2;   //0
    ADC1->SQR3   &=~  ADC_SQR3_SQ1_3;     //0
    ADC1->SQR3   &= ~ADC_SQR3_SQ1_4;//0
    // ADC1->CR2 |=ADC_CR2_CONT;
       ADC1->CR1|= ADC_CR1_EOCIE;
    //ADC1->SR=0;
    // ADC1->SMPR2 &= ~(ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0);
       NVIC_SetPriority(ADC_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
              NVIC_EnableIRQ (ADC_IRQn);


    //NVIC_EnableIRQ (ADC_IRQn);
            ADC1->CR2 |=  ADC_CR2_ADON;
}


void inits_adc2(void)
{

}
 void inits_GPIOC(void)
 {
     RCC->AHB1ENR|=RCC_AHB1ENR_GPIOCEN;


           GPIOC->MODER &=~ GPIO_MODER_MODER13_1;
           GPIOC->MODER |= GPIO_MODER_MODER13_0;
           GPIOC ->OTYPER &=~GPIO_OTYPER_OT13;
           //бит0 определяет скорость работы GPIO
            GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR13_1; //бит1
            GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR13_0;
            GPIOC->PUPDR |=GPIO_PUPDR_PUPDR13_1;
            GPIOC->PUPDR &=~ GPIO_PUPDR_PUPDR13_0;
            /*     настройка на вход     */

          // RCC->AHB1ENR|=RCC_AHB1ENR_GPIOCEN;

           GPIOC->MODER &=~ GPIO_MODER_MODER0_1;
                     GPIOC->MODER &=~ GPIO_MODER_MODER0_0;
                     GPIOC ->OTYPER &=~GPIO_OTYPER_OT0;
                     //бит0 определяет скорость работы GPIO
                      GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR0_1; //бит1
                      GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR0_0;
                      GPIOC->PUPDR &=~ GPIO_PUPDR_PUPDR0_1;
                      GPIOC->PUPDR |= GPIO_PUPDR_PUPDR0_0;

                     GPIOC->MODER &=~ GPIO_MODER_MODER1_1;
                      GPIOC->MODER |= GPIO_MODER_MODER1_0;
                              GPIOC ->OTYPER &=~GPIO_OTYPER_OT1;
                              //бит0 определяет скорость работы GPIO
                               GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR1_1; //бит1
                               GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR1_0;
                               GPIOC->PUPDR |=GPIO_PUPDR_PUPDR1_1;
                               GPIOC->PUPDR &=~ GPIO_PUPDR_PUPDR1_0;
 }

int main(void)
{
//      int adc_data=0;
    inits_GPIOC();
    inits_adc();


    //ADC1->CR2 |= ADC_CR2_SWSTART;
    //inits_timer1();
    inits_timer3();
    inits_timer5();
    //inits_timer3();
    //inits_adc();

       //ADC1->CR2 |=  ADC_CR2_ADON;
                //NVIC_EnableIRQ (ADC_IRQn);
        //ADC1->CR2 |= ADC_CR2_SWSTART;

    while(1)
    {
        //ADC1->CR2 |= ADC_CR2_SWSTART;

        //ADC1->CR2 |= ADC_CR2_SWSTART; //Запуск преобразований
    //    while (!(ADC1->SR & ADC_SR_EOC)); //ждем пока первое преобразование завершится
    //    ADC1->SR &=~ADC_SR_EOC ;
        // ADC1->SR = 0;
        //adc_data = ADC1->DR;

                    //    if(adc_data > 2024)
                   //      {
                                //  GPIOC->ODR|=1<<13;
                   //        GPIOC->BSRR |= GPIO_BSRR_BS13;
                    //     }
                  //     else
                //         {
                     //           //  GPIOC->ODR&=~1<<13;
                //              GPIOC->BSRR |= GPIO_BSRR_BR13;
                 //        }
        }
}

В прерывании по ацп перетаёт работать таймер и ацп тоже не раотает.В Кубе если настраивать то команды в atolic тоже на cmsis пишу учусь не хватает опыта не хватает информации.Документация вся на английском.

Я до настройки тактирования ещё не  дорос

/*
 * main.c
 *
 *  Created on: 2 лист. 2019 р.
 *      Author: Ivan
 */


#include "main.h"

 volatile unsigned char flag=0;
 volatile unsigned char program=0;
//uint32_t adc_data = 0;
 volatile unsigned int adc_data=0;
 volatile unsigned int pauza1=0;
 volatile unsigned int pauza2=0;
 void pauza (int T)//ввод самой паузы(программы) она написана отдельно и введеннием #include "paua.h"можно писать в основном цыкле pauza()с вводом целой переменной T
 {
    int i=0;//введение целойперемменой i
    char t=0;// введение вещественной переменной t считает такты микроконтролера
    for(i=0;i<T;t++) //програмама в цыкле
   {
     if(t==255)i=i+1;// условия одного цыкла счёта пределитель i определяется регистром TCCR2 определяется 0.1.2 битами это делителем частоты работы таймера
   }
 }

 void TIM3_IRQHandler(void)
 {
    // TIM1->DIER&=~TIM_DIER_UIE;
     TIM3->SR &= ~ TIM_SR_UIF;
     pauza1++;
      if(pauza1>10)
            {
                  GPIOC-> BSRR |=GPIO_BSRR_BS1;
             }
             if(pauza1>20)
              {
                  GPIOC-> BSRR |=GPIO_BSRR_BR1;
                  pauza1=0;
               }

     //  GPIOC->ODR ^= GPIO_ODR_OD1;
 }
void TIM5_IRQHandler(void)
{
    //TIM2->DIER&=~TIM_DIER_UIE;
    if(TIM5->SR& TIM_SR_UIF)
    {
     TIM5->SR &= ~ TIM_SR_UIF;
      pauza2++;
    //if(!(GPIOC->IDR& GPIO_IDR_ID0))
    //{
    //    pauza(20);
         if(pauza2>10)
         {
             // GPIOC-> BSRR |=GPIO_BSRR_BS13;
         }
         if(pauza2>20)
          {
            //  GPIOC-> BSRR |=GPIO_BSRR_BR13;
              pauza2=0;
           }
         //TIM3->SR &= ~ TIM_SR_UIF;
    }
 }


void PROGRAM(void)
{
    //GPIOC-> BSRR |=GPIO_BSRR_BS1;
        //        pauza(2000);
        //       GPIOC-> BSRR |=GPIO_BSRR_BR1;
        //         pauza(2000);
}
void inits_timer1(void)
{
    RCC->APB2ENR |=RCC_APB2ENR_TIM1EN;

        TIM1->PSC = 2000-1;//24000 - 1; // Настраиваем делитель что таймер тикал 1000 раз в секунду
              TIM1->ARR = 10 ;

              TIM1->DIER |= TIM_DIER_UIE;//устанавливаем флаг 1по таймеру
              TIM1->EGR = TIM_EGR_UG;
              TIM1->CR1|= TIM_CR1_CEN;//разрешаем работу таймера
              NVIC_EnableIRQ (TIM1_UP_TIM10_IRQn   );
}
void inits_timer5(void)
{
    RCC->APB1ENR |=RCC_APB1ENR_TIM5EN;

    TIM5->PSC = 3500 - 1; // Настраиваем делитель что таймер тикал 1000 раз в секунду

          TIM5->ARR = 100 ;


          TIM5->DIER = TIM_DIER_UIE;//устанавливаем флаг 1по таймеру
          TIM5->EGR = TIM_EGR_UG;
          TIM3->SR =0;
          TIM5->CR1|=   TIM_CR1_CEN;//разрешаем работу таймера
        //  NVIC_SetPriority(TIM5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
          NVIC_EnableIRQ ( TIM5_IRQn  );

}
void inits_timer3(void)
{


      RCC->APB1ENR |=RCC_APB1ENR_TIM3EN;

        TIM3->PSC=3500-1; // Настраиваем делитель что таймер тикал 1000 раз в секунду

        TIM3->ARR=100;

        TIM3->DIER = TIM_DIER_UIE;
          TIM3->EGR=TIM_EGR_UG;
          TIM3->SR =0;

         TIM3->CR1|=   TIM_CR1_CEN;
       //  NVIC_SetPriority(TIM3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
         NVIC_EnableIRQ(TIM3_IRQn);
}
void adc_IRQhanler(void)
{
    // uint16_t adc_data = 0;
     //adc_data =  ADC1->DR;
    if(ADC1->SR & ADC_SR_EOC)
    {
       ADC1->SR &=~ ADC_SR_EOC;
    // ADC1->SR = 0;
       adc_data =  ADC1->DR;
    if(adc_data>2045)
     {
         GPIOC-> BSRR |=GPIO_BSRR_BS13;
     }
     else
     {
         GPIOC-> BSRR |=GPIO_BSRR_BR13;
     }
      //ADC1->SR &=~ ADC_SR_EOC;
   }
}
void inits_adc(void)
{
     RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN;
     RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
                     GPIOA->MODER |= GPIO_MODER_MODER0_1;
                   GPIOA->MODER |= GPIO_MODER_MODER0_0;
                   GPIOA->PUPDR &=~GPIO_PUPDR_PUPDR0_1;
                   GPIOA->PUPDR &=~ GPIO_PUPDR_PUPDR0_0;


     ADC->CCR&= ~ ADC_CCR_ADCPRE;
   // ADC1->CR1|= ADC_CR1_EOCIE;
     // ADC1->SR = 0;
     ADC1->CR2 =ADC_CR2_CONT;
     // ADC1->CR2 |=ADC_CR2_EXTEN;
     ADC1->DR=0;
          ADC1->CR2|=ADC_CR2_EXTSEL;
          ADC1->CR2 |=ADC_CR2_EXTEN;
   ADC1->SMPR2 &= ~(ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0);

            /* номер канал                             */
    ADC1->SQR3 &=~ ADC_SQR3_SQ1_0;   //1 IN0
    ADC1->SQR3   &= ~ ADC_SQR3_SQ3_1;     //0
    ADC1->SQR3   &= ~ADC_SQR3_SQ1_2;   //0
    ADC1->SQR3   &=~  ADC_SQR3_SQ1_3;     //0
    ADC1->SQR3   &= ~ADC_SQR3_SQ1_4;//0
    // ADC1->CR2 |=ADC_CR2_CONT;
       ADC1->CR1|= ADC_CR1_EOCIE;
    //ADC1->SR=0;
    // ADC1->SMPR2 &= ~(ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0);
       NVIC_SetPriority(ADC_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
              NVIC_EnableIRQ (ADC_IRQn);


    //NVIC_EnableIRQ (ADC_IRQn);
            ADC1->CR2 |=  ADC_CR2_ADON;
}


void inits_adc2(void)
{

}
 void inits_GPIOC(void)
 {
     RCC->AHB1ENR|=RCC_AHB1ENR_GPIOCEN;


           GPIOC->MODER &=~ GPIO_MODER_MODER13_1;
           GPIOC->MODER |= GPIO_MODER_MODER13_0;
           GPIOC ->OTYPER &=~GPIO_OTYPER_OT13;
           //бит0 определяет скорость работы GPIO
            GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR13_1; //бит1
            GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR13_0;
            GPIOC->PUPDR |=GPIO_PUPDR_PUPDR13_1;
            GPIOC->PUPDR &=~ GPIO_PUPDR_PUPDR13_0;
            /*     настройка на вход     */

          // RCC->AHB1ENR|=RCC_AHB1ENR_GPIOCEN;

           GPIOC->MODER &=~ GPIO_MODER_MODER0_1;
                     GPIOC->MODER &=~ GPIO_MODER_MODER0_0;
                     GPIOC ->OTYPER &=~GPIO_OTYPER_OT0;
                     //бит0 определяет скорость работы GPIO
                      GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR0_1; //бит1
                      GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR0_0;
                      GPIOC->PUPDR &=~ GPIO_PUPDR_PUPDR0_1;
                      GPIOC->PUPDR |= GPIO_PUPDR_PUPDR0_0;

                     GPIOC->MODER &=~ GPIO_MODER_MODER1_1;
                      GPIOC->MODER |= GPIO_MODER_MODER1_0;
                              GPIOC ->OTYPER &=~GPIO_OTYPER_OT1;
                              //бит0 определяет скорость работы GPIO
                               GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR1_1; //бит1
                               GPIOC->OSPEEDR &=~ GPIO_OSPEEDER_OSPEEDR1_0;
                               GPIOC->PUPDR |=GPIO_PUPDR_PUPDR1_1;
                               GPIOC->PUPDR &=~ GPIO_PUPDR_PUPDR1_0;
 }

int main(void)
{
//      int adc_data=0;
    inits_GPIOC();
    inits_adc();


    //ADC1->CR2 |= ADC_CR2_SWSTART;
    //inits_timer1();
    inits_timer3();
    inits_timer5();
  

     
        ADC1->CR2 |= ADC_CR2_SWSTART;

    while(1)
    {
      
        }
}

Я извиняюсь коллеги вот рабочий исходник

Ссылка на комментарий
Поделиться на другие сайты

12 часов назад, Электронщик сказал:

Получается камень поддельный? Или сам IAR? Вы в чем пишите в IAR? А есть кусок кода с тактированием? Чтобы помигать светиком проверить есть ли инверсия, и что с тактированием

Пишу в Keil на HAL

Смогу проверенный blink для этой платы прислать после НГ - навёл порядок к празднику, убрал всё на балкон B)

Пока писал, подумалось - а как ты инверсию определил? По свечению светодиода поди? 1 пишешь - светик не горит, а 0 - горит? :D

Изменено пользователем Darth_Vader
Ссылка на комментарий
Поделиться на другие сайты

плата нормальная.В HAl всё работает проверено изучаю cmsis.я определил по свечению светодиода и когда  включаю таймера они перестают работать  другой светодиод не мигает.Не в прерывании работает т ацп и таймера(по крайнее мере один).

В hal пишу тоже на cmsis.Так проще.

Ссылка на комментарий
Поделиться на другие сайты

Цитата

 

Пока писал, подумалось - а как ты инверсию определил? По свечению светодиода поди? 1 пишешь - светик не горит, а 0 - горит? 

 

 

 

Спасибо, кстати id камня 0x413 в ST-utility -что соответствует 405,407 и другим камням этой серии, при этом CPUID в IAR показывает 0x410 вот 

Скрытый текст

Screenshot_9.jpg.5b71368d52acc25943e0bd4aecf46c02.jpg

. Пока писал, подумалось - а как ты инверсию определил? По свечению светодиода поди? 1 пишешь - светик не горит, а 0 - горит?

Ну да, ну и напряжение посмотрел на GPIO при каждом значении регистра, или HAL, при этом сколько на 103 писал и на 769 таких приколов ни разу не было

Тут вот кстати писал парень про то что партию поддельных 407 купили и CPUID 0x410

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

Светики на этой плате подтянуты к 3.3 вольт

Что бы они горели - нужно дать 0 на пин :D

701994825_.png.32abab1a064b671df6448b4c87819bc4.png

Изменено пользователем Darth_Vader
Ссылка на комментарий
Поделиться на другие сайты

спасибо.И в таймерах тоже?

Я отдельно включаю светодиоды к GPIO   портам с резистром. Эти светики я не использую.

У меня 1 горит 0 не горит.Не инверсия.

Ссылка на комментарий
Поделиться на другие сайты

@Электронщик Сфоткай МК, ты на космодроме брал? Я даже за сотню куплю у тебя этот МК, никогда не встречал подделок)

@Ivan Rusev  Вставляй пожалуйста портянки кода в спойлер и тэгом Code.

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...