Impossibile ottenere il rilevamento della velocità di trasmissione automatica per funzionare su STM32L0
. Sto usando il livello di astrazione hardware (HAL).Rilevamento automatico della velocità di trasmissione per STM32L0
Il mio codice è initilization:
/* USART1 init function */
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 300;
huart1.Init.WordLength = UART_WORDLENGTH_9B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_EVEN;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_AUTOBAUDRATE_INIT;
huart1.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_ENABLE;
huart1.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT;
HAL_UART_Init(&huart1);
}
I byte Sto mandando l'UART1 è:
0 1 2 3 4 5 6 7 8
000x 68 0B 0B 68 53 FD 52 FF FF .. etc.
0x68 = 0b01101000
0x0B = 0b00001011
0xFD = 0b11111101 <-- Character starting with 1, baudrate should be detected
0xFD :
start 1 1 .....
___ bit __________
¦______¦
...
Perché la velocità di trasmissione non essere rilevato? Ho provato:
UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT
e UART_ADVFEATURE_AUTOBAUDRATE_ONFALLINGEDGE
Così ho regolato la cronologia di impostazione della modalità e l'abilitazione nel driver da:
/* if required, configure auto Baud rate detection scheme */
if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT))
{
assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart->AdvancedInit.AutoBaudRateEnable));
MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable);
/* set auto Baudrate detection parameters if detection is enabled */
if(huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE)
{
assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode));
MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode);
}
}
a
/* if required, configure auto Baud rate detection scheme */
if(HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT))
{
assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart-
/* set auto Baudrate detection parameters if detection is enabled */
if(huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE)
{
assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode));
MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode);
}
MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable);
}
non fai qualcosa
Anche la seguente sembra soddisfacente:.
frequenza della sorgenteL'orologio deve essere compatibile con la velocità di comunicazione previsto (ove sovracampionamento del 16, la velocità di trasmissione è tra FCK/65535 e FCK/16 quando sovracampionamento di 8, il baud rate è tra fCK/65535 e fCK/8).
sto sovracampionamento del 16, in modo da
fCK= 16000000
fCK > 16000000/65535 = 244 = 244 Hz
fCK < 16000000/16 = 1000000 = 1 MHz
La mia velocità di trasmissione di scelta sono: 19200/ 9600 /2400 /300
"Mi dispiace, non posso farlo, Flying Swissman." –