board.c 8.8 KB
Newer Older
wuyangyong's avatar
 
wuyangyong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
/*
 * File      : board.c
 * This file is part of RT-Thread RTOS
 * COPYRIGHT (C) 2006 - 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
 * 2006-08-23     Bernard      first implementation
 */

#include <rthw.h>
#include <rtthread.h>

#include "stm32f10x.h"
#include "board.h"

static void rt_hw_console_init(void);

/**
 * @addtogroup STM32
 */

/*@{*/

/*******************************************************************************
 * Function Name  : RCC_Configuration
 * Description    : Configures the different system clocks.
 * Input          : None
 * Output         : None
 * Return         : None
 *******************************************************************************/
void RCC_Configuration(void)
{
    ErrorStatus HSEStartUpStatus;

    /* RCC system reset(for debug purpose) */
    RCC_DeInit();

    /* Enable HSE */
    RCC_HSEConfig(RCC_HSE_ON);

    /* Wait till HSE is ready */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    if (HSEStartUpStatus == SUCCESS)
    {
        /* HCLK = SYSCLK */
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        /* PCLK2 = HCLK */
        RCC_PCLK2Config(RCC_HCLK_Div1);
        /* PCLK1 = HCLK/2 */
        RCC_PCLK1Config(RCC_HCLK_Div2);

        /* Flash 2 wait state */
        FLASH_SetLatency(FLASH_Latency_2);
        /* Enable Prefetch Buffer */
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        /* PLLCLK = 8MHz * 9 = 72 MHz */
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

        /* Enable PLL */
        RCC_PLLCmd(ENABLE);

        /* Wait till PLL is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ;

        /* Select PLL as system clock source */
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        /* Wait till PLL is used as system clock source */
        while (RCC_GetSYSCLKSource() != 0x08) ;
    }
}

/*******************************************************************************
* 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
B
bernard.xiong 已提交
97 98 99 100 101 102 103

	/* 
	 * set priority group: 
	 * 2 bits for pre-emption priority
     * 2 bits for subpriority
     */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
wuyangyong's avatar
 
wuyangyong 已提交
104 105 106 107 108 109 110 111 112 113 114
}

/*******************************************************************************
 * Function Name  : SysTick_Configuration
 * Description    : Configures the SysTick for OS tick.
 * Input          : None
 * Output         : None
 * Return         : None
 *******************************************************************************/
void  SysTick_Configuration(void)
{
wuyangyong's avatar
wuyangyong 已提交
115 116 117 118 119 120 121 122 123
    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);
wuyangyong's avatar
 
wuyangyong 已提交
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
}

extern void rt_hw_interrupt_thread_switch(void);
/**
 * This is the timer interrupt service routine.
 *
 */
void rt_hw_timer_handler(void)
{
    /* enter interrupt */
    rt_interrupt_enter();

    rt_tick_increase();

    /* leave interrupt */
    rt_interrupt_leave();
}

/* NAND Flash */
#include "fsmc_nand.h"

/**
 * This function will initial STM32 Radio board.
 */
B
bernard.xiong 已提交
148
extern void FSMC_SRAM_Init(void);
wuyangyong's avatar
 
wuyangyong 已提交
149 150 151 152 153 154 155
void rt_hw_board_init()
{
    NAND_IDTypeDef NAND_ID;

    /* Configure the system clocks */
    RCC_Configuration();

B
bernard.xiong 已提交
156 157 158 159 160 161 162 163 164 165 166 167 168
    /* DM9000A */
    {
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE,&GPIO_InitStructure);
        GPIO_SetBits(GPIOE,GPIO_Pin_5);
    }

wuyangyong's avatar
 
wuyangyong 已提交
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
    /* NVIC Configuration */
    NVIC_Configuration();

    /* Configure the SysTick */
    SysTick_Configuration();

    /* Console Initialization*/
    rt_hw_console_init();

    /* FSMC Initialization */
    FSMC_NAND_Init();

    /* NAND read ID command */
    FSMC_NAND_ReadID(&NAND_ID);
    rt_kprintf("Read the NAND ID:%02X%02X%02X%02X\n",NAND_ID.Maker_ID,NAND_ID.Device_ID,NAND_ID.Third_ID,NAND_ID.Fourth_ID);

    /* SRAM init */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
    FSMC_SRAM_Init();

    {
        /* PC6 for SDCard Rst */
191
        GPIO_InitTypeDef GPIO_InitStructure;
wuyangyong's avatar
 
wuyangyong 已提交
192

193 194 195 196 197
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
        GPIO_SetBits(GPIOC,GPIO_Pin_6);
wuyangyong's avatar
 
wuyangyong 已提交
198 199 200
    }
}

B
bernard.xiong 已提交
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
#if STM32_CONSOLE_USART == 1
#define CONSOLE_RX_PIN	GPIO_Pin_9
#define CONSOLE_TX_PIN	GPIO_Pin_10
#define CONSOLE_GPIO	GPIOA
#define CONSOLE_USART	USART1
#elif STM32_CONSOLE_USART == 2

#if defined(STM32_LD) || defined(STM32_MD)
	#define CONSOLE_RX_PIN	GPIO_Pin_6
	#define CONSOLE_TX_PIN	GPIO_Pin_5
	#define CONSOLE_GPIO	GPIOD
#elif defined(STM32_HD)
	#define CONSOLE_RX_PIN	GPIO_Pin_3
	#define CONSOLE_TX_PIN	GPIO_Pin_2
	#define CONSOLE_GPIO	GPIOA
#endif

#define CONSOLE_USART	USART2
#elif STM32_CONSOLE_USART == 2
#define CONSOLE_RX_PIN	GPIO_Pin_11
#define CONSOLE_TX_PIN	GPIO_Pin_10
#define CONSOLE_GPIO	GPIOB
#define CONSOLE_USART	USART3
#endif

wuyangyong's avatar
 
wuyangyong 已提交
226 227 228 229 230 231 232 233
/* init console to support rt_kprintf */
static void rt_hw_console_init()
{
    /* Enable USART1 and GPIOA clocks */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1
                           | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC
                           | RCC_APB2Periph_GPIOF, ENABLE);

B
bernard.xiong 已提交
234 235
#if STM32_CONSOLE_USART == 0
#else
wuyangyong's avatar
 
wuyangyong 已提交
236 237 238 239 240
    /* GPIO configuration */
    {
        GPIO_InitTypeDef GPIO_InitStructure;

        /* Configure USART1 Tx (PA.09) as alternate function push-pull */
B
bernard.xiong 已提交
241
        GPIO_InitStructure.GPIO_Pin = CONSOLE_RX_PIN;
wuyangyong's avatar
 
wuyangyong 已提交
242 243
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
B
bernard.xiong 已提交
244
        GPIO_Init(CONSOLE_GPIO, &GPIO_InitStructure);
wuyangyong's avatar
 
wuyangyong 已提交
245 246

        /* Configure USART1 Rx (PA.10) as input floating */
B
bernard.xiong 已提交
247
        GPIO_InitStructure.GPIO_Pin = CONSOLE_TX_PIN;
wuyangyong's avatar
 
wuyangyong 已提交
248
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
B
bernard.xiong 已提交
249
        GPIO_Init(CONSOLE_GPIO, &GPIO_InitStructure);
wuyangyong's avatar
 
wuyangyong 已提交
250 251 252 253 254 255
    }

    /* USART configuration */
    {
        USART_InitTypeDef USART_InitStructure;

B
bernard.xiong 已提交
256
        /* USART configured as follow:
wuyangyong's avatar
 
wuyangyong 已提交
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
            - BaudRate = 115200 baud
            - Word Length = 8 Bits
            - One Stop Bit
            - No parity
            - Hardware flow control disabled (RTS and CTS signals)
            - Receive and transmit enabled
            - USART Clock disabled
            - USART CPOL: Clock is active low
            - USART CPHA: Data is captured on the middle
            - USART LastBit: The clock pulse of the last data bit is not output to
              the SCLK pin
        */
        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;
B
bernard.xiong 已提交
275
        USART_Init(CONSOLE_USART, &USART_InitStructure);
wuyangyong's avatar
 
wuyangyong 已提交
276
        /* Enable USART1 */
B
bernard.xiong 已提交
277
        USART_Cmd(CONSOLE_USART, ENABLE);
wuyangyong's avatar
 
wuyangyong 已提交
278
    }
B
bernard.xiong 已提交
279
#endif
wuyangyong's avatar
 
wuyangyong 已提交
280 281 282 283 284 285 286 287 288 289 290
}

/* write one character to serial, must not trigger interrupt */
static void rt_hw_console_putc(const char c)
{
    /*
    	to be polite with serial console add a line feed
    	to the carriage return character
    */
    if (c=='\n')rt_hw_console_putc('\r');

B
bernard.xiong 已提交
291 292
    while (!(CONSOLE_USART->SR & USART_FLAG_TXE));
    CONSOLE_USART->DR = (c & 0x1FF);
wuyangyong's avatar
 
wuyangyong 已提交
293 294 295 296 297 298 299 300 301
}

/**
 * This function is used by rt_kprintf to display a string on console.
 *
 * @param str the displayed string
 */
void rt_hw_console_output(const char* str)
{
B
bernard.xiong 已提交
302 303 304
#if STM32_CONSOLE_USART == 0
	/* no console */
#else
wuyangyong's avatar
 
wuyangyong 已提交
305 306 307 308
    while (*str)
    {
        rt_hw_console_putc (*str++);
    }
B
bernard.xiong 已提交
309
#endif
wuyangyong's avatar
 
wuyangyong 已提交
310 311 312
}

/*@}*/