/** ****************************************************************************** * @file board.c * @author SRG * @version V1.0.0 * @date 2020-03-17 * @brief ****************************************************************************** * @attention * *

© Copyright (c) 2020 FudanMicroelectronics. * All rights reserved.

* ****************************************************************************** */ #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" // 判断VDD是否低于阈值 int Vdd_is_Low( void ) { return (!LL_SVD_IsActiveFlag_SVDR() ); } void SVD_Init( void ) { LL_SVD_EnableSVDDigitalFilter(); // 使能数字滤波,间隔检测必须开启 LL_SVD_SetSVDMode( LL_SVD_SVDMOD_INTERVAL_ON ); // 间隔检测 LL_SVD_SetSVDInterval( LL_SVD_SVDITVL_62p5ms ); // 检测间隔62.5ms LL_SVD_DisableV1P0(); // 关闭1V基准电压 LL_SVD_EnableV0P95(); // 使用基准电压:0.95V LL_SVD_SetSVDLevel( LL_SVD_SVDLVL_LEVEL10 ); // 检测阈值等级10 - 阈值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,时钟频率过高会导致SFAIL错误 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() ) { // 清空错误标志 LL_RNG_ClearFlag_SFAIL(); LL_RNG_GetRandomData(); } else { break; // 获取成功 } } } return (LL_RNG_GetRandomData()); } /********************************************************************************************************* ** 函数名称: GPIO_NVIC_Init ** 函数功能: 部分引脚的中断配置 ** 输入参数: 无 ** 输出参数: 无 ** 返回值: 无 *********************************************************************************************************/ void GPIO_NVIC_Init( void ) { LL_CMU_EnableClock_EXTI(); //触摸芯片IRQ中断 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读卡芯片IRQ中断 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(); }