Serial MIDI output using HAL and a Nucleo F4
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-01-29 12:44 PM
I'm trying to get a simple MIDI output over DIN (standard midi connector, not usb) example working using a Nucleo-F401RE and a Sparkfun MIDI shield (
https://www.sparkfun.com/products/12898
) to send a MIDI note to a MIDI/USB adapter but so far have not had any luck. No idea what part of it is wrong. I'm guessing some part of the configuration? Any help would be greatly appreciated. I've confirmed both the MIDI shield and MIDI/USB adapter is working correctly with an old Arduino UNO.Here is my code:
main.c
unsigned char
tx[] = {
0x90,
0x3C,
0x45
};
int
main(void
){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
while
(1){
HAL_UART_Transmit(&huart2, (
uint8_t
*)&tx, 3, 0);
HAL_Delay(500);
}
Generated by CubeMX:
main.c
/* USART2
init
function */static
void
MX_USART2_UART_Init(void
){
huart2.
Instance
= USART2;huart2.
Init
.BaudRate
= 31250;huart2.
Init
.WordLength
= UART_WORDLENGTH_8B;huart2.
Init
.StopBits
= UART_STOPBITS_1;huart2.
Init
.Parity
= UART_PARITY_NONE;huart2.
Init
.Mode
= UART_MODE_TX_RX;huart2.
Init
.HwFlowCtl
= UART_HWCONTROL_NONE;huart2.
Init
.OverSampling
= UART_OVERSAMPLING_16;
if
(HAL_UART_Init(&huart2) !=HAL_OK
){
_Error_Handler(__FILE__, __LINE__);
}
}
stm32f4xx_hal_msp.c
void
HAL_UART_MspInit(UART_HandleTypeDef
* huart){
GPIO_InitTypeDef
GPIO_InitStruct;
if
(huart->Instance
==USART2){
/* USER CODE BEGIN USART2_MspInit 0 */
/* USER CODE END USART2_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_USART2_CLK_ENABLE();
/**USART2 GPIO Configuration
PA2
------> USART2_TX
PA3
------> USART2_RX
*/
GPIO_InitStruct.
Pin
= USART_TX_Pin|USART_RX_Pin;GPIO_InitStruct.
Mode
= GPIO_MODE_AF_PP;GPIO_InitStruct.
Pull
= GPIO_NOPULL;GPIO_InitStruct.
Speed
= GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.
Alternate
= GPIO_AF7_USART2;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN USART2_MspInit 1 */
/* USER CODE END USART2_MspInit 1 */
}
}
#usart #nucleo #midi #music #synthesizer #cube-hal- Labels:
-
Audio
-
STM32Cube MCU Packages
-
UART-USART
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-01-29 03:48 PM
I use this to transmit by DMA, but the code should show you what you need to know;
if (TxDMA1BufHasData) {
char uartState = HAL_UART_GetState(&huart1); if ((uartState == HAL_UART_STATE_READY) || (uartState == HAL_UART_STATE_BUSY_RX)) { TxDMA1BufHasData = false; // sending now if(HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Usart1TxDMABuffer + U1TxBufferPtrOUT, U1TxBufferPtrIN - U1TxBufferPtrOUT) == HAL_OK) { U1TxBufferPtrOUT = U1TxBufferPtrIN; Usart1TxDMABuffer[U1TxBufferPtrIN] = 0 ; // null not needed } else { _Error_Handler(__FILE__, __LINE__); /* Transfer error in transmission process */ } } }- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-01-29 09:18 PM
I see for the transmission data you are casting '(uint8_t *)' instead of to the address '(uint8_t *)&' which I tried but it still is not working. Other than that I'm not sure what part of your code can help me understand what I'm doing wrong.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-01-29 10:53 PM
it doesnt look like you need DMA, its all I have to offer..
Thats the runtime use of the code that works for me, other than that I have the same init code from the cube.
but how did you initialise the port inside the cube ?
To make it work like this, you need to configure the Usart to use the DMA, inside the cube.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-01-30 04:31 PM
Thanks. I will try this out. I do want to eventually transmit in DMA mode.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-02-06 05:15 PM
Why is the baud rate 23040 and not 31250 for MIDI?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-02-06 05:22 PM
I don't use MIDI , it started in the 80s, more than 35 years ago.