Files
99_7018_lmx/apps/earphone/94_rfid_stc/board.c
2025-12-01 10:01:10 +08:00

193 lines
5.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @file board.c
* @author SRG
* @version V1.0.0
* @date 2020-03-17
* @brief
******************************************************************************
* @attention
*
* <h2><center>&copy; 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"
// 判断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();
}