/* ***************************************************************************** * The MIT License * * Copyright (c) 2010 LeafLabs LLC. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * ****************************************************************************/ #ifndef __HARDWARE_H #define __HARDWARE_H #include "stm32f10x_type.h" #include "cortexm3_macro.h" #include "common.h" /* macro'd register and peripheral definitions */ #define RCC ((u32)0x40021000) #define FLASH ((u32)0x40022000) #define GPIOA ((u32)0x40010800) #define GPIOB ((u32)0x40010C00) #define GPIOC ((u32)0x40011000) #define RCC_CR RCC #define RCC_CFGR (RCC + 0x04) #define RCC_CIR (RCC + 0x08) #define RCC_AHBENR (RCC + 0x14) #define RCC_APB2ENR (RCC + 0x18) #define RCC_APB1ENR (RCC + 0x1C) #define FLASH_ACR (FLASH + 0x00) #define FLASH_KEYR (FLASH + 0x04) #define FLASH_OPTKEYR (FLASH + 0x08) #define FLASH_SR (FLASH + 0x0C) #define FLASH_CR (FLASH + 0x10) #define FLASH_AR (FLASH + 0x14) #define FLASH_OBR (FLASH + 0x1C) #define FLASH_WRPR (FLASH + 0x20) #define FLASH_KEY1 0x45670123 #define FLASH_KEY2 0xCDEF89AB #define FLASH_RDPRT 0x00A5 #define FLASH_SR_BSY 0x01 #define FLASH_CR_PER 0x02 #define FLASH_CR_PG 0x01 #define FLASH_CR_START 0x40 #define GPIO_CRL(port) port #define GPIO_CRH(port) (port+0x04) #define GPIO_IDR(port) (port+0x08) #define GPIO_ODR(port) (port+0x0c) #define GPIO_BSRR(port) (port+0x10) #define SCS_BASE ((u32)0xE000E000) #define NVIC_BASE (SCS_BASE + 0x0100) #define SCB_BASE (SCS_BASE + 0x0D00) #define SCS 0xE000E000 #define NVIC (SCS+0x100) #define SCB (SCS+0xD00) #define STK (SCS+0x10) #define SCB_VTOR (SCB+0x08) #define STK_CTRL (STK+0x00) #define TIM1_APB2_ENB ((u32)0x00000800) #define TIM1 ((u32)0x40012C00) #define TIM1_PSC (TIM1+0x28) #define TIM1_ARR (TIM1+0x2C) #define TIM1_RCR (TIM1+0x30) #define TIM1_CR1 (TIM1+0x00) #define TIM1_CR2 (TIM1+0x04) #define TIM1_DIER (TIM1+0x0C) #define TIM1_UP_IRQ_Channel ((u8)0x19) #define USB_HP_IRQ ((u8)0x13) #define USB_LP_IRQ ((u8)0x14) #define TIM2_IRQ ((u8)0x1C) /* AIRCR */ #define AIRCR_RESET 0x05FA0000 #define AIRCR_RESET_REQ (AIRCR_RESET | (u32)0x04); /* temporary copyage of example from kiel */ #define __VAL(__TIMCLK, __PERIOD) ((__TIMCLK/1000000UL)*__PERIOD) #define __PSC(__TIMCLK, __PERIOD) (((__VAL(__TIMCLK, __PERIOD)+49999UL)/50000UL) - 1) #define __ARR(__TIMCLK, __PERIOD) ((__VAL(__TIMCLK, __PERIOD)/(__PSC(__TIMCLK, __PERIOD)+1)) - 1) #define SET_REG(addr,val) do { *(vu32*)(addr)=val; } while(0) #define GET_REG(addr) (*(vu32*)(addr)) /* todo: there must be some major misunderstanding in how we access regs. The direct access approach (GET_REG) causes the usb init to fail upon trying to activate RCC_APB1 |= 0x00800000. However, using the struct approach from ST, it works fine...temporarily switching to that approach */ typedef struct { vu32 CR; vu32 CFGR; vu32 CIR; vu32 APB2RSTR; vu32 APB1RSTR; vu32 AHBENR; vu32 APB2ENR; vu32 APB1ENR; vu32 BDCR; vu32 CSR; } RCC_RegStruct; #define pRCC ((RCC_RegStruct *) RCC) typedef struct { vu32 ISER[2]; u32 RESERVED0[30]; vu32 ICER[2]; u32 RSERVED1[30]; vu32 ISPR[2]; u32 RESERVED2[30]; vu32 ICPR[2]; u32 RESERVED3[30]; vu32 IABR[2]; u32 RESERVED4[62]; vu32 IPR[15]; } NVIC_TypeDef; typedef struct { u8 NVIC_IRQChannel; u8 NVIC_IRQChannelPreemptionPriority; u8 NVIC_IRQChannelSubPriority; bool NVIC_IRQChannelCmd; /* TRUE for enable */ } NVIC_InitTypeDef; typedef struct { vuc32 CPUID; vu32 ICSR; vu32 VTOR; vu32 AIRCR; vu32 SCR; vu32 CCR; vu32 SHPR[3]; vu32 SHCSR; vu32 CFSR; vu32 HFSR; vu32 DFSR; vu32 MMFAR; vu32 BFAR; vu32 AFSR; } SCB_TypeDef; void setPin(u32 bank, u8 pin); void resetPin(u32 bank, u8 pin); bool readPin(u32 bank, u8 pin); void strobePin(u32 bank, u8 pin, u8 count, u32 rate); void systemHardReset(void); void systemReset(void); void setupCLK(void); void setupLED(void); void setupFLASH(void); void setupBUTTON(void); bool checkUserCode(u32 usrAddr); void jumpToUser(u32 usrAddr); bool flashWriteWord(u32 addr, u32 word); bool flashErasePage(u32 addr); bool flashErasePages(u32 addr, u16 n); void flashLock(void); void flashUnlock(void); void nvicInit(NVIC_InitTypeDef *); void nvicDisableInterrupts(void); #endif