Skip to main content
po221
Senior
February 7, 2022
Question

How to enable character match on STM32L431

  • February 7, 2022
  • 7 replies
  • 1924 views

Hello

I'm using an STM32L431 and trying to enable character match on usart2

MXcube does not manage "MODBUS" modes and the st HAL layer doesn't seem to allow this setting (it allows modbus timout but not character match)

So I try to modify USART_CR2 ADD with character code... impossible !

RM0394 Reference manual tells me : " This bit field can only be written when reception is disabled (RE = 0) or the USART is disabled (UE=0)"

ok I even tested a modification before the MXcube inits

/* USER CODE BEGIN USART2_Init 0 */
	 huart2.Instance = USART2;
	 huart2.ReceptionType = HAL_UART_RECEPTION_TOCHARMATCH ;
 
	 MODIFY_REG(huart2.Instance->CR2, USART_CR2_ADD , (char)0x0D);
 /* USER CODE END USART2_Init 0 */
 
 /* USER CODE BEGIN USART2_Init 1 */
 
 /* USER CODE END USART2_Init 1 */
 huart2.Instance = USART2;
 huart2.Init.BaudRate = 1200;
 huart2.Init.WordLength = UART_WORDLENGTH_7B;
 huart2.Init.StopBits = UART_STOPBITS_1;
 huart2.Init.Parity = UART_PARITY_NONE;
 huart2.Init.Mode = UART_MODE_RX;
 huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 huart2.Init.OverSampling = UART_OVERSAMPLING_16;
 huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
 huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
 if (HAL_UART_Init(&huart2) != HAL_OK)
 {
 Error_Handler();
 }

C1, C2... all is to 0 RE=0, UE= 0. I do not understand anything anymore

How to modify this register CR2?

How to activate the character match?

Thanks in advance

This topic has been closed for replies.

7 replies

LCE
Principal II
February 7, 2022

Not sure, never used "MODIFY_REG" or the character match feature before, but try

MODIFY_REG(huart2.Instance->CR2, USART_CR2_ADD , (char)0x0D);

after

HAL_UART_Init(&huart2)

The Init might reset and set register values according to the init struct settings.

po221
po221Author
Senior
February 7, 2022

Hello

I already tried

I also tried without this macro with

huart2.Instance->CR2 = 218103808 ;

The problem is not that my edit is overwritten; is that it is impossible for me to modify the CR2 register.

CR2 is always and always = 0

LCE
Principal II
February 7, 2022

Peripheral clock enabled?

And better set register in hex, in decimal it's absolutely unreadable (I guess not only for me). But okay, 0 is 0.

po221
po221Author
Senior
February 7, 2022

before init by MXcube: no clock on the uart and CR1 = 0 (RE =0 and UE =0)

After ini by MAXcube : clock on the uart but UE!=0

whith this it's the same

 /* USER CODE END USART2_Init 1 */
 huart2.Instance = USART2;
 huart2.Init.BaudRate = 1200;
 huart2.Init.WordLength = UART_WORDLENGTH_7B;
 huart2.Init.StopBits = UART_STOPBITS_1;
 huart2.Init.Parity = UART_PARITY_NONE;
 huart2.Init.Mode = UART_MODE_RX;
 huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 huart2.Init.OverSampling = UART_OVERSAMPLING_16;
 huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
 huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
 if (HAL_UART_Init(&huart2) != HAL_OK)
 {
 Error_Handler();
 }
 /* USER CODE BEGIN USART2_Init 2 */
 __HAL_UART_DISABLE(&huart2);
 huart2.Instance->CR2 = 0x000000D ;
 __HAL_UART_ENABLE(&huart2);
 /* USER CODE END USART2_Init 2 */

HAL_UART_DISABLE => UE = 0

Clock on

But no modification of CR2

Thanks

LCE
Principal II
February 7, 2022

And for many bits in CR2:

These bits can only be written when reception is disabled (RE = 0) or the USART is disabled

(UE = 0).

po221
po221Author
Senior
February 7, 2022

A discovery :

__HAL_UART_DISABLE(&huart2);
huart2.Instance->CR2 = 0x000000D ;

no modification of CR2

 __HAL_UART_DISABLE(&huart2);
 MODIFY_REG(huart2.Instance->CR2, USART_CR2_ADD , (char)0x0D);

no modification of CR2

but this does set all the bits of ADD to 1 :

__HAL_UART_DISABLE(&huart2);
 SET_BIT(huart2.Instance->CR2, USART_CR2_ADD);

Can you please explain to me why this is?

po221
po221Author
Senior
February 7, 2022

for my discharge I have a fever...

huart2.Instance->CR2 = 0xD000000 ; is much better

MODIFY_REG(huart2.Instance->CR2, USART_CR2_ADD , 0xD000000); is much better too

Please excuse my stupidity