/hwconf/hw_r2.c

https://github.com/cyrilh/bldc · C · 151 lines · 94 code · 22 blank · 35 comment · 0 complexity · eef1fb0a571c720d1e9699b1de52cc7a MD5 · raw file

  1. /*
  2. Copyright 2012-2014 Benjamin Vedder benjamin@vedder.se
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. /*
  15. * hw_r2.c
  16. *
  17. * Created on: 14 apr 2014
  18. * Author: benjamin
  19. */
  20. #include "hw.h"
  21. #ifdef HW_VERSION_R2
  22. #include "ch.h"
  23. #include "hal.h"
  24. #include "stm32f4xx_conf.h"
  25. #include "servo.h"
  26. void hw_init_gpio(void) {
  27. // GPIO clock enable
  28. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  29. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  30. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  31. // LEDs
  32. palSetPadMode(GPIOB, 6,
  33. PAL_MODE_OUTPUT_PUSHPULL |
  34. PAL_STM32_OSPEED_HIGHEST);
  35. palSetPadMode(GPIOB, 7,
  36. PAL_MODE_OUTPUT_PUSHPULL |
  37. PAL_STM32_OSPEED_HIGHEST);
  38. // GPIOC (ENABLE_GATE)
  39. palSetPadMode(GPIOC, 9,
  40. PAL_MODE_OUTPUT_PUSHPULL |
  41. PAL_STM32_OSPEED_HIGHEST);
  42. DISABLE_GATE();
  43. // GPIOB (DCCAL)
  44. palSetPadMode(GPIOB, 12,
  45. PAL_MODE_OUTPUT_PUSHPULL |
  46. PAL_STM32_OSPEED_HIGHEST);
  47. // GPIOA Configuration: Channel 1 to 3 as alternate function push-pull
  48. palSetPadMode(GPIOA, 8, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
  49. PAL_STM32_OSPEED_HIGHEST |
  50. PAL_STM32_PUDR_FLOATING);
  51. palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
  52. PAL_STM32_OSPEED_HIGHEST |
  53. PAL_STM32_PUDR_FLOATING);
  54. palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
  55. PAL_STM32_OSPEED_HIGHEST |
  56. PAL_STM32_PUDR_FLOATING);
  57. palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
  58. PAL_STM32_OSPEED_HIGHEST |
  59. PAL_STM32_PUDR_FLOATING);
  60. palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
  61. PAL_STM32_OSPEED_HIGHEST |
  62. PAL_STM32_PUDR_FLOATING);
  63. palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
  64. PAL_STM32_OSPEED_HIGHEST |
  65. PAL_STM32_PUDR_FLOATING);
  66. // GPIOB (hall sensors)
  67. palSetPadMode(GPIOC, 1, PAL_MODE_INPUT_PULLUP);
  68. palSetPadMode(GPIOC, 2, PAL_MODE_INPUT_PULLUP);
  69. palSetPadMode(GPIOC, 3, PAL_MODE_INPUT_PULLUP);
  70. // Fault pin
  71. palSetPadMode(GPIOC, 12, PAL_MODE_INPUT_PULLUP);
  72. // ADC Pins
  73. palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG);
  74. palSetPadMode(GPIOA, 1, PAL_MODE_INPUT_ANALOG);
  75. palSetPadMode(GPIOA, 2, PAL_MODE_INPUT_ANALOG);
  76. palSetPadMode(GPIOA, 3, PAL_MODE_INPUT_ANALOG);
  77. palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG);
  78. palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
  79. palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_ANALOG);
  80. palSetPadMode(GPIOA, 7, PAL_MODE_INPUT_ANALOG);
  81. palSetPadMode(GPIOB, 0, PAL_MODE_INPUT_ANALOG);
  82. palSetPadMode(GPIOB, 1, PAL_MODE_INPUT_ANALOG);
  83. palSetPadMode(GPIOC, 0, PAL_MODE_INPUT_ANALOG);
  84. palSetPadMode(GPIOC, 1, PAL_MODE_INPUT_ANALOG);
  85. palSetPadMode(GPIOC, 2, PAL_MODE_INPUT_ANALOG);
  86. palSetPadMode(GPIOC, 3, PAL_MODE_INPUT_ANALOG);
  87. palSetPadMode(GPIOC, 4, PAL_MODE_INPUT_ANALOG);
  88. palSetPadMode(GPIOC, 5, PAL_MODE_INPUT_ANALOG);
  89. }
  90. void hw_setup_adc_channels(void) {
  91. // ADC1 regular channels 0, 5, 4, 7, 14
  92. ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
  93. ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_3Cycles);
  94. ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 3, ADC_SampleTime_3Cycles);
  95. ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 4, ADC_SampleTime_3Cycles);
  96. ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_3Cycles);
  97. // ADC2 regular channels 1, 6, 9, 15, 8
  98. ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_3Cycles);
  99. ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 2, ADC_SampleTime_3Cycles);
  100. ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 3, ADC_SampleTime_3Cycles);
  101. ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 4, ADC_SampleTime_3Cycles);
  102. ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 5, ADC_SampleTime_3Cycles);
  103. // ADC3 regular channels 2, 10, 12, 11, 13
  104. ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 1, ADC_SampleTime_3Cycles);
  105. ADC_RegularChannelConfig(ADC3, ADC_Channel_10, 2, ADC_SampleTime_3Cycles);
  106. ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 3, ADC_SampleTime_3Cycles);
  107. ADC_RegularChannelConfig(ADC3, ADC_Channel_11, 4, ADC_SampleTime_3Cycles);
  108. ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 5, ADC_SampleTime_3Cycles);
  109. // Injected channels
  110. ADC_InjectedChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_3Cycles);
  111. ADC_InjectedChannelConfig(ADC2, ADC_Channel_6, 1, ADC_SampleTime_3Cycles);
  112. }
  113. void hw_setup_servo_outputs(void) {
  114. // Set up GPIO ports
  115. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  116. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  117. servos[0].gpio = GPIOB;
  118. servos[0].pin = 5;
  119. servos[0].offset = 0;
  120. servos[0].pos = 128;
  121. servos[1].gpio = GPIOD;
  122. servos[1].pin = 2;
  123. servos[1].offset = 0;
  124. servos[1].pos = 0;
  125. }
  126. #endif