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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

один резистор на катод плохо, 8 резисторов на сегменты хорошо (имхо).

задержка мс на таймере:

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

#define F_APB1 48000000UL
    
void delay_ms(uint16_t delay)
{
    TIM7->PSC = F_APB1 / 1000 + 1; //устанавливаем предделитель
    TIM7->ARR = delay; //устанавливаем значение переполнения таймера, а значит и значение при котором генерируется Событие обновления
    TIM7->EGR |= TIM_EGR_UG; //Генерируем Событие обновления для записи данных в регистры PSC и ARR
    TIM7->CR1 |= (TIM_CR1_CEN | TIM_CR1_OPM); //Запускаем таймер записью бита CEN и устанавливаем режим Одного прохода установкой бита OPM
    while ((TIM7->CR1 & TIM_CR1_CEN) != 0);
}
Как написать аналогично
#define Pin7 (GPIOA->IDR & GPIO_IDR_7)
Реклама
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

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

Сообщение service47 »

Спасибо. Как настроить TIM16, TIM17, чтобы было 31,250 kHz выход пина отсоединен и срабатывало прерывание и обработчик прерывания и тоже самое на 7,813 kHz приблизительно.

Есть ли аналог wacthdog_timer у STM и как его разрешить.
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

таймер 16 прерывания с частотой 6000Hz (свое вставить) , надо проверить - на таймере 15 работало:
Спойлер

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

void ConfigureTIM16(void)
{
    /* (1) Enable the peripheral clock of the TIM16 */
    /* (2) Enable interrupt on update event */
    /* (3) Select PCLK */
    /* (4) One update event each 6000Hz */
    /* (5) enables TIM16 */
    RCC->APB2ENR |= RCC_APB2ENR_TIM16EN; /* (1) */
    TIM16->DIER |= TIM_DIER_UIE; /* (2) */
    TIM16->PSC = 0; /* (3) */
    TIM16->ARR = (SystemCoreClock / 6000) - 1; /* (4) */
    TIM16->CR1 |= TIM_CR1_CEN; /* (5) */
    /* Configure NVIC for TIM16 */
    /* (1) Enable Interrupt on TIM16 */
    /* (2) Set priority for TIM16 */
    NVIC_EnableIRQ(TIM16_IRQn); /* (1) */
    NVIC_SetPriority(TIM16_IRQn, 0); /* (2) */
}
// прерывание
void TIM16_IRQHandler(void)
{
    TIM16->SR &= ~TIM_SR_UIF;  /* clear the UIF flag */
}


Independent watchdog stm32f0:
Спойлер

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

#define IWDG_REFRESH      (uint32_t)(0x0000AAAA)
#define IWDG_WRITE_ACCESS (uint32_t)(0x00005555)
#define IWDG_START        (uint32_t)(0x0000CCCC)
#define IWDG_RELOAD       (500)

void Configure_IWDG(void)
{
   /* Enable the peripheral clock RTC */
  /* (1) Enable the LSI */
  /* (2) Wait while it is not ready */
  RCC->CSR |= RCC_CSR_LSION; /* (1) */
  while((RCC->CSR & RCC_CSR_LSIRDY) != RCC_CSR_LSIRDY) /* (2) */
  { 
    /* add time out here for a robust application */
  }

  /* Enable the peripheral clock of DBG register (uncomment for debug purpose) */
//  RCC->APB2ENR |= RCC_APB2ENR_DBGMCUEN;
//  DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_IWDG_STOP; /* To be able to debug */
  
  /* Configure IWDG */
  /* (1) Activate IWDG (not needed if done in option bytes) */
  /* (2) Enable write access to IWDG registers */
  /* (3) Set prescaler by 128 40000/256 = 156.25Hz =  6400us = 6.4ms */
  /* (4) Set reload value to have a rollover each 6.4*500 = 3200ms */
  /* (5) Check if flags are reset */
  /* (6) Refresh counter */
  IWDG->KR = IWDG_START; /* (1) */
  IWDG->KR = IWDG_WRITE_ACCESS; /* (2) */
  IWDG->PR = (IWDG_PR_PR_0 | IWDG_PR_PR_1 | IWDG_PR_PR_2); /* (3) */
  IWDG->RLR = IWDG_RELOAD; /* (4) */
  while(IWDG->SR) /* (5) */
  { 
    /* add time out here for a robust application */
  }
  IWDG->KR = IWDG_REFRESH; /* (6) */
}
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

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

Сообщение pixar »

TIM7->PSC = F_APB1 / 1000 - 1; //? //устанавливаем предделитель
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

угу - злая копипаста http://about-stm32.narod.ru/delay.html
Реклама
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

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

Сообщение service47 »

Всем спасибо. Есть ли аналог __delay_cycles(200); у STM.

Как записать переменную в eeprom.

Имеется ли готовая музыка для STM до 10 секунд, чтобы выводить ее через биполярный транзистор, включенный в ключевом режиме на звукоизлучатель.
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

1) неа - для для задержек stm32 использовать нужно таймер, в ядре есть еще "бесплатный" SysTick - системный таймер с прерыванием, тоже можно организовать задержки
2)у STM32F0 eeprom нет - берем одну страницу флэш и выделяем под еепром
3) любой, например 8 битный 8кГц wav файл пишем во флэш (свободную от программы), выводим через шим таймера.
8 битный 8кГц будет примерно занимать 8кБ на одну секунду, для 10сек понадобится 80кБ флэша - это мк пожирнее. Или можно использовать сжатие звука - например ADPCM в 4 раза можно ужать. Декодер ADPCM нормально работает на 8-битных микроконтроллерах на STM32F0 и подавно .
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

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

Сообщение service47 »

Запись во FLASH, а как читать?

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

void save_param_to_flash(uint32_t first_address_page)
{
   //unlock flash
    FLASH->KEYR=0x45670123;
    FLASH->KEYR=0xCDEF89AB;
    //set programing bit
    FLASH->CR |= FLASH_CR_PG;
    
    *((uint16_t*)first_address_page) = ee_timer;
    while((FLASH->SR & FLASH_SR_BSY) != 0){;}
    
    FLASH->CR &= ~FLASH_CR_PG;

    //lock flash
    FLASH->CR |= FLASH_CR_LOCK;
}
У STM32F030F4 16Кб FLASH, wav туда не влезет, нужно или midi, а лучше MML музыка. Тут есть описание примера программы, но непонятно как его адаптировать: http://we.easyelectronics.ru/reptile/pl ... -na-s.html
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

запись и чтение флэш есть в примерах STM32SnippetsF0 http://www.st.com/web/en/catalog/tools/ ... ppetsf0-pr
папка FLASH
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

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

Сообщение service47 »

STM32 зависает, а если закомментировать TIM16->DIER |= TIM_DIER_UIE; // (2) , то отвисает.

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

void ConfigureTIM16(void)  //20000000/642=31152,647
{
    // (1) Enable the peripheral clock of the TIM16 
    // (2) Enable interrupt on update event 
    // (3) Select PCLK 
    // (4) One update event each 6000Hz 
    // (5) enables TIM16 
    RCC->APB2ENR |= RCC_APB2ENR_TIM16EN; // (1) 
    TIM16->DIER |= TIM_DIER_UIE; // (2) 
    TIM16->PSC = 0; // (3) 
    TIM16->ARR = (SystemCoreClock / 642) - 1; // (4) 
    TIM16->CR1 |= TIM_CR1_CEN; // (5) 
    // Configure NVIC for TIM16 
    // (1) Enable Interrupt on TIM16 
    // (2) Set priority for TIM16 
    NVIC_EnableIRQ(TIM16_IRQn); // (1) 
    NVIC_SetPriority(TIM16_IRQn, 0); // (2) 
}
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

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

Сообщение pixar »

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

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

Сообщение service47 »

То же самое.

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

void TIM16_IRQHandler(void)
{
i_temp++;
TIM16->SR &= ~TIM_SR_UIF;  // clear the UIF flag 
}
pixar
Потрогал лапой паяльник
Сообщения: 314
Зарегистрирован: Чт ноя 29, 2012 08:27:22

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

Сообщение pixar »

на диско051 ничего не зависает , i_temp считает как должно.
смотрите отладчиком. или добавить CC1 , вывести на ногу.
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

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

Сообщение service47 »

Как включить спящий режим?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

service47 писал(а):спящий режим
STANDBY mode:

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

 /* 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();
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

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

Сообщение service47 »

Как выйти из спящего режима по нажатию кнопки.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

выйти из этого спящего режима (STANDBY) можно только по прерыванию от ноги PA0 (WKUP1) или по прерыванию от RTC или после сброса.
Как настроить ногу PA0 на прерывание см. пример в STM32SnippetsF0 (ссылка выше была), папка \ExternalIT\01_HWInterruptSelection\
service47
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

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

Сообщение service47 »

Спасибо.

Почему при значениях TIM14->CCR1 = 0..10 ШИМ работает, но с мерцанием светодиода, а при больших значениях нет. Нужно плавно увеличивать яркость светодиода при значеиях ШИМ от 0 (ярко) до 1022 и при достижении нужного значения оставить яркость такой-же.

Функции конфигурации таймера и выключения светодиода.
Спойлер

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

static void TIM_Config14(void)  //PWM
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

// GPIOA clock enable 
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA , ENABLE);
// TIM14 clock enable 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14 , ENABLE);

// GPIOA Configuration: Channel 1 as alternate function push-pull 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
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_PinSource4, GPIO_AF_4);	

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

TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);


// Channel 1 Configuration in PWM mode 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
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(TIM14, &TIM_OCInitStructure);

TIM_Cmd(TIM14, ENABLE);
}



static void TIM_Config14_off(void)  //PWM off
{
  //ETR configuration to clear OCxREF code example
/* This code is similar to the edge-aligned PWM configuration but it enables
the clearing on OC1 for ETRclearing (OC1CE = 1) in CCMR1 (5) and ETR is
configured in SMCR (7).*/
/* (1) Set prescaler to 47, so APBCLK/48 i.e 1MHz */
/* (2) Set ARR = 8, as timer clock is 1MHz the period is 9 us */
/* (3) Set CCRx = 4, , the signal will be high during 4 us */
/* (4) Select PWM mode 1 on OC1 (OC1M = 110),
enable preload register on OC1 (OC1PE = 1),
enable clearing on OC1 for ETR clearing (OC1CE = 1) */
/* (5) Select active high polarity on OC1 (CC1P = 0, reset value),
enable the output on OC1 (CC1E = 1) */
/* (6) Enable output (MOE = 1) */
/* (7) Select ETR as OCREF clear source (OCCS = 1),
select External Trigger Prescaler off (ETPS = 00, reset value),
disable external clock mode 2 (ECE = 0, reset value),
select active at high level (ETP = 0, reset value) */
/* (8) Enable counter (CEN = 1),
select edge aligned mode (CMS = 00, reset value),
select direction as upcounter (DIR = 0, reset value) */
/* (9) Force update generation (UG = 1) */
TIM14->PSC = 47; /* (1) */
TIM14->ARR = 8; /* (2) */
TIM14->CCR1 = 65535; /* (3) */
TIM14->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE
| TIM_CCMR1_OC1CE; /* (4) */
TIM14->CCER |= TIM_CCER_CC1E; /* (5) */
TIM14->BDTR |= TIM_BDTR_MOE; /* (6) */
TIM14->SMCR |= TIM_SMCR_OCCS; /* (7) */
TIM14->CR1 |= TIM_CR1_CEN; /* (8) */
TIM14->EGR |= TIM_EGR_UG; /* (9) */
}

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

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

Сообщение pixar »

void BackLight_Set_Intencity(uint16_t backlite_procent)
Спойлер#define BACKLITE_PWM_PERIOD 1023


void TIM14_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

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

/* GPIOA Configuration: TIM14_CH1 (PA4) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
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_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Connect TIM14 Channel1 to PA4_AF4 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_4);
}


void TIM14_Init_For_Backlite(void)
{
// TIM14 as free running PWM_ch1

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

TIM14_GPIO_Config();

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

/* Time Base configuration */
TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock /1000000-1));
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = BACKLITE_PWM_PERIOD;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);

/* TIM14 Channel 1 Configuration in PWM mode */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = BACKLITE_PWM_PERIOD/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

TIM_OC1Init(TIM14, &TIM_OCInitStructure);

// TIM_CtrlPWMOutputs(TIM14, ENABLE);

TIM_Cmd(TIM14, ENABLE);

} //TIM14_Init_For_Backlite(void)


void BackLight_Set_Intencity(uint16_t backlite_procent)
{
if (backlite_procent >100)
{backlite_procent = BACKLITE_PWM_PERIOD-1;}

else if (backlite_procent == 0)
{backlite_procent = 1 ;}
else
{
backlite_procent *= ( BACKLITE_PWM_PERIOD/100);
}

TIM14->CCR1 = backlite_procent;

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

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

Сообщение service47 »

Почему при разных значениях TIM_TimeBaseStructure.TIM_Period, период остается одинаковым 25мс. И при значениях CCR1 больше 10 ШИМ пропадает.
Вложения
Image4_fclk20MHz_prescaler50000_period500_pulse100_CСR1=9.png
(3.23 КБ) 363 скачивания
Image3_fclk20MHz_prescaler50000_period500_pulse100_CСR1=0.png
(3.18 КБ) 652 скачивания
Image2_fclk20MHz_prescaler50000_period1023_pulse100_CСR1=9.png
(3.37 КБ) 648 скачиваний
Image1_fclk20MHz_prescaler50000_period1023_pulse100_CСR1=0.png
(3.21 КБ) 635 скачиваний
Ответить

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