Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4 USART FLOW CONTROL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
plushevyj
Подскажите пож, что не так: Как я понял из документации в случае использования flow control, то при поступлении в регистр приема байта, контроллер выставляет RTS в 1, пока я не считаю данные из регистра, реально иногда там появляется 1, но не всегда и не понятно по какому принципу.
CODE
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;

RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE );

// конфигурим пины
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_USART2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;
GPIO_Init(GPIOA, &GPIO_InitStructure);


USART2->CR1 &= ~((uint16_t)USART_CR1_UE); // останавливаем usart2

USART_InitStructure.USART_BaudRate = BaudRate ;//9600;// 14400;// 19200;// 38400;// 56000;// 57600;//115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, &USART_InitStructure);
USART2->CR1 |= USART_CR1_RXNEIE | USART_CR1_TXEIE; // разрешаем прерывания по готовности байта на приеме

USART2->CR1 |= USART_CR1_UE; // стартуем usart2


// конфигурим прерывания
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


*************************************************************
void USART2_IRQHandler(void){
if((USART2->SR & USART_SR_RXNE) > 0){
// пришел байт от GSM модуля
ByteReceived();

ставлю BP на ByteReceived(); по идее в этот момент RTS должно быть равно 1, но ее в основном нет
SasaVitebsk
Вообще, по-хорошему, согласно описанию на протокол после снятия сигнала источник может ещё несколько байт отправить ... biggrin.gif Поэтому RTS выставляется при 2/3 буфера. То есть, если строго подходить, то аппаратное управление потоком для STM зззз... не совсем корректное.
В одну сторону (на передачу) оно является достаточным (есть прерывание), а на приём, 2 байта маловато. ))
Красиво всё таки в LPC реализовано. Ч/з FIFO.
plushevyj
Цитата(SasaVitebsk @ Sep 16 2014, 07:35) *
Вообще, по-хорошему, согласно описанию на протокол после снятия сигнала источник может ещё несколько байт отправить ... biggrin.gif Поэтому RTS выставляется при 2/3 буфера. То есть, если строго подходить, то аппаратное управление потоком для STM зззз... не совсем корректное.
В одну сторону (на передачу) оно является достаточным (есть прерывание), а на приём, 2 байта маловато. ))
Красиво всё таки в LPC реализовано. Ч/з FIFO.

Да, так и вышло, к тому же в еррате найдена какашечка STM, если он выставил RTS , а источник продалжает слать ему данные, то он RTS убриает
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.