Страница 1 из 1

STM32F103 как очистить буфер UART?

Добавлено: Пт янв 06, 2012 19:47:32
Tacho
Всем привет!
После инициализации UART и включения трансмиттера отправляется т.н. idle frame (0хFF). Вычитывание из регистра данных ничего не дает. Посоветуйте, как от этого избавиться? Или сначала записать данные, а потом установить TXE? В РС есть команда очистить буфер, может и здесь как-то можно?

Re: STM32F103 как очистить буфер UART?

Добавлено: Сб янв 07, 2012 01:48:44
md5sum
Tacho писал(а):Всем привет!
После инициализации UART и включения трансмиттера отправляется т.н. idle frame (0хFF). Вычитывание из регистра данных ничего не дает. Посоветуйте, как от этого избавиться? Или сначала записать данные, а потом установить TXE? В РС есть команда очистить буфер, может и здесь как-то можно?
Сначала заполнять DR не поможет, судя по Reference manual от этого не избавиться...
Только в режиме Smartcard mode отсутствует IDLE frame.

А чем idle мешает? Ведь не стартов ни стопов не передается - тупо задержка на размер кадра.

Re: STM32F103 как очистить буфер UART?

Добавлено: Сб янв 07, 2012 10:08:52
Tacho
FF принимается СОМ портом, значит старт\стоп есть. Особо, конечно, не мешает, просто не культурно как-то.

Re: STM32F103 как очистить буфер UART?

Добавлено: Сб янв 07, 2012 11:15:21
md5sum
Странно, у меня не передает... Точнее старт бит не передает- 0xff и стоп они и так одного уровня...

Настроение бодрое, отдохнувшее, вот и не поленился тестик набросать... :write:
Вот кусок теста:

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

		USART1->CR1|=((uint16_t)0x2000); // Установили UE бит
	for (;;) {
		USART1->DR='R';
		USART1->CR1|=USART_Mode_Tx; // Установили TE
		LR_ON();  //Спад синхро
		_delay_us(500);
		USART1->CR1&=~USART_Mode_Tx; // Сбросили TE
		LR_OFF(); //Фронт синхро
		_delay_us(100);
	}

Настройка USART

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

	usart_init_struct.USART_BaudRate=57600UL;
	usart_init_struct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	usart_init_struct.USART_Mode=USART_Mode_Tx;
	usart_init_struct.USART_Parity=USART_Parity_No;
	usart_init_struct.USART_StopBits=USART_StopBits_1;
	usart_init_struct.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART1,&usart_init_struct);
на след картинке передаем "R". Спад верхнего сигнала соответствует установке бита TE.
Нихний сигнал - вывод TX RS232 (снимается после max232 потому и сигнал инвертирован).
Хорошо виден IDLE и после него сам символ. Фронт верхнего сигнала соотв. сбросу бита TE.
В терминале принимаем только символы "R".
Изображение
Теперь закомментируем строку USART1->DR='R';
Никаких стартов на осцилографе нет. Терминал так-же ничего не принимает!
Изображение

Re: STM32F103 как очистить буфер UART?

Добавлено: Вс янв 08, 2012 18:19:41
Tacho
Чудеса какие-то! Завтра осциллографом посмотрю откуда этот фф берется.

Re: STM32F103 как очистить буфер UART?

Добавлено: Пн янв 09, 2012 22:55:59
Tacho
FF оказалось просадкой при смене уровня на выходе с 5 вольт мах232 на 3 в. стм32 при инициализации.

Re: STM32F103 как очистить буфер UART?

Добавлено: Вт янв 10, 2012 05:50:05
md5sum
Tacho писал(а):FF оказалось просадкой при смене уровня на выходе с 5 вольт мах232 на 3 в. стм32 при инициализации.
Извиняюсь,что в предыдущем посте написал MAX232...
Перепроверил - у меня везде MAX3232 стоят. Работают от 3.3В.