193 lines
5.6 KiB
C
193 lines
5.6 KiB
C
|
|
/**
|
|||
|
|
******************************************************************************
|
|||
|
|
* @file board.c
|
|||
|
|
* @author SRG
|
|||
|
|
* @version V1.0.0
|
|||
|
|
* @date 2020-03-17
|
|||
|
|
* @brief
|
|||
|
|
******************************************************************************
|
|||
|
|
* @attention
|
|||
|
|
*
|
|||
|
|
* <h2><center>© Copyright (c) 2020 FudanMicroelectronics.
|
|||
|
|
* All rights reserved.</center></h2>
|
|||
|
|
*
|
|||
|
|
******************************************************************************
|
|||
|
|
*/
|
|||
|
|
#include "board.h"
|
|||
|
|
#include "READER.h"
|
|||
|
|
#include "fm15l0xx.h"
|
|||
|
|
#include "fm15l0xx_ll_cmu.h"
|
|||
|
|
#include "fm15l0xx_ll_gpio.h"
|
|||
|
|
#include "fm15l0xx_ll_uart.h"
|
|||
|
|
#include "fm15l0xx_ll_spi.h"
|
|||
|
|
#include "fm15l0xx_ll_svd.h"
|
|||
|
|
#include "fm15l0xx_ll_rng.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20>ж<EFBFBD>VDD<44>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
int Vdd_is_Low( void )
|
|||
|
|
{
|
|||
|
|
return (!LL_SVD_IsActiveFlag_SVDR() );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void SVD_Init( void )
|
|||
|
|
{
|
|||
|
|
LL_SVD_EnableSVDDigitalFilter(); // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EBBFAA>
|
|||
|
|
LL_SVD_SetSVDMode( LL_SVD_SVDMOD_INTERVAL_ON ); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
LL_SVD_SetSVDInterval( LL_SVD_SVDITVL_62p5ms ); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>62.5ms
|
|||
|
|
|
|||
|
|
LL_SVD_DisableV1P0(); // <20>ر<EFBFBD>1V<31><56><EFBFBD><D7BC>ѹ
|
|||
|
|
LL_SVD_EnableV0P95(); // ʹ<>û<EFBFBD><EFBFBD><D7BC>ѹ<EFBFBD><D1B9>0.95V
|
|||
|
|
LL_SVD_SetSVDLevel( LL_SVD_SVDLVL_LEVEL10 ); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ȼ<EFBFBD>10 - <20><>ֵ3.614V
|
|||
|
|
|
|||
|
|
LL_SVD_EnableSVD();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void RNG_Init( void )
|
|||
|
|
{
|
|||
|
|
LL_CMU_EnablePeriphBusClock_RNG(); // Enable bus clock(RCHF)
|
|||
|
|
LL_CMU_EnableClock_RNG(); // Enable RNG work clock
|
|||
|
|
LL_CMU_SetClockPrescaler_RNG( LL_CMU_PERPRSC_2 ); // 4MHz: RCHF / 2<><32>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD>ʹ<EFBFBD><CAB9>ᵼ<DFBB><E1B5BC>SFAIL<49><4C><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
LL_RNG_EnableNoiseSource();
|
|||
|
|
LL_RNG_Enable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
uint32_t Get_RandomNumber( void )
|
|||
|
|
{
|
|||
|
|
while ( 1 )
|
|||
|
|
{
|
|||
|
|
if ( LL_RNG_IsDataReady() || LL_RNG_IsActiveFlag_SFAIL() )
|
|||
|
|
{
|
|||
|
|
if ( LL_RNG_IsActiveFlag_SFAIL() )
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD>־
|
|||
|
|
LL_RNG_ClearFlag_SFAIL();
|
|||
|
|
LL_RNG_GetRandomData();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
break; // <20><>ȡ<EFBFBD>ɹ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return (LL_RNG_GetRandomData());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*********************************************************************************************************
|
|||
|
|
** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: GPIO_NVIC_Init
|
|||
|
|
** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
|
** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|||
|
|
** <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
|
|||
|
|
*********************************************************************************************************/
|
|||
|
|
void GPIO_NVIC_Init( void )
|
|||
|
|
{
|
|||
|
|
LL_CMU_EnableClock_EXTI();
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>оƬIRQ<52>ж<EFBFBD>
|
|||
|
|
LL_EXTI_SetEXTISelection( LL_EXTI_LINE_0, LL_EXTI_SELECTION_3 ); // PA3
|
|||
|
|
LL_EXTI_SetEXTIEdgeTrig( LL_EXTI_LINE_0, LL_EXTI_EDS_FALLING ); // Falling
|
|||
|
|
|
|||
|
|
//FM17<31><37><EFBFBD><EFBFBD>оƬIRQ<52>ж<EFBFBD>
|
|||
|
|
LL_EXTI_SetEXTISelection( LL_EXTI_LINE_1, LL_EXTI_SELECTION_3 ); // PA7
|
|||
|
|
LL_EXTI_SetEXTIEdgeTrig( LL_EXTI_LINE_1, LL_EXTI_EDS_FALLING ); // Falling
|
|||
|
|
|
|||
|
|
NVIC_EnableIRQ( GPIO_IRQn );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void GPIO_Init( void )
|
|||
|
|
{
|
|||
|
|
LL_CMU_EnablePeriphBusClock_GPIO(); // Bus clock enable
|
|||
|
|
|
|||
|
|
LL_GPIO_SetPinMode( GPIOA, LL_GPIO_Pin12, LL_GPIO_PINxMODE_DIGITAL ); // PA12 Digital function - UART1 RX
|
|||
|
|
LL_GPIO_SetPinDigitalFunc( GPIOA, LL_GPIO_Pin12, LL_GPIO_PinDFS0 );
|
|||
|
|
LL_GPIO_SetPinMode( GPIOA, LL_GPIO_Pin13, LL_GPIO_PINxMODE_DIGITAL ); // PA13 Digital function - UART1 TX
|
|||
|
|
LL_GPIO_SetPinDigitalFunc( GPIOA, LL_GPIO_Pin13, LL_GPIO_PinDFS0 );
|
|||
|
|
|
|||
|
|
|
|||
|
|
LL_GPIO_SetPinMode( LED_GPIO, LED1_PIN, LL_GPIO_PINxMODE_OUTPUT );
|
|||
|
|
LL_GPIO_SetPinMode( LED_GPIO, LED2_PIN, LL_GPIO_PINxMODE_OUTPUT );
|
|||
|
|
|
|||
|
|
LED1_On;
|
|||
|
|
LED2_On;
|
|||
|
|
DelayMs(200);
|
|||
|
|
LED1_Off;
|
|||
|
|
LED2_Off;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void Uart_Init( void )
|
|||
|
|
{
|
|||
|
|
/* Bus clock enable */
|
|||
|
|
LL_CMU_EnablePeriphBusClock_UART1();
|
|||
|
|
|
|||
|
|
LL_CMU_SelectClock_UART1( LL_CMU_HFPER_CLK_APBCLKx ); // Clock source select
|
|||
|
|
LL_CMU_EnableClock_UART1(); // Operation clock enable
|
|||
|
|
|
|||
|
|
LL_UART_SetBaudRate( UART1, 412 ); // Set baudrate to 115200bps, reg = (uclk / baudrate) - 1
|
|||
|
|
LL_UART_SetDataWidth( UART1, LL_UART_DATA_WIDTH_8bit ); // 8 bit
|
|||
|
|
LL_UART_SetStopBitsLength( UART1, LL_UART_STOPCFG_1bit ); // 1 stop bit
|
|||
|
|
LL_UART_SetParity( UART1, LL_UART_PARITY_NONE ); // Parity none
|
|||
|
|
|
|||
|
|
LL_UART_EnableTx( UART1 ); // Tx enable
|
|||
|
|
LL_UART_EnableRx( UART1 ); // Rx enable
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void uart_send_byte( UART_Typedef *uart, uint16_t c )
|
|||
|
|
{
|
|||
|
|
while ( !LL_UART_IsActiveFlag_TXBE( uart ) )
|
|||
|
|
;
|
|||
|
|
LL_UART_TransmitData( uart, (uint32_t) c );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/* Retarget fputc, then you can use printf. */
|
|||
|
|
int fputc( int ch, FILE *f )
|
|||
|
|
{
|
|||
|
|
uart_send_byte( UART1, ch );
|
|||
|
|
return (ch);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void SPI_Init( SPI_Typedef *spi )
|
|||
|
|
{
|
|||
|
|
// Bus clock enable
|
|||
|
|
if ( spi == SPI1 )
|
|||
|
|
LL_CMU_EnablePeriphBusClock_SPI1();
|
|||
|
|
else if ( spi == SPI2 )
|
|||
|
|
LL_CMU_EnablePeriphBusClock_SPI2();
|
|||
|
|
|
|||
|
|
LL_SPI_DisableCtrlSSN( spi ); // Disable Software Control
|
|||
|
|
//LL_SPI_SetSSNOutput( spi, 1 ); // Set SSN High
|
|||
|
|
|
|||
|
|
LL_SPI_Disable( spi ); // Disable SPI
|
|||
|
|
LL_SPI_SetWorkMode( spi, LL_SPI_WORKMODE_MASTER ); // Mode select - master
|
|||
|
|
LL_SPI_SetBaudrate( spi, LL_SPI_BAUDRATE_DIV_4 ); // Baudrate Select - fPCLK/16
|
|||
|
|
LL_SPI_SetFrameFormat(spi,LL_SPI_FRAME_FMT_MSB);
|
|||
|
|
LL_SPI_SetClockPolarity(spi,LL_SPI_CPOL_NEGATIVE);
|
|||
|
|
LL_SPI_SetCommMode(spi,LL_SPI_COMM_MODE_STANDARD);
|
|||
|
|
LL_SPI_SetDataLength(spi,LL_SPI_DATA_LENGTH_8bit);
|
|||
|
|
LL_SPI_DisableHalfDuplexDummyCycle(spi);
|
|||
|
|
LL_SPI_Enable( spi ); // Enable SPI
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void BSP_Init( void )
|
|||
|
|
{
|
|||
|
|
GPIO_Init();
|
|||
|
|
Uart_Init();
|
|||
|
|
//SPI_Init( SPI1);
|
|||
|
|
SVD_Init();
|
|||
|
|
RNG_Init();
|
|||
|
|
}
|
|||
|
|
|