Configuración de límites de RNG (generador de números aleatorios)

2

Estoy aprendiendo tablero STM32F4. Quiero obtener el número entre 0-15 utilizando RNG. No puedo establecer límites para obtener esos valores.

¿Hay alguien que haya experimentado con RNG o puede ayudarme?

    
pregunta Mamur Djurayev

2 respuestas

4

Si necesitas un uso int int bla = RNG_DR% 14 + 1 (produce un número entre 0 y 15 (sin incluir 0 y 15)); RNG_DR es el registro de datos del RNG. Deberá verificar el indicador de datos preparados para obtener valores válidos.

Si necesita algo más, especifique :)

    
respondido por el Tom L.
-1

Hay mi código

#include "main.h"


#define SW1 GPIO_Pin_9
#define SW2 GPIO_Pin_8
#define SW_IO GPIOB

void User_USART_Init()
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;

  /* Enable GPIO clock */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  /* Enable UART clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  /* Connect PXx to USARTx_Tx*/
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);

  /* Connect PXx to USARTx_Rx*/
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1);

  /* Configure USART Tx as alternate function  */
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure USART Rx as alternate function  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  /* USART configuration */
  USART_Init(USART1, &USART_InitStructure);

  /* Enable USART */
  USART_Cmd(USART1, ENABLE);
}

void SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data)); 

  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}

void Serial_PutChar(uint8_t c)
{
   while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
  {
  }
   SendData(USART1, c);
}

void Serial_PutString(uint8_t *s)
{
  while (*s != '
#include "main.h"


#define SW1 GPIO_Pin_9
#define SW2 GPIO_Pin_8
#define SW_IO GPIOB

void User_USART_Init()
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;

  /* Enable GPIO clock */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

  /* Enable UART clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  /* Connect PXx to USARTx_Tx*/
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);

  /* Connect PXx to USARTx_Rx*/
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1);

  /* Configure USART Tx as alternate function  */
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure USART Rx as alternate function  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  /* USART configuration */
  USART_Init(USART1, &USART_InitStructure);

  /* Enable USART */
  USART_Cmd(USART1, ENABLE);
}

void SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data)); 

  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}

void Serial_PutChar(uint8_t c)
{
   while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
  {
  }
   SendData(USART1, c);
}

void Serial_PutString(uint8_t *s)
{
  while (*s != '%pre%')
  {
    Serial_PutChar(*s);
    s++;
  }
}

void RNG_Config (void)
{
 RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
 RNG_Cmd(ENABLE);
}

int main(void)
{
uint32_t random=0;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);

  SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);
  User_USART_Init();

//random number generator 
  RNG_Config();
while(1)
{
while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET)
      {
      }
random=RNG_GetRandomNumber()%16;
}
Serial_PutString("\n\r Your random Number\n\r");
Serial_PutChar(random);

}
') { Serial_PutChar(*s); s++; } } void RNG_Config (void) { RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE); RNG_Cmd(ENABLE); } int main(void) { uint32_t random=0; RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); User_USART_Init(); //random number generator RNG_Config(); while(1) { while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET) { } random=RNG_GetRandomNumber()%16; } Serial_PutString("\n\r Your random Number\n\r"); Serial_PutChar(random); }

Hay algunos códigos que se omiten para no hacer muchas líneas.

¿Podrías comprobar si es correcto o no? Gracias a todos, Feliz año nuevo

    
respondido por el Mamur Djurayev

Lea otras preguntas en las etiquetas