Skip to content

Commit 9345582

Browse files
authored
Merge pull request odriverobotics#492 from madcowswe/uart1
Add support for UART_B on GPIO3/4
2 parents 9594c47 + dbb77fa commit 9345582

25 files changed

+366
-150
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Please add a note of your changes below this heading if you make a Pull Request.
33
### Added
44
* [Mechanical brake support](docs/mechanical-brakes.md)
55
* Added periodic sending of encoder position on CAN
6+
* Support for UART1 on GPIO3 and GPIO4. UART0 (on GPIO1/2) and UART1 can currently not be enabled at the same time.
67

78
### Changed
89
* Modified encoder offset calibration to work correctly when calib_scan_distance is not a multiple of 4pi

Firmware/Board/v3/Inc/board.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@
4343

4444
#define DEFAULT_GPIO_MODES \
4545
ODriveIntf::GPIO_MODE_DIGITAL, \
46-
ODriveIntf::GPIO_MODE_UART0, \
47-
ODriveIntf::GPIO_MODE_UART0, \
46+
ODriveIntf::GPIO_MODE_UART_A, \
47+
ODriveIntf::GPIO_MODE_UART_A, \
4848
ODriveIntf::GPIO_MODE_ANALOG_IN, \
4949
ODriveIntf::GPIO_MODE_ANALOG_IN, \
5050
ODriveIntf::GPIO_MODE_ANALOG_IN, \
@@ -57,8 +57,8 @@
5757
ODriveIntf::GPIO_MODE_ENC1, \
5858
ODriveIntf::GPIO_MODE_ENC1, \
5959
ODriveIntf::GPIO_MODE_DIGITAL_PULL_DOWN, \
60-
ODriveIntf::GPIO_MODE_CAN0, \
61-
ODriveIntf::GPIO_MODE_CAN0,
60+
ODriveIntf::GPIO_MODE_CAN_A, \
61+
ODriveIntf::GPIO_MODE_CAN_A,
6262

6363
#define TIM_TIME_BASE TIM14
6464

@@ -89,9 +89,9 @@ extern USBD_HandleTypeDef& usb_dev_handle;
8989

9090
extern Stm32SpiArbiter& ext_spi_arbiter;
9191

92-
extern UART_HandleTypeDef* uart0;
93-
extern UART_HandleTypeDef* uart1;
94-
extern UART_HandleTypeDef* uart2;
92+
extern UART_HandleTypeDef* uart_a;
93+
extern UART_HandleTypeDef* uart_b;
94+
extern UART_HandleTypeDef* uart_c;
9595

9696
extern PwmInput pwm0_input;
9797
#endif

Firmware/Board/v3/Inc/stm32f4xx_it.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,14 @@ void DMA1_Stream0_IRQHandler(void);
5858
void DMA1_Stream2_IRQHandler(void);
5959
void DMA1_Stream4_IRQHandler(void);
6060
void DMA1_Stream5_IRQHandler(void);
61+
void DMA1_Stream6_IRQHandler(void);
62+
void DMA1_Stream7_IRQHandler(void);
6163
void ADC_IRQHandler(void);
6264
void CAN1_TX_IRQHandler(void);
6365
void CAN1_RX0_IRQHandler(void);
6466
void CAN1_RX1_IRQHandler(void);
6567
void CAN1_SCE_IRQHandler(void);
68+
void USART2_IRQHandler(void);
6669
void TIM8_TRG_COM_TIM14_IRQHandler(void);
6770
void TIM5_IRQHandler(void);
6871
void SPI3_IRQHandler(void);

Firmware/Board/v3/Inc/usart.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
/* USER CODE END Includes */
6363

6464
extern UART_HandleTypeDef huart4;
65+
extern UART_HandleTypeDef huart2;
6566

6667
/* USER CODE BEGIN Private defines */
6768

@@ -70,6 +71,7 @@ extern UART_HandleTypeDef huart4;
7071
extern void _Error_Handler(char *, int);
7172

7273
void MX_UART4_Init(void);
74+
void MX_USART2_UART_Init(void);
7375

7476
/* USER CODE BEGIN Prototypes */
7577

Firmware/Board/v3/Src/dma.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ void MX_DMA_Init(void)
8383
/* DMA1_Stream5_IRQn interrupt configuration */
8484
HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 5, 0);
8585
HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
86+
/* DMA1_Stream6_IRQn interrupt configuration */
87+
HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 5, 0);
88+
HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
89+
/* DMA1_Stream7_IRQn interrupt configuration */
90+
HAL_NVIC_SetPriority(DMA1_Stream7_IRQn, 5, 0);
91+
HAL_NVIC_EnableIRQ(DMA1_Stream7_IRQn);
8692
/* DMA2_Stream0_IRQn interrupt configuration */
8793
// Dear STM, no we _don't_ want to fire an interrupt for this DMA
8894
// (it's not possible to deselect this in CubeMX)

Firmware/Board/v3/Src/spi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
110110

111111
/* SPI3 DMA Init */
112112
/* SPI3_TX Init */
113-
hdma_spi3_tx.Instance = DMA1_Stream5;
113+
hdma_spi3_tx.Instance = DMA1_Stream7;
114114
hdma_spi3_tx.Init.Channel = DMA_CHANNEL_0;
115115
hdma_spi3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
116116
hdma_spi3_tx.Init.PeriphInc = DMA_PINC_DISABLE;

Firmware/Board/v3/Src/stm32f4xx_it.c

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ extern TIM_HandleTypeDef htim5;
5454
extern TIM_HandleTypeDef htim8;
5555
extern DMA_HandleTypeDef hdma_uart4_rx;
5656
extern DMA_HandleTypeDef hdma_uart4_tx;
57+
extern DMA_HandleTypeDef hdma_usart2_rx;
58+
extern DMA_HandleTypeDef hdma_usart2_tx;
5759
extern UART_HandleTypeDef huart4;
60+
extern UART_HandleTypeDef huart2;
5861

5962
extern TIM_HandleTypeDef htim14;
6063

@@ -251,12 +254,40 @@ void DMA1_Stream5_IRQHandler(void)
251254
/* USER CODE BEGIN DMA1_Stream5_IRQn 0 */
252255
COUNT_IRQ(DMA1_Stream5_IRQn);
253256
/* USER CODE END DMA1_Stream5_IRQn 0 */
254-
HAL_DMA_IRQHandler(&hdma_spi3_tx);
257+
HAL_DMA_IRQHandler(&hdma_usart2_rx);
255258
/* USER CODE BEGIN DMA1_Stream5_IRQn 1 */
256259

257260
/* USER CODE END DMA1_Stream5_IRQn 1 */
258261
}
259262

263+
/**
264+
* @brief This function handles DMA1 stream6 global interrupt.
265+
*/
266+
void DMA1_Stream6_IRQHandler(void)
267+
{
268+
/* USER CODE BEGIN DMA1_Stream6_IRQn 0 */
269+
COUNT_IRQ(DMA1_Stream6_IRQn);
270+
/* USER CODE END DMA1_Stream6_IRQn 0 */
271+
HAL_DMA_IRQHandler(&hdma_usart2_tx);
272+
/* USER CODE BEGIN DMA1_Stream6_IRQn 1 */
273+
274+
/* USER CODE END DMA1_Stream6_IRQn 1 */
275+
}
276+
277+
/**
278+
* @brief This function handles DMA1 stream7 global interrupt.
279+
*/
280+
void DMA1_Stream7_IRQHandler(void)
281+
{
282+
/* USER CODE BEGIN DMA1_Stream7_IRQn 0 */
283+
COUNT_IRQ(DMA1_Stream7_IRQn);
284+
/* USER CODE END DMA1_Stream7_IRQn 0 */
285+
HAL_DMA_IRQHandler(&hdma_spi3_tx);
286+
/* USER CODE BEGIN DMA1_Stream7_IRQn 1 */
287+
288+
/* USER CODE END DMA1_Stream7_IRQn 1 */
289+
}
290+
260291
/**
261292
* @brief This function handles CAN1 TX interrupts.
262293
*/
@@ -313,6 +344,20 @@ void CAN1_SCE_IRQHandler(void)
313344
/* USER CODE END CAN1_SCE_IRQn 1 */
314345
}
315346

347+
/**
348+
* @brief This function handles USART2 global interrupt.
349+
*/
350+
void USART2_IRQHandler(void)
351+
{
352+
/* USER CODE BEGIN USART2_IRQn 0 */
353+
354+
/* USER CODE END USART2_IRQn 0 */
355+
HAL_UART_IRQHandler(&huart2);
356+
/* USER CODE BEGIN USART2_IRQn 1 */
357+
358+
/* USER CODE END USART2_IRQn 1 */
359+
}
360+
316361
/**
317362
* @brief This function handles TIM8 trigger and commutation interrupts and TIM14 global interrupt.
318363
*/

Firmware/Board/v3/Src/usart.c

Lines changed: 93 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,18 @@
5858
/* USER CODE END 0 */
5959

6060
UART_HandleTypeDef huart4;
61+
UART_HandleTypeDef huart2;
6162
DMA_HandleTypeDef hdma_uart4_rx;
6263
DMA_HandleTypeDef hdma_uart4_tx;
64+
DMA_HandleTypeDef hdma_usart2_rx;
65+
DMA_HandleTypeDef hdma_usart2_tx;
6366

6467
/* UART4 init function */
6568
void MX_UART4_Init(void)
6669
{
6770

6871
huart4.Instance = UART4;
69-
huart4.Init.BaudRate = 115200; // Provisionally this can be changed to 921600 for faster transfers, the low power Arduinos will not keep up.
72+
//huart4.Init.BaudRate = 115200; // Provisionally this can be changed to 921600 for faster transfers, the low power Arduinos will not keep up.
7073
huart4.Init.WordLength = UART_WORDLENGTH_8B;
7174
huart4.Init.StopBits = UART_STOPBITS_1;
7275
huart4.Init.Parity = UART_PARITY_NONE;
@@ -78,6 +81,25 @@ void MX_UART4_Init(void)
7881
_Error_Handler(__FILE__, __LINE__);
7982
}
8083

84+
}
85+
/* USART2 init function */
86+
87+
void MX_USART2_UART_Init(void)
88+
{
89+
90+
huart2.Instance = USART2;
91+
//huart2.Init.BaudRate = 115200;
92+
huart2.Init.WordLength = UART_WORDLENGTH_8B;
93+
huart2.Init.StopBits = UART_STOPBITS_1;
94+
huart2.Init.Parity = UART_PARITY_NONE;
95+
huart2.Init.Mode = UART_MODE_TX_RX;
96+
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
97+
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
98+
if (HAL_UART_Init(&huart2) != HAL_OK)
99+
{
100+
Error_Handler();
101+
}
102+
81103
}
82104

83105
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
@@ -135,6 +157,58 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
135157

136158
/* USER CODE END UART4_MspInit 1 */
137159
}
160+
else if(uartHandle->Instance==USART2)
161+
{
162+
/* USER CODE BEGIN USART2_MspInit 0 */
163+
164+
/* USER CODE END USART2_MspInit 0 */
165+
/* USART2 clock enable */
166+
__HAL_RCC_USART2_CLK_ENABLE();
167+
168+
/* USART2 DMA Init */
169+
/* USART2_RX Init */
170+
hdma_usart2_rx.Instance = DMA1_Stream5;
171+
hdma_usart2_rx.Init.Channel = DMA_CHANNEL_4;
172+
hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
173+
hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
174+
hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
175+
hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
176+
hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
177+
hdma_usart2_rx.Init.Mode = DMA_CIRCULAR;
178+
hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
179+
hdma_usart2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
180+
if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
181+
{
182+
_Error_Handler(__FILE__, __LINE__);
183+
}
184+
185+
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
186+
187+
/* USART2_TX Init */
188+
hdma_usart2_tx.Instance = DMA1_Stream6;
189+
hdma_usart2_tx.Init.Channel = DMA_CHANNEL_4;
190+
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
191+
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
192+
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
193+
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
194+
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
195+
hdma_usart2_tx.Init.Mode = DMA_NORMAL;
196+
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
197+
hdma_usart2_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
198+
if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
199+
{
200+
_Error_Handler(__FILE__, __LINE__);
201+
}
202+
203+
__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);
204+
205+
/* USART2 interrupt Init */
206+
HAL_NVIC_SetPriority(USART2_IRQn, 5, 0);
207+
HAL_NVIC_EnableIRQ(USART2_IRQn);
208+
/* USER CODE BEGIN USART2_MspInit 1 */
209+
210+
/* USER CODE END USART2_MspInit 1 */
211+
}
138212
}
139213

140214
void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
@@ -147,12 +221,6 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
147221
/* USER CODE END UART4_MspDeInit 0 */
148222
/* Peripheral clock disable */
149223
__HAL_RCC_UART4_CLK_DISABLE();
150-
151-
/**UART4 GPIO Configuration
152-
PA0-WKUP ------> UART4_TX
153-
PA1 ------> UART4_RX
154-
*/
155-
HAL_GPIO_DeInit(GPIOA, GPIO_1_Pin|GPIO_2_Pin);
156224

157225
/* UART4 DMA DeInit */
158226
HAL_DMA_DeInit(uartHandle->hdmarx);
@@ -164,6 +232,24 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
164232

165233
/* USER CODE END UART4_MspDeInit 1 */
166234
}
235+
else if(uartHandle->Instance==USART2)
236+
{
237+
/* USER CODE BEGIN USART2_MspDeInit 0 */
238+
239+
/* USER CODE END USART2_MspDeInit 0 */
240+
/* Peripheral clock disable */
241+
__HAL_RCC_USART2_CLK_DISABLE();
242+
243+
/* UART4 DMA DeInit */
244+
HAL_DMA_DeInit(uartHandle->hdmarx);
245+
HAL_DMA_DeInit(uartHandle->hdmatx);
246+
247+
/* USART2 interrupt Deinit */
248+
HAL_NVIC_DisableIRQ(USART2_IRQn);
249+
/* USER CODE BEGIN USART2_MspDeInit 1 */
250+
251+
/* USER CODE END USART2_MspDeInit 1 */
252+
}
167253
}
168254

169255
/* USER CODE BEGIN 1 */

0 commit comments

Comments
 (0)