move driver Dependency files into Driver folder
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2083 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
bfad5e609f
commit
ea8e676f51
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
#ifdef FM25CL64B
|
#ifdef FM25CL64B
|
||||||
#define FM25_MAXSIZE 8192
|
#define FM25_MAXSIZE 8192
|
||||||
#elif define(FM25LC256)
|
#elif defined(FM25LC256)
|
||||||
#define FM25_MAXSIZE 32768
|
#define FM25_MAXSIZE 32768
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
* File : application.c
|
|
||||||
* This file is part of RT-Thread RTOS
|
|
||||||
* COPYRIGHT (C) 2006, RT-Thread Development Team
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rt-thread.org/license/LICENSE
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2009-01-05 Bernard the first version
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup STM32
|
|
||||||
*/
|
|
||||||
/*@{*/
|
|
||||||
|
|
||||||
#include <board.h>
|
|
||||||
#include <rtthread.h>
|
|
||||||
#include "stm32f2xx_eth.h"
|
|
||||||
|
|
||||||
#ifdef RT_USING_DFS
|
|
||||||
/* dfs init */
|
|
||||||
#include <dfs_init.h>
|
|
||||||
/* dfs filesystem:ELM filesystem init */
|
|
||||||
#include <dfs_elm.h>
|
|
||||||
/* dfs Filesystem APIs */
|
|
||||||
#include <dfs_fs.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RT_USING_LWIP
|
|
||||||
#include <lwip/sys.h>
|
|
||||||
#include <lwip/api.h>
|
|
||||||
#include <netif/ethernetif.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void rt_init_thread_entry(void* parameter)
|
|
||||||
{
|
|
||||||
/* Filesystem Initialization */
|
|
||||||
#ifdef RT_USING_DFS
|
|
||||||
{
|
|
||||||
/* init the device filesystem */
|
|
||||||
dfs_init();
|
|
||||||
|
|
||||||
#ifdef RT_USING_DFS_ELMFAT
|
|
||||||
/* init the elm chan FatFs filesystam*/
|
|
||||||
elm_init();
|
|
||||||
|
|
||||||
/* mount sd card fat partition 1 as root directory */
|
|
||||||
if (dfs_mount("sd0", "/", "elm", 0, 0) == 0)
|
|
||||||
{
|
|
||||||
rt_kprintf("File System initialized!\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
rt_kprintf("File System initialzation failed!\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* LwIP Initialization */
|
|
||||||
#ifdef RT_USING_LWIP
|
|
||||||
{
|
|
||||||
extern void lwip_sys_init(void);
|
|
||||||
|
|
||||||
/* register ethernetif device */
|
|
||||||
eth_system_device_init();
|
|
||||||
|
|
||||||
/* initialize eth interface */
|
|
||||||
rt_hw_stm32_eth_init();
|
|
||||||
|
|
||||||
/* re-init device driver */
|
|
||||||
rt_device_init_all();
|
|
||||||
|
|
||||||
/* init lwip system */
|
|
||||||
lwip_sys_init();
|
|
||||||
rt_kprintf("TCP/IP initialized!\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int rt_application_init()
|
|
||||||
{
|
|
||||||
rt_thread_t tid;
|
|
||||||
|
|
||||||
tid = rt_thread_create("init",
|
|
||||||
rt_init_thread_entry, RT_NULL,
|
|
||||||
2048, RT_THREAD_PRIORITY_MAX/3, 20);
|
|
||||||
|
|
||||||
if (tid != RT_NULL)
|
|
||||||
rt_thread_startup(tid);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@}*/
|
|
|
@ -1,286 +0,0 @@
|
||||||
/*
|
|
||||||
* File : board.c
|
|
||||||
* This file is part of RT-Thread RTOS
|
|
||||||
* COPYRIGHT (C) 2009 RT-Thread Develop Team
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rt-thread.org/license/LICENSE
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2009-01-05 Bernard first implementation
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <rthw.h>
|
|
||||||
#include <rtthread.h>
|
|
||||||
|
|
||||||
#include "board.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup STM32
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*@{*/
|
|
||||||
|
|
||||||
#if STM32_USE_SDIO
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DeInitializes the SDIO interface.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SD_LowLevel_DeInit(void)
|
|
||||||
{
|
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
|
||||||
|
|
||||||
/*!< Disable SDIO Clock */
|
|
||||||
SDIO_ClockCmd(DISABLE);
|
|
||||||
|
|
||||||
/*!< Set Power State to OFF */
|
|
||||||
SDIO_SetPowerState(SDIO_PowerState_OFF);
|
|
||||||
|
|
||||||
/*!< DeInitializes the SDIO peripheral */
|
|
||||||
SDIO_DeInit();
|
|
||||||
|
|
||||||
/* Disable the SDIO APB2 Clock */
|
|
||||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, DISABLE);
|
|
||||||
|
|
||||||
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_MCO);
|
|
||||||
GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_MCO);
|
|
||||||
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_MCO);
|
|
||||||
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_MCO);
|
|
||||||
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_MCO);
|
|
||||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_MCO);
|
|
||||||
|
|
||||||
/* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
|
|
||||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
|
||||||
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure PD.02 CMD line */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
|
|
||||||
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure PC.12 pin: CLK pin */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
|
|
||||||
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initializes the SD Card and put it into StandBy State (Ready for
|
|
||||||
* data transfer).
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SD_LowLevel_Init(void)
|
|
||||||
{
|
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
|
||||||
|
|
||||||
/* GPIOC and GPIOD Periph clock enable */
|
|
||||||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | SD_DETECT_GPIO_CLK, ENABLE);
|
|
||||||
|
|
||||||
GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO);
|
|
||||||
GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO);
|
|
||||||
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO);
|
|
||||||
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO);
|
|
||||||
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO);
|
|
||||||
GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);
|
|
||||||
|
|
||||||
/* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
|
|
||||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
|
||||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
|
||||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
|
||||||
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure PD.02 CMD line */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
|
|
||||||
GPIO_Init(GPIOD, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Configure PC.12 pin: CLK pin */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
|
|
||||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
|
||||||
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/*!< Configure SD_SPI_DETECT_PIN pin: SD Card detect pin */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN;
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
|
|
||||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
|
||||||
GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* Enable the SDIO APB2 Clock */
|
|
||||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);
|
|
||||||
|
|
||||||
/* Enable the DMA2 Clock */
|
|
||||||
RCC_AHB1PeriphClockCmd(SD_SDIO_DMA_CLK, ENABLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Configures the DMA2 Channel4 for SDIO Tx request.
|
|
||||||
* @param BufferSRC: pointer to the source buffer
|
|
||||||
* @param BufferSize: buffer size
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize)
|
|
||||||
{
|
|
||||||
DMA_InitTypeDef SDDMA_InitStructure;
|
|
||||||
|
|
||||||
DMA_ClearFlag(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_FEIF | SD_SDIO_DMA_FLAG_DMEIF | SD_SDIO_DMA_FLAG_TEIF | SD_SDIO_DMA_FLAG_HTIF | SD_SDIO_DMA_FLAG_TCIF);
|
|
||||||
|
|
||||||
/* DMA2 Stream3 or Stream6 disable */
|
|
||||||
DMA_Cmd(SD_SDIO_DMA_STREAM, DISABLE);
|
|
||||||
|
|
||||||
/* DMA2 Stream3 or Stream6 Config */
|
|
||||||
DMA_DeInit(SD_SDIO_DMA_STREAM);
|
|
||||||
|
|
||||||
SDDMA_InitStructure.DMA_Channel = SD_SDIO_DMA_CHANNEL;
|
|
||||||
SDDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
|
|
||||||
SDDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)BufferSRC;
|
|
||||||
SDDMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
|
|
||||||
SDDMA_InitStructure.DMA_BufferSize = 0;
|
|
||||||
SDDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
|
||||||
SDDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
|
||||||
SDDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
|
|
||||||
SDDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
|
|
||||||
SDDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
|
|
||||||
SDDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
|
|
||||||
SDDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
|
|
||||||
SDDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
|
|
||||||
SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;
|
|
||||||
SDDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;
|
|
||||||
DMA_Init(SD_SDIO_DMA_STREAM, &SDDMA_InitStructure);
|
|
||||||
|
|
||||||
DMA_FlowControllerConfig(SD_SDIO_DMA_STREAM, DMA_FlowCtrl_Peripheral);
|
|
||||||
|
|
||||||
/* DMA2 Stream3 or Stream6 enable */
|
|
||||||
DMA_Cmd(SD_SDIO_DMA_STREAM, ENABLE);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Configures the DMA2 Channel4 for SDIO Rx request.
|
|
||||||
* @param BufferDST: pointer to the destination buffer
|
|
||||||
* @param BufferSize: buffer size
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize)
|
|
||||||
{
|
|
||||||
DMA_InitTypeDef SDDMA_InitStructure;
|
|
||||||
|
|
||||||
DMA_ClearFlag(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_FEIF | SD_SDIO_DMA_FLAG_DMEIF | SD_SDIO_DMA_FLAG_TEIF | SD_SDIO_DMA_FLAG_HTIF | SD_SDIO_DMA_FLAG_TCIF);
|
|
||||||
|
|
||||||
/* DMA2 Stream3 or Stream6 disable */
|
|
||||||
DMA_Cmd(SD_SDIO_DMA_STREAM, DISABLE);
|
|
||||||
|
|
||||||
/* DMA2 Stream3 or Stream6 Config */
|
|
||||||
DMA_DeInit(SD_SDIO_DMA_STREAM);
|
|
||||||
|
|
||||||
SDDMA_InitStructure.DMA_Channel = SD_SDIO_DMA_CHANNEL;
|
|
||||||
SDDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
|
|
||||||
SDDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)BufferDST;
|
|
||||||
SDDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
|
|
||||||
SDDMA_InitStructure.DMA_BufferSize = 0;
|
|
||||||
SDDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
|
||||||
SDDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
|
||||||
SDDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
|
|
||||||
SDDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
|
|
||||||
SDDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
|
|
||||||
SDDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
|
|
||||||
SDDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
|
|
||||||
SDDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
|
|
||||||
SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;
|
|
||||||
SDDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;
|
|
||||||
DMA_Init(SD_SDIO_DMA_STREAM, &SDDMA_InitStructure);
|
|
||||||
|
|
||||||
DMA_FlowControllerConfig(SD_SDIO_DMA_STREAM, DMA_FlowCtrl_Peripheral);
|
|
||||||
|
|
||||||
/* DMA2 Stream3 or Stream6 enable */
|
|
||||||
DMA_Cmd(SD_SDIO_DMA_STREAM, ENABLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Returns the DMA End Of Transfer Status.
|
|
||||||
* @param None
|
|
||||||
* @retval DMA SDIO Stream Status.
|
|
||||||
*/
|
|
||||||
uint32_t SD_DMAEndOfTransferStatus(void)
|
|
||||||
{
|
|
||||||
return (uint32_t)DMA_GetFlagStatus(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_TCIF);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : NVIC_Configuration
|
|
||||||
* Description : Configures Vector Table base location.
|
|
||||||
* Input : None
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void NVIC_Configuration(void)
|
|
||||||
{
|
|
||||||
#ifdef VECT_TAB_RAM
|
|
||||||
/* Set the Vector Table base location at 0x20000000 */
|
|
||||||
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
|
|
||||||
#else /* VECT_TAB_FLASH */
|
|
||||||
/* Set the Vector Table base location at 0x08000000 */
|
|
||||||
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* 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;
|
|
||||||
rt_uint32_t cnts;
|
|
||||||
|
|
||||||
RCC_GetClocksFreq(&rcc_clocks);
|
|
||||||
|
|
||||||
cnts = (rt_uint32_t)rcc_clocks.HCLK_Frequency / RT_TICK_PER_SECOND;
|
|
||||||
|
|
||||||
SysTick_Config(cnts);
|
|
||||||
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is the timer interrupt service routine.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void SysTick_Handler(void)
|
|
||||||
{
|
|
||||||
/* enter interrupt */
|
|
||||||
rt_interrupt_enter();
|
|
||||||
|
|
||||||
rt_tick_increase();
|
|
||||||
|
|
||||||
/* leave interrupt */
|
|
||||||
rt_interrupt_leave();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function will initial STM32 board.
|
|
||||||
*/
|
|
||||||
void rt_hw_board_init()
|
|
||||||
{
|
|
||||||
/* NVIC Configuration */
|
|
||||||
NVIC_Configuration();
|
|
||||||
|
|
||||||
/* Configure the SysTick */
|
|
||||||
SysTick_Configuration();
|
|
||||||
|
|
||||||
rt_hw_usart_init();
|
|
||||||
#ifdef RT_USING_CONSOLE
|
|
||||||
rt_console_set_device(CONSOLE_DEVICE);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@}*/
|
|
|
@ -1,121 +0,0 @@
|
||||||
/*
|
|
||||||
* File : board.h
|
|
||||||
* This file is part of RT-Thread RTOS
|
|
||||||
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rt-thread.org/license/LICENSE
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2009-09-22 Bernard add board.h to this bsp
|
|
||||||
*/
|
|
||||||
|
|
||||||
// <<< Use Configuration Wizard in Context Menu >>>
|
|
||||||
#ifndef __BOARD_H__
|
|
||||||
#define __BOARD_H__
|
|
||||||
|
|
||||||
#include <stm32f2xx.h>
|
|
||||||
|
|
||||||
/* board configuration */
|
|
||||||
// <o> SDCard Driver <1=>SDIO sdcard <0=>SPI MMC card
|
|
||||||
// <i>Default: 1
|
|
||||||
#define STM32_USE_SDIO 1
|
|
||||||
|
|
||||||
/* whether use board external SRAM memory */
|
|
||||||
// <e>Use external SRAM memory on the board
|
|
||||||
// <i>Enable External SRAM memory
|
|
||||||
#define STM32_EXT_SRAM 0
|
|
||||||
// <o>Begin Address of External SRAM
|
|
||||||
// <i>Default: 0x68000000
|
|
||||||
#define STM32_EXT_SRAM_BEGIN 0x68000000 /* the begining address of external SRAM */
|
|
||||||
// <o>End Address of External SRAM
|
|
||||||
// <i>Default: 0x68080000
|
|
||||||
#define STM32_EXT_SRAM_END 0x68080000 /* the end address of external SRAM */
|
|
||||||
// </e>
|
|
||||||
|
|
||||||
// <o> Internal SRAM memory size[Kbytes] <8-128>
|
|
||||||
// <i>Default: 64
|
|
||||||
#define STM32_SRAM_SIZE 128
|
|
||||||
#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024)
|
|
||||||
|
|
||||||
// <o> Console on USART: <0=> no console <1=>USART 1 <2=>USART 2 <3=> USART 3
|
|
||||||
// <i>Default: 1
|
|
||||||
#define STM32_CONSOLE_USART 1
|
|
||||||
|
|
||||||
// <o> Ethernet Interface: <0=> Microchip ENC28J60
|
|
||||||
#define STM32_ETH_IF 0
|
|
||||||
|
|
||||||
void rt_hw_board_led_on(int n);
|
|
||||||
void rt_hw_board_led_off(int n);
|
|
||||||
void rt_hw_board_init(void);
|
|
||||||
|
|
||||||
#if STM32_CONSOLE_USART == 0
|
|
||||||
#define CONSOLE_DEVICE "no"
|
|
||||||
#elif STM32_CONSOLE_USART == 1
|
|
||||||
#define CONSOLE_DEVICE "uart1"
|
|
||||||
#elif STM32_CONSOLE_USART == 2
|
|
||||||
#define CONSOLE_DEVICE "uart2"
|
|
||||||
#elif STM32_CONSOLE_USART == 3
|
|
||||||
#define CONSOLE_DEVICE "uart3"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if STM32_USE_SDIO
|
|
||||||
/**
|
|
||||||
* @brief SD FLASH SDIO Interface
|
|
||||||
*/
|
|
||||||
#define SD_DETECT_PIN GPIO_Pin_0 /* PB.0 */
|
|
||||||
#define SD_DETECT_GPIO_PORT GPIOB /* GPIOB */
|
|
||||||
#define SD_DETECT_GPIO_CLK RCC_AHB1Periph_GPIOB
|
|
||||||
|
|
||||||
#define SDIO_FIFO_ADDRESS ((uint32_t)0x40012C80)
|
|
||||||
/**
|
|
||||||
* @brief SDIO Intialization Frequency (400KHz max)
|
|
||||||
*/
|
|
||||||
#define SDIO_INIT_CLK_DIV ((uint8_t)0x76)
|
|
||||||
/**
|
|
||||||
* @brief SDIO Data Transfer Frequency (25MHz max)
|
|
||||||
*/
|
|
||||||
#define SDIO_TRANSFER_CLK_DIV ((uint8_t)0x0)
|
|
||||||
|
|
||||||
#define SD_SDIO_DMA DMA2
|
|
||||||
#define SD_SDIO_DMA_CLK RCC_AHB1Periph_DMA2
|
|
||||||
|
|
||||||
#define SD_SDIO_DMA_STREAM3 3
|
|
||||||
//#define SD_SDIO_DMA_STREAM6 6
|
|
||||||
|
|
||||||
#ifdef SD_SDIO_DMA_STREAM3
|
|
||||||
#define SD_SDIO_DMA_STREAM DMA2_Stream3
|
|
||||||
#define SD_SDIO_DMA_CHANNEL DMA_Channel_4
|
|
||||||
#define SD_SDIO_DMA_FLAG_FEIF DMA_FLAG_FEIF3
|
|
||||||
#define SD_SDIO_DMA_FLAG_DMEIF DMA_FLAG_DMEIF3
|
|
||||||
#define SD_SDIO_DMA_FLAG_TEIF DMA_FLAG_TEIF3
|
|
||||||
#define SD_SDIO_DMA_FLAG_HTIF DMA_FLAG_HTIF3
|
|
||||||
#define SD_SDIO_DMA_FLAG_TCIF DMA_FLAG_TCIF3
|
|
||||||
#elif defined SD_SDIO_DMA_STREAM6
|
|
||||||
#define SD_SDIO_DMA_STREAM DMA2_Stream6
|
|
||||||
#define SD_SDIO_DMA_CHANNEL DMA_Channel_4
|
|
||||||
#define SD_SDIO_DMA_FLAG_FEIF DMA_FLAG_FEIF6
|
|
||||||
#define SD_SDIO_DMA_FLAG_DMEIF DMA_FLAG_DMEIF6
|
|
||||||
#define SD_SDIO_DMA_FLAG_TEIF DMA_FLAG_TEIF6
|
|
||||||
#define SD_SDIO_DMA_FLAG_HTIF DMA_FLAG_HTIF6
|
|
||||||
#define SD_SDIO_DMA_FLAG_TCIF DMA_FLAG_TCIF6
|
|
||||||
#endif /* SD_SDIO_DMA_STREAM3 */
|
|
||||||
|
|
||||||
void SD_LowLevel_DeInit(void);
|
|
||||||
void SD_LowLevel_Init(void);
|
|
||||||
void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize);
|
|
||||||
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
void rt_hw_usart_init(void);
|
|
||||||
|
|
||||||
/* SD Card init function */
|
|
||||||
void rt_hw_msd_init(void);
|
|
||||||
|
|
||||||
/* ETH interface init function */
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// <<< Use Configuration Wizard in Context Menu >>>
|
|
|
@ -1,343 +0,0 @@
|
||||||
/*
|
|
||||||
* File : rtc.c
|
|
||||||
* This file is part of RT-Thread RTOS
|
|
||||||
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rt-thread.org/license/LICENSE
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2009-01-05 Bernard the first version
|
|
||||||
* 2011-11-26 aozima implementation time.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <rtthread.h>
|
|
||||||
#include <stm32f2xx.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
__IO uint32_t AsynchPrediv = 0, SynchPrediv = 0;
|
|
||||||
RTC_TimeTypeDef RTC_TimeStructure;
|
|
||||||
RTC_InitTypeDef RTC_InitStructure;
|
|
||||||
RTC_AlarmTypeDef RTC_AlarmStructure;
|
|
||||||
RTC_DateTypeDef RTC_DateStructure;
|
|
||||||
|
|
||||||
#define MINUTE 60
|
|
||||||
#define HOUR (60*MINUTE)
|
|
||||||
#define DAY (24*HOUR)
|
|
||||||
#define YEAR (365*DAY)
|
|
||||||
|
|
||||||
static int month[12] =
|
|
||||||
{
|
|
||||||
0,
|
|
||||||
DAY*(31),
|
|
||||||
DAY*(31+29),
|
|
||||||
DAY*(31+29+31),
|
|
||||||
DAY*(31+29+31+30),
|
|
||||||
DAY*(31+29+31+30+31),
|
|
||||||
DAY*(31+29+31+30+31+30),
|
|
||||||
DAY*(31+29+31+30+31+30+31),
|
|
||||||
DAY*(31+29+31+30+31+30+31+31),
|
|
||||||
DAY*(31+29+31+30+31+30+31+31+30),
|
|
||||||
DAY*(31+29+31+30+31+30+31+31+30+31),
|
|
||||||
DAY*(31+29+31+30+31+30+31+31+30+31+30)
|
|
||||||
};
|
|
||||||
static struct rt_device rtc;
|
|
||||||
|
|
||||||
static time_t rt_mktime(struct tm *tm)
|
|
||||||
{
|
|
||||||
long res;
|
|
||||||
int year;
|
|
||||||
year = tm->tm_year - 70;
|
|
||||||
|
|
||||||
res = YEAR * year + DAY * ((year + 1) / 4);
|
|
||||||
res += month[tm->tm_mon];
|
|
||||||
|
|
||||||
if (tm->tm_mon > 1 && ((year + 2) % 4))
|
|
||||||
res -= DAY;
|
|
||||||
res += DAY * (tm->tm_mday - 1);
|
|
||||||
res += HOUR * tm->tm_hour;
|
|
||||||
res += MINUTE * tm->tm_min;
|
|
||||||
res += tm->tm_sec;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
static rt_err_t rt_rtc_open(rt_device_t dev, rt_uint16_t oflag)
|
|
||||||
{
|
|
||||||
if (dev->rx_indicate != RT_NULL)
|
|
||||||
{
|
|
||||||
/* Open Interrupt */
|
|
||||||
}
|
|
||||||
|
|
||||||
return RT_EOK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static rt_size_t rt_rtc_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static rt_err_t rt_rtc_control(rt_device_t dev, rt_uint8_t cmd, void *args)
|
|
||||||
{
|
|
||||||
time_t *time;
|
|
||||||
struct tm ti,*to;
|
|
||||||
RT_ASSERT(dev != RT_NULL);
|
|
||||||
|
|
||||||
switch (cmd)
|
|
||||||
{
|
|
||||||
case RT_DEVICE_CTRL_RTC_GET_TIME:
|
|
||||||
time = (time_t *)args;
|
|
||||||
/* read device */
|
|
||||||
//RTC_GetTimeStamp(RTC_Format_BIN, &RTC_TimeStructure, &RTC_DateStructure);
|
|
||||||
RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
|
|
||||||
RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);
|
|
||||||
ti.tm_sec = RTC_TimeStructure.RTC_Seconds;
|
|
||||||
ti.tm_min = RTC_TimeStructure.RTC_Minutes;
|
|
||||||
ti.tm_hour = RTC_TimeStructure.RTC_Hours;
|
|
||||||
//ti.tm_wday = (RTC_DateStructure.RTC_WeekDay==7)?0:RTC_DateStructure.RTC_WeekDay;
|
|
||||||
ti.tm_mon = RTC_DateStructure.RTC_Month -1;
|
|
||||||
ti.tm_mday = RTC_DateStructure.RTC_Date;
|
|
||||||
ti.tm_year = RTC_DateStructure.RTC_Year + 70;
|
|
||||||
*time = rt_mktime(&ti);
|
|
||||||
//*time = RTC_GetCounter();
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RT_DEVICE_CTRL_RTC_SET_TIME:
|
|
||||||
{
|
|
||||||
time = (time_t *)args;
|
|
||||||
|
|
||||||
/* Enable the PWR clock */
|
|
||||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
|
|
||||||
|
|
||||||
/* Allow access to RTC */
|
|
||||||
PWR_BackupAccessCmd(ENABLE);
|
|
||||||
|
|
||||||
/* Wait until last write operation on RTC registers has finished */
|
|
||||||
//RTC_WaitForLastTask();
|
|
||||||
|
|
||||||
/* Change the current time */
|
|
||||||
//RTC_SetCounter(*time);
|
|
||||||
|
|
||||||
to = localtime(time);
|
|
||||||
RTC_TimeStructure.RTC_Seconds = to->tm_sec;
|
|
||||||
RTC_TimeStructure.RTC_Minutes = to->tm_min;
|
|
||||||
RTC_TimeStructure.RTC_Hours = to->tm_hour;
|
|
||||||
//RTC_DateStructure.RTC_WeekDay =(ti->tm_wday==0)?7:ti->tm_wday;
|
|
||||||
RTC_DateStructure.RTC_Month = to->tm_mon + 1;
|
|
||||||
RTC_DateStructure.RTC_Date = to->tm_mday;
|
|
||||||
RTC_DateStructure.RTC_Year = to->tm_year - 70;
|
|
||||||
RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure);
|
|
||||||
RTC_SetDate(RTC_Format_BIN, &RTC_DateStructure);
|
|
||||||
|
|
||||||
/* Wait until last write operation on RTC registers has finished */
|
|
||||||
//RTC_WaitForLastTask();
|
|
||||||
|
|
||||||
RTC_WriteBackupRegister(RTC_BKP_DR1, 0xA5A5);
|
|
||||||
//BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return RT_EOK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : RTC_Configuration
|
|
||||||
* Description : Configures the RTC.
|
|
||||||
* Input : None
|
|
||||||
* Output : None
|
|
||||||
* Return : 0 reday,-1 error.
|
|
||||||
*******************************************************************************/
|
|
||||||
int RTC_Config(void)
|
|
||||||
{
|
|
||||||
u32 count=0x200000;
|
|
||||||
/* Enable the PWR clock */
|
|
||||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
|
|
||||||
|
|
||||||
/* Allow access to RTC */
|
|
||||||
PWR_BackupAccessCmd(ENABLE);
|
|
||||||
|
|
||||||
RCC_LSEConfig(RCC_LSE_ON);
|
|
||||||
|
|
||||||
/* Wait till LSE is ready */
|
|
||||||
while ( (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) && (--count) );
|
|
||||||
if ( count == 0 )
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Select the RTC Clock Source */
|
|
||||||
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
|
|
||||||
|
|
||||||
SynchPrediv = 0xFF;
|
|
||||||
AsynchPrediv = 0x7F;
|
|
||||||
|
|
||||||
/* Enable the RTC Clock */
|
|
||||||
RCC_RTCCLKCmd(ENABLE);
|
|
||||||
|
|
||||||
/* Wait for RTC APB registers synchronisation */
|
|
||||||
RTC_WaitForSynchro();
|
|
||||||
|
|
||||||
/* Enable The TimeStamp */
|
|
||||||
//RTC_TimeStampCmd(RTC_TimeStampEdge_Falling, ENABLE);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int RTC_Configuration(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(RTC_Config() < 0 )
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Set the Time */
|
|
||||||
RTC_TimeStructure.RTC_Hours = 0;
|
|
||||||
RTC_TimeStructure.RTC_Minutes = 0;
|
|
||||||
RTC_TimeStructure.RTC_Seconds = 0;
|
|
||||||
|
|
||||||
/* Set the Date */
|
|
||||||
RTC_DateStructure.RTC_Month = 1;
|
|
||||||
RTC_DateStructure.RTC_Date = 1;
|
|
||||||
RTC_DateStructure.RTC_Year = 0;
|
|
||||||
RTC_DateStructure.RTC_WeekDay = 4;
|
|
||||||
|
|
||||||
/* Calendar Configuration */
|
|
||||||
RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;
|
|
||||||
RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;
|
|
||||||
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
|
|
||||||
RTC_Init(&RTC_InitStructure);
|
|
||||||
|
|
||||||
/* Set Current Time and Date */
|
|
||||||
RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);
|
|
||||||
RTC_SetDate(RTC_Format_BCD, &RTC_DateStructure);
|
|
||||||
if (RTC_Init(&RTC_InitStructure) == ERROR)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rt_hw_rtc_init(void)
|
|
||||||
{
|
|
||||||
rtc.type = RT_Device_Class_RTC;
|
|
||||||
|
|
||||||
if (RTC_ReadBackupRegister(RTC_BKP_DR1) != 0xA5A5)
|
|
||||||
{
|
|
||||||
rt_kprintf("rtc is not configured\n");
|
|
||||||
rt_kprintf("please configure with set_date and set_time\n");
|
|
||||||
if ( RTC_Configuration() != 0)
|
|
||||||
{
|
|
||||||
rt_kprintf("rtc configure fail...\r\n");
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Wait for RTC registers synchronization */
|
|
||||||
RTC_WaitForSynchro();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* register rtc device */
|
|
||||||
rtc.init = RT_NULL;
|
|
||||||
rtc.open = rt_rtc_open;
|
|
||||||
rtc.close = RT_NULL;
|
|
||||||
rtc.read = rt_rtc_read;
|
|
||||||
rtc.write = RT_NULL;
|
|
||||||
rtc.control = rt_rtc_control;
|
|
||||||
|
|
||||||
/* no private */
|
|
||||||
rtc.user_data = RT_NULL;
|
|
||||||
|
|
||||||
rt_device_register(&rtc, "rtc", RT_DEVICE_FLAG_RDWR);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
#if defined (__IAR_SYSTEMS_ICC__) && (__VER__) >= 6020000 /* for IAR 6.2 later Compiler */
|
|
||||||
#pragma module_name = "?time"
|
|
||||||
time_t (__time32)(time_t *t) /* Only supports 32-bit timestamp */
|
|
||||||
#else
|
|
||||||
time_t time(time_t* t)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
rt_device_t device;
|
|
||||||
time_t time=0;
|
|
||||||
|
|
||||||
device = rt_device_find("rtc");
|
|
||||||
if (device != RT_NULL)
|
|
||||||
{
|
|
||||||
rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
|
|
||||||
if (t != RT_NULL) *t = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
return time;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef RT_USING_FINSH
|
|
||||||
#include <finsh.h>
|
|
||||||
|
|
||||||
void set_date(rt_uint32_t year, rt_uint32_t month, rt_uint32_t day)
|
|
||||||
{
|
|
||||||
time_t now;
|
|
||||||
struct tm* ti;
|
|
||||||
rt_device_t device;
|
|
||||||
|
|
||||||
ti = RT_NULL;
|
|
||||||
/* get current time */
|
|
||||||
time(&now);
|
|
||||||
|
|
||||||
ti = localtime(&now);
|
|
||||||
if (ti != RT_NULL)
|
|
||||||
{
|
|
||||||
ti->tm_year = year - 1900;
|
|
||||||
ti->tm_mon = month - 1; /* ti->tm_mon = month; */
|
|
||||||
ti->tm_mday = day;
|
|
||||||
}
|
|
||||||
|
|
||||||
now = mktime(ti);
|
|
||||||
|
|
||||||
device = rt_device_find("rtc");
|
|
||||||
if (device != RT_NULL)
|
|
||||||
{
|
|
||||||
rt_rtc_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FINSH_FUNCTION_EXPORT(set_date, set date. e.g: set_date(2010,2,28))
|
|
||||||
|
|
||||||
void set_time(rt_uint32_t hour, rt_uint32_t minute, rt_uint32_t second)
|
|
||||||
{
|
|
||||||
time_t now;
|
|
||||||
struct tm* ti;
|
|
||||||
rt_device_t device;
|
|
||||||
|
|
||||||
ti = RT_NULL;
|
|
||||||
/* get current time */
|
|
||||||
time(&now);
|
|
||||||
|
|
||||||
ti = localtime(&now);
|
|
||||||
if (ti != RT_NULL)
|
|
||||||
{
|
|
||||||
ti->tm_hour = hour;
|
|
||||||
ti->tm_min = minute;
|
|
||||||
ti->tm_sec = second;
|
|
||||||
}
|
|
||||||
|
|
||||||
now = mktime(ti);
|
|
||||||
device = rt_device_find("rtc");
|
|
||||||
if (device != RT_NULL)
|
|
||||||
{
|
|
||||||
rt_rtc_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, &now);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FINSH_FUNCTION_EXPORT(set_time, set time. e.g: set_time(23,59,59))
|
|
||||||
|
|
||||||
void list_date()
|
|
||||||
{
|
|
||||||
time_t now;
|
|
||||||
|
|
||||||
time(&now);
|
|
||||||
rt_kprintf("%s\n", ctime(&now));
|
|
||||||
}
|
|
||||||
FINSH_FUNCTION_EXPORT(list_date, show date and time.)
|
|
||||||
#endif
|
|
|
@ -1,20 +0,0 @@
|
||||||
/*
|
|
||||||
* File : rtc.h
|
|
||||||
* This file is part of RT-Thread RTOS
|
|
||||||
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rt-thread.org/license/LICENSE
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2009-01-05 Bernard the first version
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __RTC_H__
|
|
||||||
#define __RTC_H__
|
|
||||||
|
|
||||||
void rt_hw_rtc_init(void);
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,397 +0,0 @@
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file stm32_eval_sdio_sd.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V4.6.1
|
|
||||||
* @date 18-April-2011
|
|
||||||
* @brief This file contains all the functions prototypes for the SD Card
|
|
||||||
* stm32_eval_sdio_sd driver firmware library.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __STM32_EVAL_SDIO_SD_H
|
|
||||||
#define __STM32_EVAL_SDIO_SD_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "board.h"
|
|
||||||
|
|
||||||
/** @addtogroup Utilities
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup STM32_EVAL
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup Common
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup STM32_EVAL_SDIO_SD
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup STM32_EVAL_SDIO_SD_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @brief SDIO specific error defines
|
|
||||||
*/
|
|
||||||
SD_CMD_CRC_FAIL = (1), /*!< Command response received (but CRC check failed) */
|
|
||||||
SD_DATA_CRC_FAIL = (2), /*!< Data bock sent/received (CRC check Failed) */
|
|
||||||
SD_CMD_RSP_TIMEOUT = (3), /*!< Command response timeout */
|
|
||||||
SD_DATA_TIMEOUT = (4), /*!< Data time out */
|
|
||||||
SD_TX_UNDERRUN = (5), /*!< Transmit FIFO under-run */
|
|
||||||
SD_RX_OVERRUN = (6), /*!< Receive FIFO over-run */
|
|
||||||
SD_START_BIT_ERR = (7), /*!< Start bit not detected on all data signals in widE bus mode */
|
|
||||||
SD_CMD_OUT_OF_RANGE = (8), /*!< CMD's argument was out of range.*/
|
|
||||||
SD_ADDR_MISALIGNED = (9), /*!< Misaligned address */
|
|
||||||
SD_BLOCK_LEN_ERR = (10), /*!< Transferred block length is not allowed for the card or the number of transferred bytes does not match the block length */
|
|
||||||
SD_ERASE_SEQ_ERR = (11), /*!< An error in the sequence of erase command occurs.*/
|
|
||||||
SD_BAD_ERASE_PARAM = (12), /*!< An Invalid selection for erase groups */
|
|
||||||
SD_WRITE_PROT_VIOLATION = (13), /*!< Attempt to program a write protect block */
|
|
||||||
SD_LOCK_UNLOCK_FAILED = (14), /*!< Sequence or password error has been detected in unlock command or if there was an attempt to access a locked card */
|
|
||||||
SD_COM_CRC_FAILED = (15), /*!< CRC check of the previous command failed */
|
|
||||||
SD_ILLEGAL_CMD = (16), /*!< Command is not legal for the card state */
|
|
||||||
SD_CARD_ECC_FAILED = (17), /*!< Card internal ECC was applied but failed to correct the data */
|
|
||||||
SD_CC_ERROR = (18), /*!< Internal card controller error */
|
|
||||||
SD_GENERAL_UNKNOWN_ERROR = (19), /*!< General or Unknown error */
|
|
||||||
SD_STREAM_READ_UNDERRUN = (20), /*!< The card could not sustain data transfer in stream read operation. */
|
|
||||||
SD_STREAM_WRITE_OVERRUN = (21), /*!< The card could not sustain data programming in stream mode */
|
|
||||||
SD_CID_CSD_OVERWRITE = (22), /*!< CID/CSD overwrite error */
|
|
||||||
SD_WP_ERASE_SKIP = (23), /*!< only partial address space was erased */
|
|
||||||
SD_CARD_ECC_DISABLED = (24), /*!< Command has been executed without using internal ECC */
|
|
||||||
SD_ERASE_RESET = (25), /*!< Erase sequence was cleared before executing because an out of erase sequence command was received */
|
|
||||||
SD_AKE_SEQ_ERROR = (26), /*!< Error in sequence of authentication. */
|
|
||||||
SD_INVALID_VOLTRANGE = (27),
|
|
||||||
SD_ADDR_OUT_OF_RANGE = (28),
|
|
||||||
SD_SWITCH_ERROR = (29),
|
|
||||||
SD_SDIO_DISABLED = (30),
|
|
||||||
SD_SDIO_FUNCTION_BUSY = (31),
|
|
||||||
SD_SDIO_FUNCTION_FAILED = (32),
|
|
||||||
SD_SDIO_UNKNOWN_FUNCTION = (33),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Standard error defines
|
|
||||||
*/
|
|
||||||
SD_INTERNAL_ERROR,
|
|
||||||
SD_NOT_CONFIGURED,
|
|
||||||
SD_REQUEST_PENDING,
|
|
||||||
SD_REQUEST_NOT_APPLICABLE,
|
|
||||||
SD_INVALID_PARAMETER,
|
|
||||||
SD_UNSUPPORTED_FEATURE,
|
|
||||||
SD_UNSUPPORTED_HW,
|
|
||||||
SD_ERROR,
|
|
||||||
SD_OK = 0
|
|
||||||
} SD_Error;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SDIO Transfer state
|
|
||||||
*/
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
SD_TRANSFER_OK = 0,
|
|
||||||
SD_TRANSFER_BUSY = 1,
|
|
||||||
SD_TRANSFER_ERROR
|
|
||||||
} SDTransferState;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SD Card States
|
|
||||||
*/
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
SD_CARD_READY = ((uint32_t)0x00000001),
|
|
||||||
SD_CARD_IDENTIFICATION = ((uint32_t)0x00000002),
|
|
||||||
SD_CARD_STANDBY = ((uint32_t)0x00000003),
|
|
||||||
SD_CARD_TRANSFER = ((uint32_t)0x00000004),
|
|
||||||
SD_CARD_SENDING = ((uint32_t)0x00000005),
|
|
||||||
SD_CARD_RECEIVING = ((uint32_t)0x00000006),
|
|
||||||
SD_CARD_PROGRAMMING = ((uint32_t)0x00000007),
|
|
||||||
SD_CARD_DISCONNECTED = ((uint32_t)0x00000008),
|
|
||||||
SD_CARD_ERROR = ((uint32_t)0x000000FF)
|
|
||||||
}SDCardState;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Card Specific Data: CSD Register
|
|
||||||
*/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__IO uint8_t CSDStruct; /*!< CSD structure */
|
|
||||||
__IO uint8_t SysSpecVersion; /*!< System specification version */
|
|
||||||
__IO uint8_t Reserved1; /*!< Reserved */
|
|
||||||
__IO uint8_t TAAC; /*!< Data read access-time 1 */
|
|
||||||
__IO uint8_t NSAC; /*!< Data read access-time 2 in CLK cycles */
|
|
||||||
__IO uint8_t MaxBusClkFrec; /*!< Max. bus clock frequency */
|
|
||||||
__IO uint16_t CardComdClasses; /*!< Card command classes */
|
|
||||||
__IO uint8_t RdBlockLen; /*!< Max. read data block length */
|
|
||||||
__IO uint8_t PartBlockRead; /*!< Partial blocks for read allowed */
|
|
||||||
__IO uint8_t WrBlockMisalign; /*!< Write block misalignment */
|
|
||||||
__IO uint8_t RdBlockMisalign; /*!< Read block misalignment */
|
|
||||||
__IO uint8_t DSRImpl; /*!< DSR implemented */
|
|
||||||
__IO uint8_t Reserved2; /*!< Reserved */
|
|
||||||
__IO uint32_t DeviceSize; /*!< Device Size */
|
|
||||||
__IO uint8_t MaxRdCurrentVDDMin; /*!< Max. read current @ VDD min */
|
|
||||||
__IO uint8_t MaxRdCurrentVDDMax; /*!< Max. read current @ VDD max */
|
|
||||||
__IO uint8_t MaxWrCurrentVDDMin; /*!< Max. write current @ VDD min */
|
|
||||||
__IO uint8_t MaxWrCurrentVDDMax; /*!< Max. write current @ VDD max */
|
|
||||||
__IO uint8_t DeviceSizeMul; /*!< Device size multiplier */
|
|
||||||
__IO uint8_t EraseGrSize; /*!< Erase group size */
|
|
||||||
__IO uint8_t EraseGrMul; /*!< Erase group size multiplier */
|
|
||||||
__IO uint8_t WrProtectGrSize; /*!< Write protect group size */
|
|
||||||
__IO uint8_t WrProtectGrEnable; /*!< Write protect group enable */
|
|
||||||
__IO uint8_t ManDeflECC; /*!< Manufacturer default ECC */
|
|
||||||
__IO uint8_t WrSpeedFact; /*!< Write speed factor */
|
|
||||||
__IO uint8_t MaxWrBlockLen; /*!< Max. write data block length */
|
|
||||||
__IO uint8_t WriteBlockPaPartial; /*!< Partial blocks for write allowed */
|
|
||||||
__IO uint8_t Reserved3; /*!< Reserded */
|
|
||||||
__IO uint8_t ContentProtectAppli; /*!< Content protection application */
|
|
||||||
__IO uint8_t FileFormatGrouop; /*!< File format group */
|
|
||||||
__IO uint8_t CopyFlag; /*!< Copy flag (OTP) */
|
|
||||||
__IO uint8_t PermWrProtect; /*!< Permanent write protection */
|
|
||||||
__IO uint8_t TempWrProtect; /*!< Temporary write protection */
|
|
||||||
__IO uint8_t FileFormat; /*!< File Format */
|
|
||||||
__IO uint8_t ECC; /*!< ECC code */
|
|
||||||
__IO uint8_t CSD_CRC; /*!< CSD CRC */
|
|
||||||
__IO uint8_t Reserved4; /*!< always 1*/
|
|
||||||
} SD_CSD;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Card Identification Data: CID Register
|
|
||||||
*/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__IO uint8_t ManufacturerID; /*!< ManufacturerID */
|
|
||||||
__IO uint16_t OEM_AppliID; /*!< OEM/Application ID */
|
|
||||||
__IO uint32_t ProdName1; /*!< Product Name part1 */
|
|
||||||
__IO uint8_t ProdName2; /*!< Product Name part2*/
|
|
||||||
__IO uint8_t ProdRev; /*!< Product Revision */
|
|
||||||
__IO uint32_t ProdSN; /*!< Product Serial Number */
|
|
||||||
__IO uint8_t Reserved1; /*!< Reserved1 */
|
|
||||||
__IO uint16_t ManufactDate; /*!< Manufacturing Date */
|
|
||||||
__IO uint8_t CID_CRC; /*!< CID CRC */
|
|
||||||
__IO uint8_t Reserved2; /*!< always 1 */
|
|
||||||
} SD_CID;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SD Card Status
|
|
||||||
*/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
__IO uint8_t DAT_BUS_WIDTH;
|
|
||||||
__IO uint8_t SECURED_MODE;
|
|
||||||
__IO uint16_t SD_CARD_TYPE;
|
|
||||||
__IO uint32_t SIZE_OF_PROTECTED_AREA;
|
|
||||||
__IO uint8_t SPEED_CLASS;
|
|
||||||
__IO uint8_t PERFORMANCE_MOVE;
|
|
||||||
__IO uint8_t AU_SIZE;
|
|
||||||
__IO uint16_t ERASE_SIZE;
|
|
||||||
__IO uint8_t ERASE_TIMEOUT;
|
|
||||||
__IO uint8_t ERASE_OFFSET;
|
|
||||||
} SD_CardStatus;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SD Card information
|
|
||||||
*/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
SD_CSD SD_csd;
|
|
||||||
SD_CID SD_cid;
|
|
||||||
uint32_t CardCapacity; /*!< Card Capacity */
|
|
||||||
uint32_t CardBlockSize; /*!< Card Block Size */
|
|
||||||
uint16_t RCA;
|
|
||||||
uint8_t CardType;
|
|
||||||
} SD_CardInfo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup STM32_EVAL_SDIO_SD_Exported_Constants
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SDIO Commands Index
|
|
||||||
*/
|
|
||||||
#define SD_CMD_GO_IDLE_STATE ((uint8_t)0)
|
|
||||||
#define SD_CMD_SEND_OP_COND ((uint8_t)1)
|
|
||||||
#define SD_CMD_ALL_SEND_CID ((uint8_t)2)
|
|
||||||
#define SD_CMD_SET_REL_ADDR ((uint8_t)3) /*!< SDIO_SEND_REL_ADDR for SD Card */
|
|
||||||
#define SD_CMD_SET_DSR ((uint8_t)4)
|
|
||||||
#define SD_CMD_SDIO_SEN_OP_COND ((uint8_t)5)
|
|
||||||
#define SD_CMD_HS_SWITCH ((uint8_t)6)
|
|
||||||
#define SD_CMD_SEL_DESEL_CARD ((uint8_t)7)
|
|
||||||
#define SD_CMD_HS_SEND_EXT_CSD ((uint8_t)8)
|
|
||||||
#define SD_CMD_SEND_CSD ((uint8_t)9)
|
|
||||||
#define SD_CMD_SEND_CID ((uint8_t)10)
|
|
||||||
#define SD_CMD_READ_DAT_UNTIL_STOP ((uint8_t)11) /*!< SD Card doesn't support it */
|
|
||||||
#define SD_CMD_STOP_TRANSMISSION ((uint8_t)12)
|
|
||||||
#define SD_CMD_SEND_STATUS ((uint8_t)13)
|
|
||||||
#define SD_CMD_HS_BUSTEST_READ ((uint8_t)14)
|
|
||||||
#define SD_CMD_GO_INACTIVE_STATE ((uint8_t)15)
|
|
||||||
#define SD_CMD_SET_BLOCKLEN ((uint8_t)16)
|
|
||||||
#define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17)
|
|
||||||
#define SD_CMD_READ_MULT_BLOCK ((uint8_t)18)
|
|
||||||
#define SD_CMD_HS_BUSTEST_WRITE ((uint8_t)19)
|
|
||||||
#define SD_CMD_WRITE_DAT_UNTIL_STOP ((uint8_t)20) /*!< SD Card doesn't support it */
|
|
||||||
#define SD_CMD_SET_BLOCK_COUNT ((uint8_t)23) /*!< SD Card doesn't support it */
|
|
||||||
#define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24)
|
|
||||||
#define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25)
|
|
||||||
#define SD_CMD_PROG_CID ((uint8_t)26) /*!< reserved for manufacturers */
|
|
||||||
#define SD_CMD_PROG_CSD ((uint8_t)27)
|
|
||||||
#define SD_CMD_SET_WRITE_PROT ((uint8_t)28)
|
|
||||||
#define SD_CMD_CLR_WRITE_PROT ((uint8_t)29)
|
|
||||||
#define SD_CMD_SEND_WRITE_PROT ((uint8_t)30)
|
|
||||||
#define SD_CMD_SD_ERASE_GRP_START ((uint8_t)32) /*!< To set the address of the first write
|
|
||||||
block to be erased. (For SD card only) */
|
|
||||||
#define SD_CMD_SD_ERASE_GRP_END ((uint8_t)33) /*!< To set the address of the last write block of the
|
|
||||||
continuous range to be erased. (For SD card only) */
|
|
||||||
#define SD_CMD_ERASE_GRP_START ((uint8_t)35) /*!< To set the address of the first write block to be erased.
|
|
||||||
(For MMC card only spec 3.31) */
|
|
||||||
|
|
||||||
#define SD_CMD_ERASE_GRP_END ((uint8_t)36) /*!< To set the address of the last write block of the
|
|
||||||
continuous range to be erased. (For MMC card only spec 3.31) */
|
|
||||||
|
|
||||||
#define SD_CMD_ERASE ((uint8_t)38)
|
|
||||||
#define SD_CMD_FAST_IO ((uint8_t)39) /*!< SD Card doesn't support it */
|
|
||||||
#define SD_CMD_GO_IRQ_STATE ((uint8_t)40) /*!< SD Card doesn't support it */
|
|
||||||
#define SD_CMD_LOCK_UNLOCK ((uint8_t)42)
|
|
||||||
#define SD_CMD_APP_CMD ((uint8_t)55)
|
|
||||||
#define SD_CMD_GEN_CMD ((uint8_t)56)
|
|
||||||
#define SD_CMD_NO_CMD ((uint8_t)64)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Following commands are SD Card Specific commands.
|
|
||||||
* SDIO_APP_CMD should be sent before sending these commands.
|
|
||||||
*/
|
|
||||||
#define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_STAUS ((uint8_t)13) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_OP_COND ((uint8_t)41) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52) /*!< For SD I/O Card only */
|
|
||||||
#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53) /*!< For SD I/O Card only */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Following commands are SD Card Specific security commands.
|
|
||||||
* SDIO_APP_CMD should be sent before sending these commands.
|
|
||||||
*/
|
|
||||||
#define SD_CMD_SD_APP_GET_MKB ((uint8_t)43) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_GET_MID ((uint8_t)44) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_SET_CER_RN1 ((uint8_t)45) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_GET_CER_RN2 ((uint8_t)46) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_SET_CER_RES2 ((uint8_t)47) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_GET_CER_RES1 ((uint8_t)48) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_SECURE_READ_MULTIPLE_BLOCK ((uint8_t)18) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_SECURE_WRITE_MULTIPLE_BLOCK ((uint8_t)25) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_SECURE_ERASE ((uint8_t)38) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_CHANGE_SECURE_AREA ((uint8_t)49) /*!< For SD Card only */
|
|
||||||
#define SD_CMD_SD_APP_SECURE_WRITE_MKB ((uint8_t)48) /*!< For SD Card only */
|
|
||||||
|
|
||||||
/* Uncomment the following line to select the SDIO Data transfer mode */
|
|
||||||
#define SD_DMA_MODE ((uint32_t)0x00000000)
|
|
||||||
/*#define SD_POLLING_MODE ((uint32_t)0x00000002)*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief SD detection on its memory slot
|
|
||||||
*/
|
|
||||||
#define SD_PRESENT ((uint8_t)0x01)
|
|
||||||
#define SD_NOT_PRESENT ((uint8_t)0x00)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Supported SD Memory Cards
|
|
||||||
*/
|
|
||||||
#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000)
|
|
||||||
#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001)
|
|
||||||
#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002)
|
|
||||||
#define SDIO_MULTIMEDIA_CARD ((uint32_t)0x00000003)
|
|
||||||
#define SDIO_SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004)
|
|
||||||
#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005)
|
|
||||||
#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006)
|
|
||||||
#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup STM32_EVAL_SDIO_SD_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup STM32_EVAL_SDIO_SD_Exported_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
void SD_DeInit(void);
|
|
||||||
SD_Error SD_Init(void);
|
|
||||||
SDTransferState SD_GetStatus(void);
|
|
||||||
SDCardState SD_GetState(void);
|
|
||||||
uint8_t SD_Detect(void);
|
|
||||||
SD_Error SD_PowerON(void);
|
|
||||||
SD_Error SD_PowerOFF(void);
|
|
||||||
SD_Error SD_InitializeCards(void);
|
|
||||||
SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo);
|
|
||||||
SD_Error SD_GetCardStatus(SD_CardStatus *cardstatus);
|
|
||||||
SD_Error SD_EnableWideBusOperation(uint32_t WideMode);
|
|
||||||
SD_Error SD_SelectDeselect(uint32_t addr);
|
|
||||||
SD_Error SD_ReadBlock(uint32_t ReadAddr, uint8_t *readbuff, uint16_t BlockSize);
|
|
||||||
SD_Error SD_ReadMultiBlocks(uint32_t ReadAddr, uint8_t *readbuff, uint16_t BlockSize, uint32_t NumberOfBlocks);
|
|
||||||
SD_Error SD_WriteBlock(uint32_t WriteAddr, uint8_t *writebuff, uint16_t BlockSize);
|
|
||||||
SD_Error SD_WriteMultiBlocks(uint32_t WriteAddr, uint8_t *writebuff, uint16_t BlockSize, uint32_t NumberOfBlocks);
|
|
||||||
SDTransferState SD_GetTransferState(void);
|
|
||||||
SD_Error SD_StopTransfer(void);
|
|
||||||
SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr);
|
|
||||||
SD_Error SD_SendStatus(uint32_t *pcardstatus);
|
|
||||||
SD_Error SD_SendSDStatus(uint32_t *psdstatus);
|
|
||||||
SD_Error SD_ProcessIRQSrc(void);
|
|
||||||
SD_Error SD_WaitReadOperation(void);
|
|
||||||
SD_Error SD_WaitWriteOperation(void);
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __STM32_EVAL_SDIO_SD_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
|
@ -1,418 +0,0 @@
|
||||||
/*
|
|
||||||
* File : serial.c
|
|
||||||
* This file is part of RT-Thread RTOS
|
|
||||||
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rt-thread.org/license/LICENSE
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2009-02-05 Bernard first version
|
|
||||||
* 2009-10-25 Bernard fix rt_serial_read bug when there is no data
|
|
||||||
* in the buffer.
|
|
||||||
* 2010-03-29 Bernard cleanup code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "serial.h"
|
|
||||||
#include <stm32f2xx_dma.h>
|
|
||||||
#include <stm32f2xx_usart.h>
|
|
||||||
|
|
||||||
static void rt_serial_enable_dma(DMA_Stream_TypeDef* dma_channel,
|
|
||||||
rt_uint32_t address, rt_uint32_t size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup STM32
|
|
||||||
*/
|
|
||||||
/*@{*/
|
|
||||||
|
|
||||||
/* RT-Thread Device Interface */
|
|
||||||
static rt_err_t rt_serial_init (rt_device_t dev)
|
|
||||||
{
|
|
||||||
struct stm32_serial_device* uart = (struct stm32_serial_device*) dev->user_data;
|
|
||||||
|
|
||||||
if (!(dev->flag & RT_DEVICE_FLAG_ACTIVATED))
|
|
||||||
{
|
|
||||||
if (dev->flag & RT_DEVICE_FLAG_INT_RX)
|
|
||||||
{
|
|
||||||
rt_memset(uart->int_rx->rx_buffer, 0,
|
|
||||||
sizeof(uart->int_rx->rx_buffer));
|
|
||||||
uart->int_rx->read_index = 0;
|
|
||||||
uart->int_rx->save_index = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev->flag & RT_DEVICE_FLAG_DMA_TX)
|
|
||||||
{
|
|
||||||
RT_ASSERT(uart->dma_tx->dma_channel != RT_NULL);
|
|
||||||
uart->dma_tx->list_head = uart->dma_tx->list_tail = RT_NULL;
|
|
||||||
|
|
||||||
/* init data node memory pool */
|
|
||||||
rt_mp_init(&(uart->dma_tx->data_node_mp), "dn",
|
|
||||||
uart->dma_tx->data_node_mem_pool,
|
|
||||||
sizeof(uart->dma_tx->data_node_mem_pool),
|
|
||||||
sizeof(struct stm32_serial_data_node));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enable USART */
|
|
||||||
USART_Cmd(uart->uart_device, ENABLE);
|
|
||||||
|
|
||||||
dev->flag |= RT_DEVICE_FLAG_ACTIVATED;
|
|
||||||
}
|
|
||||||
|
|
||||||
return RT_EOK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static rt_err_t rt_serial_open(rt_device_t dev, rt_uint16_t oflag)
|
|
||||||
{
|
|
||||||
return RT_EOK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static rt_err_t rt_serial_close(rt_device_t dev)
|
|
||||||
{
|
|
||||||
return RT_EOK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static rt_size_t rt_serial_read (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
|
|
||||||
{
|
|
||||||
rt_uint8_t* ptr;
|
|
||||||
rt_err_t err_code;
|
|
||||||
struct stm32_serial_device* uart;
|
|
||||||
|
|
||||||
ptr = buffer;
|
|
||||||
err_code = RT_EOK;
|
|
||||||
uart = (struct stm32_serial_device*)dev->user_data;
|
|
||||||
|
|
||||||
if (dev->flag & RT_DEVICE_FLAG_INT_RX)
|
|
||||||
{
|
|
||||||
/* interrupt mode Rx */
|
|
||||||
while (size)
|
|
||||||
{
|
|
||||||
rt_base_t level;
|
|
||||||
|
|
||||||
/* disable interrupt */
|
|
||||||
level = rt_hw_interrupt_disable();
|
|
||||||
|
|
||||||
if (uart->int_rx->read_index != uart->int_rx->save_index)
|
|
||||||
{
|
|
||||||
/* read a character */
|
|
||||||
*ptr++ = uart->int_rx->rx_buffer[uart->int_rx->read_index];
|
|
||||||
size--;
|
|
||||||
|
|
||||||
/* move to next position */
|
|
||||||
uart->int_rx->read_index ++;
|
|
||||||
if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE)
|
|
||||||
uart->int_rx->read_index = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* set error code */
|
|
||||||
err_code = -RT_EEMPTY;
|
|
||||||
|
|
||||||
/* enable interrupt */
|
|
||||||
rt_hw_interrupt_enable(level);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* enable interrupt */
|
|
||||||
rt_hw_interrupt_enable(level);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* polling mode */
|
|
||||||
while ((rt_uint32_t)ptr - (rt_uint32_t)buffer < size)
|
|
||||||
{
|
|
||||||
while (uart->uart_device->SR & USART_FLAG_RXNE)
|
|
||||||
{
|
|
||||||
*ptr = uart->uart_device->DR & 0xff;
|
|
||||||
ptr ++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set error code */
|
|
||||||
rt_set_errno(err_code);
|
|
||||||
return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rt_serial_enable_dma(DMA_Stream_TypeDef* dma_channel,
|
|
||||||
rt_uint32_t address, rt_uint32_t size)
|
|
||||||
{
|
|
||||||
RT_ASSERT(dma_channel != RT_NULL);
|
|
||||||
|
|
||||||
/* disable DMA */
|
|
||||||
DMA_Cmd(dma_channel, DISABLE);
|
|
||||||
|
|
||||||
/* set buffer address */
|
|
||||||
dma_channel->M0AR = address;
|
|
||||||
/* set size */
|
|
||||||
dma_channel->NDTR = size;
|
|
||||||
|
|
||||||
/* enable DMA */
|
|
||||||
DMA_Cmd(dma_channel, ENABLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static rt_size_t rt_serial_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
|
|
||||||
{
|
|
||||||
rt_uint8_t* ptr;
|
|
||||||
rt_err_t err_code;
|
|
||||||
struct stm32_serial_device* uart;
|
|
||||||
|
|
||||||
err_code = RT_EOK;
|
|
||||||
ptr = (rt_uint8_t*)buffer;
|
|
||||||
uart = (struct stm32_serial_device*)dev->user_data;
|
|
||||||
|
|
||||||
if (dev->flag & RT_DEVICE_FLAG_INT_TX)
|
|
||||||
{
|
|
||||||
/* interrupt mode Tx, does not support */
|
|
||||||
RT_ASSERT(0);
|
|
||||||
}
|
|
||||||
else if (dev->flag & RT_DEVICE_FLAG_DMA_TX)
|
|
||||||
{
|
|
||||||
/* DMA mode Tx */
|
|
||||||
|
|
||||||
/* allocate a data node */
|
|
||||||
struct stm32_serial_data_node* data_node = (struct stm32_serial_data_node*)
|
|
||||||
rt_mp_alloc (&(uart->dma_tx->data_node_mp), RT_WAITING_FOREVER);
|
|
||||||
if (data_node == RT_NULL)
|
|
||||||
{
|
|
||||||
/* set error code */
|
|
||||||
err_code = -RT_ENOMEM;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rt_uint32_t level;
|
|
||||||
|
|
||||||
/* fill data node */
|
|
||||||
data_node->data_ptr = ptr;
|
|
||||||
data_node->data_size = size;
|
|
||||||
|
|
||||||
/* insert to data link */
|
|
||||||
data_node->next = RT_NULL;
|
|
||||||
|
|
||||||
/* disable interrupt */
|
|
||||||
level = rt_hw_interrupt_disable();
|
|
||||||
|
|
||||||
data_node->prev = uart->dma_tx->list_tail;
|
|
||||||
if (uart->dma_tx->list_tail != RT_NULL)
|
|
||||||
uart->dma_tx->list_tail->next = data_node;
|
|
||||||
uart->dma_tx->list_tail = data_node;
|
|
||||||
|
|
||||||
if (uart->dma_tx->list_head == RT_NULL)
|
|
||||||
{
|
|
||||||
/* start DMA to transmit data */
|
|
||||||
uart->dma_tx->list_head = data_node;
|
|
||||||
|
|
||||||
/* Enable DMA Channel */
|
|
||||||
rt_serial_enable_dma(uart->dma_tx->dma_channel,
|
|
||||||
(rt_uint32_t)uart->dma_tx->list_head->data_ptr,
|
|
||||||
uart->dma_tx->list_head->data_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* enable interrupt */
|
|
||||||
rt_hw_interrupt_enable(level);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* polling mode */
|
|
||||||
if (dev->flag & RT_DEVICE_FLAG_STREAM)
|
|
||||||
{
|
|
||||||
/* stream mode */
|
|
||||||
while (size)
|
|
||||||
{
|
|
||||||
if (*ptr == '\n')
|
|
||||||
{
|
|
||||||
while (!(uart->uart_device->SR & USART_FLAG_TXE));
|
|
||||||
uart->uart_device->DR = '\r';
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!(uart->uart_device->SR & USART_FLAG_TXE));
|
|
||||||
uart->uart_device->DR = (*ptr & 0x1FF);
|
|
||||||
|
|
||||||
++ptr; --size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* write data directly */
|
|
||||||
while (size)
|
|
||||||
{
|
|
||||||
while (!(uart->uart_device->SR & USART_FLAG_TXE));
|
|
||||||
uart->uart_device->DR = (*ptr & 0x1FF);
|
|
||||||
|
|
||||||
++ptr; --size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set error code */
|
|
||||||
rt_set_errno(err_code);
|
|
||||||
|
|
||||||
return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static rt_err_t rt_serial_control (rt_device_t dev, rt_uint8_t cmd, void *args)
|
|
||||||
{
|
|
||||||
struct stm32_serial_device* uart;
|
|
||||||
|
|
||||||
RT_ASSERT(dev != RT_NULL);
|
|
||||||
|
|
||||||
uart = (struct stm32_serial_device*)dev->user_data;
|
|
||||||
switch (cmd)
|
|
||||||
{
|
|
||||||
case RT_DEVICE_CTRL_SUSPEND:
|
|
||||||
/* suspend device */
|
|
||||||
dev->flag |= RT_DEVICE_FLAG_SUSPENDED;
|
|
||||||
USART_Cmd(uart->uart_device, DISABLE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RT_DEVICE_CTRL_RESUME:
|
|
||||||
/* resume device */
|
|
||||||
dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED;
|
|
||||||
USART_Cmd(uart->uart_device, ENABLE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return RT_EOK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* serial register for STM32
|
|
||||||
* support STM32F103VB and STM32F103ZE
|
|
||||||
*/
|
|
||||||
rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct stm32_serial_device *serial)
|
|
||||||
{
|
|
||||||
RT_ASSERT(device != RT_NULL);
|
|
||||||
|
|
||||||
if ((flag & RT_DEVICE_FLAG_DMA_RX) ||
|
|
||||||
(flag & RT_DEVICE_FLAG_INT_TX))
|
|
||||||
{
|
|
||||||
RT_ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
device->type = RT_Device_Class_Char;
|
|
||||||
device->rx_indicate = RT_NULL;
|
|
||||||
device->tx_complete = RT_NULL;
|
|
||||||
device->init = rt_serial_init;
|
|
||||||
device->open = rt_serial_open;
|
|
||||||
device->close = rt_serial_close;
|
|
||||||
device->read = rt_serial_read;
|
|
||||||
device->write = rt_serial_write;
|
|
||||||
device->control = rt_serial_control;
|
|
||||||
device->user_data = serial;
|
|
||||||
|
|
||||||
/* register a character device */
|
|
||||||
return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ISR for serial interrupt */
|
|
||||||
void rt_hw_serial_isr(rt_device_t device)
|
|
||||||
{
|
|
||||||
struct stm32_serial_device* uart = (struct stm32_serial_device*) device->user_data;
|
|
||||||
|
|
||||||
if(USART_GetITStatus(uart->uart_device, USART_IT_RXNE) != RESET)
|
|
||||||
{
|
|
||||||
/* interrupt mode receive */
|
|
||||||
RT_ASSERT(device->flag & RT_DEVICE_FLAG_INT_RX);
|
|
||||||
|
|
||||||
/* save on rx buffer */
|
|
||||||
while (uart->uart_device->SR & USART_FLAG_RXNE)
|
|
||||||
{
|
|
||||||
rt_base_t level;
|
|
||||||
|
|
||||||
/* disable interrupt */
|
|
||||||
level = rt_hw_interrupt_disable();
|
|
||||||
|
|
||||||
/* save character */
|
|
||||||
uart->int_rx->rx_buffer[uart->int_rx->save_index] = uart->uart_device->DR & 0xff;
|
|
||||||
uart->int_rx->save_index ++;
|
|
||||||
if (uart->int_rx->save_index >= UART_RX_BUFFER_SIZE)
|
|
||||||
uart->int_rx->save_index = 0;
|
|
||||||
|
|
||||||
/* if the next position is read index, discard this 'read char' */
|
|
||||||
if (uart->int_rx->save_index == uart->int_rx->read_index)
|
|
||||||
{
|
|
||||||
uart->int_rx->read_index ++;
|
|
||||||
if (uart->int_rx->read_index >= UART_RX_BUFFER_SIZE)
|
|
||||||
uart->int_rx->read_index = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* enable interrupt */
|
|
||||||
rt_hw_interrupt_enable(level);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clear interrupt */
|
|
||||||
USART_ClearITPendingBit(uart->uart_device, USART_IT_RXNE);
|
|
||||||
|
|
||||||
/* invoke callback */
|
|
||||||
if (device->rx_indicate != RT_NULL)
|
|
||||||
{
|
|
||||||
rt_size_t rx_length;
|
|
||||||
|
|
||||||
/* get rx length */
|
|
||||||
rx_length = uart->int_rx->read_index > uart->int_rx->save_index ?
|
|
||||||
UART_RX_BUFFER_SIZE - uart->int_rx->read_index + uart->int_rx->save_index :
|
|
||||||
uart->int_rx->save_index - uart->int_rx->read_index;
|
|
||||||
|
|
||||||
device->rx_indicate(device, rx_length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (USART_GetITStatus(uart->uart_device, USART_IT_TC) != RESET)
|
|
||||||
{
|
|
||||||
/* clear interrupt */
|
|
||||||
USART_ClearITPendingBit(uart->uart_device, USART_IT_TC);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ISR for DMA mode Tx
|
|
||||||
*/
|
|
||||||
void rt_hw_serial_dma_tx_isr(rt_device_t device)
|
|
||||||
{
|
|
||||||
rt_uint32_t level;
|
|
||||||
struct stm32_serial_data_node* data_node;
|
|
||||||
struct stm32_serial_device* uart = (struct stm32_serial_device*) device->user_data;
|
|
||||||
|
|
||||||
/* DMA mode receive */
|
|
||||||
RT_ASSERT(device->flag & RT_DEVICE_FLAG_DMA_TX);
|
|
||||||
|
|
||||||
/* get the first data node */
|
|
||||||
data_node = uart->dma_tx->list_head;
|
|
||||||
RT_ASSERT(data_node != RT_NULL);
|
|
||||||
|
|
||||||
/* invoke call to notify tx complete */
|
|
||||||
if (device->tx_complete != RT_NULL)
|
|
||||||
device->tx_complete(device, data_node->data_ptr);
|
|
||||||
|
|
||||||
/* disable interrupt */
|
|
||||||
level = rt_hw_interrupt_disable();
|
|
||||||
|
|
||||||
/* remove list head */
|
|
||||||
uart->dma_tx->list_head = data_node->next;
|
|
||||||
if (uart->dma_tx->list_head == RT_NULL) /* data link empty */
|
|
||||||
uart->dma_tx->list_tail = RT_NULL;
|
|
||||||
|
|
||||||
/* enable interrupt */
|
|
||||||
rt_hw_interrupt_enable(level);
|
|
||||||
|
|
||||||
/* release data node memory */
|
|
||||||
rt_mp_free(data_node);
|
|
||||||
|
|
||||||
if (uart->dma_tx->list_head != RT_NULL)
|
|
||||||
{
|
|
||||||
/* transmit next data node */
|
|
||||||
rt_serial_enable_dma(uart->dma_tx->dma_channel,
|
|
||||||
(rt_uint32_t)uart->dma_tx->list_head->data_ptr,
|
|
||||||
uart->dma_tx->list_head->data_size);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* no data to be transmitted, disable DMA */
|
|
||||||
DMA_Cmd(uart->dma_tx->dma_channel, DISABLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@}*/
|
|
|
@ -1,70 +0,0 @@
|
||||||
/*
|
|
||||||
* File : serial.h
|
|
||||||
* This file is part of RT-Thread RTOS
|
|
||||||
* COPYRIGHT (C) 2009 - 2010, RT-Thread Development Team
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rt-thread.org/license/LICENSE
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2009-01-05 Bernard first version
|
|
||||||
* 2010-03-29 Bernard remove interrupt tx and DMA rx mode.
|
|
||||||
*/
|
|
||||||
#ifndef __RT_HW_SERIAL_H__
|
|
||||||
#define __RT_HW_SERIAL_H__
|
|
||||||
|
|
||||||
#include <rthw.h>
|
|
||||||
#include <rtthread.h>
|
|
||||||
|
|
||||||
/* STM32F10x library definitions */
|
|
||||||
#include <stm32f2xx.h>
|
|
||||||
|
|
||||||
#define UART_RX_BUFFER_SIZE 64
|
|
||||||
#define UART_TX_DMA_NODE_SIZE 4
|
|
||||||
|
|
||||||
/* data node for Tx Mode */
|
|
||||||
struct stm32_serial_data_node
|
|
||||||
{
|
|
||||||
rt_uint8_t *data_ptr;
|
|
||||||
rt_size_t data_size;
|
|
||||||
struct stm32_serial_data_node *next, *prev;
|
|
||||||
};
|
|
||||||
struct stm32_serial_dma_tx
|
|
||||||
{
|
|
||||||
/* DMA Channel */
|
|
||||||
DMA_Stream_TypeDef* dma_channel;
|
|
||||||
|
|
||||||
/* data list head and tail */
|
|
||||||
struct stm32_serial_data_node *list_head, *list_tail;
|
|
||||||
|
|
||||||
/* data node memory pool */
|
|
||||||
struct rt_mempool data_node_mp;
|
|
||||||
rt_uint8_t data_node_mem_pool[UART_TX_DMA_NODE_SIZE *
|
|
||||||
(sizeof(struct stm32_serial_data_node) + sizeof(void*))];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct stm32_serial_int_rx
|
|
||||||
{
|
|
||||||
rt_uint8_t rx_buffer[UART_RX_BUFFER_SIZE];
|
|
||||||
rt_uint32_t read_index, save_index;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct stm32_serial_device
|
|
||||||
{
|
|
||||||
USART_TypeDef* uart_device;
|
|
||||||
|
|
||||||
/* rx structure */
|
|
||||||
struct stm32_serial_int_rx* int_rx;
|
|
||||||
|
|
||||||
/* tx structure */
|
|
||||||
struct stm32_serial_dma_tx* dma_tx;
|
|
||||||
};
|
|
||||||
|
|
||||||
rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct stm32_serial_device *serial);
|
|
||||||
|
|
||||||
void rt_hw_serial_isr(rt_device_t device);
|
|
||||||
void rt_hw_serial_dma_tx_isr(rt_device_t device);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,149 +0,0 @@
|
||||||
/*
|
|
||||||
* File : startup.c
|
|
||||||
* This file is part of RT-Thread RTOS
|
|
||||||
* COPYRIGHT (C) 2006, RT-Thread Develop Team
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://openlab.rt-thread.com/license/LICENSE
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2006-08-31 Bernard first implementation
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <rthw.h>
|
|
||||||
#include <rtthread.h>
|
|
||||||
|
|
||||||
#include <stm32f2xx.h>
|
|
||||||
#include "board.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @addtogroup STM32
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*@{*/
|
|
||||||
|
|
||||||
extern int rt_application_init(void);
|
|
||||||
#ifdef RT_USING_FINSH
|
|
||||||
extern void finsh_system_init(void);
|
|
||||||
extern void finsh_set_device(const char* device);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __CC_ARM
|
|
||||||
extern int Image$$RW_IRAM1$$ZI$$Limit;
|
|
||||||
#elif __ICCARM__
|
|
||||||
#pragma section="HEAP"
|
|
||||||
#else
|
|
||||||
extern int __bss_end;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : assert_failed
|
|
||||||
* Description : Reports the name of the source file and the source line number
|
|
||||||
* where the assert error has occurred.
|
|
||||||
* Input : - file: pointer to the source file name
|
|
||||||
* - line: assert error line source number
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void assert_failed(u8* file, u32 line)
|
|
||||||
{
|
|
||||||
rt_kprintf("\n\r Wrong parameter value detected on\r\n");
|
|
||||||
rt_kprintf(" file %s\r\n", file);
|
|
||||||
rt_kprintf(" line %d\r\n", line);
|
|
||||||
|
|
||||||
while (1) ;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function will startup RT-Thread RTOS.
|
|
||||||
*/
|
|
||||||
void rtthread_startup(void)
|
|
||||||
{
|
|
||||||
/* init board */
|
|
||||||
rt_hw_board_init();
|
|
||||||
|
|
||||||
/* show version */
|
|
||||||
rt_show_version();
|
|
||||||
|
|
||||||
/* init tick */
|
|
||||||
rt_system_tick_init();
|
|
||||||
|
|
||||||
/* init kernel object */
|
|
||||||
rt_system_object_init();
|
|
||||||
|
|
||||||
/* init timer system */
|
|
||||||
rt_system_timer_init();
|
|
||||||
|
|
||||||
#ifdef RT_USING_HEAP
|
|
||||||
#if STM32_EXT_SRAM
|
|
||||||
rt_system_heap_init((void*)STM32_EXT_SRAM_BEGIN, (void*)STM32_EXT_SRAM_END);
|
|
||||||
#else
|
|
||||||
#ifdef __CC_ARM
|
|
||||||
rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)STM32_SRAM_END);
|
|
||||||
#elif __ICCARM__
|
|
||||||
rt_system_heap_init(__segment_end("HEAP"), (void*)STM32_SRAM_END);
|
|
||||||
#else
|
|
||||||
/* init memory system */
|
|
||||||
rt_system_heap_init((void*)&__bss_end, (void*)STM32_SRAM_END);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* init scheduler system */
|
|
||||||
rt_system_scheduler_init();
|
|
||||||
|
|
||||||
#ifdef RT_USING_DFS
|
|
||||||
/* init sdcard driver */
|
|
||||||
#if STM32_USE_SDIO
|
|
||||||
rt_hw_sdcard_init();
|
|
||||||
#else
|
|
||||||
rt_hw_msd_init();
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
rt_hw_rtc_init();
|
|
||||||
|
|
||||||
/* init all device */
|
|
||||||
rt_device_init_all();
|
|
||||||
|
|
||||||
/* init application */
|
|
||||||
rt_application_init();
|
|
||||||
|
|
||||||
#ifdef RT_USING_FINSH
|
|
||||||
/* init finsh */
|
|
||||||
finsh_system_init();
|
|
||||||
finsh_set_device("uart1");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* init timer thread */
|
|
||||||
rt_system_timer_thread_init();
|
|
||||||
|
|
||||||
/* init idle thread */
|
|
||||||
rt_thread_idle_init();
|
|
||||||
|
|
||||||
/* start scheduler */
|
|
||||||
rt_system_scheduler_start();
|
|
||||||
|
|
||||||
/* never reach here */
|
|
||||||
return ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
/* disable interrupt first */
|
|
||||||
rt_hw_interrupt_disable();
|
|
||||||
|
|
||||||
/* init system setting */
|
|
||||||
SystemInit();
|
|
||||||
|
|
||||||
/* startup RT-Thread RTOS */
|
|
||||||
rtthread_startup();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@}*/
|
|
|
@ -1,137 +0,0 @@
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file Project/Template/stm32f10x_it.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V3.1.0
|
|
||||||
* @date 06/19/2009
|
|
||||||
* @brief Main Interrupt Service Routines.
|
|
||||||
* This file provides template for all exceptions handler and
|
|
||||||
* peripherals interrupt service routine.
|
|
||||||
******************************************************************************
|
|
||||||
* @copy
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "stm32f20x_it.h"
|
|
||||||
#include <rtthread.h>
|
|
||||||
|
|
||||||
/** @addtogroup Template_Project
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/* Cortex-M3 Processor Exceptions Handlers */
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles NMI exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void NMI_Handler(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Memory Manage exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void MemManage_Handler(void)
|
|
||||||
{
|
|
||||||
/* Go to infinite loop when Memory Manage exception occurs */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Bus Fault exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void BusFault_Handler(void)
|
|
||||||
{
|
|
||||||
/* Go to infinite loop when Bus Fault exception occurs */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Usage Fault exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void UsageFault_Handler(void)
|
|
||||||
{
|
|
||||||
/* Go to infinite loop when Usage Fault exception occurs */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles SVCall exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SVC_Handler(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Debug Monitor exception.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void DebugMon_Handler(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(RT_USING_DFS) && STM32_USE_SDIO
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : SDIO_IRQHandler
|
|
||||||
* Description : This function handles SDIO global interrupt request.
|
|
||||||
* Input : None
|
|
||||||
* Output : None
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
void SDIO_IRQHandler(void)
|
|
||||||
{
|
|
||||||
extern int SD_ProcessIRQSrc(void);
|
|
||||||
|
|
||||||
/* enter interrupt */
|
|
||||||
rt_interrupt_enter();
|
|
||||||
|
|
||||||
/* Process All SDIO Interrupt Sources */
|
|
||||||
if( SD_ProcessIRQSrc() == 2)
|
|
||||||
rt_kprintf("SD Error\n");
|
|
||||||
|
|
||||||
/* leave interrupt */
|
|
||||||
rt_interrupt_leave();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
|
|
|
@ -1,53 +0,0 @@
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file Project/Template/stm32f10x_it.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V3.1.0
|
|
||||||
* @date 06/19/2009
|
|
||||||
* @brief This file contains the headers of the interrupt handlers.
|
|
||||||
******************************************************************************
|
|
||||||
* @copy
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __STM32F10x_IT_H
|
|
||||||
#define __STM32F10x_IT_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include <stm32f2xx.h>
|
|
||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
/* Exported functions ------------------------------------------------------- */
|
|
||||||
|
|
||||||
void NMI_Handler(void);
|
|
||||||
void HardFault_Handler(void);
|
|
||||||
void MemManage_Handler(void);
|
|
||||||
void BusFault_Handler(void);
|
|
||||||
void UsageFault_Handler(void);
|
|
||||||
void SVC_Handler(void);
|
|
||||||
void DebugMon_Handler(void);
|
|
||||||
void PendSV_Handler(void);
|
|
||||||
void SysTick_Handler(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __STM32F10x_IT_H */
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
|
|
|
@ -1,88 +0,0 @@
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file USART/USART_Printf/stm32f2xx_conf.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V1.0.0
|
|
||||||
* @date 18-April-2011
|
|
||||||
* @brief Library configuration file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
|
||||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
|
|
||||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
|
|
||||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
|
|
||||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
|
|
||||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __STM32F2xx_CONF_H
|
|
||||||
#define __STM32F2xx_CONF_H
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
/* Uncomment the line below to enable peripheral header file inclusion */
|
|
||||||
#include "stm32f2xx_adc.h"
|
|
||||||
#include "stm32f2xx_can.h"
|
|
||||||
#include "stm32f2xx_crc.h"
|
|
||||||
#include "stm32f2xx_cryp.h"
|
|
||||||
#include "stm32f2xx_dac.h"
|
|
||||||
#include "stm32f2xx_dbgmcu.h"
|
|
||||||
#include "stm32f2xx_dcmi.h"
|
|
||||||
#include "stm32f2xx_dma.h"
|
|
||||||
#include "stm32f2xx_exti.h"
|
|
||||||
#include "stm32f2xx_flash.h"
|
|
||||||
#include "stm32f2xx_fsmc.h"
|
|
||||||
#include "stm32f2xx_hash.h"
|
|
||||||
#include "stm32f2xx_gpio.h"
|
|
||||||
#include "stm32f2xx_i2c.h"
|
|
||||||
#include "stm32f2xx_iwdg.h"
|
|
||||||
#include "stm32f2xx_pwr.h"
|
|
||||||
#include "stm32f2xx_rcc.h"
|
|
||||||
#include "stm32f2xx_rng.h"
|
|
||||||
#include "stm32f2xx_rtc.h"
|
|
||||||
#include "stm32f2xx_sdio.h"
|
|
||||||
#include "stm32f2xx_spi.h"
|
|
||||||
#include "stm32f2xx_syscfg.h"
|
|
||||||
#include "stm32f2xx_tim.h"
|
|
||||||
#include "stm32f2xx_usart.h"
|
|
||||||
#include "stm32f2xx_wwdg.h"
|
|
||||||
#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
|
|
||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* If an external clock source is used, then the value of the following define
|
|
||||||
should be set to the value of the external clock source, else, if no external
|
|
||||||
clock is used, keep this define commented */
|
|
||||||
/*#define I2S_EXTERNAL_CLOCK_VAL 12288000 */ /* Value of the external clock in Hz */
|
|
||||||
|
|
||||||
|
|
||||||
/* Uncomment the line below to expanse the "assert_param" macro in the
|
|
||||||
Standard Peripheral Library drivers code */
|
|
||||||
/* #define USE_FULL_ASSERT 1 */
|
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
#ifdef USE_FULL_ASSERT
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief The assert_param macro is used for function's parameters check.
|
|
||||||
* @param expr: If expr is false, it calls assert_failed function
|
|
||||||
* which reports the name of the source file and the source
|
|
||||||
* line number of the call that failed.
|
|
||||||
* If expr is true, it returns no value.
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
|
|
||||||
/* Exported functions ------------------------------------------------------- */
|
|
||||||
void assert_failed(uint8_t* file, uint32_t line);
|
|
||||||
#else
|
|
||||||
#define assert_param(expr) ((void)0)
|
|
||||||
#endif /* USE_FULL_ASSERT */
|
|
||||||
|
|
||||||
#endif /* __STM32F2xx_CONF_H */
|
|
||||||
|
|
||||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
|
|
|
@ -1,281 +0,0 @@
|
||||||
/*
|
|
||||||
* File : usart.c
|
|
||||||
* This file is part of RT-Thread RTOS
|
|
||||||
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rt-thread.org/license/LICENSE
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2009-01-05 Bernard the first version
|
|
||||||
* 2010-03-29 Bernard remove interrupt Tx and DMA Rx mode
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "usart.h"
|
|
||||||
#include <serial.h>
|
|
||||||
#include <stm32f2xx.h>
|
|
||||||
#include <stm32f2xx_dma.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Use UART1 as console output and finsh input
|
|
||||||
* interrupt Rx and poll Tx (stream mode)
|
|
||||||
*
|
|
||||||
* Use UART2 with interrupt Rx and poll Tx
|
|
||||||
* Use UART3 with DMA Tx and interrupt Rx -- DMA channel 2
|
|
||||||
*
|
|
||||||
* USART DMA setting on STM32
|
|
||||||
* USART1 Tx --> DMA Channel 4
|
|
||||||
* USART1 Rx --> DMA Channel 5
|
|
||||||
* USART2 Tx --> DMA Channel 7
|
|
||||||
* USART2 Rx --> DMA Channel 6
|
|
||||||
* USART3 Tx --> DMA Channel 2
|
|
||||||
* USART3 Rx --> DMA Channel 3
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART1
|
|
||||||
struct stm32_serial_int_rx uart1_int_rx;
|
|
||||||
struct stm32_serial_device uart1 =
|
|
||||||
{
|
|
||||||
USART1,
|
|
||||||
&uart1_int_rx,
|
|
||||||
RT_NULL
|
|
||||||
};
|
|
||||||
struct rt_device uart1_device;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART6
|
|
||||||
struct stm32_serial_int_rx uart6_int_rx;
|
|
||||||
struct stm32_serial_device uart6 =
|
|
||||||
{
|
|
||||||
USART6,
|
|
||||||
&uart6_int_rx,
|
|
||||||
RT_NULL
|
|
||||||
};
|
|
||||||
struct rt_device uart6_device;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART2
|
|
||||||
struct stm32_serial_int_rx uart2_int_rx;
|
|
||||||
struct stm32_serial_device uart2 =
|
|
||||||
{
|
|
||||||
USART2,
|
|
||||||
&uart2_int_rx,
|
|
||||||
RT_NULL
|
|
||||||
};
|
|
||||||
struct rt_device uart2_device;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART3
|
|
||||||
struct stm32_serial_int_rx uart3_int_rx;
|
|
||||||
struct stm32_serial_dma_tx uart3_dma_tx;
|
|
||||||
struct stm32_serial_device uart3 =
|
|
||||||
{
|
|
||||||
USART3,
|
|
||||||
&uart3_int_rx,
|
|
||||||
&uart3_dma_tx
|
|
||||||
};
|
|
||||||
struct rt_device uart3_device;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define USART1_DR_Base 0x40013804
|
|
||||||
#define USART2_DR_Base 0x40004404
|
|
||||||
#define USART3_DR_Base 0x40004804
|
|
||||||
|
|
||||||
/* USART1_REMAP = 0 */
|
|
||||||
#define UART1_GPIO_TX GPIO_Pin_9
|
|
||||||
#define UART1_GPIO_RX GPIO_Pin_10
|
|
||||||
#define UART1_GPIO GPIOA
|
|
||||||
#define RCC_APBPeriph_UART1 RCC_APB2Periph_USART1
|
|
||||||
#define UART1_TX_DMA DMA1_Channel4
|
|
||||||
#define UART1_RX_DMA DMA1_Channel5
|
|
||||||
|
|
||||||
#if defined(STM32F10X_LD) || defined(STM32F10X_MD) || defined(STM32F10X_CL)
|
|
||||||
#define UART2_GPIO_TX GPIO_Pin_5
|
|
||||||
#define UART2_GPIO_RX GPIO_Pin_6
|
|
||||||
#define UART2_GPIO GPIOD
|
|
||||||
#define RCC_APBPeriph_UART2 RCC_APB1Periph_USART2
|
|
||||||
#else /* for STM32F10X_HD */
|
|
||||||
/* USART2_REMAP = 0 */
|
|
||||||
#define UART2_GPIO_TX GPIO_Pin_2
|
|
||||||
#define UART2_GPIO_RX GPIO_Pin_3
|
|
||||||
#define UART2_GPIO GPIOA
|
|
||||||
#define RCC_APBPeriph_UART2 RCC_APB1Periph_USART2
|
|
||||||
#define UART2_TX_DMA DMA1_Channel7
|
|
||||||
#define UART2_RX_DMA DMA1_Channel6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* USART3_REMAP[1:0] = 00 */
|
|
||||||
#define UART3_GPIO_RX GPIO_Pin_11
|
|
||||||
#define UART3_GPIO_TX GPIO_Pin_10
|
|
||||||
#define UART3_GPIO GPIOB
|
|
||||||
#define RCC_APBPeriph_UART3 RCC_APB1Periph_USART3
|
|
||||||
#define UART3_TX_DMA DMA1_Channel2
|
|
||||||
#define UART3_RX_DMA DMA1_Channel3
|
|
||||||
|
|
||||||
/* USART6_REMAP = 0 */
|
|
||||||
#define UART6_GPIO_TX GPIO_Pin_6
|
|
||||||
#define UART6_GPIO_RX GPIO_Pin_7
|
|
||||||
#define UART6_GPIO GPIOC
|
|
||||||
#define RCC_APBPeriph_UART6 RCC_APB2Periph_USART6
|
|
||||||
//#define UART1_TX_DMA DMA1_Channel?
|
|
||||||
//#define UART1_RX_DMA DMA1_Channel?
|
|
||||||
|
|
||||||
static void RCC_Configuration(void)
|
|
||||||
{
|
|
||||||
#ifdef RT_USING_UART1
|
|
||||||
/* Enable USART1 and GPIOA clocks */
|
|
||||||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
|
|
||||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART6
|
|
||||||
/* Enable USART6 and GPIOC clocks */
|
|
||||||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
|
|
||||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void GPIO_Configuration(void)
|
|
||||||
{
|
|
||||||
GPIO_InitTypeDef GPIO_InitStruct;
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART1
|
|
||||||
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
|
|
||||||
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
|
|
||||||
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
|
|
||||||
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
|
|
||||||
|
|
||||||
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
|
|
||||||
GPIO_Init(GPIOA,&GPIO_InitStruct);
|
|
||||||
|
|
||||||
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
|
|
||||||
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART6
|
|
||||||
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
|
|
||||||
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
|
|
||||||
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
|
|
||||||
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
|
|
||||||
|
|
||||||
GPIO_InitStruct.GPIO_Pin=UART6_GPIO_TX|UART6_GPIO_RX;
|
|
||||||
GPIO_Init(UART6_GPIO,&GPIO_InitStruct);
|
|
||||||
|
|
||||||
GPIO_PinAFConfig(UART6_GPIO, GPIO_PinSource6, GPIO_AF_USART6);
|
|
||||||
GPIO_PinAFConfig(UART6_GPIO, GPIO_PinSource7, GPIO_AF_USART6);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static void NVIC_Configuration(void)
|
|
||||||
{
|
|
||||||
NVIC_InitTypeDef NVIC_InitStructure;
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART1
|
|
||||||
/* Enable the USART1 Interrupt */
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
||||||
NVIC_Init(&NVIC_InitStructure);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART6
|
|
||||||
/* Enable the USART1 Interrupt */
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
|
||||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
|
||||||
NVIC_Init(&NVIC_InitStructure);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Init all related hardware in here
|
|
||||||
* rt_hw_serial_init() will register all supported USART device
|
|
||||||
*/
|
|
||||||
void rt_hw_usart_init()
|
|
||||||
{
|
|
||||||
USART_InitTypeDef USART_InitStructure;
|
|
||||||
|
|
||||||
RCC_Configuration();
|
|
||||||
|
|
||||||
GPIO_Configuration();
|
|
||||||
|
|
||||||
NVIC_Configuration();
|
|
||||||
|
|
||||||
/* uart init */
|
|
||||||
#ifdef RT_USING_UART1
|
|
||||||
USART_DeInit(USART1);
|
|
||||||
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_Init(USART1, &USART_InitStructure);
|
|
||||||
|
|
||||||
/* register uart1 */
|
|
||||||
rt_hw_serial_register(&uart1_device, "uart1",
|
|
||||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,
|
|
||||||
&uart1);
|
|
||||||
|
|
||||||
/* enable interrupt */
|
|
||||||
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
|
|
||||||
/* Enable USART1 */
|
|
||||||
USART_Cmd(USART1, ENABLE);
|
|
||||||
USART_ClearFlag(USART1,USART_FLAG_TXE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* uart init */
|
|
||||||
#ifdef RT_USING_UART6
|
|
||||||
USART_DeInit(USART6);
|
|
||||||
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_Init(USART6, &USART_InitStructure);
|
|
||||||
|
|
||||||
/* register uart1 */
|
|
||||||
rt_hw_serial_register(&uart6_device, "uart6",
|
|
||||||
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,
|
|
||||||
&uart6);
|
|
||||||
|
|
||||||
/* enable interrupt */
|
|
||||||
USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
|
|
||||||
/* Enable USART6 */
|
|
||||||
USART_Cmd(USART6, ENABLE);
|
|
||||||
USART_ClearFlag(USART6,USART_FLAG_TXE);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART1
|
|
||||||
void USART1_IRQHandler()
|
|
||||||
{
|
|
||||||
/* enter interrupt */
|
|
||||||
rt_interrupt_enter();
|
|
||||||
|
|
||||||
rt_hw_serial_isr(&uart1_device);
|
|
||||||
|
|
||||||
/* leave interrupt */
|
|
||||||
rt_interrupt_leave();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RT_USING_UART6
|
|
||||||
void USART6_IRQHandler()
|
|
||||||
{
|
|
||||||
/* enter interrupt */
|
|
||||||
rt_interrupt_enter();
|
|
||||||
|
|
||||||
rt_hw_serial_isr(&uart6_device);
|
|
||||||
|
|
||||||
/* leave interrupt */
|
|
||||||
rt_interrupt_leave();
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,23 +0,0 @@
|
||||||
/*
|
|
||||||
* File : usart.h
|
|
||||||
* This file is part of RT-Thread RTOS
|
|
||||||
* COPYRIGHT (C) 2009, RT-Thread Development Team
|
|
||||||
*
|
|
||||||
* The license and distribution terms for this file may be
|
|
||||||
* found in the file LICENSE in this distribution or at
|
|
||||||
* http://www.rt-thread.org/license/LICENSE
|
|
||||||
*
|
|
||||||
* Change Logs:
|
|
||||||
* Date Author Notes
|
|
||||||
* 2009-01-05 Bernard the first version
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __USART_H__
|
|
||||||
#define __USART_H__
|
|
||||||
|
|
||||||
#include <rthw.h>
|
|
||||||
#include <rtthread.h>
|
|
||||||
|
|
||||||
void rt_hw_usart_init(void);
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue