|
|
/*
|
|
|
*********************************************************************************************************
|
|
|
*
|
|
|
* BOARD SUPPORT PACKAGE
|
|
|
*
|
|
|
* ST Microelectronics STM32
|
|
|
* with the
|
|
|
* STM3210B-EVAL Evaluation Board
|
|
|
*
|
|
|
* Filename : bsp.c
|
|
|
* Version : V1.00
|
|
|
*********************************************************************************************************
|
|
|
*/
|
|
|
|
|
|
/*
|
|
|
*********************************************************************************************************
|
|
|
* INCLUDE FILES
|
|
|
*********************************************************************************************************
|
|
|
*/
|
|
|
#define BSP_MODULE
|
|
|
|
|
|
#include <bsp.h>
|
|
|
#include <stdio.h>
|
|
|
#include <ucos_ii.h>
|
|
|
#include <cpu_core.h>
|
|
|
#include <cm_backtrace.h>
|
|
|
|
|
|
/*
|
|
|
*********************************************************************************************************
|
|
|
* LOCAL TABLES
|
|
|
*********************************************************************************************************
|
|
|
*/
|
|
|
#define DWT_CR *(CPU_REG32 *)0xE0001000
|
|
|
#define DWT_CYCCNT *(CPU_REG32 *)0xE0001004
|
|
|
#define DEM_CR *(CPU_REG32 *)0xE000EDFC
|
|
|
#define DEM_CR_TRCENA (1 << 24)
|
|
|
#define DWT_CR_CYCCNTENA (1 << 0)
|
|
|
/*
|
|
|
*********************************************************************************************************
|
|
|
* LOCAL GLOBAL VARIABLES
|
|
|
*********************************************************************************************************
|
|
|
*/
|
|
|
/*
|
|
|
*********************************************************************************************************
|
|
|
* LOCAL FUNCTION PROTOTYPES
|
|
|
*********************************************************************************************************
|
|
|
*/
|
|
|
|
|
|
/**
|
|
|
* RCC configuration
|
|
|
*/
|
|
|
static void RCC_Configuration(void)
|
|
|
{
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD>ģ<EFBFBD>鿪<EFBFBD><E9BFAA>ʱ<EFBFBD><CAB1>
|
|
|
//<2F><><EFBFBD><EFBFBD>GPIO
|
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
|
|
|
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | \
|
|
|
RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOG,
|
|
|
ENABLE);
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>AFIO
|
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
|
|
|
//<2F><><EFBFBD><EFBFBD>USART1ʱ<31><CAB1>
|
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
|
|
|
//<2F><><EFBFBD><EFBFBD>USART2ʱ<32><CAB1>
|
|
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
|
|
|
//<2F><><EFBFBD><EFBFBD>DMAʱ<41><CAB1>
|
|
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
|
|
|
/* Enable ADC1 and GPIOC clock */
|
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
|
|
|
/* Enable WWDG clock */
|
|
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* NVIC Configuration
|
|
|
*/
|
|
|
static void NVIC_Configuration(void)
|
|
|
{
|
|
|
#if defined(VECT_TAB_RAM)
|
|
|
// Set the Vector Table base location at 0x20000000
|
|
|
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x00);
|
|
|
#elif defined(VECT_TAB_FLASH)
|
|
|
// Set the Vector Table base location at 0x08000000
|
|
|
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);
|
|
|
#elif defined(VECT_TAB_USER)
|
|
|
// Set the Vector Table base location by user
|
|
|
NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_VECTOR_TABLE);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* GPIO Configuration
|
|
|
*/
|
|
|
static void GPIO_Configuration(void)
|
|
|
{
|
|
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
|
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
|
|
GPIO_Init(GPIOE, &GPIO_InitStructure);
|
|
|
GPIO_Init(GPIOF, &GPIO_InitStructure);
|
|
|
GPIO_Init(GPIOG, &GPIO_InitStructure);
|
|
|
|
|
|
/******************system run led*******************/
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|
|
|
|
|
/* USART1_TX */
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
|
|
|
|
/* USART1_RX */
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : USART1_Configuration
|
|
|
* Description : USART1 Configuration
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
*******************************************************************************/
|
|
|
void USART1_Configuration(void)
|
|
|
{
|
|
|
USART_InitTypeDef USART_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_Tx | USART_Mode_Rx;
|
|
|
USART_Init(USART1, &USART_InitStructure);
|
|
|
|
|
|
USART_Cmd(USART1, ENABLE);
|
|
|
|
|
|
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
|
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : SysTick_Configuration
|
|
|
* Description : Configures the SysTick for OS tick.
|
|
|
* Input : None
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
*******************************************************************************/
|
|
|
void SysTick_Configuration(void)
|
|
|
{
|
|
|
RCC_ClocksTypeDef rcc_clocks;
|
|
|
uint32_t cnts;
|
|
|
|
|
|
RCC_GetClocksFreq(&rcc_clocks);
|
|
|
|
|
|
#if (OS_VERSION >= 30000u)
|
|
|
cnts = (rcc_clocks.HCLK_Frequency / OSCfg_TickRate_Hz); /* Determine nbr SysTick increments */
|
|
|
#else
|
|
|
cnts = (rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);
|
|
|
#endif
|
|
|
|
|
|
SysTick_Config(cnts);
|
|
|
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
*********************************************************************************************************
|
|
|
* CPU_TS_TmrInit()
|
|
|
*
|
|
|
* Description : Initialize & start CPU timestamp timer.
|
|
|
*
|
|
|
* Argument(s) : none.
|
|
|
*
|
|
|
* Return(s) : none.
|
|
|
*
|
|
|
* Caller(s) : CPU_TS_Init().
|
|
|
*
|
|
|
* This function is an INTERNAL CPU module function & MUST be implemented by application/
|
|
|
* BSP function(s) [see Note #1] but MUST NOT be called by application function(s).
|
|
|
*
|
|
|
* Note(s) : (1) CPU_TS_TmrInit() is an application/BSP function that MUST be defined by the developer
|
|
|
* if either of the following CPU features is enabled :
|
|
|
*
|
|
|
* (a) CPU timestamps
|
|
|
* (b) CPU interrupts disabled time measurements
|
|
|
*
|
|
|
* See 'cpu_cfg.h CPU TIMESTAMP CONFIGURATION Note #1'
|
|
|
* & 'cpu_cfg.h CPU INTERRUPTS DISABLED TIME MEASUREMENT CONFIGURATION Note #1a'.
|
|
|
*
|
|
|
* (2) (a) Timer count values MUST be returned via word-size-configurable 'CPU_TS_TMR'
|
|
|
* data type.
|
|
|
*
|
|
|
* (1) If timer has more bits, truncate timer values' higher-order bits greater
|
|
|
* than the configured 'CPU_TS_TMR' timestamp timer data type word size.
|
|
|
*
|
|
|
* (2) Since the timer MUST NOT have less bits than the configured 'CPU_TS_TMR'
|
|
|
* timestamp timer data type word size; 'CPU_CFG_TS_TMR_SIZE' MUST be
|
|
|
* configured so that ALL bits in 'CPU_TS_TMR' data type are significant.
|
|
|
*
|
|
|
* In other words, if timer size is not a binary-multiple of 8-bit octets
|
|
|
* (e.g. 20-bits or even 24-bits), then the next lower, binary-multiple
|
|
|
* octet word size SHOULD be configured (e.g. to 16-bits). However, the
|
|
|
* minimum supported word size for CPU timestamp timers is 8-bits.
|
|
|
*
|
|
|
* See also 'cpu_cfg.h CPU TIMESTAMP CONFIGURATION Note #2'
|
|
|
* & 'cpu_core.h CPU TIMESTAMP DATA TYPES Note #1'.
|
|
|
*
|
|
|
* (b) Timer SHOULD be an 'up' counter whose values increase with each time count.
|
|
|
*
|
|
|
* (c) When applicable, timer period SHOULD be less than the typical measured time
|
|
|
* but MUST be less than the maximum measured time; otherwise, timer resolution
|
|
|
* inadequate to measure desired times.
|
|
|
*
|
|
|
* See also 'CPU_TS_TmrRd() Note #2'.
|
|
|
*********************************************************************************************************
|
|
|
*/
|
|
|
|
|
|
#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
|
|
|
void CPU_TS_TmrInit (void)
|
|
|
{
|
|
|
RCC_ClocksTypeDef rcc_clocks;
|
|
|
|
|
|
RCC_GetClocksFreq(&rcc_clocks);
|
|
|
|
|
|
|
|
|
DEM_CR |= (CPU_INT32U)DEM_CR_TRCENA; /* Enable Cortex-M3's DWT CYCCNT reg. */
|
|
|
DWT_CYCCNT = (CPU_INT32U)0u;
|
|
|
DWT_CR |= (CPU_INT32U)DWT_CR_CYCCNTENA;
|
|
|
|
|
|
CPU_TS_TmrFreqSet(rcc_clocks.HCLK_Frequency);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
|
|
|
/*$PAGE*/
|
|
|
/*
|
|
|
*********************************************************************************************************
|
|
|
* CPU_TS_TmrRd()
|
|
|
*
|
|
|
* Description : Get current CPU timestamp timer count value.
|
|
|
*
|
|
|
* Argument(s) : none.
|
|
|
*
|
|
|
* Return(s) : Timestamp timer count (see Notes #2a & #2b).
|
|
|
*
|
|
|
* Caller(s) : CPU_TS_Init(),
|
|
|
* CPU_TS_Get32(),
|
|
|
* CPU_TS_Get64(),
|
|
|
* CPU_IntDisMeasStart(),
|
|
|
* CPU_IntDisMeasStop().
|
|
|
*
|
|
|
* This function is an INTERNAL CPU module function & MUST be implemented by application/
|
|
|
* BSP function(s) [see Note #1] but SHOULD NOT be called by application function(s).
|
|
|
*
|
|
|
* Note(s) : (1) CPU_TS_TmrRd() is an application/BSP function that MUST be defined by the developer
|
|
|
* if either of the following CPU features is enabled :
|
|
|
*
|
|
|
* (a) CPU timestamps
|
|
|
* (b) CPU interrupts disabled time measurements
|
|
|
*
|
|
|
* See 'cpu_cfg.h CPU TIMESTAMP CONFIGURATION Note #1'
|
|
|
* & 'cpu_cfg.h CPU INTERRUPTS DISABLED TIME MEASUREMENT CONFIGURATION Note #1a'.
|
|
|
*
|
|
|
* (2) (a) Timer count values MUST be returned via word-size-configurable 'CPU_TS_TMR'
|
|
|
* data type.
|
|
|
*
|
|
|
* (1) If timer has more bits, truncate timer values' higher-order bits greater
|
|
|
* than the configured 'CPU_TS_TMR' timestamp timer data type word size.
|
|
|
*
|
|
|
* (2) Since the timer MUST NOT have less bits than the configured 'CPU_TS_TMR'
|
|
|
* timestamp timer data type word size; 'CPU_CFG_TS_TMR_SIZE' MUST be
|
|
|
* configured so that ALL bits in 'CPU_TS_TMR' data type are significant.
|
|
|
*
|
|
|
* In other words, if timer size is not a binary-multiple of 8-bit octets
|
|
|
* (e.g. 20-bits or even 24-bits), then the next lower, binary-multiple
|
|
|
* octet word size SHOULD be configured (e.g. to 16-bits). However, the
|
|
|
* minimum supported word size for CPU timestamp timers is 8-bits.
|
|
|
*
|
|
|
* See also 'cpu_cfg.h CPU TIMESTAMP CONFIGURATION Note #2'
|
|
|
* & 'cpu_core.h CPU TIMESTAMP DATA TYPES Note #1'.
|
|
|
*
|
|
|
* (b) Timer SHOULD be an 'up' counter whose values increase with each time count.
|
|
|
*
|
|
|
* (1) If timer is a 'down' counter whose values decrease with each time count,
|
|
|
* then the returned timer value MUST be ones-complemented.
|
|
|
*
|
|
|
* (c) (1) When applicable, the amount of time measured by CPU timestamps is
|
|
|
* calculated by either of the following equations :
|
|
|
*
|
|
|
* (A) Time measured = Number timer counts * Timer period
|
|
|
*
|
|
|
* where
|
|
|
*
|
|
|
* Number timer counts Number of timer counts measured
|
|
|
* Timer period Timer's period in some units of
|
|
|
* (fractional) seconds
|
|
|
* Time measured Amount of time measured, in same
|
|
|
* units of (fractional) seconds
|
|
|
* as the Timer period
|
|
|
*
|
|
|
* Number timer counts
|
|
|
* (B) Time measured = ---------------------
|
|
|
* Timer frequency
|
|
|
*
|
|
|
* where
|
|
|
*
|
|
|
* Number timer counts Number of timer counts measured
|
|
|
* Timer frequency Timer's frequency in some units
|
|
|
* of counts per second
|
|
|
* Time measured Amount of time measured, in seconds
|
|
|
*
|
|
|
* (2) Timer period SHOULD be less than the typical measured time but MUST be less
|
|
|
* than the maximum measured time; otherwise, timer resolution inadequate to
|
|
|
* measure desired times.
|
|
|
*********************************************************************************************************
|
|
|
*/
|
|
|
|
|
|
#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
|
|
|
CPU_TS_TMR CPU_TS_TmrRd (void)
|
|
|
{
|
|
|
return ((CPU_TS_TMR)DWT_CYCCNT);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
void BSP_IntDisAll (void)
|
|
|
{
|
|
|
CPU_IntDis();
|
|
|
}
|
|
|
|
|
|
int fputc(int ch, FILE *f)
|
|
|
{
|
|
|
USART_SendData(USART1, (uint8_t) ch);
|
|
|
/* Loop until the end of transmission */
|
|
|
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
|
|
|
{}
|
|
|
return ch;
|
|
|
}
|
|
|
|
|
|
int fgetc(FILE *f)
|
|
|
{
|
|
|
|
|
|
while(!(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET))
|
|
|
{
|
|
|
}
|
|
|
|
|
|
return (USART_ReceiveData(USART1));
|
|
|
}
|
|
|
|
|
|
void assert_failed(u8* file, u32 line)
|
|
|
{
|
|
|
/* User can add his own implementation to report the file name and line number,
|
|
|
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
|
|
|
/* Infinite loop */
|
|
|
cm_backtrace_assert(cmb_get_sp());
|
|
|
printf("assert failed at %s:%d \n", file, line);
|
|
|
while (1) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void delay(uint32_t nCount)
|
|
|
{
|
|
|
for(; nCount!= 0; nCount--);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
*********************************************************************************************************
|
|
|
* LOCAL CONFIGURATION ERRORS
|
|
|
*********************************************************************************************************
|
|
|
*/
|
|
|
|
|
|
|
|
|
/*
|
|
|
*********************************************************************************************************
|
|
|
* BSP_Init()
|
|
|
*
|
|
|
* Description : Initialize the Board Support Package (BSP).
|
|
|
*
|
|
|
* Argument(s) : none.
|
|
|
*
|
|
|
* Return(s) : none.
|
|
|
*
|
|
|
* Caller(s) : Application.
|
|
|
*
|
|
|
* Note(s) : (1) This function SHOULD be called before any other BSP function is called.
|
|
|
*********************************************************************************************************
|
|
|
*/
|
|
|
|
|
|
void BSP_Init (void)
|
|
|
{
|
|
|
RCC_Configuration();
|
|
|
NVIC_Configuration();
|
|
|
USART1_Configuration();
|
|
|
GPIO_Configuration();
|
|
|
SysTick_Configuration();
|
|
|
}
|
|
|
|