Кто любит RISC в жизни, заходим, не стесняемся.
oleg110592
Друг Кота
Сообщения: 3832 Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщение
oleg110592 » Чт окт 29, 2015 13:37:12
один резистор на катод плохо, 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
Сообщение
service47 » Чт окт 29, 2015 14:20:22
Спасибо. Как настроить TIM16, TIM17, чтобы было 31,250 kHz выход пина отсоединен и срабатывало прерывание и обработчик прерывания и тоже самое на 7,813 kHz приблизительно.
Есть ли аналог wacthdog_timer у STM и как его разрешить.
oleg110592
Друг Кота
Сообщения: 3832 Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщение
oleg110592 » Чт окт 29, 2015 16:19:47
таймер 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
Сообщение
pixar » Пт окт 30, 2015 01:53:12
TIM7->PSC = F_APB1 / 1000 - 1; //? //устанавливаем предделитель
service47
Прорезались зубы
Сообщения: 219 Зарегистрирован: Вт мар 12, 2013 16:05:45
Сообщение
service47 » Пт окт 30, 2015 09:54:49
Всем спасибо. Есть ли аналог __delay_cycles(200); у STM.
Как записать переменную в eeprom.
Имеется ли готовая музыка для STM до 10 секунд, чтобы выводить ее через биполярный транзистор, включенный в ключевом режиме на звукоизлучатель.
oleg110592
Друг Кота
Сообщения: 3832 Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщение
oleg110592 » Пт окт 30, 2015 10:48:45
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
Сообщение
service47 » Пт окт 30, 2015 16:30:42
Запись во 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
service47
Прорезались зубы
Сообщения: 219 Зарегистрирован: Вт мар 12, 2013 16:05:45
Сообщение
service47 » Пн ноя 09, 2015 11:38:45
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
Сообщение
pixar » Пн ноя 09, 2015 12:19:33
В обработчике прерывания тим16 сбросить флаг прерывания.
service47
Прорезались зубы
Сообщения: 219 Зарегистрирован: Вт мар 12, 2013 16:05:45
Сообщение
service47 » Пн ноя 09, 2015 13:23:06
То же самое.
Код: Выделить всё
void TIM16_IRQHandler(void)
{
i_temp++;
TIM16->SR &= ~TIM_SR_UIF; // clear the UIF flag
}
pixar
Потрогал лапой паяльник
Сообщения: 314 Зарегистрирован: Чт ноя 29, 2012 08:27:22
Сообщение
pixar » Вт ноя 10, 2015 03:09:28
на диско051 ничего не зависает , i_temp считает как должно.
смотрите отладчиком. или добавить CC1 , вывести на ногу.
service47
Прорезались зубы
Сообщения: 219 Зарегистрирован: Вт мар 12, 2013 16:05:45
Сообщение
service47 » Ср ноя 11, 2015 14:54:50
Как включить спящий режим?
oleg110592
Друг Кота
Сообщения: 3832 Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщение
oleg110592 » Ср ноя 11, 2015 16:02:03
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
Сообщение
service47 » Ср ноя 11, 2015 16:12:36
Как выйти из спящего режима по нажатию кнопки.
oleg110592
Друг Кота
Сообщения: 3832 Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщение
oleg110592 » Ср ноя 11, 2015 17:30:34
выйти из этого спящего режима (STANDBY) можно только по прерыванию от ноги PA0 (WKUP1) или по прерыванию от RTC или после сброса.
Как настроить ногу PA0 на прерывание см. пример в STM32SnippetsF0 (ссылка выше была), папка \ExternalIT\01_HWInterruptSelection\
service47
Прорезались зубы
Сообщения: 219 Зарегистрирован: Вт мар 12, 2013 16:05:45
Сообщение
service47 » Чт ноя 12, 2015 13:19:47
Спасибо.
Почему при значениях 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
Сообщение
pixar » Пт ноя 13, 2015 03:52:30
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()