STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Fusion
Грызет канифоль
Сообщения: 272
Зарегистрирован: Пт ноя 13, 2009 10:39:32
Откуда: Москва
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Fusion »

Для 103 теперь понятно.

А в stm32f30x.h для флэша только два значения:
#define FLASH_ACR_LATENCY_0 ((uint8_t)0x01) /*!< Bit 0 */
#define FLASH_ACR_LATENCY_1 ((uint8_t)0x02) /*!< Bit 1 */
Надо поискать что для каких частот.
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: STM32 новичку в ARM что к чему

Сообщение uldemir »

Может, кто по опыту ткнёт меня носом, что я делаю не так. Пытаюсь "запустить" ЦАП (кристалл stm32f051). Сконфигурировал TIM6 делать прерывания и TRGO сигналы:

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

// DAC
	DAC->CR = DAC_CR_EN1;

// TIM6 - Тактовый сигнал для ЦАП
	TIM6->CR1 &= ~TIM_CR1_CEN; // disable
	TIM6->CR1 = TIM_CR1_ARPE | TIM_CR1_URS ;
	TIM6->CR2  = TIM_CR2_MMS_1;	// 010: Update - The update event is selected as a trigger output (TRGO).
	TIM6->PSC = 0; 
	TIM6->ARR =  10000-1; // 8MHz / 1000 = 8 kHz
	TIM6->EGR |= TIM_EGR_UG; // Сформировать Update Event для загрузки регистров
	TIM6->DIER = TIM_DIER_UIE; // | TIM_DIER_UDE;
	TIM6->CR1  |= TIM_CR1_CEN   ; //enable timer

Поначалу планировал через ПДП, но пока решил упростить. Разрешил прерывание:

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

void TIM6_IRQHandler(void) {
	const uint8_t	sine_tab[] = {128, 218, 255, 218, 128, 38, 0, 38 };
	static const uint8_t *tab_ptr;
	
	TIM6->SR &= ~(TIM_SR_UIF);
	
	if (flag.beep) {
		DAC1->DHR8R1 = *tab_ptr++;
		if (tab_ptr >= sine_tab + sizeof(sine_tab)) tab_ptr = sine_tab;
	} else {
		tab_ptr = sine_tab;
		DAC1->DHR8R1 = *tab_ptr;
	}
}
Вроде, ничего сложного. выдаю 1кГц "синусоиду". Но, изредка на осциллограмме проскакивали "ошибки". Я даже снизил частоту в 10 раз, но ошибки врё равно проскакивают. И независимо, использую update event TIM6 как триггер или нет.
Изображение Изображение

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

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

[uquote="uldemir",url="/forum/viewtopic.php?p=3406024#p3406024"]Может, кто по опыту ткнёт меня носом, что я делаю не так.[/uquote]
делал дтмф синусоиду на таком же мк - чисто было. Что-то с указателем похоже не то и sizeof массива так, наверное, не подсчитать - прогнал на пк в VS, немного по другому, - работает.
Изображение
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: STM32 новичку в ARM что к чему

Сообщение uldemir »

sizeof() работает "правильно", пока размер элементов равен байту. Впрочем, и во всех других случаях тоже должен. Я лоханулся в другом месте. Массив назвал константным, но не назвал статическим. Поэтому, он оказывался почему-то иногда в немного другом месте памяти. Наверное, надо указывать еще какой-то модификатор, если хочется его держать в памяти программ.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Эиком - электронные компоненты и радиодетали
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Кстати, кто-нибудь помнит навскидку, можно для DMA указать в качестве источника область во флеше? Работать оно будет? Типа, как в предыдущей задаче, массив const и гоним таблицу с синусом в DAC, только через DMA.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3408055#p3408055"]Кстати, кто-нибудь помнит навскидку, можно для DMA указать в качестве источника область во флеше? Работать оно будет?[/uquote]
Конечно будет, главное CCM RAM ему не подсунуть, но для этого нужно как минимум иметь мк у которого она есть.
Реклама
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: STM32 новичку в ARM что к чему

Сообщение uldemir »

Собственно, это то, что я сейчас и пытаюсь сделать. ПДП сделал.

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

void start_sound(void) {
	static const uint8_t	sine_tab[] = {128, 218, 255, 218, 128, 38, 0, 38 };
	
	DMA1_Channel3->CPAR = (uint32_t) (&(DAC1->DHR8R1));
	DMA1_Channel3->CMAR = (uint32_t) sine_tab;
	DMA1_Channel3->CNDTR = sizeof(sine_tab);
	DMA1_Channel3->CCR = DMA_CCR_MINC | DMA_CCR_CIRC | DMA_CCR_DIR;
	DMA1_Channel3->CCR |= DMA_CCR_EN;
	
	DAC1->CR = DAC_CR_DMAEN1 | DAC_CR_TEN1 | DAC_CR_EN1;
}
Но вот у меня нет уверенности (больше), что этот массив находится в памяти программ.

И еще вопрос, если я хочу разместить в памяти большой массив данных - как это сделать, не перегоняя в текстовый вид? Как бы сделать так, чтобы линкер простой raw файл закинул в память и слинковал с моей функцией. Хм, с адресом проблем особых не вижу, а вот с размером как быть?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="uldemir",url="/forum/viewtopic.php?p=3408094#p3408094"]Но вот у меня нет уверенности (больше), что этот массив находится в памяти программ.[/uquote]
Если знаешь адрес начала массива, значит знаешь и в какой области памяти этот массив обитает.
И еще вопрос, если я хочу разместить в памяти большой массив данных - как это сделать, не перегоняя в текстовый вид? Как бы сделать так, чтобы линкер простой raw файл закинул в память и слинковал с моей функцией. Хм, с адресом проблем особых не вижу, а вот с размером как быть?
У твоего F051 не настолько много флеша, что в него влезали большие массивы :) Конверть в текстовый вид, все остальное - это какие-то специфические фичи отдельных сред или компиляторов.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3408064#p3408064"]Конечно будет,[/uquote]
Вопрос этот возник у меня не на пустом месте. Какое-то время назад ковырялся с армами другого производителя, так там указать можно, но работать оно не будет. Долго копался в референсе, пока в каком-то углу ни обнаружил приписочку, что источником для DMA может быть только область RAM или периферия.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

[uquote="a5021",url="/forum/viewtopic.php?p=3408171#p3408171"]что источником для DMA может быть только область RAM или периферия.[/uquote]
Логично. Контроллер DMA живет отдельной жизнью. Вы хотите чтобы программа шла из конвейера или что там вытаскивает данные из флеша на лету, потом внезапно вставала на паузу, потому что конвейеру надо обслужить канал DMA и отдать туда данные. Толку от такого DMA :))) :))) :))) :)))
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Вообще DMA у STM32 в иных случаях может заставить подвинуться всех прочих, включая ядро, если потребуется. Но это в отношении ОЗУ. А вот что случается, если DMA начинает лезть к флешу, я себе плохо представляю и поверхностное гугление этот вопрос пока не проясняет.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

[uquote="uldemir",url="/forum/viewtopic.php?p=3408094#p3408094"]И еще вопрос, если я хочу разместить в памяти большой массив данных - как это сделать, не перегоняя в текстовый вид?[/uquote]
так делал - выделил основной программе 9К (хватило) далее 1К типа еепром, далее до конца звук сжатый адпсм

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

#define FLASH_USER_START_ADDR   ((uint32_t)0x08002800)   /* Start @ of user Flash area */
в хекс редакторе (HxD) разместил сначала основную прошивку, потом по адресу 0x2800 вставил звук в виде raw
У твоего F051 не настолько много флеша,
В нашем ларьке STM32F051C8 с 64К флэша стоит существенно дешевле чем STM32F051C6 с 32К, такое же и с F030

DMA с Flash вроде должен - из RM:
Изображение
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3408519#p3408519"]В нашем ларьке STM32F051C8 с 64К флэша стоит существенно дешевле чем STM32F051C6 с 32К, такое же и с F030[/uquote]
Я на F4 насмотрелся на таблицы по 512КБ, потому если на F0 будет таковая на пару десяток КБ, то это совсем ни о чем :)
DMA с Flash вроде должен - из RM:
Я бы не писал, если бы у самого не работало.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="Reflector",url="/forum/viewtopic.php?p=3408536#p3408536"]Я на F4 насмотрелся на таблицы по 512КБ[/uquote]А ради чего, если линкер может подцепить файл? Вот, в IAR, например:
Изображение
bf.png
(39.06 КБ) 725 скачиваний
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3408560#p3408560"]А ради чего, если линкер может подцепить файл? Вот, в IAR, например:[/uquote]
Некоторые как-то так и делали, причем шили в конец флеша один раз, т.к. каждый раз заливать такие объемы не так и быстро, а я просто написал программу которая ужала эту таблицу в 7.3 раза и успокоился :)
xVekx
Встал на лапы
Сообщения: 125
Зарегистрирован: Вс мар 01, 2009 20:41:19

Re: STM32 новичку в ARM что к чему

Сообщение xVekx »

Кто ковырял USB => VCP есть функция

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

static int8_t CDC_Receive_HS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 11 */
  USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceHS);
  return (USBD_OK);
  /* USER CODE END 11 */
}
можем мы узнать в ней размер посылаемого пакета данных?
например из оси посылаем 1024 байт, тк размер принимаемыех данных конечной точкой при работе в full speed 64 байт, получаем 16 вызовов функции выше, есть ли какая возможность определить кол-во вызовов или определить перед началом посылки и самому собрать 1024 байт в буфере.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3408519#p3408519"]В нашем ларьке STM32F051C8 с 64К флэша стоит существенно дешевле чем STM32F051C6 с 32К, такое же и с F030[/uquote]
То, что тот ларек хлебосолен, известно далеко за пределами ваших краев. Но перебивает ли он китайцев ?

Изображение
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="xVekx",url="/forum/viewtopic.php?p=3408966#p3408966"]Кто ковырял USB => VCP есть функция
...
можем мы узнать в ней размер посылаемого пакета данных?
например из оси посылаем 1024 байт, тк размер принимаемыех данных конечной точкой при работе в full speed 64 байт, получаем 16 вызовов функции выше, есть ли какая возможность определить кол-во вызовов или определить перед началом посылки и самому собрать 1024 байт в буфере.[/uquote]
Откуда в VCP пакеты взялись? Это же просто труба - есть данные пишем, нет - молчим. В любой момент вы можете получить от одного байта до максимального размера конечной точки. Если внутри потока приложение какие-то пакеты формирует, то VCP об этом ничего не знает, это не его уровень.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: STM32 новичку в ARM что к чему

Сообщение uldemir »

Читаю даташит на 32F103-й кристалл про RTC и не понимаю, когда считывать регистр RTC_CNT. Из картинки я понял, что прерывание секундное происходит за 1 такт RTCCLK до обновления? Выходит, если я получил прерывание, то мне нужно еще ждать 30 микросекунд, пока я смогу считать обновлённый RTC_CNT.

Я смотрю на картинки 180 и 181.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

Ответить

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