11.02.2017, 21:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Ругается в проекте что нет core_cm3.h, в паке его нет.Есть подозрение что не только этот файлик попросит.
Пытался скачать с сайта stm пак,но соединение сбрасывается.
__________________
Глаза боятся,а руки делают.
Последний раз редактировалось CERGEI1982; 11.02.2017 в 21:36.
|
|
|
|
11.02.2017, 23:37
|
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
это хедеры ядра Cortex-Mx от ARMа, а не от ST.
вот версия 3.20: cmsis.3.20.zip, из-за дебильной регистрации невозможно скачать свежую с родного сайта: https://www.arm.com/products/process...e-standard.php
Последний раз редактировалось zöner; 12.02.2017 в 16:03.
|
|
|
|
12.02.2017, 03:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Благодарю за помощь,уже стыдно часто спрашивать то,но. Проблема при компиляции теперь с assert_param.
__________________
Глаза боятся,а руки делают.
|
|
|
|
12.02.2017, 16:00
|
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
в stm32f0xx_conf.h assert_param отключен (используется только для детальной отладки):
Код:
|
#define assert_param(expr) ((void)0) |
можно описать в любом глобальном хедере или в настройках проекта (я добавил в main.h)
Последний раз редактировалось zöner; 12.02.2017 в 16:03.
|
|
|
|
13.02.2017, 02:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от zöner
|
в stm32f0xx_conf.h assert_param отключен (используется только для детальной отладки):
Код:
|
#define assert_param(expr) ((void)0) |
можно описать в любом глобальном хедере или в настройках проекта (я добавил в main.h)
|
Да спасибо помогло.
А вы применяли эту детальную отладку? Если да как это делает или есть где прочитать?
и что обозначает это выражение
Код:
|
#define assert_param(expr) ((void)0) |
Присвоение функции ((void)0) ?
__________________
Глаза боятся,а руки делают.
|
|
|
|
13.02.2017, 14:04
|
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
выражение непонятное, наверно можно заменить пробелом
|
|
|
|
14.02.2017, 00:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Чертовщина какая-то! Пытаюсь настроить таймер 3 на SM32F030, чтобы он по DMA заменял регистры ARR и CCR1 на каждое событие update. Сделал так:
Код:
|
static uint16_t table[] = {400,500,600,700,800,900};
static void tim3_setup(){
RCC-›APB1ENR |= RCC_APB1ENR_TIM3EN; // enable clocking
RCC-›AHBENR |= RCC_AHBENR_DMA1EN;
//TIM3-›CR1 = TIM_CR1_UDIS; // disable update event
TIM3-›CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // PWM mode 1: acive-›inactive, preload enable
TIM3-›PSC = 47999; // 1kHz
TIM3-›ARR = 500; // period 0.5sec
TIM3-›CCR1 = 300; // 0.3sec LED lights and 0.2sec off
TIM3-›CCER = TIM_CCER_CC1P | TIM_CCER_CC1E; // turn it on, active low
// DMA ch3 - TIM3_UP
DMA1_Channel3-›CPAR = (uint32_t)(&(TIM3-›DMAR)); // TIM3_ch1
//DMA1_Channel3-›CPAR = (uint32_t)(&(TIM3-›ARR));
DMA1_Channel3-›CMAR = (uint32_t)(table);
DMA1_Channel3-›CNDTR = 6;
// circular, memsiz 16bit, psiz 32bit, memincrement, from memory
DMA1_Channel3-›CCR |= DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_1
| DMA_CCR_MINC | DMA_CCR_DIR;
TIM3-›DCR = (0 ‹‹ 8) // three bytes
+ 13; // ARR, [not used], ccr1
TIM3-›DIER = TIM_DIER_UDE; // enable DMA requests
TIM3-›CR1 |= TIM_CR1_CEN; // turn it on
DMA1_Channel3-›CCR |= DMA_CCR_EN | DMA_CCR_TCIE; // turn on DMA
TIM3-›EGR |= TIM_EGR_UG; // force update generation
} |
(пока хотя бы ARR), но ничего не работает: вместо шести импульсов разных длительностей имею один, причем длительностью около двух секунд!
Написать DMA1_Channel3-›CPAR = (uint32_t)(&(TIM3-›ARR)) я не могу, т.к. надо еще и CCR1 обновлять.
В прерываниях обновлять не хочется — есть же DMA! Этот канал больше нигде не используется (UART1 работает по прерыванию на прием, а на передачу использует канал 3 DMA).
Может у кого-нибудь есть пример рабочего кода? А то теряюсь: даже в даташите чертовщина какая-то (то пишут, что в TIM3_DCR DBL есть количество передач минус один, то без "минус один").
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
14.02.2017, 00:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Ну я и дурень! Надо было не вручную считать (в таблице пару регистров дважды написали), а задать по смещению. Вот так работает:
Код:
|
static uint16_t table[] = { 200,0,100, 200,0,100, 400,0,100,
400,0,300, 400,0,300, 600,0,300,
200,0,100, 200,0,100, 800,0,100};
// Tim3_ch1 - PA6, 48MHz -› 1kHz
static void tim3_setup(){
RCC-›APB1ENR |= RCC_APB1ENR_TIM3EN; // enable clocking
RCC-›AHBENR |= RCC_AHBENR_DMA1EN;
//TIM3-›CR1 = TIM_CR1_UDIS; // disable update event
TIM3-›CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // PWM mode 1: acive-›inactive, preload enable
TIM3-›PSC = 47999; // 1kHz
TIM3-›ARR = 500; // period 0.5sec
TIM3-›CCR1 = 300; // 0.3sec LED lights and 0.2sec off
TIM3-›CCER = TIM_CCER_CC1P | TIM_CCER_CC1E; // turn it on, active low
// DMA ch3 - TIM3_UP
DMA1_Channel3-›CPAR = (uint32_t)(&(TIM3-›DMAR)); // TIM3_ch1
DMA1_Channel3-›CMAR = (uint32_t)(table);
DMA1_Channel3-›CNDTR = 27;
// memsiz 16bit, psiz 32bit, memincrement, from memory
DMA1_Channel3-›CCR |= DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_1
| DMA_CCR_MINC | DMA_CCR_DIR;
TIM3-›DCR = (2 ‹‹ 8) // three bytes
+ (((uint32_t)&TIM3-›ARR - (uint32_t)&TIM3-›CR1) ›› 2);
TIM3-›DIER = TIM_DIER_UDE; // enable DMA requests
TIM3-›CR1 |= TIM_CR1_CEN; // turn it on
DMA1_Channel3-›CCR |= DMA_CCR_EN | DMA_CCR_TCIE; // turn on DMA
TIM3-›EGR |= TIM_EGR_UG; // force update generation
} |
Теперь буду писать обработчик USART'а, чтобы морзянить входную строку.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
14.02.2017, 01:17
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Работа через DMAR.
TIM3 - формирование ШИМ,
TIM1 - изменение скважности ШИМ, запускает DMA Ch5, а он в свою очередь пересылает данные скважности из памяти в регистр TIM3-›DMAR, который является настроенной ссылкой на регистр TIM3-›CCR4. То есть, записывая в DMAR, фактически попадаем в CCR4, потому что в TIM3-›DCR (DBA) указано приращение адреса CCR4 относительно CR1.
А DCR (DBL) определяет количество последовательно идущих регистров, начиная с базового адреса, которые будут загружены за один раз. Это не количество импульсов, это количество загружаемых через DMA регистров за один раз. Пакетная передача. Позволяет например за раз одновременно загрузить или прочитать все 4 регистра CCR.
Причем, счетчик передач CNDTR в DMA уменьшится сразу на число одновременно загружаемых регистров.
Нажмите, чтобы открыть спойлер
PHP код:
|
void PWM_Init(uint32_t address, uint16_t buff_size)
{
RCC-›AHBENR |= RCC_AHBENR_GPIOBEN | RCC_AHBENR_DMAEN; // Тактирование GPIOB и DMA1
RCC-›APB1ENR |= RCC_APB1ENR_TIM3EN; // Тактирование TIM3
GPIOB-›MODER |= GPIO_MODER_MODER1_1; //PB1 - AF PP
GPIOB-›AFR[0] |= 0x01‹‹(4*1); //PB1 - AF1 TIM3
TIM3-›CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 | // PWM mode1
TIM_CCMR2_OC4PE; // Preload CCR
TIM3-›PSC = 0; // на частоте APB1
TIM3-›ARR = 2048-1; // 10 бит PWM
TIM3-›CCR4 = 1023; // 50% PWM, средняя точка
TIM3-›CCER = TIM_CCER_CC4E; // Out enable
TIM3-›DCR = 0x10; // доступ к CCR4
/* настройка DMA для передачи значения в ШИМ */
DMA1_Channel5-›CCR = DMA_CCR_MSIZE_0 | // 16 bit
DMA_CCR_PSIZE_0 | // 16 bit
DMA_CCR_MINC | // Mem incr
DMA_CCR_DIR | // Mem-›Periph
DMA_CCR_PL_0 | // приоритет средний
DMA_CCR_CIRC; // Circ mode
DMA1_Channel5-›CMAR = address; // адрес массива
DMA1_Channel5-›CPAR = (uint32_t)&TIM3-›DMAR; // адрес промежуточного регистра в TIM3
DMA1_Channel5-›CNDTR = buff_size; // размер буфера
DMA1_Channel5-›CCR |= DMA_CCR_EN; // канал включен
TIM3-›CR1 |= TIM_CR1_CEN;
}
void SampleRate_Generator_Init(uint32_t SampleRate_ADC, uint8_t DAC_divider)
{
/* SampleRate = SystemCoreClock / (PSC * ARR) */
/* ARR = SystemCoreClock / (SampleRate * PSC) */
/* PSC = 1:1 */
RCC-›APB2ENR |= RCC_APB2ENR_TIM1EN; // Тактирование таймера
TIM1-›PSC = 0; //
TIM1-›ARR = SystemCoreClock / (SampleRate_ADC) - 1; // частота работы таймера
TIM1-›RCR = DAC_divider-1; // коэффициент деления для DAC
TIM1-›CCR4 = 2; // сдвиг события по времени
TIM1-›CR2 = TIM_CR2_MMS; // TRGO CCR4 для запуска АЦП
TIM1-›CCMR2 = TIM_CCMR2_OC4M; //
TIM1-›DIER = TIM_DIER_UDE; // генерация запроса DMA по UEV для PWM-DAC
TIM1-›CR1 |= TIM_CR1_CEN; // запуск генератора
}
|
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
18.02.2017, 09:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
А что за буфер настраивается?
Код:
|
/* Enable Prefetch Buffer */
FLASH-›ACR |= FLASH_ACR_PRFTBE;
/* Flash 2 wait state */
FLASH-›ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH-›ACR |= (uint32_t)FLASH_ACR_LATENCY_2; |
__________________
Глаза боятся,а руки делают.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:28.
|
|