/****************************************************************************** * The MIT License * * Copyright (c) 2011 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. *****************************************************************************/ /** * @file board.cpp for STM32 Nucleo-F103RB * @original author Grégoire Passault * @brief Nucleo board file * edited and tested by Matthias Diro, Release Date: 27.01.2015 * there are some solderings neccessary for complete compatibility * consider the Nucleo User manual for: * OSC clock: clock must be driven either from "MCO from ST-Link" or Oscillator from external PF0/PD0/PH0. Soldering is neccessary if board number is MB1136 C-01, see -> 5.7 OSC clock * USART: If PA2/PA3 needed, solder bridges must be changed. see -> 5.8 USART communication */ //#include // For this board's header file //#include // For stm32_pin_info and its contents // (these go into PIN_MAP). //#include "boards_private.h" // For PMAP_ROW(), which makes // PIN_MAP easier to read. #include #include #include /* Roger Clark. Added next to includes for changes to Serial */ #include #include #include #include // boardInit(): NUCLEO rely on some remapping void boardInit(void) { afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY); // relase PC3 and PC5 on nucleo afio_remap(AFIO_REMAP_USART3_PARTIAL); // remap Serial2(USART3)PB10/PB11 // to PC10/PC11 -> don't forget to insert into gpio.h: // AFIO_REMAP_USART3_PARTIAL = AFIO_MAPR_USART3_REMAP_PARTIAL afio_remap(AFIO_REMAP_TIM2_FULL); // better PWM compatibility afio_remap(AFIO_REMAP_TIM3_PARTIAL);// better PWM compatibility } /* namespace wirish { namespace priv { static stm32f1_rcc_pll_data pll_data = {RCC_PLLMUL_9}; rcc_clk w_board_pll_in_clk = RCC_CLK_HSI; rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSI_DIV_2, &pll_data}; } } */ // Pin map: this lets the basic I/O functions (digitalWrite(), // analogRead(), pwmWrite()) translate from pin numbers to STM32 // peripherals. // // PMAP_ROW() lets us specify a row (really a struct stm32_pin_info) // in the pin map. Its arguments are: // // - GPIO device for the pin (GPIOA, etc.) // - GPIO bit for the pin (0 through 15) // - Timer device, or NULL if none // - Timer channel (1 to 4, for PWM), or 0 if none // - ADC device, or NULL if none // - ADC channel, or ADCx if none // gpioX, PINbit, TIMER/NULL, timerch/0, ADC1/NULL, adcsub/0 // gpioX, TIMER/NULL, ADC1/NULL, PINbit, timerch/0, adcsub/0 // 0 1 2 3 4 5 // 0 3 1 4 2 5 // 0 1 3 4 2 5 // 0 1 2 4 2 5 extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { /* Arduino-like header, right connectors */ {GPIOA, NULL, ADC1, 3, 0, 3}, /* D0/PA3 */ {GPIOA, NULL, ADC1, 2, 0, 2}, /* D1/PA2 */ {GPIOA, TIMER1, NULL, 10, 3, ADCx}, /* D2/PA10 */ {GPIOB, TIMER2, NULL, 3, 2, ADCx}, /* D3/PB3 */ {GPIOB, TIMER3, NULL, 5, 2, ADCx}, /* D4/PB5 */ {GPIOB, TIMER3, NULL, 4, 1, ADCx}, /* D5/PB4 */ {GPIOB, TIMER2, NULL, 10, 3, ADCx}, /* D6/PB10 */ {GPIOA, TIMER1, NULL, 8, 1, ADCx}, /* D7/PA8 */ {GPIOA, TIMER1, NULL, 9, 2, ADCx}, /* D8/PA9 */ {GPIOC, NULL, NULL, 7, 0, ADCx}, /* D9/PC7 */ {GPIOB, TIMER4, NULL, 6, 1, ADCx}, /* D10/PB6 */ {GPIOA, NULL, ADC1, 7, 0, 7}, /* D11/PA7 */ {GPIOA, NULL, ADC1, 6, 0, 6}, /* D12/PA6 */ {GPIOA, NULL, NULL, 5, 0, ADCx}, /* D13/PA5 LED - no ADC12_IN5 !*/ {GPIOB, TIMER4, NULL, 9, 4, ADCx}, /* D14/PB9 */ {GPIOB, TIMER4, NULL, 8, 3, ADCx}, /* D15/PB8 */ {GPIOA, NULL, ADC1, 0, 0, 0}, /* D16/A0/PA0 */ {GPIOA, NULL, ADC1, 1, 0, 1}, /* D17/A1/PA1 */ {GPIOA, NULL, ADC1, 4, 0, 4}, /* D18/A2/PA4 */ {GPIOB, TIMER3, ADC1, 0, 3, 8}, /* D19/A3/PB0 */ {GPIOC, NULL, ADC1, 1, 0, 11}, /* D20/A4/PC1 */ {GPIOC, NULL, ADC1, 0, 0, 10}, /* D21/A5/PC0 */ {GPIOC, NULL, NULL, 10, 0, ADCx}, /* D22/PC10 */ {GPIOC, NULL, NULL, 12, 0, ADCx}, /* D23/PC12 */ {GPIOB, TIMER4, NULL, 7, 2, ADCx}, /* D24/PB7 */ {GPIOC, NULL, NULL, 13, 0, ADCx}, /* D25/PC13 USER BLUE BUTTON */ {GPIOC, NULL, NULL, 14, 0, ADCx}, /* D26/PC14 */ {GPIOC, NULL, NULL, 15, 0, ADCx}, /* D27/PC15 */ {GPIOC, NULL, ADC1, 2, 0, 12}, /* D28/PC2 */ {GPIOC, NULL, ADC1, 3, 0, 13}, /* D29/PC3 */ {GPIOC, NULL, NULL, 11, 0, ADCx}, /* D30/PC11 */ {GPIOD, NULL, NULL, 2, 0, ADCx}, /* D31/PD2 */ {GPIOC, NULL, NULL, 9, 0, ADCx}, /* D32/PC9 */ {GPIOC, NULL, NULL, 8, 0, ADCx}, /* D33/PC8 */ {GPIOC, NULL, NULL, 6, 0, ADCx}, /* D34/PC6 */ {GPIOC, NULL, ADC1, 5, 0, 15}, /* D35/PC5 */ {GPIOA, NULL, NULL, 12, 0, ADCx}, /* D36/PA12 */ {GPIOA, TIMER1, NULL, 11, 4, ADCx}, /* D37/PA11 */ {GPIOB, NULL, NULL, 12, 0, ADCx}, /* D38/PB12 */ {GPIOB, TIMER2, NULL, 11, 4, ADCx}, /* D39/PB11 PWM-not working?*/ {GPIOB, NULL, NULL, 2, 0, ADCx}, /* D40/PB2 BOOT1 !!*/ {GPIOB, TIMER3, ADC1, 1, 4, 9}, /* D41/PB1 */ {GPIOB, NULL, NULL, 15, 0, ADCx}, /* D42/PB15 */ {GPIOB, NULL, NULL, 14, 0, ADCx}, /* D43/PB14 */ {GPIOB, NULL, NULL, 13, 0, ADCx}, /* D44/PB13 */ {GPIOC, NULL, ADC1, 4, 0, 14}, /* D45/PC4 */ // PMAP_ROW(GPIOA, 13, NULL, 0, NULL, ADCx), /* D41/PA13 do not use*/ // PMAP_ROW(GPIOA, 14, NULL, 0, NULL, ADCx), /* D42/PA14 do not use*/ // PMAP_ROW(GPIOA, 15, TIMER2, 1, NULL, ADCx), /* D43/PA15 do not use*/ }; // Array of pins you can use for pwmWrite(). Keep it in Flash because // it doesn't change, and so we don't waste RAM. extern const uint8 boardPWMPins[] __FLASH__ = { 2,3,5,6,7,8,10,14,15,19,24,37,39,41 }; // Array of pins you can use for analogRead(). extern const uint8 boardADCPins[] __FLASH__ = { 0,1,11,12,16,17,18,19,20,21,28,29,35,41,45 }; // Array of pins that the board uses for something special. Other than // the button and the LED, it's usually best to leave these pins alone // unless you know what you're doing. /* remappings Infos ************************************* Bit 12 TIM4_REMAP: TIM4 remapping This bit is set and cleared by software. It controls the mapping of TIM4 channels 1 to 4 onto the GPIO ports. 0: No remap (TIM4_CH1/PB6, TIM4_CH2/PB7, TIM4_CH3/PB8, TIM4_CH4/PB9) 1: Full remap (TIM4_CH1/PD12, TIM4_CH2/ ************************************* Bits 11:10 TIM3_REMAP[1:0]: TIM3 remapping These bits are set and cleared by software. They control the mapping of TIM3 channels 1 to 4 on the GPIO ports. 00: No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) 01: Not used 10: Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) 11: Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) Note: TIM3_ETR on PE0 is not re-mapped. ************************************* Bits 9:8 TIM2_REMAP[1:0]: TIM2 remapping These bits are set and cleared by software. They control the mapping of TIM2 channels 1 to 4 and external trigger (ETR) on the GPIO ports. 00: No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) 01: Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) 10: Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) 11: Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) ************************************* Bits 7:6 TIM1_REMAP[1:0]: TIM1 remapping These bits are set and cleared by software. They control the mapping of TIM1 channels 1 to 4, 1N to 3N, external trigger (ETR) and Break input (BKIN) on the GPIO ports. 00: No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) 01: Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) 10: not used 11: Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) ************************************* Bits 5:4 USART3_REMAP[1:0]: USART3 remapping These bits are set and cleared by software. They control the mapping of USART3 CTS, RTS,CK,TX and RX alternate functions on the GPIO ports. 00: No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) 01: Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) 10: not used 11: Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) ************************************* Bit 3 USART2_REMAP: USART2 remapping This bit is set and cleared by software. It controls the mapping of USART2 CTS, RTS,CK,TX and RX alternate functions on the GPIO ports. 0: No remap (CTS/PA0, RTS/PA1, TX/PA2, RX/PA3, CK/PA4) 1: Remap (CTS/PD3, RTS/PD4, TX/PD5, RX/PD6, CK/PD7) ************************************* Bit 2 USART1_REMAP: USART1 remapping This bit is set and cleared by software. It controls the mapping of USART1 TX and RX alternate functions on the GPIO ports. 0: No remap (TX/PA9, RX/PA10) 1: Remap (TX/PB6, RX/PB7) ************************************* Bit 1 I2C1_REMAP: I2C1 remapping This bit is set and cleared by software. It controls the mapping of I2C1 SCL and SDA alternate functions on the GPIO ports. 0: No remap (SCL/PB6, SDA/PB7) 1: Remap (SCL/PB8, SDA/PB9) ************************************* Bit 0 SPI1_REMAP: SPI1 remapping This bit is set and cleared by software. It controls the mapping of SPI1 NSS, SCK, MISO, MOSI alternate functions on the GPIO ports. 0: No remap (NSS/PA4, SCK/PA5, MISO/PA6, MOSI/PA7) 1: Remap (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5) */ /* * Roger Clark * * 2015/05/28 * * Moved definitions for Hardware Serial devices from HardwareSerial.cpp so that each board can define which Arduino "Serial" instance * Maps to which hardware serial port on the microprocessor */ #ifdef SERIAL_USB DEFINE_HWSERIAL(Serial1, 1); DEFINE_HWSERIAL(Serial2, 2); DEFINE_HWSERIAL(Serial3, 3); #else DEFINE_HWSERIAL(Serial, 3);// Use HW Serial 2 as "Serial" DEFINE_HWSERIAL(Serial1, 2); DEFINE_HWSERIAL(Serial2, 1); #endif