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

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 пользователей онлайн

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

  • Сообщения

    • Доковырялся с макеткой так, что все перестало работать( И посмотрев внимательнее обнаружил, что в рабочем варианте у меня используется TPL5111 (ZFVX), а на макетке TPL5110 (ZALX). Китайцы видать напутали со сборкой положили и то и то. В одной статейке написано :  TPL5110 — таймер для управления внешним ключом питания, в качестве которого используется МОП-транзистор TPL5111 — таймер для управления внешним ключом питания, в качестве которого используется LDO-стабилизатор с функцией разрешения Что используется в качестве этого "LDO стабилизатора" пока не разобрался( Теперь только после праздников. пысы  Не получается блин просто))))))  
    • Тут я уже писАл, какой ток что на самом деле протекает.  
    • Как к модеру к нему конечно были вопросы. Ну и правила его не касались, когда кидался оскорблениями в адрес Василича. А за ответы на оскорбления Василич баны выхватывал
    • Смотрю, многие в усилителях избегают катодного повторителя. Либо сразу берут токовые лампы с хорошим усилением, либо два каскада последовательно на токовых лампах с низким усилением. Вроде бы на звук не влияет...
    • Имел дело с зарядкой батареек еще с советских времен. Тогда еще в магазине (!) купил специальную зарядку для ртутно-цинковых батареек, очень миниатюрная, зарядка шла от встроенного солнечного элемента (и это еще в советские времена!). Использовал для зарядки батареек для наручных часов, после первой зарядки батарейки хватало примерно на полгода, потом на 3-4 месяца. Потом (когда батарейка служила меньше двух месяцев) батарейка отправлялась на упокой. Спасала студента тогда очень эта вещица. Жалею что тогда не срисовал ее внутренности. А вот с зарядкой щелочных батареек пришлось заниматься уже значительно позже. Мне кто-то подарил такой набор (зарядка с комплектом перезаряжаемых батареек) - вот его обзор https://aphnetworks.com/reviews/pure_energy_xl  Все было нормально, но у всех этих батареек ресурс очень ограничен, примерно 25 циклов максимум. После чего емкость уменьшается и нет смысла их дальше использовать. После каждой зарядки емкость уменьшается, но не сильно. Реально раз десять заряжать можно точно без проблем. После того как выработался ресурс последней батарейки стал вопрос - а можно ли заряжать обычные батарейки тоже? Зарядка-то осталась... И как раз в то время приобрел обычные (т.е. "незаряжаемые") батарейки той же фирмы (PureEnergy). Оказалось что они заряжаются точно также, как и "заряжаемые"! Возможно что у них та же химия... Пробовал батарейки разных фирм, степени разряда. Короче говоря, фирменные всякие Дюраселлы и Энержайзеры не заряжаются вообще, и даже могут потечь во время зарядки. А вот самые дикие и дешевые нонейм чаще всего заряжаются без проблем. Насчет емкости - конечно емкость полностью не восстанавливается, но для работы в беспроводной клаве,, мышке или пульте вполне хватает и достаточно надолго.  Но занимаюсь этим нечасто, просто когда лень ехать в магазин за очередной партией батареек.  А если есть возможность, то предпочитаю переделывать питание под литий. Очень сильно достает саморазряд всяких Ni-Cd, Ni-MH - разряжаются даже те, которые якобы должны долго держать заряд. Схему зарядки еще не срисовывал (лень было разбирать), но схема сложнее чем все что я видел в Интернете. Напряжение заряда примерно 1,7в. xlaa_tds.pdf
    • Я делаю ставку на контакты NC реле запуска и NO реле торможения. Тем более они такие хлипенькие.
×
×
  • Создать...