Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
sheackspear
4 / 4 / 1
Регистрация: 18.06.2013
Сообщений: 30
1

STM32F4 - встроенный генератор случайности

29.02.2016, 01:23. Просмотров 1832. Ответов 12
Метки нет (Все метки)

Доброй ночи. Разбираюсь с платой STM32F4 Discovery. Надо получить случайное число из встроенного генератора случайных чисел. Взял за основу проект который выложен в нете.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdint.h>
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_rng.h"
GPIO_InitTypeDef  GPIO_InitStructure;
void Delay(__IO uint32_t nCount);
int main(int argc, char *argv[])
{
uint32_t random32bit = 0;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
RNG_Cmd(ENABLE);
while (1)
  {
 while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET)
     {
      Delay(0x7FFFFF);
         }
      random32bit = RNG->DR;
 
     GPIO_Write(GPIOD, (random32bit&0xF)<<12) ;
 
    Delay(0x7FFFFF);
 
  }
return 0;
}
 
void Delay(__IO uint32_t nCount)
{
  while(nCount--)
  {
  }
}
Проект написаный на Кейле5. Сам проект компилируется и собирается. Но когда запускаешь на выполнение выдает *** error 31: illegal qualifier и случайности не генерируются. Подскажите какие настроейкия мог не учесть в проекте или чтонадо дописать
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.02.2016, 01:23
Ответы с готовыми решениями:

STM32F4+внешний генератор (решено)
Плата при включении не запускается от внешнего генератора, вижу это по...

STM32F4 генератор одиночных импульсов с регулировкой фазы
для экспериментов нужно закодить генератор одиночного импульса относительно...

Встроенный датчик температуры.
Приветствую! Задался целью разобраться со встроенным датчиком температуры. В...

STM32F103 и встроенный ИОН
Доброго времени суток! Пытаюсь измерять напряжение с помощью встроенного ИОН...

Встроенный таймер в MCS-51
Здравствуйте. Приложенное изображение - это циклограмма обработки детали. По...

12
sheackspear
4 / 4 / 1
Регистрация: 18.06.2013
Сообщений: 30
29.02.2016, 01:24  [ТС] 2
Вот полный проект
0
Вложения
Тип файла: rar test.rar (686.6 Кб, 6 просмотров)
Voland_
1670 / 1015 / 97
Регистрация: 04.01.2010
Сообщений: 3,395
29.02.2016, 15:51 3
Что-то я вообще ничего не понял. Вы пишете код, который работает с регистрами IO и т.д. напрямую. При этом говорите, что
Цитата Сообщение от sheackspear Посмотреть сообщение
когда запускаешь на выполнение выдает *** error 31: illegal qualifier и случайности не генерируются.
так вот я не понял, что вы и где пытаетесь выполнить, и откуда что "выдает"? Это постараться еще надо, чтобы МК вам "что-то куда-то выдал".
0
sheackspear
4 / 4 / 1
Регистрация: 18.06.2013
Сообщений: 30
09.03.2016, 13:26  [ТС] 4
Добрый день.
Извините за неправильную терминологию.
Программирую под Кейл 5.
В данном случае задача вроде бы проста. Надо что бы встроенный в плату stm32f4-Discovery генератор случайности генерировал 32-битное случайное число и записывал его в переменную random32bit. Как я разобрался генератор данное число хранит в регистре RNG->DR. Как я понимаю считывая его с определенным интервалом я буду получать случайное число. Никуда его не передаю. Само значение random32bit смотрю в памяти. Сама проблема состоит в том что генератор не передает в данную переменную никаких значений.
Не могу разобраться что я сделал не правильно. Полнй проект я выложил в архиве ниже.
Ошибку *** error 31: illegal qualifier пишет Кейл когда код скомпилирован и запускается на плате.
Как бы два вопроса: 1. Что я не инициализировал? 2. Если проблемно решить первый есть ли пример использования RNG-генератора под stm32f4-Discovery?
0
Voland_
1670 / 1015 / 97
Регистрация: 04.01.2010
Сообщений: 3,395
09.03.2016, 15:20 5
Цитата Сообщение от sheackspear Посмотреть сообщение
запускаешь на выполнение выдает *** error 31:
Цитата Сообщение от sheackspear Посмотреть сообщение
Ошибку *** error 31: illegal qualifier пишет Кейл когда код скомпилирован и запускается на плате.
вы понимаете, что мне отсюда не видно, как вы запускаете код и каким образом подключена ваша плата к ПК, как на нее реагируют встроенные модули KEIL и какие именно это модули?
у STM32F4 есть как минимум 2 способа встроенной отладки и безмерное количество самостоятельных, в том числе разработанных сторонними фирмами. Соответственно, "что" выдает, "куда" и "почему" ответит вам только тот, кто делает так же как вы, то бишь не зная как именно подключаетесь вы.
Отладку вы ведете через JTAG или через SWD?

Теперь по коду. Если вы используете SDK, то почему вы не используете функцию, которая возвращает правильное значение регистра генератора? Тип RNG_GetValue(), или что-то типа этого должно быть.
Цитата Сообщение от sheackspear Посмотреть сообщение
проблема состоит в том что генератор не передает в данную переменную никаких значений.
как вы это определили?
0
sheackspear
4 / 4 / 1
Регистрация: 18.06.2013
Сообщений: 30
10.03.2016, 01:00  [ТС] 6
Доброй ночи. Использую отладку через SWD. В описании нашел функцию HAL_RNG_GetRandomNumber() посмотрев ее использование увидел что это просто чтение регистра RNG->DR. Подозреваю я неправильно инициализировал какую то периферию. Сижу разбираюсь.

Добавлено через 1 минуту
А определяю по просмотру значения переменной. Оно не меняется. Соответственно генератор не формирует случайную последовательность.
0
Humanoid
Почетный модератор
9981 / 3867 / 348
Регистрация: 12.06.2008
Сообщений: 11,401
10.03.2016, 07:49 7
Цитата Сообщение от sheackspear Посмотреть сообщение
В описании нашел функцию HAL_RNG_GetRandomNumber() посмотрев ее использование увидел что это просто чтение регистра RNG->DR
На сколько я помню, там так и устроен блок - просто чтение регистра... это же аппаратный рандомайзер. Только вначале нужно дождаться, готовности рандомного числа, ожиданием выставления какого-то статусного регистра.

Цитата Сообщение от sheackspear Посмотреть сообщение
Оно не меняется.
Может, блок не включили?

Тоже когда-то тоже думал использовать этот блок, но мне очень не понравилось качество этих "случайных" чисел. Слишком много подряд идёт нулей и единиц... в 16-ричных числах очень часто встречаются числа 0 и F. Возможно, я как-то неправильно использовал этот блок, потому что в даташите говорят, что он очень хороший.
0
Voland_
1670 / 1015 / 97
Регистрация: 04.01.2010
Сообщений: 3,395
10.03.2016, 09:10 8
Цитата Сообщение от sheackspear Посмотреть сообщение
определяю по просмотру значения переменной
Отключите оптимизацию. Вы с этим значением ничего существенного не делаете, поэтому, компилятор мог вообще выделить 1 ниббл и выложить его куда вы хотели, со смещением.
PS: непосредственно с генератором я дела не имел, но судя по коду, логика получения числа у вас прослеживается. По крайней мере если вы видите, что флаг готовности данных выставляется, и вы читаете значение генератора, и после этого на выходы ничего не выставляется - то проблема либо в генераторе, либо в еще какой-нить периферии, которую вы забыли включить. Типа какого-нить опорного напряжения и пр. Может есть примеры в SDK?
0
sheackspear
4 / 4 / 1
Регистрация: 18.06.2013
Сообщений: 30
10.03.2016, 10:27  [ТС] 9
Нашел пример под stm32f429 сейчас попробую пересобрать под discovery. Надеюсь получится. Во всяком случае отпишусь.
0
Voland_
1670 / 1015 / 97
Регистрация: 04.01.2010
Сообщений: 3,395
10.03.2016, 13:52 10
Цитата Сообщение от sheackspear Посмотреть сообщение
Нашел пример под stm32f429 сейчас попробую пересобрать под discovery.
похоже, вы путаетесь в названиях. "discovery" в данном случае - это плата, на которой помимо МК есть внешняя периферия, которая может продемонстрировать как классно и круто работает контроллер. Для нее разработан набор примеров, чтобы это сделать, часто основанный на SDK под конкретное семейство контроллеров, один из которых впаян в плату.
Поэтому, причем тут "пример для f429 записать в discovery" - непонятно. Вы должны четко понять что и где инициализируется на плате и ее библиотеке, какой у вас МК на плате, чтобы выяснить что можно использовать, а что - нет. Возможно просто в вашем контроллере вообще нет генератора случайных чисел.
... вот смотрите семейство STM32F4 по поиску слова 'random' у меня нашелся только один чип STM32F410 ( есть и другие, просто не отмечено здесь ) с этой фичей. В других он может и есть, но уже на стартовой странице "что-то сомнительно". Проверьте у себя микруху, потом пробуйте. Например, в STM32F401/F411 рандом-генератора, судя по описанию, нет.
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,937
10.03.2016, 21:46 11
во всех( наверное) стмках где есть аппаратный DAC можно сделать генератор
нужно включить ЦАП в режим генерации "белого шума" и считывать значения
0
sheackspear
4 / 4 / 1
Регистрация: 18.06.2013
Сообщений: 30
10.03.2016, 23:55  [ТС] 12
Читал описание именно под плату stm32f4 - Discovery. Там действительно есть генератор случайных 32 битных чисел. Упрощенно даже описан алгоритм его запуска. Правда описан в общем а не как программный код. Вот пошагово реализую сейчас сам код. Главное правильно с периферией разобраться.
0
sheackspear
4 / 4 / 1
Регистрация: 18.06.2013
Сообщений: 30
16.03.2016, 17:14  [ТС] 13
Лучший ответ Сообщение было отмечено ValeryS как решение

Решение

Добрый день вообщем разобрался наконец то.
Как говориться чем проще тем лучше. Все оказалось намного проще.

Итоговый код получился такой
C++
1
2
3
4
5
6
7
8
9
10
11
/////Запускаем переферию для генератора
uint32_t i;
RCC->AHB2ENR | = RCC->AHB2ENR_RNGEN;
///// запускаем сам генератор
RNG->CR | = RNG_CR_RNGEN;
//////Ждем флаг что данные сгенерированы
while(!(RNG->SR &(RNG_SR_DRDY)));
 
////// Считываем и записываем данные.
 
i = RNG->DR;
Все заработало.
2
16.03.2016, 17:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2016, 17:14

Музыка через встроенный ЦАП
Со встроенным ЦАПом немного работал, но музыку им не играл. А на сколько он...

STM32VLDISCOVERY не видит встроенный микроконтроллер
Приключилась следующая проблема: Отладочная плата STM32VLDISCOVERY перестала...

st-link встроенный в stm8s discovery
вопрос в том шьет ли этот прогер только с серию или льки 8битные тоже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru