259 lines
11 KiB
C++
259 lines
11 KiB
C++
/******************************************************************************
|
|
* 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 <g.passault@gmail.com>
|
|
* @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 <board/board.h> // For this board's header file
|
|
|
|
//#include <wirish_types.h> // 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 <board/board.h>
|
|
|
|
#include <libmaple/gpio.h>
|
|
#include <libmaple/timer.h>
|
|
|
|
/* Roger Clark. Added next to includes for changes to Serial */
|
|
#include <libmaple/usart.h>
|
|
#include <HardwareSerial.h>
|
|
|
|
|
|
#include <wirish_debug.h>
|
|
#include <wirish_types.h>
|
|
// 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 |