STM32F030K6 настройка программы

Кто любит RISC в жизни, заходим, не стесняемся.
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

char slow_sensors_data[2] ? данные 12 бит ?

Eсли ADC_DiscModeCmd(ADC1, ENABLE); , то АЦП при каждом обращении сам переключает все активные каналы из пула , по одному каналу на обращение.
Если ADC_DiscModeCmd(ADC1, DISABLE); то все активные каналы пребираются сразу с одного пинка и без DMA считываете каждый раз данные только канала со старшим адресом ( если включен перебор каналов от младшего к старшему) .

Посмотреть можно отладчиком. Кейл показывает регистры ADC, так что можно по шагам посмотреть - какой именно адрес включен и что АЦП там меряет. Не знаю как в IAR.

У F030 нет вывода VBAT , сейчас у вас АЦП вместо VBAT просто отключает MUX и меряет "что-то".
Остаток на ёмкости после Vref , например.
Для F030 вам нужно любой вывод АЦП использовать, учитывать порядок пинов.

На других сериях pin VBAT есть только выше 48 ног и должен быть подключен на питание.
На АЦП с VBAT сигнал идёт через делитель 1/2 50 кОм, +/- 1% вроде.
После старта этот делитель отключен , его надо включить перед замером и подождать какие - то микросекунды.
Спойлер// 2. Get data from slow sensors pool

//#define ADC_Channel_Vrefint ((uint32_t)ADC_Channel_17)
//#define ADC_Channel_Vbat ((uint32_t)ADC_Channel_18) , для F030 поставить здесь свой канал .

ADC_StartOfConversion(ADC1);
// Wait until conversion complete
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET){;}

adc_data_v_ref = ADC_GetConversionValue(ADC1); для F030 - обратный порядок

ADC_StartOfConversion(ADC1);
// Wait until conversion complete
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET){;}

adc_data_v_bat = ADC_GetConversionValue(ADC1); для F030 - обратный порядок

}
Реклама
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Вообщем придется ставить TL431 с выходным напряжением на 3В для подачи на пин VDDA.

При записи во FLASH, читается не то что записали.
Если timer = (flash_read(0x08006000)), то при чтении на индикаторе 1, если timer = 1+ (flash_read(0x08006000)), то на индикаторе 0, если 2+, то 1, 3+, то 2.
Спойлер

Код: Выделить всё

uint32_t flash_read(uint32_t address)
{
  return (*(__IO uint32_t*) address);
}

uint8_t flash_ready(void) 
{
  return !(FLASH->SR & FLASH_SR_BSY);
}
 
//Функция стирает одну страницу. В качестве адреса можно использовать любой
//принадлежащий диапазону адресов той странице которую нужно очистить.
void flash_erase_page(uint32_t address) 
{
  FLASH->CR|= FLASH_CR_PER; //Устанавливаем бит стирания одной страницы
  FLASH->AR = address; // Задаем её адрес
  FLASH->CR|= FLASH_CR_STRT; // Запускаем стирание
  while(!flash_ready());  //Ждем пока страница сотрется.
  FLASH->CR&= ~FLASH_CR_PER; //Сбрасываем бит обратно
}

void flash_write(uint32_t address,int data) 
{
  //FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование флеша
  FLASH_Unlock();
  while(!flash_ready()); //Ожидаем готовности флеша к записи
  *(__IO uint16_t*)address = (int)data; //Пишем младшие 2 бата
  while(!flash_ready());
  //address+=2;
  //data>>=16;
  //*(__IO uint16_t*)address = (uint16_t)data; //Пишем старшие 2 байта
  //while(!flash_ready());
  //FLASH->CR &= ~(FLASH_CR_PG); //Запрещаем программирование флеша
  FLASH_Lock();

  timer = 3+(flash_read(0x08006000));
  FLASH_Unlock();
  flash_erase_page(0x08006000);
  FLASH_Lock();
}
По адресу 0x08006000 видимо уже что-то записано, как узнать адреса свободной области памяти для записи.
Реклама
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

есть ограничения по разнице между Vdd и Vdda и порядок подачи питания.
Vdda должно подаваться раньше Vdd для работы Brown Out Detector.
flash можно посмотреть в ST-Link Utility , по правилам память нужно линкеру прописывать в Target или scatter file,
задать верхнюю границу RO для программы и область RW для данных.
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

FLASH занята по адрес 0х08002580 примерно, в функции задан начальный адрес 0х08006000 для записи 4-х переменных int, конечный адрес 0x08006016. Если записывать по одной переменной то работает, поочередно зависает.
Спойлер

Код: Выделить всё


 #define FLASH_PAGE_SIZE         ((uint32_t)0x00000400)   /* FLASH Page Size */
 #define FLASH_USER_START_ADDR   ((uint32_t)0x08006000)   /* Start @ of user Flash area */
 #define FLASH_USER_END_ADDR     ((uint32_t)0x08006016)   /* End @ of user Flash area */

uint32_t EraseCounter = 0x00, Address = 0x00;
uint32_t NbrOfPage = 0x00;
__IO FLASH_Status FLASHStatus = FLASH_COMPLETE;
__IO TestStatus MemoryProgramStatus = PASSED;

static void Writetoflash2(void)
{
  /* Unlock the Flash to enable the flash control register access *************/ 
  FLASH_Unlock();
    
  /* Erase the user Flash area
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/

  /* Clear pending flags (if any) */  
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR); 

  /* Define the number of page to be erased */
  NbrOfPage = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;

  /* Erase the FLASH pages */
  for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
  {
    if (FLASH_ErasePage(FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter))!= FLASH_COMPLETE)
    {
     /* Error occurred while sector erase. 
         User can add here some code to deal with this error  */
      while (1)
      {
      }
    }
  }
  /* Program the user Flash area word by word
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/

  Address = FLASH_USER_START_ADDR;

  while (Address < FLASH_USER_END_ADDR)
  {
    if (FLASH_ProgramWord(Address, timer) == FLASH_COMPLETE)
    {
      Address = Address + 4;
      if (FLASH_ProgramWord(Address, programma) == FLASH_COMPLETE)
      {
        Address = Address + 4;
        if (FLASH_ProgramWord(Address, power) == FLASH_COMPLETE)
        {
          Address = Address + 4;
          if (FLASH_ProgramWord(Address, melodiya) == FLASH_COMPLETE)
          {
            Address = Address + 4;
          }
        }
      }
    }
    else
    { 
      /* Error occurred while writing data in Flash memory. 
         User can add here some code to deal with this error */
      while (1)
      {
      }
    }
  }

  /* Lock the Flash to disable the flash control register access (recommended
     to protect the FLASH memory against possible unwanted operation) *********/
  FLASH_Lock(); 


  /* Check if the programmed data is OK 
      MemoryProgramStatus = 0: data programmed correctly
      MemoryProgramStatus != 0: number of words not programmed correctly ******/
  Address = FLASH_USER_START_ADDR;
  MemoryProgramStatus = PASSED;
  
  while (Address < FLASH_USER_END_ADDR)
  {
    timer = *(__IO uint32_t *)Address;
    Address = Address + 4;
    programma = *(__IO uint32_t *)Address;
    Address = Address + 4;
    power = *(__IO uint32_t *)Address;
    Address = Address + 4;
    melodiya = *(__IO uint32_t *)Address;
    Address = Address + 4;
    }
}

static void flash_read2(void)
{
  Address = FLASH_USER_START_ADDR;
  MemoryProgramStatus = PASSED;
  
  while (Address < FLASH_USER_END_ADDR)
  {
    timer = *(__IO uint32_t *)Address;
    Address = Address + 4;
    programma = *(__IO uint32_t *)Address;
    Address = Address + 4;
    power = *(__IO uint32_t *)Address;
    Address = Address + 4;
    melodiya = *(__IO uint32_t *)Address;
    Address = Address + 4;
  }
}

Получилось сделать так:
Спойлер

Код: Выделить всё


 #define FLASH_PAGE_SIZE         ((uint32_t)0x00000400)   /* FLASH Page Size */
 #define FLASH_USER_START_ADDR   ((uint32_t)0x08006000)   /* Start @ of user Flash area */
 #define FLASH_USER_END_ADDR     ((uint32_t)0x08006400)   /* End @ of user Flash area */


uint32_t EraseCounter = 0x00, Address = 0x00;
uint32_t NbrOfPage = 0x00;
__IO FLASH_Status FLASHStatus = FLASH_COMPLETE;
__IO TestStatus MemoryProgramStatus = PASSED;


static void Writetoflash2(void)
{
  /* Unlock the Flash to enable the flash control register access *************/ 
  FLASH_Unlock();
    
  /* Erase the user Flash area
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/

  /* Clear pending flags (if any) */  
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR); 

  /* Define the number of page to be erased */
  NbrOfPage = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;

  /* Erase the FLASH pages */
  for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
  {
    if (FLASH_ErasePage(FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter))!= FLASH_COMPLETE)
    {
     /* Error occurred while sector erase. 
         User can add here some code to deal with this error  */
      while (1)
      {
      }
    }
  }
  /* Program the user Flash area word by word
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/

  Address = FLASH_USER_START_ADDR;

  while (Address < FLASH_USER_END_ADDR)
  {
    if (FLASH_ProgramWord(Address, timer) == FLASH_COMPLETE)
    {
      Address = Address + 4;
      if (FLASH_ProgramWord(Address, programma) == FLASH_COMPLETE)
      {
        Address = Address + 4;
        if (FLASH_ProgramWord(Address, power) == FLASH_COMPLETE)
        {
          Address = Address + 4;
          if (FLASH_ProgramWord(Address, melodiya) == FLASH_COMPLETE)
          {
            Address = Address + 4;
            break;
          }
        }
      }
    }
    else
    { 
      /* Error occurred while writing data in Flash memory. 
         User can add here some code to deal with this error */
      while (1)
      {
      }
    }
  }

  /* Lock the Flash to disable the flash control register access (recommended
     to protect the FLASH memory against possible unwanted operation) *********/
  FLASH_Lock(); 


  /* Check if the programmed data is OK 
      MemoryProgramStatus = 0: data programmed correctly
      MemoryProgramStatus != 0: number of words not programmed correctly ******/
  Address = FLASH_USER_START_ADDR;
  MemoryProgramStatus = PASSED;
  
  while (Address < FLASH_USER_END_ADDR)
  {
    timer = *(__IO uint32_t *)Address;
    Address = Address + 4;
    programma = *(__IO uint32_t *)Address;
    Address = Address + 4;
    power = *(__IO uint32_t *)Address;
    Address = Address + 4;
    melodiya = *(__IO uint32_t *)Address;
    Address = Address + 4;
            break;
  }
}

static void flash_read2(void)
{
  Address = FLASH_USER_START_ADDR;
  MemoryProgramStatus = PASSED;
  
  while (Address < FLASH_USER_END_ADDR)
  {
    timer = *(__IO uint32_t *)Address;
    Address = Address + 4;
    programma = *(__IO uint32_t *)Address;
    Address = Address + 4;
    power = *(__IO uint32_t *)Address;
    Address = Address + 4;
    melodiya = *(__IO uint32_t *)Address;
    Address = Address + 4;
            break;
  }
}
Как выйти из спящего режима через нулевой уровень на пине РА0, если вход такой:
Спойлер

Код: Выделить всё

 sleep_counter++;
  if((sleep_counter>=400000)&&(lamp_start==0))
  {
    GPIO_ResetBits(GPIOF, GPIO_Pin_0);  //A
    GPIO_ResetBits(GPIOF, GPIO_Pin_1);  //B
    GPIO_ResetBits(GPIOA, GPIO_Pin_3);  //C
    GPIO_ResetBits(GPIOB, GPIO_Pin_1);  //D
    GPIO_ResetBits(GPIOA, GPIO_Pin_9);  //E
    GPIO_ResetBits(GPIOA, GPIO_Pin_10);  //F
    GPIO_ResetBits(GPIOA, GPIO_Pin_13);  //G
    GPIO_SetBits(GPIOA, GPIO_Pin_14);  //DP
   //sleep=1;
   sleep_counter=0;
    /* Clear Wakeup flag */
  PWR->CR |= PWR_CR_CWUF;
  /* Select STANDBY mode */
  PWR->CR |= PWR_CR_PDDS;
  /* Set SLEEPDEEP bit of Cortex-M0 System Control Register */
  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  /* Request Wait For Interrupt */
  __WFI();
  }
Пробовал так, никак:
Спойлер

Код: Выделить всё

  // Enable RTC Alarm A Interrupt 
  RTC_ITConfig(RTC_IT_ALRA, ENABLE);
  // Configure the RTC Alarm A register 
  //RTC_SetAlarm(RTC_Format_BCD, RTC_Alarm_A, &RTC_AlarmStructure);
  // Enable the alarm 
  RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
  //RTC_ClearFlag(RTC_FLAG_ALRAF);
  //RTC_ITConfig(RTC_IT_ALRA, ENABLE);
  
  EXTI_InitTypeDef EXTI_InitStructure;
  RTC_AlarmTypeDef RTC_AlarmStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  
  // EXTI configuration 
  EXTI_ClearITPendingBit(EXTI_Line0);
  EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line5 | EXTI_Line6 | EXTI_Line7;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
  
  // Enable the RTC Alarm Interrupt 
  NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;//RTC_Alarm_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;//NVIC_IRQChannelPreemptionPriority
  //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 
  // Set the alarmA Masks 
  RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_All;
  RTC_SetAlarm(RTC_Format_BCD, RTC_Alarm_A, &RTC_AlarmStructure);
  
  // Set AlarmA subseconds and enable SubSec Alarm : generate 8 interripts per Second 
  RTC_AlarmSubSecondConfig(RTC_Alarm_A, 0xFF, RTC_AlarmSubSecondMask_SS14_5);
  // Enable AlarmA interrupt 
  RTC_ITConfig(RTC_IT_ALRA, ENABLE);
Реклама
Эиком - электронные компоненты и радиодетали
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Выход из спящего режима не работает и при входе в спящий режим зависает. Программа из STM32F0xx_StdPeriph_Examples:
Спойлер

Код: Выделить всё

void RTC_IRQHandler(void)
{
    GPIO_SetBits(GPIOA, GPIO_Pin_10);  //F
  if (RTC_GetITStatus(RTC_IT_ALRA) != RESET)
  {
    /* LED4 on */
    //STM_EVAL_LEDOn(LED4);

    /* Clear the Alarm A Pending Bit */
    RTC_ClearITPendingBit(RTC_IT_ALRA);
    
    /* Clear EXTI line17 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line17);    
  }  
}

void EXTI4_15_IRQHandler(void)
{/*
  if(EXTI_GetITStatus(TAMPER_BUTTON_EXTI_LINE) != RESET)
  { 
    // Clear the TAMPER Button EXTI line pending bit 
    EXTI_ClearITPendingBit(TAMPER_BUTTON_EXTI_LINE);

    // LED2 on
    STM_EVAL_LEDOn(LED2);
  }*/
    GPIO_SetBits(GPIOA, GPIO_Pin_10);  //F
}







static void RTC_Config2(void)
{
  RTC_TimeTypeDef   RTC_TimeStructure;
  RTC_InitTypeDef   RTC_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  
  // RTC Configuration 
  /// Enable the PWR clock 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  
  // Allow access to RTC 
  PWR_BackupAccessCmd(ENABLE);

  // Reset back up registers 
  RCC_BackupResetCmd(ENABLE);
  RCC_BackupResetCmd(DISABLE);
  
  // Enable the LSE 
  RCC_LSEConfig(RCC_LSE_ON);
  
  // Wait till LSE is ready 
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {}
  
  // Select the RTC Clock Source 
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  
  // Enable the RTC Clock 
  RCC_RTCCLKCmd(ENABLE);
 
  RTC_DeInit(); 
  // Wait for RTC APB registers synchronisation 
  RTC_WaitForSynchro();  
  
  // Set RTC calendar clock to 1 HZ (1 second) 
  RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
  RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
  RTC_InitStructure.RTC_SynchPrediv = 0x0FF;
  /*
  if (RTC_Init(&RTC_InitStructure) == ERROR)
  {
    while(1);
  }*/

  // Set the time to 00h 00mn 30s AM 
  RTC_TimeStructure.RTC_H12     = RTC_H12_AM;
  RTC_TimeStructure.RTC_Hours   = 0x00;
  RTC_TimeStructure.RTC_Minutes = 0x00;
  RTC_TimeStructure.RTC_Seconds = 0x1E;  
  
  RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);
    
  // Configure EXTI line 17 (connected to the RTC Alarm event) 
  EXTI_ClearITPendingBit(EXTI_Line17);
  EXTI_InitStructure.EXTI_Line = EXTI_Line17;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
  
  // NVIC configuration 
  NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure); 
}


static void RTC_AlarmConfig(void)
{  
  RTC_TimeTypeDef   RTC_TimeStructure;
  RTC_AlarmTypeDef  RTC_AlarmStructure;

  /* Get current time */
  RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);

  /* Set the alarm to current time + 5s */
  RTC_AlarmStructure.RTC_AlarmTime.RTC_H12     = RTC_H12_AM;
  RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours   = RTC_TimeStructure.RTC_Hours;
  RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = RTC_TimeStructure.RTC_Minutes;
  RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = RTC_TimeStructure.RTC_Seconds + 5;
  RTC_AlarmStructure.RTC_AlarmDateWeekDay = 31;
  RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
  RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay | RTC_AlarmMask_Minutes |
                                     RTC_AlarmMask_Hours;
  RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
   
  /* Enable the RTC Alarm A interrupt */
  RTC_ITConfig(RTC_IT_ALRA, ENABLE);

  /* Enable the alarm */
  RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
    
  /* Clear the Alarm A Pending Bit */
  RTC_ClearITPendingBit(RTC_IT_ALRA);  
}

static void SYSCLKConfig_STOP(void)
{  
  /* After wake-up from STOP reconfigure the system clock */
  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);
  
  /* Wait till HSE is ready */
  while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET)
  {}
  
  /* Enable PLL */
  RCC_PLLCmd(ENABLE);
  
  /* Wait till PLL is ready */
  while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  {}
  
  /* Select PLL as system clock source */
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  
  /* Wait till PLL is used as system clock source */
  while (RCC_GetSYSCLKSource() != 0x08)
  {}
}
extern __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{
  TimingDelay = nTime;

  while(TimingDelay != 0);

}




  sleep_counter++;
  if((sleep_counter>=400000)&&(lamp_start==0))
  { 
    // RTC Configuration 
    RTC_Config2();
    // Insert 5 second delay 
    //Delay(500);
    
    // Set alarm in 5s 
    RTC_AlarmConfig();

    // LEDs Off 
    GPIO_ResetBits(GPIOF, GPIO_Pin_0);  //A
    GPIO_ResetBits(GPIOF, GPIO_Pin_1);  //B
    GPIO_ResetBits(GPIOA, GPIO_Pin_3);  //C
    GPIO_ResetBits(GPIOB, GPIO_Pin_1);  //D
    GPIO_ResetBits(GPIOA, GPIO_Pin_9);  //E
    GPIO_ResetBits(GPIOA, GPIO_Pin_10);  //F
    GPIO_ResetBits(GPIOA, GPIO_Pin_13);  //G
    GPIO_SetBits(GPIOA, GPIO_Pin_14);  //DP
   
    // Request to enter STOP mode with regulator in low power mode 
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

    // LED1 On 
    GPIO_SetBits(GPIOA, GPIO_Pin_13);  //DP
    
    // Disable the RTC Alarm interrupt 
    RTC_ITConfig(RTC_IT_ALRA, DISABLE);
    RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
    
    // Configures system clock after wake-up from STOP 
    SYSCLKConfig_STOP();
}
На каком пине должен быть EXTI_Trigger_Rising от EXTI_Line17 если он внутри подсоединен к Internal interrupt line 17 Connected to the RTC Alarm event.
Реклама
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

В stop mode входит, но обратно по нажатию кнопки на пине PA13 не выходит.
В даташите указано чтобы войти в stop mode нужно: PDDS and LPDS bits + SLEEPDEEP bit + WFI or WFE, а чтобы выйти нужно: Any EXTI line (configured in the EXTI registers). Видимо обработчик прерывания не запускается.
Спойлер

Код: Выделить всё

/* Configure pins to be interrupts */
void Configure_PA0(void) 
{
    /* Set variables used */
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
  /*  */
    // Enable clock for GPIOA 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    // Enable clock for SYSCFG 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    
    // Set pin as input 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_0);  //
    
    // Tell system that you will use PA0 for EXTI_Line0 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource13);
    
    // PD0 is connected to EXTI_Line0 
    EXTI_InitStructure.EXTI_Line = EXTI_Line13;
    // Enable interrupt 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    // Interrupt mode 
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    // Triggers on rising and falling edge 
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    // Add to EXTI 
    EXTI_Init(&EXTI_InitStructure);
 
    // Add IRQ vector to NVIC 
    // PD0 is connected to EXTI_Line0, which has EXTI0_IRQn vector 
    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;
    // Set priority 
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;//NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
    // Set sub priority 
    //NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
    // Enable interrupt 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    // Add to NVIC 
    NVIC_Init(&NVIC_InitStructure);
}


/* Set interrupt handlers */
/* Handle PD0 interrupt */
void EXTI4_15_IRQHandler(void) 
{
      sleep_counter=0;
      timer=5;
    GPIO_ResetBits(GPIOF, GPIO_Pin_1);  //B
    GPIO_ResetBits(GPIOA, GPIO_Pin_9);  //E
    GPIO_SetBits(GPIOA, GPIO_Pin_14);  //DP
    GPIO_SetBits(GPIOF, GPIO_Pin_0);  //A
    GPIO_SetBits(GPIOA, GPIO_Pin_3);  //C
    GPIO_SetBits(GPIOB, GPIO_Pin_1);  //D
    GPIO_SetBits(GPIOA, GPIO_Pin_10);  //F
    GPIO_SetBits(GPIOA, GPIO_Pin_13);  //G
    /* Make sure that interrupt flag is set */
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        /* Clear interrupt flag */
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
    if (EXTI_GetITStatus(EXTI_Line13) != RESET)
    {
        /* Clear interrupt flag */
        EXTI_ClearITPendingBit(EXTI_Line13);
    }
}



while(1)
{
  Configure_PA0();

  sleep_counter++;
  if((sleep_counter>=400000)&&(lamp_start==0))
  { 

    GPIO_ResetBits(GPIOF, GPIO_Pin_0);  //A
    GPIO_ResetBits(GPIOF, GPIO_Pin_1);  //B
    GPIO_ResetBits(GPIOA, GPIO_Pin_3);  //C
    GPIO_ResetBits(GPIOB, GPIO_Pin_1);  //D
    GPIO_ResetBits(GPIOA, GPIO_Pin_9);  //E
    GPIO_ResetBits(GPIOA, GPIO_Pin_10);  //F
    GPIO_ResetBits(GPIOA, GPIO_Pin_13);  //G
    GPIO_SetBits(GPIOA, GPIO_Pin_14);  //DP
  PWR->CSR |= PWR_CSR_EWUP1 | PWR_CSR_EWUP2 | PWR_CSR_EWUP5 | PWR_CSR_EWUP6 | PWR_CSR_EWUP7;
    RTC_AlarmTypeDef  RTC_AlarmStructure;
    RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
    RTC_ITConfig(RTC_IT_ALRA, ENABLE);
    RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
    PWR_WakeUpPinCmd(PWR_WakeUpPin_1,ENABLE);
   Configure_PA0();
   sleep_counter=0;
   PWR->CR |= 0x07;  //Mode name Stop: PDDS and LPDS bits + SLEEPDEEP bit + WFI or WFE
   //Mode name Standby: PDDS bits + SLEEPDEEP bit + WFI or WFE
   SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  // Request Wait For Interrupt 
  __WFI();
  }
}
Реклама
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32F030K6 настройка программы

Сообщение a5021 »

А никто не в курсе, что за странная "запирающая" последовательность (7) записи в регистр RTC->WPR присутствует во всех примерах Code Snippets и в примере из мануала (RM0091) на стр. 978:

Код: Выделить всё

/* (1) Write access for RTC registers */
/* (2) Enable init phase */
/* (3) Wait until it is allow to modify RTC register values */
/* (4) set prescaler, 40kHz/128 => 312 Hz, 312Hz/312 => 1Hz */
/* (5) New time in TR */
/* (6) Disable init phase */
/* (7) Disable write access for RTC registers */
RTC->WPR = 0xCA; /* (1) */
RTC->WPR = 0x53; /* (1) */
RTC->ISR |= RTC_ISR_INIT; /* (2) */
while ((RTC->ISR & RTC_ISR_INITF) != RTC_ISR_INITF) /* (3) */
{
/* add time out here for a robust application */
}
RTC->PRER = 0x007F0137; /* (4) */
RTC->TR = RTC_TR_PM | Time; /* (5) */
RTC->ISR &=~ RTC_ISR_INIT; /* (6) */
RTC->WPR = 0xFE; /* (7) */
RTC->WPR = 0x64; /* (7) */
Из всего мной прочитанного по данной теме вроде бы явствует, что любое "произвольное" значение занесенное в RTC->WPR приводит к тому, что часики запираются и запись в регистры становится невозможной. Но во всех примерах и в мануле, для запирания в WPR пишут не абы что, а совершенно конкретную последовательность 0xFE и 0x64. Это какая-то неописанная магия или просто бред собачий?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32F030K6 настройка программы

Сообщение oleg110592 »

a5021 писал(а):Но во всех примерах и в мануле, для запирания в WPR пишут не абы что, а совершенно конкретную последовательность 0xFE и 0x64
в SPL так пишут:

Код: Выделить всё

  /* Enable the write protection for RTC registers */
  RTC->WPR = 0xFF; 
и все
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32F030K6 настройка программы

Сообщение a5021 »

В HAL я тоже посмотрел сразу и как раз на счет этого вопросов не возникло. Там те же FF, но вот откуда взялись магические цифры в мануале и снайпетах, даже намеков никаких не видно. Есть, конечно, подозрение, что скопипастили из какого-то другого семейства, но пока не понятно из какого именно.
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Правильно ли вхожу в stop mode и правильно ли выхожу? В даташите написано, чтобы войти в stop mode необходимо (RM0360: Table 14 page 78): PDDS and LPDS bits + SLEEPDEEP bit + WFI or WFE.
Вход:

Спойлер

Код: Выделить всё

  sleep_counter++;
  if((sleep_counter>=400000)&&(lamp_start==0))
  { 
    GPIO_ResetBits(GPIOF, GPIO_Pin_0);  //A
    GPIO_ResetBits(GPIOF, GPIO_Pin_1);  //B
    GPIO_ResetBits(GPIOA, GPIO_Pin_3);  //C
    GPIO_ResetBits(GPIOB, GPIO_Pin_1);  //D
    GPIO_ResetBits(GPIOA, GPIO_Pin_9);  //E
    GPIO_ResetBits(GPIOA, GPIO_Pin_10);  //F
    GPIO_ResetBits(GPIOA, GPIO_Pin_13);  //G
    GPIO_SetBits(GPIOA, GPIO_Pin_14);  //DP
    DisableADC();
  Configure_PA();
  EXTI->PR &= ~0x00;
  EXTI->SWIER &= ~0x00;
  sleep_counter=0;
  PWR->CR |= 0x05; //Mode name Stop: PDDS and LPDS bits + SLEEPDEEP bit + WFI or WFE
  //Mode name Standby: PDDS bits + SLEEPDEEP bit + WFI or WFE
  // Set SLEEPDEEP bit of Cortex-M0 System Control Register 
  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  // Request Wait For Interrupt 
  __WFI();
Чтобы выйти необходимо если входили через WFI, то любое EXTI Line configured in Interrupt mode (the corresponding EXTI
Interrupt vector must be enabled in the NVIC).
Соответственно прерывания разрешены так:
Спойлер

Код: Выделить всё

void main(void)
{
__enable_irq ();
EXTI -> IMR = 1;
EXTI -> EMR = 1;
EXTI -> FTSR = 1;
while (1)
  {...
И выход настроен на пин PA0 так:
Спойлер

Код: Выделить всё

void Configure_PA(void) 
{
    /* Set variables used */
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
  /*  */
    // Enable clock for GPIOA 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    // Enable clock for SYSCFG 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    
    // Set pin as input 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_0);  //
    
    // Tell system that you will use PA13 for EXTI_Line13 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource13);
    
  EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4
                          | EXTI_Line5 | EXTI_Line6 | EXTI_Line7 | EXTI_Line8
                          | EXTI_Line9 | EXTI_Line10 | EXTI_Line11 | EXTI_Line12
                          | EXTI_Line13 | EXTI_Line14 | EXTI_Line15 | EXTI_Line16
                          | EXTI_Line17 | EXTI_Line18 | EXTI_Line19 | EXTI_Line20
                          | EXTI_Line21 | EXTI_Line22 | EXTI_Line23 | EXTI_Line25
                          | EXTI_Line26 | EXTI_Line27 | EXTI_Line31);
    // PA13 is connected to EXTI_Line13 
    EXTI_InitStructure.EXTI_Line = EXTI_Line13;
    // Enable interrupt 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    // Interrupt mode 
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    // Triggers on rising and falling edge 
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    // Add to EXTI 
    EXTI_Init(&EXTI_InitStructure);
 
    // Разрешаем прерывания в периферии для выводов 0 и 13 
    EXTI->IMR |=(EXTI_IMR_MR0 | EXTI_IMR_MR13);
    //EXTI->SWIER |= EXTI_SWIER_SWIER13;
    
    // Add IRQ vector to NVIC 
    // PD0 is connected to EXTI_Line0, which has EXTI0_IRQn vector 
    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;
    // Set priority 
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;//NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
    // Set sub priority 
    //NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
    // Enable interrupt 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    // Add to NVIC 
    NVIC_Init(&NVIC_InitStructure);
    NVIC_EnableIRQ(EXTI4_15_IRQn);
    NVIC_SetPriority(EXTI4_15_IRQn,0);
}


/* Set interrupt handlers */
/* Handle PD0 interrupt */
void EXTI4_15_IRQHandler(void) 
{
      sleep_counter=0;
    GPIO_ResetBits(GPIOF, GPIO_Pin_1);  //B
    GPIO_ResetBits(GPIOA, GPIO_Pin_9);  //E
    GPIO_SetBits(GPIOA, GPIO_Pin_14);  //DP
    GPIO_SetBits(GPIOF, GPIO_Pin_0);  //A
    GPIO_SetBits(GPIOA, GPIO_Pin_3);  //C
    GPIO_SetBits(GPIOB, GPIO_Pin_1);  //D
    GPIO_SetBits(GPIOA, GPIO_Pin_10);  //F
    GPIO_SetBits(GPIOA, GPIO_Pin_13);  //G
    /* Make sure that interrupt flag is set */
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        /* Clear interrupt flag */
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
    if (EXTI_GetITStatus(EXTI_Line13) != RESET)
    {
        /* Clear interrupt flag */
        EXTI_ClearITPendingBit(EXTI_Line13);
    }
}
Также в даташите указано что можно еще через пины PA13 и PA17 (этот пин вообще наружу не выведен, а подсоединен внутри и каким образом можно менять его фронтом или спадом?). Но во всех этих случаях никак не выходит.
Примеры из сниппетов не удается подключить правильно. Необходимо настроить именно выход через нажатие любой кнопки, таймеры и прочее не подходит.
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

Посмотрите исходник из этой темы , может поможет. Правда , там проц. 100 серии.
http://radiokot.ru/forum/viewtopic.php?f=25&t=95086
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Получилось так:
Спойлер

Код: Выделить всё

void Configure_PA0(void) 
{
    /* Set variables used */
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    // Enable clock for GPIOA 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    // Enable clock for SYSCFG 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    
    // Set pin as input 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_0);  //
    
    // Tell system that you will use PA0 for EXTI_Line0 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
  EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4
                          | EXTI_Line5 | EXTI_Line6 | EXTI_Line7 | EXTI_Line8
                          | EXTI_Line9 | EXTI_Line10 | EXTI_Line11 | EXTI_Line12
                          | EXTI_Line13 | EXTI_Line14 | EXTI_Line15 | EXTI_Line16
                          | EXTI_Line17 | EXTI_Line18 | EXTI_Line19 | EXTI_Line20
                          | EXTI_Line21 | EXTI_Line22 | EXTI_Line23 | EXTI_Line25
                          | EXTI_Line26 | EXTI_Line27 | EXTI_Line31);/**/
    // PA0 is connected to EXTI_Line0 
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    // Enable interrupt 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    // Interrupt mode 
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    // Triggers on rising and falling edge 
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//EXTI_Trigger_Rising_Falling;
    // Add to EXTI 
    EXTI_Init(&EXTI_InitStructure);
 
    // Разрешаем прерывания в периферии для выводов 0 
    EXTI->IMR |=(EXTI_IMR_MR0);
    
    // Add IRQ vector to NVIC 
    // PD0 is connected to EXTI_Line0, which has EXTI0_IRQn vector 
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
    // Set priority 
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;//NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
    // Set sub priority 
    //NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
    // Enable interrupt 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    // Add to NVIC 
    NVIC_Init(&NVIC_InitStructure);
    NVIC_EnableIRQ(EXTI0_1_IRQn);
    NVIC_SetPriority(EXTI0_1_IRQn,0);
}



    DisableADC();
    Configure_PA0();
    sleep_counter=0;
  
	EXTI->FTSR = EXTI_FTSR_TR0;
	EXTI->IMR = 0;
	EXTI->EMR = EXTI_EMR_MR0;
	EXTI->PR = 0x0003FFFF;

	SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
	//PWR->CR &= ~(PWR_CR_PDDS|PWR_CR_LPDS);
	//PWR->CR |= PWR_CR_LPDS;
        PWR->CR |= 0x01; 
        EXTI->PR = 0x0003FFFF;
        __NOP();
	__WFE(); 
	NVIC_SystemReset();
Теперь необходимо настроить прерывание от TIM3 и сам таймер.
service47 писал(а):Имеются мелодии для ATmega88PA-AU, одна функция nota, сами мелодии и настройка таймера с обработчиком прерывания. Нужно перенести мелодии под stm32. Как правильно настроить таймер.

Даташит на ATmega88PA: http://www.atmel.com/images/Atmel-8271- ... mplete.pdf

Даташит под stm32: http://www.st.com/web/en/resource/techn ... 091010.pdf

Программа для ATmega88PA-AU:
Спойлер

Код: Выделить всё

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x04;
TCNT0=222;
OCR0A=0x00;
OCR0B=0x00;

// Timer 0 overflow interrupt service routine
#pragma vector=TIMER0_OVF_vect
__interrupt void TIMER0_OVF(void) 
{
i_temp++;
TCNT0=216;
}


void nota (unsigned int ton, unsigned int dlit, unsigned int pause)
{
unsigned int k=0, d;
TCCR0B=0x04;
TIMSK0=0x01;
i_temp=0;
d=dlit;
dlit=(dlit*95)/100;
	while (i_temp<dlit)
	{
        asm("wdr");
	    for (k=0; k<ton; k++)
	    {
            asm("wdr");
            __delay_cycles(10);
        }
	    Zum=!Zum;
	    if ((Start==0||Select==0)&&sz_start_musik==1)
            break;
	}
	for (k=0; k<ton; k++)
	{
        __delay_cycles(10);
        asm("wdr");
    }
	Zum=0;
	while (i_temp<d)
	{
        asm("wdr");
        if ((Start==0||Select==0)&&sz_start_musik==1)
            break;
	}
	while (i_temp<=pause)
	{
        asm("wdr");
        if ((Start==0||Select==0)&&sz_start_musik==1)
            break;
	}
Zum=0;
TCCR0B=0x00;
TIMSK0=0x01;
}
Для stm32:
Спойлер

Код: Выделить всё

#define _inverse_pin_() (GPIOA->ODR = GPIOA->ODR^(1UL<<2))
#define Zum (GPIOA->IDR & GPIO_IDR_2)


static void TIM_Config3(void)  //
{
// Clock value: 31,250 kHz
// Mode: Normal top=FFh
TIM3->CR1 |= (TIM_CR1_CMS_1 | TIM_CR1_CEN);
TIM3->DIER |= (TIM_DIER_UIE);
TIM3->CNT=0xDE;  
TIM3->PSC=0x255;  

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;


/* GPIOA clock enable */
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA , ENABLE);
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);

/* GPIOA Configuration: Channel 1 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_4);

TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 1023;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

// Channel 1 Configuration in PWM mode 

//TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = 1022;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

TIM_OC1Init(TIM3, &TIM_OCInitStructure);

TIM_Cmd(TIM3, ENABLE);
    NVIC_EnableIRQ(TIM3_IRQn); // (1) 
    NVIC_SetPriority(TIM3_IRQn, 1); // (2) 
}

void TIM3_IRQHandler(void) //
{
  i_temp++;
  TIM3->CNT=216;
  TIM3->SR &= ~TIM_SR_UIF;  // clear the UIF flag 
}

void nota (unsigned int ton, unsigned int dlit, unsigned int pause)
{
unsigned int k=0, d;
TIM3->PSC=0x255; 
TIM3->CR1 |= (TIM_CR1_CMS_1 | TIM_CR1_CEN);  
i_temp=0;
d=dlit;
dlit=(dlit*95)/100;
	while (i_temp<dlit)
	{
            //asm("wdr");
            for (k=0; k<ton; k++)
            {
                //asm("wdr");
                __delay_cycles(10);
            }
	    _inverse_pin_(); //Zum=!Zum;
	    if ((Start==0||Select==0)&&sz_start_musik==1)
            break;
	}
	for (k=0; k<ton; k++)
	{
            __delay_cycles(10);
            //asm("wdr");
        }
	GPIOA ->ODR  &= ~(1<<2); //Zum=0;
	while (i_temp<d)
	{
            //asm("wdr");
            if ((Start==0||Select==0)&&sz_start_musik==1)
            break;
	}
	while (i_temp<=pause)
	{
            //asm("wdr");
            if ((Start==0||Select==0)&&sz_start_musik==1)
            break;
	}
GPIOA ->ODR  &= ~(1<<2); //Zum=0;
TIM3->CR1 &= ~TIM_CR1_CEN;  //TCCR0B=0x00;
//TIM3->DIER &= ~TIM_DIER_CC1IE;  //TIMSK0=0x01;
TIM3->DIER &= ~TIM_DIER_UIE;  //TIMSK0=0x01;
TIM3->DIER |= (TIM_DIER_UIE);
}
Собственно больше нужно настроить саму функцию nota и чтобы вызывался обработчик прерывания.
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

Честно говоря - не понял , как Вы всё представляете. Если кварц 20мег, то клок таймера у Вас никак не будет 31,250.
Ну и вообще всё как то сложно.
На стм32 можно сделать совсем другим путём - через синхронизацию двух таймеров. Тим1 будет стробировать клок на тим2 или тим3 . Тим1 формирует длительность тона / паузу, прескалер ему задать 20,000 и программировать в миллисек. Tим2/ Tим3 без прескалера , программируется на частоту тона. Шим Tим2 / Tим3 задает громкость.

На неделе могу скинуть рабочий пример.
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

Пример из проекта на F042.
В STM32F030 нет TIM2, нужно переделать TIM2_-> TIM3 , включая синзронизацию от TIM1
Спойлер//
#include <stdlib.h>
#include <stdint.h>

#include "stm32f0xx.h"
#include "stm32f0xx_conf.h"
#include "stm32f0xx_it.h"
//

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;


/*******************/
volatile uint16_t tim1_period = tone_and_silent_gap_duration;
volatile uint16_t tim1_ch1_pulse = tone_duration;

volatile uint16_t tim2_period = tone_frequency;
volatile uint16_t tim2_ch3_pulse = tone_intensity;


/*******************/
void TIM1_MasterConfig(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

/* Time Base configuration */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

TIM_TimeBaseStructure.TIM_Prescaler = TIM1_PRESCALER;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = tim1_period;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

/* TIM1 Channel 4 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = tim1_ch1_pulse;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);

// Master-Slave mode
TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_OC4Ref);
TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE);

NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
NVIC_EnableIRQ(TIM1_CC_IRQn);

// TIM_Cmd(TIM1, ENABLE);
}



/*******************/
void TIM1_BRK_UP_TRG_COM_IRQHandler (void)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);

// это окончание промежутка между тонами

}//TIM1_IRQHandler


/*******************/
void TIM1_CC_IRQHandler (void)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_CC4);
// это окончание тона
}



/*******************/
void TIM2_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);

/* GPIOA Configuration: TIM2 CH3 (PA2) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Connect TIM Channels to AF2 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_2);
}



/*******************/
void TIM2_SlaveConfig(void)
{
// TIM2 is Slave in Gated mode of TIM1
// and TIM2 is Master for TIM3 in Trigger Mode.

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

/* TIM GPIO Configuration */
TIM2_GPIO_Config();
/* Time Base configuration */
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = tim2_period;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

/* TIM2 Channel 3 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = tim2_ch3_pulse;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);

// Master-Slave mode
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_OC3Ref);
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);// TIM2 trigger source is TIM1
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Gated);

// TIM_Cmd(TIM2, ENABLE);
}


// EOF
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Скорее всего проще будет настроить на генерацию ШИМ только один таймер. И запускать функцию nota, в которой и будет происходить изменение величины ШИМ, в зависимости от переменных ton, dlit, pause, задаваемых в массиве. Второй же таймер настроить на прерывания и в обработчике прерываний сделать i_temp++;
Как в таком случае правильно написать функцию nota.

Пример:
Спойлер

Код: Выделить всё

#define C7     247  //одна из нот

unsigned int t1 [3][2]={
{
0, 0
},
{
C7, 0
},
{
94, 94
}
};


void  Ton1 (void)
{
unsigned int i;
      for (i=0; i<1; i++)
      {
	     nota(t1[1][i], t1[2][i]/3, (t1[0][i+1]-t1[0][i])/3);
      }
}


void nota2 (unsigned int ton, unsigned int dlit, unsigned int pause)
{
//tim1_period = 100; //tone_and_silent_gap_duration
pause = tim1_ch1_pulse; //tone_duration;
dlit = tim3_period; //tone_frequency;
ton = tim3_ch3_pulse; //tone_intensity;

TIM_TimeBaseStructure.TIM_Period = dlit;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_Pulse = ton;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);

unsigned int k=0, d;
i_temp=0;
d=dlit;
dlit=(dlit*95)/100;
        GPIO_SetBits(GPIOA, GPIO_Pin_6);
	while (i_temp<dlit)
	{
	    //i_temp++;
            for (k=0; k<ton; k++)
            {
                __delay_cycles(10);
            }
	     GPIO_ResetBits(GPIOA, GPIO_Pin_6);
	}
        GPIO_SetBits(GPIOA, GPIO_Pin_6);
	for (k=0; k<ton; k++)
	{
            __delay_cycles(10);
        }
        GPIO_ResetBits(GPIOA, GPIO_Pin_6);
}
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

не пойму вот этого
for (i=0; i<1; i++)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32F030K6 настройка программы

Сообщение a5021 »

Тело цикла выполняется один раз.
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

Тело цикла выполняется один раз.
смысл такой конструкции ?


Использовать 31250 как такт для таймера - плохая затея , набор высоких тонов ограничен.
лучше использовать 1МГц , перекрывается диапазон от 15 Гц до 20к .
Наверху разрешение хорошее, можете даже в стандартные частоты нот сносно попасть.
Спойлер//
// 2015.12.22
// target: STM32f051_Disco ;
//
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_tim.h"
#include "stm32f0xx_it.h"

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

typedef struct TONE_FORMAT_T {
uint16_t note;
uint16_t duration;
} TONE_FORMAT_T;

#define TONES_ARRAY_MAX_INDEX 10
#define DEF_TIME 200
const TONE_FORMAT_T tones_array [TONES_ARRAY_MAX_INDEX+1] = {
// {.note, .duration}
{ 20, DEF_TIME},//0
{ 40, DEF_TIME},//1
{ 80, DEF_TIME},
{ 160, DEF_TIME},
{ 12, DEF_TIME},
{ 24, DEF_TIME}, //5
{ 48, DEF_TIME},
{ 96, DEF_TIME},
{ 30, DEF_TIME},
{ 60, DEF_TIME},
{ 120, DEF_TIME}//10
};

static volatile uint16_t tone_index=0 ;
static volatile uint16_t time_delay=0 ;

void TIM3_Config(void);
//void TIM14_Config(void);
void Tone_Reload(TONE_FORMAT_T new_tone);


int main(void)
{
TIM3_Config();

if (SysTick_Config(SystemCoreClock/1000-1)) // set SysTick = 1000 Hz
{ while(1){;} }

Tone_Reload(tones_array[0]);

while(1)
{
if (time_delay == 0)
{

if (tone_index < (TONES_ARRAY_MAX_INDEX))
{
tone_index ++;
}
else
{
tone_index = 0;
}

Tone_Reload(tones_array[tone_index]);
}

}
}

void SysTick_Handler(void)
{
if (time_delay !=0)
{
time_delay--;
}
else {;}
}

void Tone_Reload(TONE_FORMAT_T new_tone)
{
// TIM_Cmd(TIM3, DISABLE);
// pause time delay here
TIM3->CNT = 0;
TIM3->ARR = (uint16_t)(new_tone.note);
TIM3->CCR1 = (uint16_t)((new_tone.note)/2);
// TIM_Cmd(TIM3, ENABLE);
time_delay = new_tone.duration;
}


void TIM3_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

/* TIM GPIO Configuration */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* GPIOA Configuration: TIM3 CH1 (PA6) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Connect TIM Channels to AF1 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

/* Time Base configuration */

TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/31250)-1;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = tones_array[0].note;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

TIM_OCStructInit(&TIM_OCInitStructure);

/* TIM3 Channel 1 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = tones_array[0].note/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);

TIM_Cmd(TIM3, ENABLE);
}



//void TIM14_Config(void)
//{
// RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
//
// /* Time Base configuration */
// TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
//
// TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/1000)-1;
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
// TIM_TimeBaseStructure.TIM_Period = 10;// ms
// TIM_TimeBaseStructure.TIM_ClockDivision = 0;
// TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
//
// TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
//
// TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
//
// NVIC_EnableIRQ(TIM14_IRQn);
// TIM_Cmd(TIM14, ENABLE);
//}


///*******************/
//void TIM14_IRQHandler (void)
//{
// TIM_ClearITPendingBit(TIM14, TIM_IT_Update);
//
// if (tone_index < (TONES_ARRAY_MAX_INDEX-1))
// {
// tone_index++;
// }
// else
// {
// tone_index = 0;
// }
//
// Tone_Reload(tones_array[tone_index]);
//
//}//TIM14_IRQHandler
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Re: STM32F030K6 настройка программы

Сообщение service47 »

Спасибо, получилось так:
Спойлер

Код: Выделить всё


void TIM3_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

/* TIM GPIO Configuration */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* GPIOA Configuration: TIM3 CH1 (PA6) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Connect TIM Channels to AF1 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

/* Time Base configuration */

TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/200000)-1;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 0;//tones_array[0].note;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

TIM_OCStructInit(&TIM_OCInitStructure);

/* TIM3 Channel 1 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;//tones_array[0].note/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);

TIM_Cmd(TIM3, ENABLE);
}

void TIM3_IRQHandler(void) //
{
  i_temp++;
  TIM_ClearITPendingBit(TIM3, TIM_TS_ITR0);
  TIM3->SR &= ~TIM_SR_TIF;  // clear the UIF flag 
}


void SysTick_Handler(void)
{
i_temp++;
}

//=========
#define B2     4186

#define C3     3951
#define C_3    3729
#define Db3    3729
#define D3     3440
#define D_3    3332
#define Eb3    3332
#define E3     3136
#define F3     2960
#define F_3    2794
#define Gb3    2794
#define G3     2637
#define G_3    2489
#define Ab3    2489
#define A3     2349
#define A_3    2217
#define Bb3    2217
#define B3     2093

#define C4     1975
#define C_4    1865
#define Db4    1865
#define D4     1720
#define D_4    1661
#define Eb4    1661
#define E4     1568
#define F4     1480
#define F_4    1396
#define Gb4    1396
#define G4     1318
#define G_4    1244
#define Ab4    1244
#define A4     1175
#define A_4    1109
#define Bb4    1109
#define B4     1047

#define C5     988
#define C_5    932
#define Db5    932
#define D5     880
#define D_5    830
#define Eb5    830
#define E5     784
#define F5     740
#define F_5    698
#define Gb5    698
#define G5     659
#define G_5    622
#define Ab5    622
#define A5     587
#define A_5    554
#define Bb5    554
#define B5     523

#define C6     494
#define C_6    466
#define Db6    466
#define D6     440
#define D_6    415
#define Eb6    415
#define E6     392
#define F6     370
#define F_6    349
#define Gb6    349
#define G6     330
#define G_6    311
#define Ab6    311
#define A6     293
#define A_6    277
#define Bb6    277
#define B6     261

#define C7     247
#define C_7    233
#define Db7    233
#define D7     220
#define D_7    207
#define Eb7    207
#define E7     196
#define F7     185
#define F_7    174
#define Gb7    174
#define G7     164
#define G_7    156
#define Ab7    156
#define A7     148
#define A_7    139
#define Bb7    139
#define B7     131


unsigned int P [3][27]={
{
0, 70, 130, 220, 250, 310, 370, 485, 550, 610, 685, 720, 785, 960, 1025,
1080, 1140, 1200, 1265, 1320, 1440, 1500, 1560, 1650, 1680, 1745, 1745
},
{
E5, E5, E6, B5, D6, C6, A5, G5, G5, G6, F6, F6, E6, G6, F6, D6, B5, F6,
E6, E6, E5, E5, E6, G_5, B5, A5, 0
},
{
20, 70, 95, 25, 20, 20, 125, 20, 65, 90, 20, 75, 175, 75, 15, 15, 20, 75, 15, 125,
20, 75, 90, 30, 20, 175, 0
}
};


unsigned int Vech[3][37]={ 
{
60, 540, 1020, 1500, 1980, 2940, 3420, 3900, 4860, 5820, 7740, 8220,
8700, 9180, 9660, 10620, 11100, 11580, 13500, 14460, 15420, 15900,
16380, 18300, 18780, 19260, 19740, 20220, 22140, 22620, 23100,
24060, 24540, 25020, 25980, 26940, 26940
},
{
C5, Eb5, G5, Eb5, F5, Eb5, D5, G5, F5, C5, Eb5, G5, Bb5, Bb5, C6,
Bb5, G_5, G5, A5, B5, D6, C6, G5, D5, C5, G5, F5, G_5, Bb5, G_5,
G5, F5, Eb5, G5, F5, C5, 0
},
{
480, 480, 480, 480, 960, 480, 480, 960, 960, 1920, 480, 500,
480, 517, 960, 480, 480, 1920, 960, 960, 480, 480, 1920, 480,
480, 480, 480, 2063, 480, 480, 960, 505, 480, 996, 991, 1920, 0
}
};

void nota2 (unsigned int ton, unsigned int dlit, unsigned int pause)
{
TIM3->CNT = 0;
TIM3->ARR = (uint16_t)(ton);
TIM3->CCR1 = (uint16_t)((ton)/2);

unsigned int k=0, d;
i_temp=0;
d=dlit;
dlit=(dlit*95)/100;
	while (i_temp<dlit)
	{
          __delay_cycles(10);
	}
        /*
        for (k=0; k<pause; k++)
        {
          __delay_cycles(10);
        }*/
}

main
{
TIM3_Config();

if (SysTick_Config(SystemCoreClock/2000-1)) 
{ while(1){;} }

while(1)
{

                for (i=0; i<36; i++)
                {
                      nota2(Vech[1][i]/3, Vech[2][i]/3, (Vech[0][i+1]-Vech[0][i])/3);//Vechera
                }


                for (i=0; i<26; i++)
                {
                       nota2(P[1][i]/2, (P[2][i]*35)/10, ((P[0][i+1]-P[0][i])*35)/10);//Prostokvashino
                }
}
}
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

Re: STM32F030K6 настройка программы

Сообщение pixar »

B 32F030K y TIM3 доступно 4 канала . Можно их запустить в Center Aligned Mode и сделать типа ЦАП, форма будет ближе к синусу.
Ответить

Вернуться в «ARM»