Сложности с паритетом USART STM32F407

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Встал на лапы
Сообщения: 113
Зарегистрирован: Сб янв 11, 2014 21:25:55

Сообщение Alex-Elektron »

С наступающим Новым Годом, уважаемые форумчане! Занимаюсь программированием микроконтроллеров около 7 лет, но недавно столкнулся с проблемой настройки USART2 у STM32F407. МК работает в связке с неким чёрным ящиком и общается с ним через max-232, используя USART. Требуемые настройки связи с данным прибором следующие:
- частота связи: 9600
- количество бит посылки: 8
- паритет: по чётному (even)
- стоповые биты: 1

Настроил следующим образом:

Код: Выделить всё

void init_usart2(){
	GPIO_InitTypeDef GPIO_InitStructure; //Структура содержащая настройки порта
	USART_InitTypeDef USART_InitStructure; //Структура содержащая настройки USART

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //Включаем тактирование порта A
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //Включаем тактирование порта USART2

	GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); //Подключаем PA3 к TX USART2
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); //Подключаем PA2 к RX USART2

	//Конфигурируем PA2 как альтернативную функцию -> TX UART
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	//Конфигурируем PA3 как альтернативную функцию -> RX UART
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	USART_InitStructure.USART_BaudRate = 9600; //Скорость обмена 9600 бод
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; //Длина слова 8 бит
	USART_InitStructure.USART_StopBits = USART_StopBits_1; //1 стоп-бит
	USART_InitStructure.USART_Parity = USART_Parity_Even; //Чётный
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //Включен передатчик и приемник USART2

	USART_Init(USART2, &USART_InitStructure);

	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
	NVIC_EnableIRQ (USART2_IRQn);
	USART_Cmd(USART2, ENABLE); //включить юарт2
}

int main(void){
	init_usart2(); 	
	__enable_irq();

    while(1){
    	put_char(0xA0);
    	put_char(0x00);
    	put_char(0x08);
    	put_char(0xCA);

    	if(read_flag){

    		char_to_lcd(chislo, 2); //некая функция, преобразующая массив полученных данных

    		USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    		read_flag=0;
    	}


   	for(unsigned int n=0; n<900000; n++)	n=n; 

  
    }
}

void USART2_IRQHandler(void){

	   if (USART2->SR & USART_SR_RXNE){ //Проверяем, пришло ли что-нибудь в UART
		   USART1->SR&=~USART_SR_RXNE;
	   	   chislo[uart2_rx_bit]=USART2->DR; //Считываем то что пришло в массив

	   	   if(++uart2_rx_bit>5){
	   		   USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
	   		   uart2_rx_bit=0;
	   		   read_flag=1;
	   	   }
	   }
}
Настройки в терминале соответствуют заявленной конфигурации. МК должен послать в терминал (в итоге, к чёрному ящику) последовательность (HEX-формат) 0xA0 0x00 0x08 0xCA. Но в терминал приходит A0 00 88 CA, при чём положение флага выбора паритета (parity) в терминале не влияет на принимаемые данные, всегда приходит A0 00 88 CA. При изменении настроек МК (parity: No):

Код: Выделить всё

USART_InitStructure.USART_Parity = USART_Parity_No; //Проверка чётности
данные приходят бес искажения, при чём, и в этом случае положение флага выбора паритета (parity) в терминале не влияет на принимаемые данные.

Собственно, вопрос: где, по вашему мнению, следует искать баг?

P.S. С AVRками таких проблем не возникало.
P.P.S. Данный проект разрабатывается на DISCOVERY F4.
Реклама
Ответить

Вернуться в «Разные вопросы по МК»