Browse Source

[stm32f401-nucleo] arduino support (#5842)

* [stm32f401-nucleo] arduino support
* 增加application arduino main文件
* 调整目录结构
Man, Jianting (Meco) 3 years ago
parent
commit
7b47e8d052
35 changed files with 1081 additions and 237 deletions
  1. 1 1
      bsp/stm32/libraries/HAL_Drivers/drv_pwm.c
  2. 3 0
      bsp/stm32/stm32f072-st-nucleo/applications/SConscript
  3. 26 0
      bsp/stm32/stm32f072-st-nucleo/applications/arduino_main.cpp
  4. 35 27
      bsp/stm32/stm32f072-st-nucleo/applications/arduino_pinout/README.md
  5. 0 0
      bsp/stm32/stm32f072-st-nucleo/applications/arduino_pinout/SConscript
  6. BIN
      bsp/stm32/stm32f072-st-nucleo/applications/arduino_pinout/nucleo-f072-pinout.png
  7. 6 2
      bsp/stm32/stm32f072-st-nucleo/applications/arduino_pinout/pins_arduino.c
  8. 10 6
      bsp/stm32/stm32f072-st-nucleo/applications/arduino_pinout/pins_arduino.h
  9. 12 6
      bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc
  10. 16 0
      bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/main.c
  11. 1 0
      bsp/stm32/stm32f072-st-nucleo/board/Kconfig
  12. 3 0
      bsp/stm32/stm32f401-st-nucleo/applications/SConscript
  13. 23 0
      bsp/stm32/stm32f401-st-nucleo/applications/arduino_main.cpp
  14. 64 0
      bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/README.md
  15. 0 0
      bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/SConscript
  16. BIN
      bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/nucleo-f401-pinout.png
  17. 48 0
      bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/pins_arduino.c
  18. 45 0
      bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/pins_arduino.h
  19. 3 12
      bsp/stm32/stm32f401-st-nucleo/applications/main.c
  20. 0 6
      bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/.mxproject
  21. 102 28
      bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc
  22. 2 2
      bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/main.h
  23. 120 80
      bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h
  24. 1 3
      bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h
  25. 177 7
      bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/main.c
  26. 212 3
      bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c
  27. 1 2
      bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c
  28. 86 12
      bsp/stm32/stm32f401-st-nucleo/board/Kconfig
  29. 4 3
      bsp/stm32/stm32l475-atk-pandora/applications/SConscript
  30. 26 0
      bsp/stm32/stm32l475-atk-pandora/applications/arduino_main.cpp
  31. 39 35
      bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/README.md
  32. 9 0
      bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/SConscript
  33. 2 2
      bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/pins_arduino.c
  34. 0 0
      bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/pins_arduino.h
  35. 4 0
      bsp/stm32/stm32l475-atk-pandora/board/Kconfig

+ 1 - 1
bsp/stm32/libraries/HAL_Drivers/drv_pwm.c

@@ -162,7 +162,7 @@ static struct stm32_pwm stm32_pwm_obj[] =
 /* APBx timer clocks frequency doubler state related to APB1CLKDivider value */
 /* APBx timer clocks frequency doubler state related to APB1CLKDivider value */
 static void pclkx_doubler_get(rt_uint32_t *pclk1_doubler, rt_uint32_t *pclk2_doubler)
 static void pclkx_doubler_get(rt_uint32_t *pclk1_doubler, rt_uint32_t *pclk2_doubler)
 {
 {
-    rt_uint32_t flatency = 0;
+    uint32_t flatency = 0;
     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 
 
     RT_ASSERT(pclk1_doubler != RT_NULL);
     RT_ASSERT(pclk1_doubler != RT_NULL);

+ 3 - 0
bsp/stm32/stm32f072-st-nucleo/applications/SConscript

@@ -5,6 +5,9 @@ cwd = GetCurrentDir()
 CPPPATH = [cwd]
 CPPPATH = [cwd]
 src = ['main.c']
 src = ['main.c']
 
 
+if GetDepend(['PKG_USING_RTDUINO']):
+    src += ['arduino_main.cpp']
+
 group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
 group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
 
 
 list = os.listdir(cwd)
 list = os.listdir(cwd)

+ 26 - 0
bsp/stm32/stm32f072-st-nucleo/applications/arduino_main.cpp

@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2021-12-10     Meco Man     first version
+ */
+
+#include <Arduino.h>
+
+uint8_t led = LED_BUILTIN;
+
+void setup(void)
+{
+    /* put your setup code here, to run once: */
+    pinMode(led, OUTPUT);
+}
+
+void loop(void)
+{
+    /* put your main code here, to run repeatedly: */
+    digitalWrite(led, !digitalRead(led));
+    delay(100);
+}

+ 35 - 27
bsp/stm32/stm32f072-st-nucleo/applications/arduino/README.md → bsp/stm32/stm32f072-st-nucleo/applications/arduino_pinout/README.md

@@ -1,8 +1,8 @@
-# STM32L072 Nucleo开发板的Arduino生态兼容说明
+# STM32F072 Nucleo开发板的Arduino生态兼容说明
 
 
 ## 1 RTduino - RT-Thread的Arduino生态兼容层
 ## 1 RTduino - RT-Thread的Arduino生态兼容层
 
 
-STM32L072 Nucleo开发板已经完整适配了[RTduino软件包](https://github.com/mysterywolf/RTduino),即RT-Thread的Arduino生态兼容层。用户可以按照Arduino的编程习惯来操作该BSP,并且可以使用大量Arduino社区丰富的库,是对RT-Thread生态的极大增强。更多信息,请参见[RTduino软件包说明文档](https://github.com/mysterywolf/RTduino)。
+STM32F072 Nucleo开发板已经完整适配了[RTduino软件包](https://github.com/mysterywolf/RTduino),即RT-Thread的Arduino生态兼容层。用户可以按照Arduino的编程习惯来操作该BSP,并且可以使用大量Arduino社区丰富的库,是对RT-Thread生态的极大增强。更多信息,请参见[RTduino软件包说明文档](https://github.com/mysterywolf/RTduino)。
 
 
 ### 1.1 如何开启针对本BSP的Arduino生态兼容层
 ### 1.1 如何开启针对本BSP的Arduino生态兼容层
 
 
@@ -16,33 +16,37 @@ Hardware Drivers Config --->
 
 
 ## 2 Arduino引脚排布
 ## 2 Arduino引脚排布
 
 
+![nucleo-f072-pinout](nucleo-f072-pinout.png)
+
 该BSP遵照Arduino UNO板的引脚排列方式。详见 `pins_arduino.c`
 该BSP遵照Arduino UNO板的引脚排列方式。详见 `pins_arduino.c`
 
 
-| Arduino引脚编号 | STM32引脚编号 | 备注                                           |
-| --------------- | ------------- | ---------------------------------------------- |
-| 0 (D0)          | --            | 该引脚在UNO板中为串口RX引脚,不能被当做普通IO  |
-| 1 (D1)          | --            | 该引脚在UNO板中为串口TX引脚,不能被当做普通IO  |
-| 2 (D2)          | PA10          |                                                |
-| 3 (D3)          | PB3           | PWM(定时器2发生)                             |
-| 4 (D4)          | PB5           |                                                |
-| 5 (D5)          | PB4           | PWM(定时器3发生)                             |
-| 6 (D6)          | PB10          | PWM(定时器2发生)                             |
-| 7 (D7)          | PA8           |                                                |
-| 8 (D8)          | PA9           |                                                |
-| 9 (D9)          | PC7           | PWM(定时器3发生)                             |
-| 10 (D10)        | PB6           | PWM反相位(定时器16发生)                      |
-| 11 (D11)        | PA7           | PWM(定时器17发生)                            |
-| 12 (D12)        | PA6           |                                                |
-| 13 (D13)        | PA5           |                                                |
-| 14 (D14)        | PC13          | 扩展:Nucleo板载用户按键(左侧蓝色)           |
-| A0              | PA0           | ADC                                            |
-| A1              | PA1           | ADC                                            |
-| A2              | PA4           | ADC                                            |
-| A3              | PB0           | ADC                                            |
-| A4              | PC1           | ADC                                            |
-| A5              | PC0           | ADC                                            |
-| --              | PB9           | I2C1-SDA,被RT-Thread的I2C设备框架i2c1总线接管 |
-| --              |               | I2C1_SCL,被RT-Thread的I2C设备框架i2c1总线接管 |
+| Arduino引脚编号 | STM32引脚编号 | 备注                                                         |
+| --------------- | ------------- | ------------------------------------------------------------ |
+| 0 (D0)          | --            | 该引脚在UNO板中为串口RX引脚,不可当做普通IO                  |
+| 1 (D1)          | --            | 该引脚在UNO板中为串口TX引脚,不可当做普通IO                  |
+| 2 (D2)          | PA10          |                                                              |
+| 3 (D3)          | PB3           | PWM(定时器2发生)                                           |
+| 4 (D4)          | PB5           |                                                              |
+| 5 (D5)          | PB4           | PWM(定时器3发生)                                           |
+| 6 (D6)          | PB10          | PWM(定时器2发生)                                           |
+| 7 (D7)          | PA8           |                                                              |
+| 8 (D8)          | PA9           |                                                              |
+| 9 (D9)          | PC7           | PWM(定时器3发生)                                           |
+| 10 (D10)        | PB6           | PWM反相位(定时器16发生)                                    |
+| 11 (D11)        | PA7           | PWM(定时器17发生)                                          |
+| 12 (D12)        | PA6           |                                                              |
+| 13 (D13)        | PA5           |                                                              |
+| 14 (D14)        | PB9           | I2C1-SDA,被RT-Thread的I2C设备框架i2c1总线接管,不可当做普通IO |
+| 15 (D15)        | PB8           | I2C1_SCL,被RT-Thread的I2C设备框架i2c1总线接管,不可当做普通IO |
+| 16 (D16)        | PC13          | Nucleo板载用户按键(左侧蓝色)                               |
+| A0              | PA0           | ADC                                                          |
+| A1              | PA1           | ADC                                                          |
+| A2              | PA4           | ADC                                                          |
+| A3              | PB0           | ADC                                                          |
+| A4              | PC1           | ADC                                                          |
+| A5              | PC0           | ADC                                                          |
+| A6              | --            | 芯片内部参考电压 ADC                                         |
+| A7              | --            | 芯片内部温度 ADC                                             |
 
 
 > 注意:
 > 注意:
 >
 >
@@ -51,6 +55,10 @@ Hardware Drivers Config --->
 > 3. USART2是Nucleo板的默认串口,理论应对接到了Arduino引脚编号的D0和D1,但是其实际用于串口通信,因此不允许当做普通IO来使用和操作。如果需要将D0、D1与STM32 USART2的引脚相连,需要手动焊接锡桥SB62、SB63。
 > 3. USART2是Nucleo板的默认串口,理论应对接到了Arduino引脚编号的D0和D1,但是其实际用于串口通信,因此不允许当做普通IO来使用和操作。如果需要将D0、D1与STM32 USART2的引脚相连,需要手动焊接锡桥SB62、SB63。
 > 4. Nucleo板的Arduino接口中AVDD(即AREF)默认是与VDD相连的,如果需要扩展板提供外部参考电压,需要将SB57锡桥挑开。
 > 4. Nucleo板的Arduino接口中AVDD(即AREF)默认是与VDD相连的,如果需要扩展板提供外部参考电压,需要将SB57锡桥挑开。
 
 
+> 参考资料
+>
+> 【1】[STM32 Nucleo板官方手册](https://www.st.com/resource/en/user_manual/um1724-stm32-nucleo64-boards-mb1136-stmicroelectronics.pdf)
+
 ## 3 I2C总线
 ## 3 I2C总线
 
 
 STM32F072 Nucleo板的I2C总线是板上丝印的 `SCL/D15` 和 `SDA/D14` 引脚,这两个引脚是被RT-Thread I2C设备框架接管的,不需要直接操控这两个引脚,直接引用`#include <Wire.h>`(Arduino官方I2C头文件)即可使用。
 STM32F072 Nucleo板的I2C总线是板上丝印的 `SCL/D15` 和 `SDA/D14` 引脚,这两个引脚是被RT-Thread I2C设备框架接管的,不需要直接操控这两个引脚,直接引用`#include <Wire.h>`(Arduino官方I2C头文件)即可使用。

+ 0 - 0
bsp/stm32/stm32f072-st-nucleo/applications/arduino/SConscript → bsp/stm32/stm32f072-st-nucleo/applications/arduino_pinout/SConscript


BIN
bsp/stm32/stm32f072-st-nucleo/applications/arduino_pinout/nucleo-f072-pinout.png


+ 6 - 2
bsp/stm32/stm32f072-st-nucleo/applications/arduino/pins_arduino.c → bsp/stm32/stm32f072-st-nucleo/applications/arduino_pinout/pins_arduino.c

@@ -34,11 +34,15 @@ const pin_map_t pin_map_table[]=
     {D11, GET_PIN(A,7), "pwm17", 1}, /* PWM */
     {D11, GET_PIN(A,7), "pwm17", 1}, /* PWM */
     {D12, GET_PIN(A,6)},
     {D12, GET_PIN(A,6)},
     {D13, GET_PIN(A,5)},
     {D13, GET_PIN(A,5)},
-    {D14, GET_PIN(C,13)}, /* user button */
+    {D14}, /* I2C1-SDA */
+    {D15}, /* I2C1-SCL */
+    {D16, GET_PIN(C,13)}, /* user button */
     {A0, GET_PIN(A,0), "adc1", 0}, /* ADC */
     {A0, GET_PIN(A,0), "adc1", 0}, /* ADC */
     {A1, GET_PIN(A,1), "adc1", 1}, /* ADC */
     {A1, GET_PIN(A,1), "adc1", 1}, /* ADC */
     {A2, GET_PIN(A,4), "adc1", 4}, /* ADC */
     {A2, GET_PIN(A,4), "adc1", 4}, /* ADC */
     {A3, GET_PIN(B,0), "adc1", 8}, /* ADC */
     {A3, GET_PIN(B,0), "adc1", 8}, /* ADC */
     {A4, GET_PIN(C,1), "adc1", 11}, /* ADC */
     {A4, GET_PIN(C,1), "adc1", 11}, /* ADC */
-    {A5, GET_PIN(C,0), "adc1", 10} /* ADC */
+    {A5, GET_PIN(C,0), "adc1", 10}, /* ADC */
+    {A6, RT_NULL, "adc1", 17}, /* ADC, On-Chip: internal reference voltage, ADC_CHANNEL_VREFINT */
+    {A7, RT_NULL, "adc1", 16} /* ADC, On-Chip: internal temperature sensor, ADC_CHANNEL_TEMPSENSOR */
 };
 };

+ 10 - 6
bsp/stm32/stm32f072-st-nucleo/applications/arduino/pins_arduino.h → bsp/stm32/stm32f072-st-nucleo/applications/arduino_pinout/pins_arduino.h

@@ -27,12 +27,16 @@
 #define D12  (12)
 #define D12  (12)
 #define D13  (13)
 #define D13  (13)
 #define D14  (14)
 #define D14  (14)
-#define A0   (15)
-#define A1   (16)
-#define A2   (17)
-#define A3   (18)
-#define A4   (19)
-#define A5   (20)
+#define D15  (15)
+#define D16  (16)
+#define A0   (17)
+#define A1   (18)
+#define A2   (19)
+#define A3   (20)
+#define A4   (21)
+#define A5   (22)
+#define A6   (23)
+#define A7   (24)
 
 
 #define LED_BUILTIN  D13 /* Default Built-in LED */
 #define LED_BUILTIN  D13 /* Default Built-in LED */
 
 

+ 12 - 6
bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc

@@ -30,11 +30,13 @@ Mcu.Pin19=PB3
 Mcu.Pin2=PC15-OSC32_OUT
 Mcu.Pin2=PC15-OSC32_OUT
 Mcu.Pin20=PB4
 Mcu.Pin20=PB4
 Mcu.Pin21=PB6
 Mcu.Pin21=PB6
-Mcu.Pin22=VP_SYS_VS_Systick
-Mcu.Pin23=VP_TIM2_VS_ClockSourceINT
-Mcu.Pin24=VP_TIM3_VS_ClockSourceINT
-Mcu.Pin25=VP_TIM16_VS_ClockSourceINT
-Mcu.Pin26=VP_TIM17_VS_ClockSourceINT
+Mcu.Pin22=VP_ADC_TempSens_Input
+Mcu.Pin23=VP_ADC_Vref_Input
+Mcu.Pin24=VP_SYS_VS_Systick
+Mcu.Pin25=VP_TIM2_VS_ClockSourceINT
+Mcu.Pin26=VP_TIM3_VS_ClockSourceINT
+Mcu.Pin27=VP_TIM16_VS_ClockSourceINT
+Mcu.Pin28=VP_TIM17_VS_ClockSourceINT
 Mcu.Pin3=PF0-OSC_IN
 Mcu.Pin3=PF0-OSC_IN
 Mcu.Pin4=PF1-OSC_OUT
 Mcu.Pin4=PF1-OSC_OUT
 Mcu.Pin5=PC0
 Mcu.Pin5=PC0
@@ -42,7 +44,7 @@ Mcu.Pin6=PC1
 Mcu.Pin7=PA0
 Mcu.Pin7=PA0
 Mcu.Pin8=PA1
 Mcu.Pin8=PA1
 Mcu.Pin9=PA2
 Mcu.Pin9=PA2
-Mcu.PinsNb=27
+Mcu.PinsNb=29
 Mcu.ThirdPartyNb=0
 Mcu.ThirdPartyNb=0
 Mcu.UserConstants=
 Mcu.UserConstants=
 Mcu.UserName=STM32F072RBTx
 Mcu.UserName=STM32F072RBTx
@@ -209,6 +211,10 @@ TIM3.IPParameters=Channel-PWM Generation2 CH2,Channel-PWM Generation1 CH1
 USART2.IPParameters=VirtualMode,VirtualMode-Asynchronous
 USART2.IPParameters=VirtualMode,VirtualMode-Asynchronous
 USART2.VirtualMode=VM_ASYNC
 USART2.VirtualMode=VM_ASYNC
 USART2.VirtualMode-Asynchronous=VM_ASYNC
 USART2.VirtualMode-Asynchronous=VM_ASYNC
+VP_ADC_TempSens_Input.Mode=IN-TempSens
+VP_ADC_TempSens_Input.Signal=ADC_TempSens_Input
+VP_ADC_Vref_Input.Mode=IN-Vrefint
+VP_ADC_Vref_Input.Signal=ADC_Vref_Input
 VP_SYS_VS_Systick.Mode=SysTick
 VP_SYS_VS_Systick.Mode=SysTick
 VP_SYS_VS_Systick.Signal=SYS_VS_Systick
 VP_SYS_VS_Systick.Signal=SYS_VS_Systick
 VP_TIM16_VS_ClockSourceINT.Mode=Enable_Timer
 VP_TIM16_VS_ClockSourceINT.Mode=Enable_Timer

+ 16 - 0
bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/main.c

@@ -274,6 +274,22 @@ static void MX_ADC_Init(void)
   {
   {
     Error_Handler();
     Error_Handler();
   }
   }
+
+  /** Configure for the selected ADC regular channel to be converted.
+  */
+  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
+  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+  /** Configure for the selected ADC regular channel to be converted.
+  */
+  sConfig.Channel = ADC_CHANNEL_VREFINT;
+  if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
   /* USER CODE BEGIN ADC_Init 2 */
   /* USER CODE BEGIN ADC_Init 2 */
 
 
   /* USER CODE END ADC_Init 2 */
   /* USER CODE END ADC_Init 2 */

+ 1 - 0
bsp/stm32/stm32f072-st-nucleo/board/Kconfig

@@ -36,6 +36,7 @@ menu "Onboard Peripheral Drivers"
         imply RTDUINO_USING_SERVO
         imply RTDUINO_USING_SERVO
         imply RTDUINO_USING_WIRE
         imply RTDUINO_USING_WIRE
         imply RTDUINO_USING_ADAFRUIT
         imply RTDUINO_USING_ADAFRUIT
+        imply RTUSING_USING_SPI
         default n
         default n
 
 
 endmenu
 endmenu

+ 3 - 0
bsp/stm32/stm32f401-st-nucleo/applications/SConscript

@@ -5,6 +5,9 @@ cwd     = GetCurrentDir()
 CPPPATH = [cwd]
 CPPPATH = [cwd]
 src = ['main.c']
 src = ['main.c']
 
 
+if GetDepend(['PKG_USING_RTDUINO']):
+    src += ['arduino_main.cpp']
+
 group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
 group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
 
 
 list = os.listdir(cwd)
 list = os.listdir(cwd)

+ 23 - 0
bsp/stm32/stm32f401-st-nucleo/applications/arduino_main.cpp

@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2022-04-19     Meco Man     first version
+ */
+
+#include <Arduino.h>
+
+void setup(void)
+{
+    /* put your setup code here, to run once: */
+}
+
+void loop(void)
+{
+    /* put your main code here, to run repeatedly: */
+    Serial.println("Hello RT-Thread from arduino_main.cpp\n");
+    delay(800);
+}

+ 64 - 0
bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/README.md

@@ -0,0 +1,64 @@
+# STM32F401 Nucleo开发板的Arduino生态兼容说明
+
+## 1 RTduino - RT-Thread的Arduino生态兼容层
+
+STM32F401 Nucleo开发板已经完整适配了[RTduino软件包](https://github.com/mysterywolf/RTduino),即RT-Thread的Arduino生态兼容层。用户可以按照Arduino的编程习惯来操作该BSP,并且可以使用大量Arduino社区丰富的库,是对RT-Thread生态的极大增强。更多信息,请参见[RTduino软件包说明文档](https://github.com/mysterywolf/RTduino)。
+
+### 1.1 如何开启针对本BSP的Arduino生态兼容层
+
+Env 工具下敲入 menuconfig 命令,或者 RT-Thread Studio IDE 下选择 RT-Thread Settings:
+
+```Kconfig
+Hardware Drivers Config --->
+    Onboard Peripheral Drivers --->
+        [*] Support Arduino
+```
+
+## 2 Arduino引脚排布
+
+![nucleo-f401-pinout](nucleo-f401-pinout.png)
+
+该BSP遵照Arduino UNO板的引脚排列方式。详见 `pins_arduino.c`
+
+| Arduino引脚编号 | STM32引脚编号 | 备注                                                         |
+| --------------- | ------------- | ------------------------------------------------------------ |
+| 0 (D0)          | --            | 该引脚在UNO板中为串口RX引脚,不可当做普通IO                  |
+| 1 (D1)          | --            | 该引脚在UNO板中为串口TX引脚,不可当做普通IO                  |
+| 2 (D2)          | PA10          |                                                              |
+| 3 (D3)          | PB3           | PWM(定时器2发生)                                           |
+| 4 (D4)          | PB5           |                                                              |
+| 5 (D5)          | PB4           | PWM(定时器3发生)                                           |
+| 6 (D6)          | PB10          | PWM(定时器2发生)                                           |
+| 7 (D7)          | PA8           |                                                              |
+| 8 (D8)          | PA9           |                                                              |
+| 9 (D9)          | PC7           | PWM(定时器3发生)                                           |
+| 10 (D10)        | PB6           | SPI1-CS,被RT-Thread的SPI设备框架spi1总线接管,不可当做普通IO |
+| 11 (D11)        | PA7           | SPI1-MOSI,被RT-Thread的SPI设备框架spi1总线接管,不可当做普通IO |
+| 12 (D12)        | PA6           | SPI1-MISO,被RT-Thread的SPI设备框架spi1总线接管,不可当做普通IO |
+| 13 (D13)        | PA5           | SPI1-SCK,被RT-Thread的SPI设备框架spi1总线接管,不可当做普通IO |
+| 14 (D14)        | PB9           | I2C1-SDA,被RT-Thread的I2C设备框架i2c1总线接管,不可当做普通IO |
+| 15 (D15)        | PB8           | I2C1_SCL,被RT-Thread的I2C设备框架i2c1总线接管,不可当做普通IO |
+| 16 (D16)        | PC13          | Nucleo板载用户按键(左侧蓝色)                               |
+| A0              | PA0           | ADC                                                          |
+| A1              | PA1           | ADC                                                          |
+| A2              | PA4           | ADC                                                          |
+| A3              | PB0           | ADC                                                          |
+| A4              | PC1           | ADC                                                          |
+| A5              | PC0           | ADC                                                          |
+| A6              | --            | 芯片内部参考电压 ADC                                         |
+| A7              | --            | 芯片内部温度 ADC                                             |
+
+> 注意:
+>
+> 1. D10引脚是PWM反相位引脚,这是由STM32设计决定的,例如正常的PWM设定占空比是20%,它就是20%。但是对于D10引脚,设定占空比是20%,实际输出的占空比是80%。
+> 2. 驱动舵机和analogWrite函数要选择不同定时器发生的PWM信号引脚,由于STM32的定时器4个通道需要保持相同的频率,如果采用相同的定时器发生的PWM分别驱动舵机和analogWrite,可能会导致舵机失效。
+> 3. USART2是Nucleo板的默认串口,理论应对接到了Arduino引脚编号的D0和D1,但是其实际用于串口通信,因此不允许当做普通IO来使用和操作。如果需要将D0、D1与STM32 USART2的引脚相连,需要手动焊接锡桥SB62、SB63。
+> 4. Nucleo板的Arduino接口中AVDD(即AREF)默认是与VDD相连的,如果需要扩展板提供外部参考电压,需要将SB57锡桥挑开。
+
+> 参考资料
+>
+> 【1】[STM32 Nucleo板官方手册](https://www.st.com/resource/en/user_manual/um1724-stm32-nucleo64-boards-mb1136-stmicroelectronics.pdf)
+
+## 3 I2C总线
+
+STM32F401 Nucleo板的I2C总线是板上丝印的 `SCL/D15` 和 `SDA/D14` 引脚,这两个引脚是被RT-Thread I2C设备框架接管的,不需要直接操控这两个引脚,直接引用`#include <Wire.h>`(Arduino官方I2C头文件)即可使用。

+ 0 - 0
bsp/stm32/stm32l475-atk-pandora/applications/arduino/SConscript → bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/SConscript


BIN
bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/nucleo-f401-pinout.png


+ 48 - 0
bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/pins_arduino.c

@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2022-04-19     Meco Man     first version
+ */
+#include <Arduino.h>
+#include <board.h>
+#include "pins_arduino.h"
+
+/*
+    {Arduino Pin, RT-Thread Pin [, Device Name(PWM or ADC), Channel]}
+    [] means optional
+    Digital pins must NOT give the device name and channel.
+    Analog pins MUST give the device name and channel(ADC, PWM or DAC).
+    Arduino Pin must keep in sequence.
+*/
+const pin_map_t pin_map_table[]=
+{
+    {D0}, /* RX */
+    {D1}, /* TX */
+    {D2, GET_PIN(A,10)},
+    {D3, GET_PIN(B,3), "pwm2", 2}, /* PWM */
+    {D4, GET_PIN(B,5)},
+    {D5, GET_PIN(B,4), "pwm3", 1}, /* PWM */
+    {D6, GET_PIN(B,10), "pwm2", 3}, /* PWM */
+    {D7, GET_PIN(A,8)},
+    {D8, GET_PIN(A,9)},
+    {D9, GET_PIN(C,7), "pwm3", 2}, /* PWM */
+    {D10}, /* SPI1-CS */
+    {D11}, /* SPI1-MOSI */
+    {D12}, /* SPI1-MISO */
+    {D13}, /* SPI1-SCK */
+    {D14}, /* I2C1-SDA */
+    {D15}, /* I2C1-SCL */
+    {D16, GET_PIN(C,13)}, /* user button */
+    {A0, GET_PIN(A,0), "adc1", 0}, /* ADC */
+    {A1, GET_PIN(A,1), "adc1", 1}, /* ADC */
+    {A2, GET_PIN(A,4), "adc1", 4}, /* ADC */
+    {A3, GET_PIN(B,0), "adc1", 8}, /* ADC */
+    {A4, GET_PIN(C,1), "adc1", 11}, /* ADC */
+    {A5, GET_PIN(C,0), "adc1", 10}, /* ADC */
+    {A6, RT_NULL, "adc1", 17}, /* ADC, On-Chip: internal reference voltage, ADC_CHANNEL_VREFINT */
+    {A7, RT_NULL, "adc1", 16} /* ADC, On-Chip: internal temperature sensor, ADC_CHANNEL_TEMPSENSOR */
+};

+ 45 - 0
bsp/stm32/stm32f401-st-nucleo/applications/arduino_pinout/pins_arduino.h

@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2022-04-19     Meco Man     first version
+ */
+
+#ifndef Pins_Arduino_h
+#define Pins_Arduino_h
+
+/* pins alias. Must keep in sequence */
+#define D0   (0)
+#define D1   (1)
+#define D2   (2)
+#define D3   (3)
+#define D4   (4)
+#define D5   (5)
+#define D6   (6)
+#define D7   (7)
+#define D8   (8)
+#define D9   (9)
+#define D10  (10)
+#define D11  (11)
+#define D12  (12)
+#define D13  (13)
+#define D14  (14)
+#define D15  (15)
+#define D16  (16)
+#define A0   (17)
+#define A1   (18)
+#define A2   (19)
+#define A3   (20)
+#define A4   (21)
+#define A5   (22)
+#define A6   (23)
+#define A7   (24)
+
+#define LED_BUILTIN  D13 /* Default Built-in LED */
+
+#define ARDUINO_DEFAULT_IIC_BUS_NAME "i2c1"
+
+#endif /* Pins_Arduino_h */

+ 3 - 12
bsp/stm32/stm32f401-st-nucleo/applications/main.c

@@ -6,25 +6,16 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2018-11-06     SummerGift   first version
  * 2018-11-06     SummerGift   first version
+ * 2022-04-19     Meco Man     solve LED interferes with SPI
  */
  */
 
 
 #include <rtthread.h>
 #include <rtthread.h>
-#include <rtdevice.h>
-#include <board.h>
-
-/* defined the LD2 (user LED) pin: PB1 */
-#define LED2_PIN    GET_PIN(A, 5)
 
 
 int main(void)
 int main(void)
 {
 {
-    /* set LED0 pin mode to output */
-    rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
-
     while (1)
     while (1)
     {
     {
-        rt_pin_write(LED2_PIN, PIN_HIGH);
-        rt_thread_mdelay(500);
-        rt_pin_write(LED2_PIN, PIN_LOW);
-        rt_thread_mdelay(500);
+        rt_kprintf("Hello RT-Thread from main.c\n");
+        rt_thread_mdelay(1000);
     }
     }
 }
 }

File diff suppressed because it is too large
+ 0 - 6
bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/.mxproject


+ 102 - 28
bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc

@@ -1,43 +1,70 @@
 #MicroXplorer Configuration settings - do not modify
 #MicroXplorer Configuration settings - do not modify
+ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_0
+ADC1.IPParameters=Rank-0\#ChannelRegularConversion,master,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag
+ADC1.NbrOfConversionFlag=1
+ADC1.Rank-0\#ChannelRegularConversion=1
+ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_3CYCLES
+ADC1.master=1
 File.Version=6
 File.Version=6
 KeepUserPlacement=false
 KeepUserPlacement=false
+Mcu.CPN=STM32F401RET6
 Mcu.Family=STM32F4
 Mcu.Family=STM32F4
-Mcu.IP0=NVIC
-Mcu.IP1=RCC
-Mcu.IP2=SPI1
-Mcu.IP3=SYS
-Mcu.IP4=USART2
-Mcu.IPNb=5
+Mcu.IP0=ADC1
+Mcu.IP1=NVIC
+Mcu.IP2=RCC
+Mcu.IP3=SPI1
+Mcu.IP4=SYS
+Mcu.IP5=TIM2
+Mcu.IP6=TIM3
+Mcu.IP7=USART2
+Mcu.IPNb=8
 Mcu.Name=STM32F401R(D-E)Tx
 Mcu.Name=STM32F401R(D-E)Tx
 Mcu.Package=LQFP64
 Mcu.Package=LQFP64
 Mcu.Pin0=PC14-OSC32_IN
 Mcu.Pin0=PC14-OSC32_IN
 Mcu.Pin1=PC15-OSC32_OUT
 Mcu.Pin1=PC15-OSC32_OUT
-Mcu.Pin10=PA14
-Mcu.Pin11=VP_SYS_VS_Systick
+Mcu.Pin10=PA4
+Mcu.Pin11=PA5
+Mcu.Pin12=PA6
+Mcu.Pin13=PA7
+Mcu.Pin14=PB0
+Mcu.Pin15=PB10
+Mcu.Pin16=PC7
+Mcu.Pin17=PA13
+Mcu.Pin18=PA14
+Mcu.Pin19=PB3
 Mcu.Pin2=PH0 - OSC_IN
 Mcu.Pin2=PH0 - OSC_IN
+Mcu.Pin20=PB4
+Mcu.Pin21=VP_ADC1_TempSens_Input
+Mcu.Pin22=VP_ADC1_Vref_Input
+Mcu.Pin23=VP_SYS_VS_Systick
 Mcu.Pin3=PH1 - OSC_OUT
 Mcu.Pin3=PH1 - OSC_OUT
-Mcu.Pin4=PA2
-Mcu.Pin5=PA3
-Mcu.Pin6=PA5
-Mcu.Pin7=PA6
-Mcu.Pin8=PA7
-Mcu.Pin9=PA13
-Mcu.PinsNb=12
+Mcu.Pin4=PC0
+Mcu.Pin5=PC1
+Mcu.Pin6=PA0-WKUP
+Mcu.Pin7=PA1
+Mcu.Pin8=PA2
+Mcu.Pin9=PA3
+Mcu.PinsNb=24
 Mcu.ThirdPartyNb=0
 Mcu.ThirdPartyNb=0
 Mcu.UserConstants=
 Mcu.UserConstants=
 Mcu.UserName=STM32F401RETx
 Mcu.UserName=STM32F401RETx
-MxCube.Version=5.1.0
-MxDb.Version=DB.5.0.10
-NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false
-NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false
-NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false
-NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false
-NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false
-NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false
+MxCube.Version=6.5.0
+MxDb.Version=DB.6.0.50
+NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
+NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
+NVIC.ForceEnableDMAVector=true
+NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
+NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
+NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
+NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
 NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
 NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
-NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false
-NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true
-NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false
+NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
+NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
+NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
+PA0-WKUP.Locked=true
+PA0-WKUP.Signal=ADCx_IN0
+PA1.Locked=true
+PA1.Signal=ADCx_IN1
 PA13.Mode=Serial_Wire
 PA13.Mode=Serial_Wire
 PA13.Signal=SYS_JTMS-SWDIO
 PA13.Signal=SYS_JTMS-SWDIO
 PA14.Mode=Serial_Wire
 PA14.Mode=Serial_Wire
@@ -52,6 +79,8 @@ PA3.GPIO_PuPd=GPIO_PULLUP
 PA3.GPIO_Speed=GPIO_SPEED_FREQ_LOW
 PA3.GPIO_Speed=GPIO_SPEED_FREQ_LOW
 PA3.Mode=Asynchronous
 PA3.Mode=Asynchronous
 PA3.Signal=USART2_RX
 PA3.Signal=USART2_RX
+PA4.Locked=true
+PA4.Signal=ADCx_IN4
 PA5.Locked=true
 PA5.Locked=true
 PA5.Mode=Full_Duplex_Master
 PA5.Mode=Full_Duplex_Master
 PA5.Signal=SPI1_SCK
 PA5.Signal=SPI1_SCK
@@ -59,10 +88,24 @@ PA6.Mode=Full_Duplex_Master
 PA6.Signal=SPI1_MISO
 PA6.Signal=SPI1_MISO
 PA7.Mode=Full_Duplex_Master
 PA7.Mode=Full_Duplex_Master
 PA7.Signal=SPI1_MOSI
 PA7.Signal=SPI1_MOSI
+PB0.Locked=true
+PB0.Signal=ADCx_IN8
+PB10.Locked=true
+PB10.Signal=S_TIM2_CH3
+PB3.Locked=true
+PB3.Signal=S_TIM2_CH2
+PB4.Locked=true
+PB4.Signal=S_TIM3_CH1
+PC0.Locked=true
+PC0.Signal=ADCx_IN10
+PC1.Locked=true
+PC1.Signal=ADCx_IN11
 PC14-OSC32_IN.Mode=LSE-External-Oscillator
 PC14-OSC32_IN.Mode=LSE-External-Oscillator
 PC14-OSC32_IN.Signal=RCC_OSC32_IN
 PC14-OSC32_IN.Signal=RCC_OSC32_IN
 PC15-OSC32_OUT.Mode=LSE-External-Oscillator
 PC15-OSC32_OUT.Mode=LSE-External-Oscillator
 PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
 PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
+PC7.Locked=true
+PC7.Signal=S_TIM3_CH2
 PH0\ -\ OSC_IN.Mode=HSE-External-Clock-Source
 PH0\ -\ OSC_IN.Mode=HSE-External-Clock-Source
 PH0\ -\ OSC_IN.Signal=RCC_OSC_IN
 PH0\ -\ OSC_IN.Signal=RCC_OSC_IN
 PH1\ -\ OSC_OUT.Mode=HSE-External-Clock-Source
 PH1\ -\ OSC_OUT.Mode=HSE-External-Clock-Source
@@ -77,7 +120,7 @@ ProjectManager.CustomerFirmwarePackage=
 ProjectManager.DefaultFWLocation=true
 ProjectManager.DefaultFWLocation=true
 ProjectManager.DeletePrevious=true
 ProjectManager.DeletePrevious=true
 ProjectManager.DeviceId=STM32F401RETx
 ProjectManager.DeviceId=STM32F401RETx
-ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.24.0
+ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.27.0
 ProjectManager.FreePins=false
 ProjectManager.FreePins=false
 ProjectManager.HalAssertFull=false
 ProjectManager.HalAssertFull=false
 ProjectManager.HeapSize=0x200
 ProjectManager.HeapSize=0x200
@@ -90,11 +133,12 @@ ProjectManager.PreviousToolchain=
 ProjectManager.ProjectBuild=false
 ProjectManager.ProjectBuild=false
 ProjectManager.ProjectFileName=CubeMX_Config.ioc
 ProjectManager.ProjectFileName=CubeMX_Config.ioc
 ProjectManager.ProjectName=CubeMX_Config
 ProjectManager.ProjectName=CubeMX_Config
+ProjectManager.RegisterCallBack=
 ProjectManager.StackSize=0x400
 ProjectManager.StackSize=0x400
 ProjectManager.TargetToolchain=MDK-ARM V5
 ProjectManager.TargetToolchain=MDK-ARM V5
 ProjectManager.ToolChainLocation=
 ProjectManager.ToolChainLocation=
 ProjectManager.UnderRoot=false
 ProjectManager.UnderRoot=false
-ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true
+ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_ADC1_Init-ADC1-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true,7-MX_TIM3_Init-TIM3-false-HAL-true
 RCC.48MHZClocksFreq_Value=84000000
 RCC.48MHZClocksFreq_Value=84000000
 RCC.AHBFreq_Value=84000000
 RCC.AHBFreq_Value=84000000
 RCC.APB1CLKDivider=RCC_HCLK_DIV2
 RCC.APB1CLKDivider=RCC_HCLK_DIV2
@@ -123,12 +167,42 @@ RCC.VCOI2SOutputFreq_Value=192000000
 RCC.VCOInputFreq_Value=1000000
 RCC.VCOInputFreq_Value=1000000
 RCC.VCOOutputFreq_Value=336000000
 RCC.VCOOutputFreq_Value=336000000
 RCC.VcooutputI2S=96000000
 RCC.VcooutputI2S=96000000
+SH.ADCx_IN0.0=ADC1_IN0,IN0
+SH.ADCx_IN0.ConfNb=1
+SH.ADCx_IN1.0=ADC1_IN1,IN1
+SH.ADCx_IN1.ConfNb=1
+SH.ADCx_IN10.0=ADC1_IN10,IN10
+SH.ADCx_IN10.ConfNb=1
+SH.ADCx_IN11.0=ADC1_IN11,IN11
+SH.ADCx_IN11.ConfNb=1
+SH.ADCx_IN4.0=ADC1_IN4,IN4
+SH.ADCx_IN4.ConfNb=1
+SH.ADCx_IN8.0=ADC1_IN8,IN8
+SH.ADCx_IN8.ConfNb=1
+SH.S_TIM2_CH2.0=TIM2_CH2,PWM Generation2 CH2
+SH.S_TIM2_CH2.ConfNb=1
+SH.S_TIM2_CH3.0=TIM2_CH3,PWM Generation3 CH3
+SH.S_TIM2_CH3.ConfNb=1
+SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1
+SH.S_TIM3_CH1.ConfNb=1
+SH.S_TIM3_CH2.0=TIM3_CH2,PWM Generation2 CH2
+SH.S_TIM3_CH2.ConfNb=1
 SPI1.Direction=SPI_DIRECTION_2LINES
 SPI1.Direction=SPI_DIRECTION_2LINES
 SPI1.IPParameters=VirtualType,Mode,Direction
 SPI1.IPParameters=VirtualType,Mode,Direction
 SPI1.Mode=SPI_MODE_MASTER
 SPI1.Mode=SPI_MODE_MASTER
 SPI1.VirtualType=VM_MASTER
 SPI1.VirtualType=VM_MASTER
+TIM2.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
+TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
+TIM2.IPParameters=Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3
+TIM3.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
+TIM3.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
+TIM3.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2
 USART2.IPParameters=VirtualMode
 USART2.IPParameters=VirtualMode
 USART2.VirtualMode=VM_ASYNC
 USART2.VirtualMode=VM_ASYNC
+VP_ADC1_TempSens_Input.Mode=IN-TempSens
+VP_ADC1_TempSens_Input.Signal=ADC1_TempSens_Input
+VP_ADC1_Vref_Input.Mode=IN-Vrefint
+VP_ADC1_Vref_Input.Signal=ADC1_Vref_Input
 VP_SYS_VS_Systick.Mode=SysTick
 VP_SYS_VS_Systick.Mode=SysTick
 VP_SYS_VS_Systick.Signal=SYS_VS_Systick
 VP_SYS_VS_Systick.Signal=SYS_VS_Systick
 board=custom
 board=custom

+ 2 - 2
bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/main.h

@@ -70,6 +70,8 @@ extern "C" {
 
 
 /* USER CODE END EM */
 /* USER CODE END EM */
 
 
+void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
+
 /* Exported functions prototypes ---------------------------------------------*/
 /* Exported functions prototypes ---------------------------------------------*/
 void Error_Handler(void);
 void Error_Handler(void);
 
 
@@ -87,5 +89,3 @@ void Error_Handler(void);
 #endif
 #endif
 
 
 #endif /* __MAIN_H */
 #endif /* __MAIN_H */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 120 - 80
bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h

@@ -1,36 +1,24 @@
+/* USER CODE BEGIN Header */
 /**
 /**
   ******************************************************************************
   ******************************************************************************
-  * @file    stm32f4xx_hal_conf.h
-  * @brief   HAL configuration file.             
+  * @file    stm32f4xx_hal_conf_template.h
+  * @author  MCD Application Team
+  * @brief   HAL configuration template file.
+  *          This file should be copied to the application folder and renamed
+  *          to stm32f4xx_hal_conf.h.
   ******************************************************************************
   ******************************************************************************
   * @attention
   * @attention
   *
   *
-  * <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
+  * Copyright (c) 2017 STMicroelectronics.
+  * All rights reserved.
   *
   *
-  * Redistribution and use in source and binary forms, with or without modification,
-  * are permitted provided that the following conditions are met:
-  *   1. Redistributions of source code must retain the above copyright notice,
-  *      this list of conditions and the following disclaimer.
-  *   2. Redistributions in binary form must reproduce the above copyright notice,
-  *      this list of conditions and the following disclaimer in the documentation
-  *      and/or other materials provided with the distribution.
-  *   3. Neither the name of STMicroelectronics nor the names of its contributors
-  *      may be used to endorse or promote products derived from this software
-  *      without specific prior written permission.
-  *
-  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  * This software is licensed under terms that can be found in the LICENSE file
+  * in the root directory of this software component.
+  * If no LICENSE file comes with this software, it is provided AS-IS.
   *
   *
   ******************************************************************************
   ******************************************************************************
-  */ 
+  */
+/* USER CODE END Header */
 
 
 /* Define to prevent recursive inclusion -------------------------------------*/
 /* Define to prevent recursive inclusion -------------------------------------*/
 #ifndef __STM32F4xx_HAL_CONF_H
 #ifndef __STM32F4xx_HAL_CONF_H
@@ -45,14 +33,15 @@
 
 
 /* ########################## Module Selection ############################## */
 /* ########################## Module Selection ############################## */
 /**
 /**
-  * @brief This is the list of modules to be used in the HAL driver 
+  * @brief This is the list of modules to be used in the HAL driver
   */
   */
-#define HAL_MODULE_ENABLED  
+#define HAL_MODULE_ENABLED
 
 
-/* #define HAL_ADC_MODULE_ENABLED   */
+  #define HAL_ADC_MODULE_ENABLED
 /* #define HAL_CRYP_MODULE_ENABLED   */
 /* #define HAL_CRYP_MODULE_ENABLED   */
 /* #define HAL_CAN_MODULE_ENABLED   */
 /* #define HAL_CAN_MODULE_ENABLED   */
 /* #define HAL_CRC_MODULE_ENABLED   */
 /* #define HAL_CRC_MODULE_ENABLED   */
+/* #define HAL_CAN_LEGACY_MODULE_ENABLED   */
 /* #define HAL_CRYP_MODULE_ENABLED   */
 /* #define HAL_CRYP_MODULE_ENABLED   */
 /* #define HAL_DAC_MODULE_ENABLED   */
 /* #define HAL_DAC_MODULE_ENABLED   */
 /* #define HAL_DCMI_MODULE_ENABLED   */
 /* #define HAL_DCMI_MODULE_ENABLED   */
@@ -74,11 +63,12 @@
 /* #define HAL_SD_MODULE_ENABLED   */
 /* #define HAL_SD_MODULE_ENABLED   */
 /* #define HAL_MMC_MODULE_ENABLED   */
 /* #define HAL_MMC_MODULE_ENABLED   */
 #define HAL_SPI_MODULE_ENABLED
 #define HAL_SPI_MODULE_ENABLED
-/* #define HAL_TIM_MODULE_ENABLED   */
+#define HAL_TIM_MODULE_ENABLED
 #define HAL_UART_MODULE_ENABLED
 #define HAL_UART_MODULE_ENABLED
 /* #define HAL_USART_MODULE_ENABLED   */
 /* #define HAL_USART_MODULE_ENABLED   */
 /* #define HAL_IRDA_MODULE_ENABLED   */
 /* #define HAL_IRDA_MODULE_ENABLED   */
 /* #define HAL_SMARTCARD_MODULE_ENABLED   */
 /* #define HAL_SMARTCARD_MODULE_ENABLED   */
+/* #define HAL_SMBUS_MODULE_ENABLED   */
 /* #define HAL_WWDG_MODULE_ENABLED   */
 /* #define HAL_WWDG_MODULE_ENABLED   */
 /* #define HAL_PCD_MODULE_ENABLED   */
 /* #define HAL_PCD_MODULE_ENABLED   */
 /* #define HAL_HCD_MODULE_ENABLED   */
 /* #define HAL_HCD_MODULE_ENABLED   */
@@ -87,11 +77,12 @@
 /* #define HAL_QSPI_MODULE_ENABLED   */
 /* #define HAL_QSPI_MODULE_ENABLED   */
 /* #define HAL_CEC_MODULE_ENABLED   */
 /* #define HAL_CEC_MODULE_ENABLED   */
 /* #define HAL_FMPI2C_MODULE_ENABLED   */
 /* #define HAL_FMPI2C_MODULE_ENABLED   */
+/* #define HAL_FMPSMBUS_MODULE_ENABLED   */
 /* #define HAL_SPDIFRX_MODULE_ENABLED   */
 /* #define HAL_SPDIFRX_MODULE_ENABLED   */
 /* #define HAL_DFSDM_MODULE_ENABLED   */
 /* #define HAL_DFSDM_MODULE_ENABLED   */
 /* #define HAL_LPTIM_MODULE_ENABLED   */
 /* #define HAL_LPTIM_MODULE_ENABLED   */
-/* #define HAL_EXTI_MODULE_ENABLED   */
 #define HAL_GPIO_MODULE_ENABLED
 #define HAL_GPIO_MODULE_ENABLED
+#define HAL_EXTI_MODULE_ENABLED
 #define HAL_DMA_MODULE_ENABLED
 #define HAL_DMA_MODULE_ENABLED
 #define HAL_RCC_MODULE_ENABLED
 #define HAL_RCC_MODULE_ENABLED
 #define HAL_FLASH_MODULE_ENABLED
 #define HAL_FLASH_MODULE_ENABLED
@@ -102,20 +93,20 @@
 /**
 /**
   * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
   * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
   *        This value is used by the RCC HAL module to compute the system frequency
   *        This value is used by the RCC HAL module to compute the system frequency
-  *        (when HSE is used as system clock source, directly or through the PLL).  
+  *        (when HSE is used as system clock source, directly or through the PLL).
   */
   */
-#if !defined  (HSE_VALUE) 
-  #define HSE_VALUE    ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */
+#if !defined  (HSE_VALUE)
+  #define HSE_VALUE    8000000U /*!< Value of the External oscillator in Hz */
 #endif /* HSE_VALUE */
 #endif /* HSE_VALUE */
 
 
 #if !defined  (HSE_STARTUP_TIMEOUT)
 #if !defined  (HSE_STARTUP_TIMEOUT)
-  #define HSE_STARTUP_TIMEOUT    ((uint32_t)100U)   /*!< Time out for HSE start up, in ms */
+  #define HSE_STARTUP_TIMEOUT    100U   /*!< Time out for HSE start up, in ms */
 #endif /* HSE_STARTUP_TIMEOUT */
 #endif /* HSE_STARTUP_TIMEOUT */
 
 
 /**
 /**
   * @brief Internal High Speed oscillator (HSI) value.
   * @brief Internal High Speed oscillator (HSI) value.
   *        This value is used by the RCC HAL module to compute the system frequency
   *        This value is used by the RCC HAL module to compute the system frequency
-  *        (when HSI is used as system clock source, directly or through the PLL). 
+  *        (when HSI is used as system clock source, directly or through the PLL).
   */
   */
 #if !defined  (HSI_VALUE)
 #if !defined  (HSI_VALUE)
   #define HSI_VALUE    ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
   #define HSI_VALUE    ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
@@ -124,8 +115,8 @@
 /**
 /**
   * @brief Internal Low Speed oscillator (LSI) value.
   * @brief Internal Low Speed oscillator (LSI) value.
   */
   */
-#if !defined  (LSI_VALUE) 
- #define LSI_VALUE  ((uint32_t)32000U)       /*!< LSI Typical Value in Hz*/
+#if !defined  (LSI_VALUE)
+ #define LSI_VALUE  32000U       /*!< LSI Typical Value in Hz*/
 #endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz
 #endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz
                                              The real value may vary depending on the variations
                                              The real value may vary depending on the variations
                                              in voltage and temperature.*/
                                              in voltage and temperature.*/
@@ -133,20 +124,20 @@
   * @brief External Low Speed oscillator (LSE) value.
   * @brief External Low Speed oscillator (LSE) value.
   */
   */
 #if !defined  (LSE_VALUE)
 #if !defined  (LSE_VALUE)
- #define LSE_VALUE  ((uint32_t)32768U)    /*!< Value of the External Low Speed oscillator in Hz */
+ #define LSE_VALUE  32768U    /*!< Value of the External Low Speed oscillator in Hz */
 #endif /* LSE_VALUE */
 #endif /* LSE_VALUE */
 
 
 #if !defined  (LSE_STARTUP_TIMEOUT)
 #if !defined  (LSE_STARTUP_TIMEOUT)
-  #define LSE_STARTUP_TIMEOUT    ((uint32_t)5000U)   /*!< Time out for LSE start up, in ms */
+  #define LSE_STARTUP_TIMEOUT    5000U   /*!< Time out for LSE start up, in ms */
 #endif /* LSE_STARTUP_TIMEOUT */
 #endif /* LSE_STARTUP_TIMEOUT */
 
 
 /**
 /**
   * @brief External clock source for I2S peripheral
   * @brief External clock source for I2S peripheral
-  *        This value is used by the I2S HAL module to compute the I2S clock source 
-  *        frequency, this source is inserted directly through I2S_CKIN pad. 
+  *        This value is used by the I2S HAL module to compute the I2S clock source
+  *        frequency, this source is inserted directly through I2S_CKIN pad.
   */
   */
 #if !defined  (EXTERNAL_CLOCK_VALUE)
 #if !defined  (EXTERNAL_CLOCK_VALUE)
-  #define EXTERNAL_CLOCK_VALUE    ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/
+  #define EXTERNAL_CLOCK_VALUE    12288000U /*!< Value of the External audio frequency in Hz*/
 #endif /* EXTERNAL_CLOCK_VALUE */
 #endif /* EXTERNAL_CLOCK_VALUE */
 
 
 /* Tip: To avoid modifying this file each time you need to use different HSE,
 /* Tip: To avoid modifying this file each time you need to use different HSE,
@@ -156,16 +147,56 @@
 /**
 /**
   * @brief This is the HAL system configuration section
   * @brief This is the HAL system configuration section
   */
   */
-#define  VDD_VALUE		      ((uint32_t)3300U) /*!< Value of VDD in mv */           
-#define  TICK_INT_PRIORITY            ((uint32_t)0U)   /*!< tick interrupt priority */            
-#define  USE_RTOS                     0U     
+#define  VDD_VALUE		      3300U /*!< Value of VDD in mv */
+#define  TICK_INT_PRIORITY            0U   /*!< tick interrupt priority */
+#define  USE_RTOS                     0U
 #define  PREFETCH_ENABLE              1U
 #define  PREFETCH_ENABLE              1U
 #define  INSTRUCTION_CACHE_ENABLE     1U
 #define  INSTRUCTION_CACHE_ENABLE     1U
 #define  DATA_CACHE_ENABLE            1U
 #define  DATA_CACHE_ENABLE            1U
 
 
+#define  USE_HAL_ADC_REGISTER_CALLBACKS         0U /* ADC register callback disabled       */
+#define  USE_HAL_CAN_REGISTER_CALLBACKS         0U /* CAN register callback disabled       */
+#define  USE_HAL_CEC_REGISTER_CALLBACKS         0U /* CEC register callback disabled       */
+#define  USE_HAL_CRYP_REGISTER_CALLBACKS        0U /* CRYP register callback disabled      */
+#define  USE_HAL_DAC_REGISTER_CALLBACKS         0U /* DAC register callback disabled       */
+#define  USE_HAL_DCMI_REGISTER_CALLBACKS        0U /* DCMI register callback disabled      */
+#define  USE_HAL_DFSDM_REGISTER_CALLBACKS       0U /* DFSDM register callback disabled     */
+#define  USE_HAL_DMA2D_REGISTER_CALLBACKS       0U /* DMA2D register callback disabled     */
+#define  USE_HAL_DSI_REGISTER_CALLBACKS         0U /* DSI register callback disabled       */
+#define  USE_HAL_ETH_REGISTER_CALLBACKS         0U /* ETH register callback disabled       */
+#define  USE_HAL_HASH_REGISTER_CALLBACKS        0U /* HASH register callback disabled      */
+#define  USE_HAL_HCD_REGISTER_CALLBACKS         0U /* HCD register callback disabled       */
+#define  USE_HAL_I2C_REGISTER_CALLBACKS         0U /* I2C register callback disabled       */
+#define  USE_HAL_FMPI2C_REGISTER_CALLBACKS      0U /* FMPI2C register callback disabled    */
+#define  USE_HAL_FMPSMBUS_REGISTER_CALLBACKS    0U /* FMPSMBUS register callback disabled  */
+#define  USE_HAL_I2S_REGISTER_CALLBACKS         0U /* I2S register callback disabled       */
+#define  USE_HAL_IRDA_REGISTER_CALLBACKS        0U /* IRDA register callback disabled      */
+#define  USE_HAL_LPTIM_REGISTER_CALLBACKS       0U /* LPTIM register callback disabled     */
+#define  USE_HAL_LTDC_REGISTER_CALLBACKS        0U /* LTDC register callback disabled      */
+#define  USE_HAL_MMC_REGISTER_CALLBACKS         0U /* MMC register callback disabled       */
+#define  USE_HAL_NAND_REGISTER_CALLBACKS        0U /* NAND register callback disabled      */
+#define  USE_HAL_NOR_REGISTER_CALLBACKS         0U /* NOR register callback disabled       */
+#define  USE_HAL_PCCARD_REGISTER_CALLBACKS      0U /* PCCARD register callback disabled    */
+#define  USE_HAL_PCD_REGISTER_CALLBACKS         0U /* PCD register callback disabled       */
+#define  USE_HAL_QSPI_REGISTER_CALLBACKS        0U /* QSPI register callback disabled      */
+#define  USE_HAL_RNG_REGISTER_CALLBACKS         0U /* RNG register callback disabled       */
+#define  USE_HAL_RTC_REGISTER_CALLBACKS         0U /* RTC register callback disabled       */
+#define  USE_HAL_SAI_REGISTER_CALLBACKS         0U /* SAI register callback disabled       */
+#define  USE_HAL_SD_REGISTER_CALLBACKS          0U /* SD register callback disabled        */
+#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS   0U /* SMARTCARD register callback disabled */
+#define  USE_HAL_SDRAM_REGISTER_CALLBACKS       0U /* SDRAM register callback disabled     */
+#define  USE_HAL_SRAM_REGISTER_CALLBACKS        0U /* SRAM register callback disabled      */
+#define  USE_HAL_SPDIFRX_REGISTER_CALLBACKS     0U /* SPDIFRX register callback disabled   */
+#define  USE_HAL_SMBUS_REGISTER_CALLBACKS       0U /* SMBUS register callback disabled     */
+#define  USE_HAL_SPI_REGISTER_CALLBACKS         0U /* SPI register callback disabled       */
+#define  USE_HAL_TIM_REGISTER_CALLBACKS         0U /* TIM register callback disabled       */
+#define  USE_HAL_UART_REGISTER_CALLBACKS        0U /* UART register callback disabled      */
+#define  USE_HAL_USART_REGISTER_CALLBACKS       0U /* USART register callback disabled     */
+#define  USE_HAL_WWDG_REGISTER_CALLBACKS        0U /* WWDG register callback disabled      */
+
 /* ########################## Assert Selection ############################## */
 /* ########################## Assert Selection ############################## */
 /**
 /**
-  * @brief Uncomment the line below to expanse the "assert_param" macro in the 
+  * @brief Uncomment the line below to expanse the "assert_param" macro in the
   *        HAL drivers code
   *        HAL drivers code
   */
   */
 /* #define USE_FULL_ASSERT    1U */
 /* #define USE_FULL_ASSERT    1U */
@@ -182,29 +213,29 @@
 #define MAC_ADDR4   0U
 #define MAC_ADDR4   0U
 #define MAC_ADDR5   0U
 #define MAC_ADDR5   0U
 
 
-/* Definition of the Ethernet driver buffers size and count */   
+/* Definition of the Ethernet driver buffers size and count */
 #define ETH_RX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for receive               */
 #define ETH_RX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for receive               */
 #define ETH_TX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for transmit              */
 #define ETH_TX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for transmit              */
-#define ETH_RXBUFNB                    ((uint32_t)4U)       /* 4 Rx buffers of size ETH_RX_BUF_SIZE  */
-#define ETH_TXBUFNB                    ((uint32_t)4U)       /* 4 Tx buffers of size ETH_TX_BUF_SIZE  */
+#define ETH_RXBUFNB                    4U       /* 4 Rx buffers of size ETH_RX_BUF_SIZE  */
+#define ETH_TXBUFNB                    4U       /* 4 Tx buffers of size ETH_TX_BUF_SIZE  */
 
 
 /* Section 2: PHY configuration section */
 /* Section 2: PHY configuration section */
 
 
-/* DP83848_PHY_ADDRESS Address*/ 
+/* DP83848_PHY_ADDRESS Address*/
 #define DP83848_PHY_ADDRESS           0x01U
 #define DP83848_PHY_ADDRESS           0x01U
-/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ 
-#define PHY_RESET_DELAY                 ((uint32_t)0x000000FFU)
+/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
+#define PHY_RESET_DELAY                 0x000000FFU
 /* PHY Configuration delay */
 /* PHY Configuration delay */
-#define PHY_CONFIG_DELAY                ((uint32_t)0x00000FFFU)
+#define PHY_CONFIG_DELAY                0x00000FFFU
 
 
-#define PHY_READ_TO                     ((uint32_t)0x0000FFFFU)
-#define PHY_WRITE_TO                    ((uint32_t)0x0000FFFFU)
+#define PHY_READ_TO                     0x0000FFFFU
+#define PHY_WRITE_TO                    0x0000FFFFU
 
 
 /* Section 3: Common PHY Registers */
 /* Section 3: Common PHY Registers */
 
 
 #define PHY_BCR                         ((uint16_t)0x0000U)    /*!< Transceiver Basic Control Register   */
 #define PHY_BCR                         ((uint16_t)0x0000U)    /*!< Transceiver Basic Control Register   */
 #define PHY_BSR                         ((uint16_t)0x0001U)    /*!< Transceiver Basic Status Register    */
 #define PHY_BSR                         ((uint16_t)0x0001U)    /*!< Transceiver Basic Status Register    */
- 
+
 #define PHY_RESET                       ((uint16_t)0x8000U)  /*!< PHY Reset */
 #define PHY_RESET                       ((uint16_t)0x8000U)  /*!< PHY Reset */
 #define PHY_LOOPBACK                    ((uint16_t)0x4000U)  /*!< Select loop-back mode */
 #define PHY_LOOPBACK                    ((uint16_t)0x4000U)  /*!< Select loop-back mode */
 #define PHY_FULLDUPLEX_100M             ((uint16_t)0x2100U)  /*!< Set the full-duplex mode at 100 Mb/s */
 #define PHY_FULLDUPLEX_100M             ((uint16_t)0x2100U)  /*!< Set the full-duplex mode at 100 Mb/s */
@@ -219,7 +250,7 @@
 #define PHY_AUTONEGO_COMPLETE           ((uint16_t)0x0020U)  /*!< Auto-Negotiation process completed   */
 #define PHY_AUTONEGO_COMPLETE           ((uint16_t)0x0020U)  /*!< Auto-Negotiation process completed   */
 #define PHY_LINKED_STATUS               ((uint16_t)0x0004U)  /*!< Valid link established               */
 #define PHY_LINKED_STATUS               ((uint16_t)0x0004U)  /*!< Valid link established               */
 #define PHY_JABBER_DETECTION            ((uint16_t)0x0002U)  /*!< Jabber condition detected            */
 #define PHY_JABBER_DETECTION            ((uint16_t)0x0002U)  /*!< Jabber condition detected            */
-  
+
 /* Section 4: Extended PHY Registers */
 /* Section 4: Extended PHY Registers */
 #define PHY_SR                          ((uint16_t)0x10U)    /*!< PHY status register Offset                      */
 #define PHY_SR                          ((uint16_t)0x10U)    /*!< PHY status register Offset                      */
 
 
@@ -237,25 +268,25 @@
 
 
 /* Includes ------------------------------------------------------------------*/
 /* Includes ------------------------------------------------------------------*/
 /**
 /**
-  * @brief Include module's header file 
+  * @brief Include module's header file
   */
   */
 
 
 #ifdef HAL_RCC_MODULE_ENABLED
 #ifdef HAL_RCC_MODULE_ENABLED
   #include "stm32f4xx_hal_rcc.h"
   #include "stm32f4xx_hal_rcc.h"
 #endif /* HAL_RCC_MODULE_ENABLED */
 #endif /* HAL_RCC_MODULE_ENABLED */
 
 
-#ifdef HAL_EXTI_MODULE_ENABLED
-  #include "stm32f4xx_hal_exti.h"
-#endif /* HAL_EXTI_MODULE_ENABLED */
-
 #ifdef HAL_GPIO_MODULE_ENABLED
 #ifdef HAL_GPIO_MODULE_ENABLED
   #include "stm32f4xx_hal_gpio.h"
   #include "stm32f4xx_hal_gpio.h"
 #endif /* HAL_GPIO_MODULE_ENABLED */
 #endif /* HAL_GPIO_MODULE_ENABLED */
 
 
+#ifdef HAL_EXTI_MODULE_ENABLED
+  #include "stm32f4xx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
 #ifdef HAL_DMA_MODULE_ENABLED
 #ifdef HAL_DMA_MODULE_ENABLED
   #include "stm32f4xx_hal_dma.h"
   #include "stm32f4xx_hal_dma.h"
 #endif /* HAL_DMA_MODULE_ENABLED */
 #endif /* HAL_DMA_MODULE_ENABLED */
-   
+
 #ifdef HAL_CORTEX_MODULE_ENABLED
 #ifdef HAL_CORTEX_MODULE_ENABLED
   #include "stm32f4xx_hal_cortex.h"
   #include "stm32f4xx_hal_cortex.h"
 #endif /* HAL_CORTEX_MODULE_ENABLED */
 #endif /* HAL_CORTEX_MODULE_ENABLED */
@@ -268,12 +299,16 @@
   #include "stm32f4xx_hal_can.h"
   #include "stm32f4xx_hal_can.h"
 #endif /* HAL_CAN_MODULE_ENABLED */
 #endif /* HAL_CAN_MODULE_ENABLED */
 
 
+#ifdef HAL_CAN_LEGACY_MODULE_ENABLED
+  #include "stm32f4xx_hal_can_legacy.h"
+#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */
+
 #ifdef HAL_CRC_MODULE_ENABLED
 #ifdef HAL_CRC_MODULE_ENABLED
   #include "stm32f4xx_hal_crc.h"
   #include "stm32f4xx_hal_crc.h"
 #endif /* HAL_CRC_MODULE_ENABLED */
 #endif /* HAL_CRC_MODULE_ENABLED */
 
 
 #ifdef HAL_CRYP_MODULE_ENABLED
 #ifdef HAL_CRYP_MODULE_ENABLED
-  #include "stm32f4xx_hal_cryp.h" 
+  #include "stm32f4xx_hal_cryp.h"
 #endif /* HAL_CRYP_MODULE_ENABLED */
 #endif /* HAL_CRYP_MODULE_ENABLED */
 
 
 #ifdef HAL_DMA2D_MODULE_ENABLED
 #ifdef HAL_DMA2D_MODULE_ENABLED
@@ -295,7 +330,7 @@
 #ifdef HAL_FLASH_MODULE_ENABLED
 #ifdef HAL_FLASH_MODULE_ENABLED
   #include "stm32f4xx_hal_flash.h"
   #include "stm32f4xx_hal_flash.h"
 #endif /* HAL_FLASH_MODULE_ENABLED */
 #endif /* HAL_FLASH_MODULE_ENABLED */
- 
+
 #ifdef HAL_SRAM_MODULE_ENABLED
 #ifdef HAL_SRAM_MODULE_ENABLED
   #include "stm32f4xx_hal_sram.h"
   #include "stm32f4xx_hal_sram.h"
 #endif /* HAL_SRAM_MODULE_ENABLED */
 #endif /* HAL_SRAM_MODULE_ENABLED */
@@ -310,11 +345,11 @@
 
 
 #ifdef HAL_PCCARD_MODULE_ENABLED
 #ifdef HAL_PCCARD_MODULE_ENABLED
   #include "stm32f4xx_hal_pccard.h"
   #include "stm32f4xx_hal_pccard.h"
-#endif /* HAL_PCCARD_MODULE_ENABLED */ 
-  
+#endif /* HAL_PCCARD_MODULE_ENABLED */
+
 #ifdef HAL_SDRAM_MODULE_ENABLED
 #ifdef HAL_SDRAM_MODULE_ENABLED
   #include "stm32f4xx_hal_sdram.h"
   #include "stm32f4xx_hal_sdram.h"
-#endif /* HAL_SDRAM_MODULE_ENABLED */      
+#endif /* HAL_SDRAM_MODULE_ENABLED */
 
 
 #ifdef HAL_HASH_MODULE_ENABLED
 #ifdef HAL_HASH_MODULE_ENABLED
  #include "stm32f4xx_hal_hash.h"
  #include "stm32f4xx_hal_hash.h"
@@ -324,6 +359,10 @@
  #include "stm32f4xx_hal_i2c.h"
  #include "stm32f4xx_hal_i2c.h"
 #endif /* HAL_I2C_MODULE_ENABLED */
 #endif /* HAL_I2C_MODULE_ENABLED */
 
 
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32f4xx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
 #ifdef HAL_I2S_MODULE_ENABLED
 #ifdef HAL_I2S_MODULE_ENABLED
  #include "stm32f4xx_hal_i2s.h"
  #include "stm32f4xx_hal_i2s.h"
 #endif /* HAL_I2S_MODULE_ENABLED */
 #endif /* HAL_I2S_MODULE_ENABLED */
@@ -356,10 +395,6 @@
  #include "stm32f4xx_hal_sd.h"
  #include "stm32f4xx_hal_sd.h"
 #endif /* HAL_SD_MODULE_ENABLED */
 #endif /* HAL_SD_MODULE_ENABLED */
 
 
-#ifdef HAL_MMC_MODULE_ENABLED
- #include "stm32f4xx_hal_mmc.h"
-#endif /* HAL_MMC_MODULE_ENABLED */
-
 #ifdef HAL_SPI_MODULE_ENABLED
 #ifdef HAL_SPI_MODULE_ENABLED
  #include "stm32f4xx_hal_spi.h"
  #include "stm32f4xx_hal_spi.h"
 #endif /* HAL_SPI_MODULE_ENABLED */
 #endif /* HAL_SPI_MODULE_ENABLED */
@@ -395,7 +430,7 @@
 #ifdef HAL_HCD_MODULE_ENABLED
 #ifdef HAL_HCD_MODULE_ENABLED
  #include "stm32f4xx_hal_hcd.h"
  #include "stm32f4xx_hal_hcd.h"
 #endif /* HAL_HCD_MODULE_ENABLED */
 #endif /* HAL_HCD_MODULE_ENABLED */
-   
+
 #ifdef HAL_DSI_MODULE_ENABLED
 #ifdef HAL_DSI_MODULE_ENABLED
  #include "stm32f4xx_hal_dsi.h"
  #include "stm32f4xx_hal_dsi.h"
 #endif /* HAL_DSI_MODULE_ENABLED */
 #endif /* HAL_DSI_MODULE_ENABLED */
@@ -412,6 +447,10 @@
  #include "stm32f4xx_hal_fmpi2c.h"
  #include "stm32f4xx_hal_fmpi2c.h"
 #endif /* HAL_FMPI2C_MODULE_ENABLED */
 #endif /* HAL_FMPI2C_MODULE_ENABLED */
 
 
+#ifdef HAL_FMPSMBUS_MODULE_ENABLED
+ #include "stm32f4xx_hal_fmpsmbus.h"
+#endif /* HAL_FMPSMBUS_MODULE_ENABLED */
+
 #ifdef HAL_SPDIFRX_MODULE_ENABLED
 #ifdef HAL_SPDIFRX_MODULE_ENABLED
  #include "stm32f4xx_hal_spdifrx.h"
  #include "stm32f4xx_hal_spdifrx.h"
 #endif /* HAL_SPDIFRX_MODULE_ENABLED */
 #endif /* HAL_SPDIFRX_MODULE_ENABLED */
@@ -423,14 +462,18 @@
 #ifdef HAL_LPTIM_MODULE_ENABLED
 #ifdef HAL_LPTIM_MODULE_ENABLED
  #include "stm32f4xx_hal_lptim.h"
  #include "stm32f4xx_hal_lptim.h"
 #endif /* HAL_LPTIM_MODULE_ENABLED */
 #endif /* HAL_LPTIM_MODULE_ENABLED */
-   
+
+#ifdef HAL_MMC_MODULE_ENABLED
+ #include "stm32f4xx_hal_mmc.h"
+#endif /* HAL_MMC_MODULE_ENABLED */
+
 /* Exported macro ------------------------------------------------------------*/
 /* Exported macro ------------------------------------------------------------*/
 #ifdef  USE_FULL_ASSERT
 #ifdef  USE_FULL_ASSERT
 /**
 /**
   * @brief  The assert_param macro is used for function's parameters check.
   * @brief  The assert_param macro is used for function's parameters check.
-  * @param  expr: If expr is false, it calls assert_failed function
+  * @param  expr If expr is false, it calls assert_failed function
   *         which reports the name of the source file and the source
   *         which reports the name of the source file and the source
-  *         line number of the call that failed. 
+  *         line number of the call that failed.
   *         If expr is true, it returns no value.
   *         If expr is true, it returns no value.
   * @retval None
   * @retval None
   */
   */
@@ -439,13 +482,10 @@
   void assert_failed(uint8_t* file, uint32_t line);
   void assert_failed(uint8_t* file, uint32_t line);
 #else
 #else
   #define assert_param(expr) ((void)0U)
   #define assert_param(expr) ((void)0U)
-#endif /* USE_FULL_ASSERT */    
+#endif /* USE_FULL_ASSERT */
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }
 #endif
 #endif
 
 
 #endif /* __STM32F4xx_HAL_CONF_H */
 #endif /* __STM32F4xx_HAL_CONF_H */
- 
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 1 - 3
bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h

@@ -39,7 +39,7 @@
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
  extern "C" {
  extern "C" {
-#endif 
+#endif
 
 
 /* Private includes ----------------------------------------------------------*/
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
 /* USER CODE BEGIN Includes */
@@ -80,5 +80,3 @@ void SysTick_Handler(void);
 #endif
 #endif
 
 
 #endif /* __STM32F4xx_IT_H */
 #endif /* __STM32F4xx_IT_H */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 177 - 7
bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/main.c

@@ -37,7 +37,6 @@
   ******************************************************************************
   ******************************************************************************
   */
   */
 /* USER CODE END Header */
 /* USER CODE END Header */
-
 /* Includes ------------------------------------------------------------------*/
 /* Includes ------------------------------------------------------------------*/
 #include "main.h"
 #include "main.h"
 
 
@@ -62,8 +61,13 @@
 /* USER CODE END PM */
 /* USER CODE END PM */
 
 
 /* Private variables ---------------------------------------------------------*/
 /* Private variables ---------------------------------------------------------*/
+ ADC_HandleTypeDef hadc1;
+
 SPI_HandleTypeDef hspi1;
 SPI_HandleTypeDef hspi1;
 
 
+TIM_HandleTypeDef htim2;
+TIM_HandleTypeDef htim3;
+
 UART_HandleTypeDef huart2;
 UART_HandleTypeDef huart2;
 
 
 /* USER CODE BEGIN PV */
 /* USER CODE BEGIN PV */
@@ -75,6 +79,9 @@ void SystemClock_Config(void);
 static void MX_GPIO_Init(void);
 static void MX_GPIO_Init(void);
 static void MX_USART2_UART_Init(void);
 static void MX_USART2_UART_Init(void);
 static void MX_SPI1_Init(void);
 static void MX_SPI1_Init(void);
+static void MX_ADC1_Init(void);
+static void MX_TIM2_Init(void);
+static void MX_TIM3_Init(void);
 /* USER CODE BEGIN PFP */
 /* USER CODE BEGIN PFP */
 
 
 /* USER CODE END PFP */
 /* USER CODE END PFP */
@@ -114,6 +121,9 @@ int main(void)
   MX_GPIO_Init();
   MX_GPIO_Init();
   MX_USART2_UART_Init();
   MX_USART2_UART_Init();
   MX_SPI1_Init();
   MX_SPI1_Init();
+  MX_ADC1_Init();
+  MX_TIM2_Init();
+  MX_TIM3_Init();
   /* USER CODE BEGIN 2 */
   /* USER CODE BEGIN 2 */
 
 
   /* USER CODE END 2 */
   /* USER CODE END 2 */
@@ -142,11 +152,13 @@ void SystemClock_Config(void)
   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 
 
-  /** Configure the main internal regulator output voltage 
+  /** Configure the main internal regulator output voltage
   */
   */
   __HAL_RCC_PWR_CLK_ENABLE();
   __HAL_RCC_PWR_CLK_ENABLE();
   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
-  /** Initializes the CPU, AHB and APB busses clocks 
+
+  /** Initializes the RCC Oscillators according to the specified parameters
+  * in the RCC_OscInitTypeDef structure.
   */
   */
   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
@@ -161,7 +173,8 @@ void SystemClock_Config(void)
   {
   {
     Error_Handler();
     Error_Handler();
   }
   }
-  /** Initializes the CPU, AHB and APB busses clocks 
+
+  /** Initializes the CPU, AHB and APB buses clocks
   */
   */
   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
@@ -176,6 +189,58 @@ void SystemClock_Config(void)
   }
   }
 }
 }
 
 
+/**
+  * @brief ADC1 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void MX_ADC1_Init(void)
+{
+
+  /* USER CODE BEGIN ADC1_Init 0 */
+
+  /* USER CODE END ADC1_Init 0 */
+
+  ADC_ChannelConfTypeDef sConfig = {0};
+
+  /* USER CODE BEGIN ADC1_Init 1 */
+
+  /* USER CODE END ADC1_Init 1 */
+
+  /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
+  */
+  hadc1.Instance = ADC1;
+  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
+  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
+  hadc1.Init.ScanConvMode = DISABLE;
+  hadc1.Init.ContinuousConvMode = DISABLE;
+  hadc1.Init.DiscontinuousConvMode = DISABLE;
+  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
+  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
+  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
+  hadc1.Init.NbrOfConversion = 1;
+  hadc1.Init.DMAContinuousRequests = DISABLE;
+  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
+  if (HAL_ADC_Init(&hadc1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
+  */
+  sConfig.Channel = ADC_CHANNEL_0;
+  sConfig.Rank = 1;
+  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
+  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /* USER CODE BEGIN ADC1_Init 2 */
+
+  /* USER CODE END ADC1_Init 2 */
+
+}
+
 /**
 /**
   * @brief SPI1 Initialization Function
   * @brief SPI1 Initialization Function
   * @param None
   * @param None
@@ -214,6 +279,112 @@ static void MX_SPI1_Init(void)
 
 
 }
 }
 
 
+/**
+  * @brief TIM2 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void MX_TIM2_Init(void)
+{
+
+  /* USER CODE BEGIN TIM2_Init 0 */
+
+  /* USER CODE END TIM2_Init 0 */
+
+  TIM_MasterConfigTypeDef sMasterConfig = {0};
+  TIM_OC_InitTypeDef sConfigOC = {0};
+
+  /* USER CODE BEGIN TIM2_Init 1 */
+
+  /* USER CODE END TIM2_Init 1 */
+  htim2.Instance = TIM2;
+  htim2.Init.Prescaler = 0;
+  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
+  htim2.Init.Period = 4294967295;
+  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sConfigOC.OCMode = TIM_OCMODE_PWM1;
+  sConfigOC.Pulse = 0;
+  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
+  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /* USER CODE BEGIN TIM2_Init 2 */
+
+  /* USER CODE END TIM2_Init 2 */
+  HAL_TIM_MspPostInit(&htim2);
+
+}
+
+/**
+  * @brief TIM3 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void MX_TIM3_Init(void)
+{
+
+  /* USER CODE BEGIN TIM3_Init 0 */
+
+  /* USER CODE END TIM3_Init 0 */
+
+  TIM_MasterConfigTypeDef sMasterConfig = {0};
+  TIM_OC_InitTypeDef sConfigOC = {0};
+
+  /* USER CODE BEGIN TIM3_Init 1 */
+
+  /* USER CODE END TIM3_Init 1 */
+  htim3.Instance = TIM3;
+  htim3.Init.Prescaler = 0;
+  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
+  htim3.Init.Period = 65535;
+  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sConfigOC.OCMode = TIM_OCMODE_PWM1;
+  sConfigOC.Pulse = 0;
+  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
+  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /* USER CODE BEGIN TIM3_Init 2 */
+
+  /* USER CODE END TIM3_Init 2 */
+  HAL_TIM_MspPostInit(&htim3);
+
+}
+
 /**
 /**
   * @brief USART2 Initialization Function
   * @brief USART2 Initialization Function
   * @param None
   * @param None
@@ -259,6 +430,7 @@ static void MX_GPIO_Init(void)
   __HAL_RCC_GPIOC_CLK_ENABLE();
   __HAL_RCC_GPIOC_CLK_ENABLE();
   __HAL_RCC_GPIOH_CLK_ENABLE();
   __HAL_RCC_GPIOH_CLK_ENABLE();
   __HAL_RCC_GPIOA_CLK_ENABLE();
   __HAL_RCC_GPIOA_CLK_ENABLE();
+  __HAL_RCC_GPIOB_CLK_ENABLE();
 
 
 }
 }
 
 
@@ -287,12 +459,10 @@ void Error_Handler(void)
   * @retval None
   * @retval None
   */
   */
 void assert_failed(uint8_t *file, uint32_t line)
 void assert_failed(uint8_t *file, uint32_t line)
-{ 
+{
   /* USER CODE BEGIN 6 */
   /* USER CODE BEGIN 6 */
   /* User can add his own implementation to report the file name and line number,
   /* User can add his own implementation to report the file name and line number,
      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
   /* USER CODE END 6 */
   /* USER CODE END 6 */
 }
 }
 #endif /* USE_FULL_ASSERT */
 #endif /* USE_FULL_ASSERT */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 212 - 3
bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c

@@ -78,7 +78,9 @@
 /* USER CODE BEGIN 0 */
 /* USER CODE BEGIN 0 */
 
 
 /* USER CODE END 0 */
 /* USER CODE END 0 */
-/**
+
+void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
+                                        /**
   * Initializes the Global MSP.
   * Initializes the Global MSP.
   */
   */
 void HAL_MspInit(void)
 void HAL_MspInit(void)
@@ -97,6 +99,93 @@ void HAL_MspInit(void)
   /* USER CODE END MspInit 1 */
   /* USER CODE END MspInit 1 */
 }
 }
 
 
+/**
+* @brief ADC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hadc: ADC handle pointer
+* @retval None
+*/
+void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
+{
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  if(hadc->Instance==ADC1)
+  {
+  /* USER CODE BEGIN ADC1_MspInit 0 */
+
+  /* USER CODE END ADC1_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_ADC1_CLK_ENABLE();
+
+    __HAL_RCC_GPIOC_CLK_ENABLE();
+    __HAL_RCC_GPIOA_CLK_ENABLE();
+    __HAL_RCC_GPIOB_CLK_ENABLE();
+    /**ADC1 GPIO Configuration
+    PC0     ------> ADC1_IN10
+    PC1     ------> ADC1_IN11
+    PA0-WKUP     ------> ADC1_IN0
+    PA1     ------> ADC1_IN1
+    PA4     ------> ADC1_IN4
+    PB0     ------> ADC1_IN8
+    */
+    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
+    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4;
+    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_0;
+    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+  /* USER CODE BEGIN ADC1_MspInit 1 */
+
+  /* USER CODE END ADC1_MspInit 1 */
+  }
+
+}
+
+/**
+* @brief ADC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hadc: ADC handle pointer
+* @retval None
+*/
+void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
+{
+  if(hadc->Instance==ADC1)
+  {
+  /* USER CODE BEGIN ADC1_MspDeInit 0 */
+
+  /* USER CODE END ADC1_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_ADC1_CLK_DISABLE();
+
+    /**ADC1 GPIO Configuration
+    PC0     ------> ADC1_IN10
+    PC1     ------> ADC1_IN11
+    PA0-WKUP     ------> ADC1_IN0
+    PA1     ------> ADC1_IN1
+    PA4     ------> ADC1_IN4
+    PB0     ------> ADC1_IN8
+    */
+    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1);
+
+    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4);
+
+    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0);
+
+  /* USER CODE BEGIN ADC1_MspDeInit 1 */
+
+  /* USER CODE END ADC1_MspDeInit 1 */
+  }
+
+}
+
 /**
 /**
 * @brief SPI MSP Initialization
 * @brief SPI MSP Initialization
 * This function configures the hardware resources used in this example
 * This function configures the hardware resources used in this example
@@ -164,6 +253,128 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
 
 
 }
 }
 
 
+/**
+* @brief TIM_PWM MSP Initialization
+* This function configures the hardware resources used in this example
+* @param htim_pwm: TIM_PWM handle pointer
+* @retval None
+*/
+void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
+{
+  if(htim_pwm->Instance==TIM2)
+  {
+  /* USER CODE BEGIN TIM2_MspInit 0 */
+
+  /* USER CODE END TIM2_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_TIM2_CLK_ENABLE();
+  /* USER CODE BEGIN TIM2_MspInit 1 */
+
+  /* USER CODE END TIM2_MspInit 1 */
+  }
+  else if(htim_pwm->Instance==TIM3)
+  {
+  /* USER CODE BEGIN TIM3_MspInit 0 */
+
+  /* USER CODE END TIM3_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_TIM3_CLK_ENABLE();
+  /* USER CODE BEGIN TIM3_MspInit 1 */
+
+  /* USER CODE END TIM3_MspInit 1 */
+  }
+
+}
+
+void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
+{
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  if(htim->Instance==TIM2)
+  {
+  /* USER CODE BEGIN TIM2_MspPostInit 0 */
+
+  /* USER CODE END TIM2_MspPostInit 0 */
+    __HAL_RCC_GPIOB_CLK_ENABLE();
+    /**TIM2 GPIO Configuration
+    PB10     ------> TIM2_CH3
+    PB3     ------> TIM2_CH2
+    */
+    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_3;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
+    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+  /* USER CODE BEGIN TIM2_MspPostInit 1 */
+
+  /* USER CODE END TIM2_MspPostInit 1 */
+  }
+  else if(htim->Instance==TIM3)
+  {
+  /* USER CODE BEGIN TIM3_MspPostInit 0 */
+
+  /* USER CODE END TIM3_MspPostInit 0 */
+
+    __HAL_RCC_GPIOC_CLK_ENABLE();
+    __HAL_RCC_GPIOB_CLK_ENABLE();
+    /**TIM3 GPIO Configuration
+    PC7     ------> TIM3_CH2
+    PB4     ------> TIM3_CH1
+    */
+    GPIO_InitStruct.Pin = GPIO_PIN_7;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
+    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+    GPIO_InitStruct.Pin = GPIO_PIN_4;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
+    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
+  /* USER CODE BEGIN TIM3_MspPostInit 1 */
+
+  /* USER CODE END TIM3_MspPostInit 1 */
+  }
+
+}
+/**
+* @brief TIM_PWM MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param htim_pwm: TIM_PWM handle pointer
+* @retval None
+*/
+void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm)
+{
+  if(htim_pwm->Instance==TIM2)
+  {
+  /* USER CODE BEGIN TIM2_MspDeInit 0 */
+
+  /* USER CODE END TIM2_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_TIM2_CLK_DISABLE();
+  /* USER CODE BEGIN TIM2_MspDeInit 1 */
+
+  /* USER CODE END TIM2_MspDeInit 1 */
+  }
+  else if(htim_pwm->Instance==TIM3)
+  {
+  /* USER CODE BEGIN TIM3_MspDeInit 0 */
+
+  /* USER CODE END TIM3_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_TIM3_CLK_DISABLE();
+  /* USER CODE BEGIN TIM3_MspDeInit 1 */
+
+  /* USER CODE END TIM3_MspDeInit 1 */
+  }
+
+}
+
 /**
 /**
 * @brief UART MSP Initialization
 * @brief UART MSP Initialization
 * This function configures the hardware resources used in this example
 * This function configures the hardware resources used in this example
@@ -232,5 +443,3 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
 /* USER CODE BEGIN 1 */
 /* USER CODE BEGIN 1 */
 
 
 /* USER CODE END 1 */
 /* USER CODE END 1 */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 1 - 2
bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c

@@ -77,7 +77,7 @@
 /* USER CODE END EV */
 /* USER CODE END EV */
 
 
 /******************************************************************************/
 /******************************************************************************/
-/*           Cortex-M4 Processor Interruption and Exception Handlers          */ 
+/*           Cortex-M4 Processor Interruption and Exception Handlers          */
 /******************************************************************************/
 /******************************************************************************/
 /**
 /**
   * @brief This function handles Non maskable interrupt.
   * @brief This function handles Non maskable interrupt.
@@ -215,4 +215,3 @@ void SysTick_Handler(void)
 /* USER CODE BEGIN 1 */
 /* USER CODE BEGIN 1 */
 
 
 /* USER CODE END 1 */
 /* USER CODE END 1 */
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 86 - 12
bsp/stm32/stm32f401-st-nucleo/board/Kconfig

@@ -14,6 +14,29 @@ menu "Onboard Peripheral Drivers"
         select BSP_USING_UART2
         select BSP_USING_UART2
         default y
         default y
 
 
+   config BSP_USING_ARDUINO
+        bool "Support Arduino"
+        select PKG_USING_RTDUINO
+        select BSP_USING_GPIO
+        select BSP_USING_ADC
+        select BSP_USING_ADC1
+        select BSP_USING_PWM
+        select BSP_USING_PWM2
+        select BSP_USING_PWM2_CH2
+        select BSP_USING_PWM2_CH3
+        select BSP_USING_PWM3
+        select BSP_USING_PWM3_CH1
+        select BSP_USING_PWM3_CH2
+        select BSP_USING_I2C
+        select BSP_USING_I2C1
+        select BSP_USING_SPI
+        # select BSP_USING_SPI1
+        imply RTDUINO_USING_SERVO
+        imply RTDUINO_USING_WIRE
+        imply RTDUINO_USING_ADAFRUIT
+        imply RTUSING_USING_SPI
+        default n
+
 endmenu
 endmenu
 
 
 menu "On-chip Peripheral Drivers"
 menu "On-chip Peripheral Drivers"
@@ -37,7 +60,50 @@ menu "On-chip Peripheral Drivers"
                 depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA
                 depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA
                 default n
                 default n
         endif
         endif
-		
+
+    menuconfig BSP_USING_ADC
+        bool "Enable ADC"
+        default n
+        select RT_USING_ADC
+        if BSP_USING_ADC
+            config BSP_USING_ADC1
+                bool "Enable ADC1"
+                default n
+        endif
+
+    menuconfig BSP_USING_PWM
+        bool "Enable PWM"
+        default n
+        select RT_USING_PWM
+
+        if BSP_USING_PWM
+            menuconfig BSP_USING_PWM2
+                bool "Enable timer2 output PWM"
+                default n
+                if BSP_USING_PWM2
+                    config BSP_USING_PWM2_CH2
+                        bool "Enable PWM2 channel2"
+                        default n
+
+                    config BSP_USING_PWM2_CH3
+                        bool "Enable PWM2 channel3"
+                        default n
+                endif
+
+            menuconfig BSP_USING_PWM3
+                bool "Enable timer3 output PWM"
+                default n
+                if BSP_USING_PWM3
+                    config BSP_USING_PWM3_CH1
+                        bool "Enable PWM3 channel1"
+                        default n
+
+                    config BSP_USING_PWM3_CH2
+                        bool "Enable PWM3 channel2"
+                        default n
+                endif
+        endif
+
     menuconfig BSP_USING_SPI
     menuconfig BSP_USING_SPI
         bool "Enable SPI BUS"
         bool "Enable SPI BUS"
         default n
         default n
@@ -59,22 +125,30 @@ menu "On-chip Peripheral Drivers"
                 default n
                 default n
         endif
         endif
 
 
-    menuconfig BSP_USING_I2C1
-        bool "Enable I2C1 BUS (software simulation)"
+    menuconfig BSP_USING_I2C
+        bool "Enable I2C BUS"
         default n
         default n
         select RT_USING_I2C
         select RT_USING_I2C
         select RT_USING_I2C_BITOPS
         select RT_USING_I2C_BITOPS
         select RT_USING_PIN
         select RT_USING_PIN
-        if BSP_USING_I2C1
-            config BSP_I2C1_SCL_PIN
-                int "i2c1 scl pin number"
-                range 1 216
-                default 15
-            config BSP_I2C1_SDA_PIN
-                int "I2C1 sda pin number"
-                range 1 216
-                default 16
+
+        if BSP_USING_I2C
+            config BSP_USING_I2C1
+                bool "Enable I2C1 Bus (User I2C)"
+                default n
+                if BSP_USING_I2C1
+                    comment "Notice: PB9 --> 25; PB8 --> 24" 
+                    config BSP_I2C1_SCL_PIN
+                        int "i2c1 SCL pin number"
+                        range 1 176
+                        default 24
+                    config BSP_I2C1_SDA_PIN
+                        int "i2c1 SDA pin number"
+                        range 1 176
+                        default 25
+                endif
         endif
         endif
+
     source "../libraries/HAL_Drivers/Kconfig"
     source "../libraries/HAL_Drivers/Kconfig"
     
     
 endmenu
 endmenu

+ 4 - 3
bsp/stm32/stm32l475-atk-pandora/applications/SConscript

@@ -2,14 +2,15 @@ from building import *
 import os
 import os
 
 
 cwd = GetCurrentDir()
 cwd = GetCurrentDir()
-
+CPPPATH = [cwd]
 src = ['main.c']
 src = ['main.c']
 
 
+if GetDepend(['PKG_USING_RTDUINO']):
+    src += ['arduino_main.cpp']
+
 if GetDepend(['PKG_USING_NRF24L01']):
 if GetDepend(['PKG_USING_NRF24L01']):
     src += ['nrf24l01_init.c']
     src += ['nrf24l01_init.c']
 
 
-CPPPATH = [cwd]
-
 group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
 group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
 
 
 list = os.listdir(cwd)
 list = os.listdir(cwd)

+ 26 - 0
bsp/stm32/stm32l475-atk-pandora/applications/arduino_main.cpp

@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2021-12-10     Meco Man     first version
+ */
+
+#include <Arduino.h>
+
+uint8_t led = LED_BUILTIN;
+
+void setup(void)
+{
+    /* put your setup code here, to run once: */
+    pinMode(led, OUTPUT);
+}
+
+void loop(void)
+{
+    /* put your main code here, to run repeatedly: */
+    digitalWrite(led, !digitalRead(led));
+    delay(100);
+}

+ 39 - 35
bsp/stm32/stm32l475-atk-pandora/applications/arduino/README.md → bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/README.md

@@ -20,41 +20,41 @@ Hardware Drivers Config --->
 
 
 ### 2.1 Arduino引脚排布统览
 ### 2.1 Arduino引脚排布统览
 
 
-| Arduino引脚编号       | STM32引脚编号 | 备注                                           |
-| --------------------- | ------------- | ---------------------------------------------- |
-| 0 (D0)                | --            | 该引脚在UNO板中为串口RX引脚,不能被当做普通IO  |
-| 1 (D1)                | --            | 该引脚在UNO板中为串口TX引脚,不能被当做普通IO  |
-| 2 (D2)                | PB9           | 普通IO                                         |
-| 3 (D3)                | PD15          | PWM(定时器4发生)                             |
-| 4 (D4)                | PA8           | 普通IO                                         |
-| 5 (D5)                | PD14          | 普通IO                                         |
-| 6 (D6)                | PB11          | PWM(定时器2发生)                             |
-| 7 (D7)                | PB14          | 普通IO                                         |
-| 8 (D8)                | PB12          | 普通IO                                         |
-| 9 (D9)                | PD12          | PWM(定时器4发生)                             |
-| 10 (D10)              | PB10          | PWM(定时器2发生)                             |
-| 11 (D11)              | PB8           | PWM(定时器4发生)                             |
-| 12 (D12)              | PB15          | 普通IO                                         |
-| 13 (D13)              | PB13          | 普通IO                                         |
-| 14 (D14)              | PA1           | 振动电机-A                                     |
-| 15 (D15)              | PA0           | 振动电机-B                                     |
-| 16 (D16)              | PB2           | 蜂鸣器                                         |
-| 17 (D17)              | PD10          | KEY0                                           |
-| 18 (D18)              | PD9           | KEY1                                           |
-| 19 (D19)              | PD8           | KEY2                                           |
-| 20 (D20)              | PC13          | KEY-WKUP                                       |
-| 21 (D21)              | PE7           | 红色LED                                        |
-| 22 (D22, LED_BUILTIN) | PE8           | 绿色LED,Arduino默认LED                        |
-| 23 (D23)              | PE9           | 蓝色LED,具有PWM功能(定时器1发生)            |
-| 24 (D24)              | PB0           | 红外发送                                       |
-| 25 (D25)              | PB1           | 红外接收                                       |
-| A0                    | PC2           | ADC                                            |
-| A1                    | PC4           | ADC                                            |
-| A2                    | --            | 芯片内部参考电压 ADC                           |
-| A3                    | --            | 芯片内部温度 ADC                               |
-| DAC0                  | PA4           | 真模拟输出 DAC                                 |
-| --                    | PC7           | I2C1-SDA,被RT-Thread的I2C设备框架i2c1总线接管 |
-| --                    | PC6           | I2C1-SCL,被RT-Thread的I2C设备框架i2c1总线接管 |
+| Arduino引脚编号       | STM32引脚编号 | 备注                                                         |
+| --------------------- | ------------- | ------------------------------------------------------------ |
+| 0 (D0)                | --            | 该引脚在UNO板中为串口RX引脚,不可当做普通IO                  |
+| 1 (D1)                | --            | 该引脚在UNO板中为串口TX引脚,不可当做普通IO                  |
+| 2 (D2)                | PB9           | 普通IO                                                       |
+| 3 (D3)                | PD15          | PWM(定时器4发生)                                           |
+| 4 (D4)                | PA8           | 普通IO                                                       |
+| 5 (D5)                | PD14          | 普通IO                                                       |
+| 6 (D6)                | PB11          | PWM(定时器2发生)                                           |
+| 7 (D7)                | PB14          | 普通IO                                                       |
+| 8 (D8)                | PB12          | 普通IO                                                       |
+| 9 (D9)                | PD12          | PWM(定时器4发生)                                           |
+| 10 (D10)              | PB10          | PWM(定时器2发生)                                           |
+| 11 (D11)              | PB8           | PWM(定时器4发生)                                           |
+| 12 (D12)              | PB15          | 普通IO                                                       |
+| 13 (D13)              | PB13          | 普通IO                                                       |
+| 14 (D14)              | PA1           | 振动电机-A                                                   |
+| 15 (D15)              | PA0           | 振动电机-B                                                   |
+| 16 (D16)              | PB2           | 蜂鸣器                                                       |
+| 17 (D17)              | PD10          | KEY0                                                         |
+| 18 (D18)              | PD9           | KEY1                                                         |
+| 19 (D19)              | PD8           | KEY2                                                         |
+| 20 (D20)              | PC13          | KEY-WKUP                                                     |
+| 21 (D21)              | PE7           | 红色LED                                                      |
+| 22 (D22, LED_BUILTIN) | PE8           | 绿色LED,Arduino默认LED                                      |
+| 23 (D23)              | PE9           | 蓝色LED,具有PWM功能(定时器1发生)                          |
+| 24 (D24)              | PB0           | 红外发送                                                     |
+| 25 (D25)              | PB1           | 红外接收                                                     |
+| A0                    | PC2           | ADC                                                          |
+| A1                    | PC4           | ADC                                                          |
+| A2                    | --            | 芯片内部参考电压 ADC                                         |
+| A3                    | --            | 芯片内部温度 ADC                                             |
+| DAC0                  | PA4           | 真模拟输出 DAC                                               |
+| --                    | PC7           | I2C1-SDA,被RT-Thread的I2C设备框架i2c1总线接管,不可当做普通IO |
+| --                    | PC6           | I2C1-SCL,被RT-Thread的I2C设备框架i2c1总线接管,不可当做普通IO |
 
 
 > 注意:
 > 注意:
 >
 >
@@ -117,6 +117,10 @@ I2C的引脚都是被RT-Thread I2C设备框架接管的,不需要直接操控
 
 
 Arduino的 analogWrite 函数虽为模拟写,但是实际输出的是PWM数字信号,并非真正的模拟信号。这是由于Arduino早期使用的AVR单片机并不支持DAC的功能,因此这个习惯就被保留了下来。但是随着Arduino支持芯片的丰富,部分高级芯片已经内建了DAC(例如Arduino官方板MKR、Zero等),因此Arduino的 analogWrite 函数后续也支持了真模拟输出功能。
 Arduino的 analogWrite 函数虽为模拟写,但是实际输出的是PWM数字信号,并非真正的模拟信号。这是由于Arduino早期使用的AVR单片机并不支持DAC的功能,因此这个习惯就被保留了下来。但是随着Arduino支持芯片的丰富,部分高级芯片已经内建了DAC(例如Arduino官方板MKR、Zero等),因此Arduino的 analogWrite 函数后续也支持了真模拟输出功能。
 
 
+| 特殊功能                        | Arduino引脚编号 | STM32引脚编号 |
+| ------------------------------- | --------------- | ------------- |
+| 真模拟输出 (True Analog Output) | DAC0            | PA4           |
+
 在潘多拉板上,使用PA4来当做真模拟输出功能引脚,使用方法为:
 在潘多拉板上,使用PA4来当做真模拟输出功能引脚,使用方法为:
 
 
 ```c
 ```c

+ 9 - 0
bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/SConscript

@@ -0,0 +1,9 @@
+from building import *
+
+cwd = GetCurrentDir()
+src = Glob('*.c') + Glob('*.cpp')
+inc = [cwd]
+
+group = DefineGroup('Arduino', src, depend = ['PKG_USING_RTDUINO'], CPPPATH = inc)
+
+Return('group')

+ 2 - 2
bsp/stm32/stm32l475-atk-pandora/applications/arduino/pins_arduino.c → bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/pins_arduino.c

@@ -48,7 +48,7 @@ const pin_map_t pin_map_table[]=
     {D25, GET_PIN(B,1)}, /* INFRARED RECEPTION */
     {D25, GET_PIN(B,1)}, /* INFRARED RECEPTION */
     {A0, GET_PIN(C,2), "adc1", 3}, /* ADC */
     {A0, GET_PIN(C,2), "adc1", 3}, /* ADC */
     {A1, GET_PIN(C,4), "adc1", 13}, /* ADC */
     {A1, GET_PIN(C,4), "adc1", 13}, /* ADC */
-    {A2, RT_NULL, "adc1", 0}, /* ADC, On-Chip: internal reference voltage */
-    {A3, RT_NULL, "adc1", 17}, /* ADC, On-Chip: internal temperature sensor */
+    {A2, RT_NULL, "adc1", 0}, /* ADC, On-Chip: internal reference voltage, ADC_CHANNEL_VREFINT */
+    {A3, RT_NULL, "adc1", 17}, /* ADC, On-Chip: internal temperature sensor, ADC_CHANNEL_TEMPSENSOR */
     {DAC0, GET_PIN(A,4), "dac1", 1} /* DAC */
     {DAC0, GET_PIN(A,4), "dac1", 1} /* DAC */
 };
 };

+ 0 - 0
bsp/stm32/stm32l475-atk-pandora/applications/arduino/pins_arduino.h → bsp/stm32/stm32l475-atk-pandora/applications/arduino_pinout/pins_arduino.h


+ 4 - 0
bsp/stm32/stm32l475-atk-pandora/board/Kconfig

@@ -41,6 +41,10 @@ menu "Onboard Peripheral Drivers"
         select BSP_USING_I2C4
         select BSP_USING_I2C4
         select BSP_USING_DAC
         select BSP_USING_DAC
         select BSP_USING_DAC1
         select BSP_USING_DAC1
+        select BSP_USING_SPI
+        # select BSP_USING_SPI2
+        # select BSP_SPI2_TX_USING_DMA
+        # select BSP_SPI2_RX_USING_DMA
         imply RTDUINO_USING_SERVO
         imply RTDUINO_USING_SERVO
         imply RTDUINO_USING_WIRE
         imply RTDUINO_USING_WIRE
         imply RTDUINO_USING_ADAFRUIT
         imply RTDUINO_USING_ADAFRUIT

Some files were not shown because too many files changed in this diff