STM32 новичку в ARM что к чему
- Fusion
- Грызет канифоль
- Сообщения: 272
- Зарегистрирован: Пт ноя 13, 2009 10:39:32
- Откуда: Москва
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Для 103 теперь понятно.
А в stm32f30x.h для флэша только два значения:
#define FLASH_ACR_LATENCY_0 ((uint8_t)0x01) /*!< Bit 0 */
#define FLASH_ACR_LATENCY_1 ((uint8_t)0x02) /*!< Bit 1 */
Надо поискать что для каких частот.
А в stm32f30x.h для флэша только два значения:
#define FLASH_ACR_LATENCY_0 ((uint8_t)0x01) /*!< Bit 0 */
#define FLASH_ACR_LATENCY_1 ((uint8_t)0x02) /*!< Bit 1 */
Надо поискать что для каких частот.
- Реклама
Re: STM32 новичку в ARM что к чему
Может, кто по опыту ткнёт меня носом, что я делаю не так. Пытаюсь "запустить" ЦАП (кристалл stm32f051). Сконфигурировал TIM6 делать прерывания и TRGO сигналы:
Поначалу планировал через ПДП, но пока решил упростить. Разрешил прерывание:
Вроде, ничего сложного. выдаю 1кГц "синусоиду". Но, изредка на осциллограмме проскакивали "ошибки". Я даже снизил частоту в 10 раз, но ошибки врё равно проскакивают. И независимо, использую update event TIM6 как триггер или нет.

Я бы понимал, что другое прерывание "тормозит" это. Но ведь видно что значения "перескакивают"
Код: Выделить всё
// 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;
}
}
Я бы понимал, что другое прерывание "тормозит" это. Но ведь видно что значения "перескакивают"
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: STM32 новичку в ARM что к чему
[uquote="uldemir",url="/forum/viewtopic.php?p=3406024#p3406024"]Может, кто по опыту ткнёт меня носом, что я делаю не так.[/uquote]
делал дтмф синусоиду на таком же мк - чисто было. Что-то с указателем похоже не то и sizeof массива так, наверное, не подсчитать - прогнал на пк в VS, немного по другому, - работает.

делал дтмф синусоиду на таком же мк - чисто было. Что-то с указателем похоже не то и sizeof массива так, наверное, не подсчитать - прогнал на пк в VS, немного по другому, - работает.
Re: STM32 новичку в ARM что к чему
sizeof() работает "правильно", пока размер элементов равен байту. Впрочем, и во всех других случаях тоже должен. Я лоханулся в другом месте. Массив назвал константным, но не назвал статическим. Поэтому, он оказывался почему-то иногда в немного другом месте памяти. Наверное, надо указывать еще какой-то модификатор, если хочется его держать в памяти программ.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: STM32 новичку в ARM что к чему
Кстати, кто-нибудь помнит навскидку, можно для DMA указать в качестве источника область во флеше? Работать оно будет? Типа, как в предыдущей задаче, массив const и гоним таблицу с синусом в DAC, только через DMA.
- Реклама
Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3408055#p3408055"]Кстати, кто-нибудь помнит навскидку, можно для DMA указать в качестве источника область во флеше? Работать оно будет?[/uquote]
Конечно будет, главное CCM RAM ему не подсунуть, но для этого нужно как минимум иметь мк у которого она есть.
Конечно будет, главное CCM RAM ему не подсунуть, но для этого нужно как минимум иметь мк у которого она есть.
Re: STM32 новичку в ARM что к чему
Собственно, это то, что я сейчас и пытаюсь сделать. ПДП сделал.
Но вот у меня нет уверенности (больше), что этот массив находится в памяти программ.
И еще вопрос, если я хочу разместить в памяти большой массив данных - как это сделать, не перегоняя в текстовый вид? Как бы сделать так, чтобы линкер простой raw файл закинул в память и слинковал с моей функцией. Хм, с адресом проблем особых не вижу, а вот с размером как быть?
Код: Выделить всё
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 файл закинул в память и слинковал с моей функцией. Хм, с адресом проблем особых не вижу, а вот с размером как быть?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: STM32 новичку в ARM что к чему
[uquote="uldemir",url="/forum/viewtopic.php?p=3408094#p3408094"]Но вот у меня нет уверенности (больше), что этот массив находится в памяти программ.[/uquote]
Если знаешь адрес начала массива, значит знаешь и в какой области памяти этот массив обитает.
Конверть в текстовый вид, все остальное - это какие-то специфические фичи отдельных сред или компиляторов.
Если знаешь адрес начала массива, значит знаешь и в какой области памяти этот массив обитает.
У твоего F051 не настолько много флеша, что в него влезали большие массивыИ еще вопрос, если я хочу разместить в памяти большой массив данных - как это сделать, не перегоняя в текстовый вид? Как бы сделать так, чтобы линкер простой raw файл закинул в память и слинковал с моей функцией. Хм, с адресом проблем особых не вижу, а вот с размером как быть?
Re: STM32 новичку в ARM что к чему
[uquote="Reflector",url="/forum/viewtopic.php?p=3408064#p3408064"]Конечно будет,[/uquote]
Вопрос этот возник у меня не на пустом месте. Какое-то время назад ковырялся с армами другого производителя, так там указать можно, но работать оно не будет. Долго копался в референсе, пока в каком-то углу ни обнаружил приписочку, что источником для DMA может быть только область RAM или периферия.
Вопрос этот возник у меня не на пустом месте. Какое-то время назад ковырялся с армами другого производителя, так там указать можно, но работать оно не будет. Долго копался в референсе, пока в каком-то углу ни обнаружил приписочку, что источником для DMA может быть только область RAM или периферия.
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3408171#p3408171"]что источником для DMA может быть только область RAM или периферия.[/uquote]
Логично. Контроллер DMA живет отдельной жизнью. Вы хотите чтобы программа шла из конвейера или что там вытаскивает данные из флеша на лету, потом внезапно вставала на паузу, потому что конвейеру надо обслужить канал DMA и отдать туда данные. Толку от такого DMA

Логично. Контроллер DMA живет отдельной жизнью. Вы хотите чтобы программа шла из конвейера или что там вытаскивает данные из флеша на лету, потом внезапно вставала на паузу, потому что конвейеру надо обслужить канал DMA и отдать туда данные. Толку от такого DMA
Re: STM32 новичку в ARM что к чему
Вообще DMA у STM32 в иных случаях может заставить подвинуться всех прочих, включая ядро, если потребуется. Но это в отношении ОЗУ. А вот что случается, если DMA начинает лезть к флешу, я себе плохо представляю и поверхностное гугление этот вопрос пока не проясняет.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: STM32 новичку в ARM что к чему
[uquote="uldemir",url="/forum/viewtopic.php?p=3408094#p3408094"]И еще вопрос, если я хочу разместить в памяти большой массив данных - как это сделать, не перегоняя в текстовый вид?[/uquote]
так делал - выделил основной программе 9К (хватило) далее 1К типа еепром, далее до конца звук сжатый адпсм
в хекс редакторе (HxD) разместил сначала основную прошивку, потом по адресу 0x2800 вставил звук в виде raw
DMA с Flash вроде должен - из RM:

так делал - выделил основной программе 9К (хватило) далее 1К типа еепром, далее до конца звук сжатый адпсм
Код: Выделить всё
#define FLASH_USER_START_ADDR ((uint32_t)0x08002800) /* Start @ of user Flash area */В нашем ларьке STM32F051C8 с 64К флэша стоит существенно дешевле чем STM32F051C6 с 32К, такое же и с F030У твоего F051 не настолько много флеша,
DMA с Flash вроде должен - из RM:
Re: STM32 новичку в ARM что к чему
[uquote="oleg110592",url="/forum/viewtopic.php?p=3408519#p3408519"]В нашем ларьке STM32F051C8 с 64К флэша стоит существенно дешевле чем STM32F051C6 с 32К, такое же и с F030[/uquote]
Я на F4 насмотрелся на таблицы по 512КБ, потому если на F0 будет таковая на пару десяток КБ, то это совсем ни о чем
Я на F4 насмотрелся на таблицы по 512КБ, потому если на F0 будет таковая на пару десяток КБ, то это совсем ни о чем
Я бы не писал, если бы у самого не работало.DMA с Flash вроде должен - из RM:
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
[uquote="Reflector",url="/forum/viewtopic.php?p=3408536#p3408536"]Я на F4 насмотрелся на таблицы по 512КБ[/uquote]А ради чего, если линкер может подцепить файл? Вот, в IAR, например:
Re: STM32 новичку в ARM что к чему
[uquote="VladislavS",url="/forum/viewtopic.php?p=3408560#p3408560"]А ради чего, если линкер может подцепить файл? Вот, в IAR, например:[/uquote]
Некоторые как-то так и делали, причем шили в конец флеша один раз, т.к. каждый раз заливать такие объемы не так и быстро, а я просто написал программу которая ужала эту таблицу в 7.3 раза и успокоился
Некоторые как-то так и делали, причем шили в конец флеша один раз, т.к. каждый раз заливать такие объемы не так и быстро, а я просто написал программу которая ужала эту таблицу в 7.3 раза и успокоился
Re: STM32 новичку в ARM что к чему
Кто ковырял USB => VCP есть функция
можем мы узнать в ней размер посылаемого пакета данных?
например из оси посылаем 1024 байт, тк размер принимаемыех данных конечной точкой при работе в full speed 64 байт, получаем 16 вызовов функции выше, есть ли какая возможность определить кол-во вызовов или определить перед началом посылки и самому собрать 1024 байт в буфере.
Код: Выделить всё
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 байт в буфере.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
[uquote="xVekx",url="/forum/viewtopic.php?p=3408966#p3408966"]Кто ковырял USB => VCP есть функция
...
можем мы узнать в ней размер посылаемого пакета данных?
например из оси посылаем 1024 байт, тк размер принимаемыех данных конечной точкой при работе в full speed 64 байт, получаем 16 вызовов функции выше, есть ли какая возможность определить кол-во вызовов или определить перед началом посылки и самому собрать 1024 байт в буфере.[/uquote]
Откуда в VCP пакеты взялись? Это же просто труба - есть данные пишем, нет - молчим. В любой момент вы можете получить от одного байта до максимального размера конечной точки. Если внутри потока приложение какие-то пакеты формирует, то VCP об этом ничего не знает, это не его уровень.
...
можем мы узнать в ней размер посылаемого пакета данных?
например из оси посылаем 1024 байт, тк размер принимаемыех данных конечной точкой при работе в full speed 64 байт, получаем 16 вызовов функции выше, есть ли какая возможность определить кол-во вызовов или определить перед началом посылки и самому собрать 1024 байт в буфере.[/uquote]
Откуда в VCP пакеты взялись? Это же просто труба - есть данные пишем, нет - молчим. В любой момент вы можете получить от одного байта до максимального размера конечной точки. Если внутри потока приложение какие-то пакеты формирует, то VCP об этом ничего не знает, это не его уровень.
Re: STM32 новичку в ARM что к чему
Читаю даташит на 32F103-й кристалл про RTC и не понимаю, когда считывать регистр RTC_CNT. Из картинки я понял, что прерывание секундное происходит за 1 такт RTCCLK до обновления? Выходит, если я получил прерывание, то мне нужно еще ждать 30 микросекунд, пока я смогу считать обновлённый RTC_CNT.
Я смотрю на картинки 180 и 181.
Я смотрю на картинки 180 и 181.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница



