Цитата(AHTOXA @ Oct 28 2011, 07:32)

Вместо прерывания по окончанию передачи удобнее использовать прерывание по опустошению передатчика (TXE).
Тогда отправка символа выглядит так:
Код
void putch(char ch)
{
TxChannel.push(ch);
enable_tx_interrupt();
}
а обработчик прерывания - вот так:
Код
...
Запрет/разрешение прерывания по опустошению передатчика:
Код
inline void disable_tx_interrupt() { USART1->CR1 &= ~USART_CR1_TXEIE; }
inline void enable_tx_interrupt() { USART1->CR1 |= USART_CR1_TXEIE; }
Спасибо большое за совет. Действительно, с таким прерыванием отлично заработало, как предпологалось изначально.
Сначала прочитал про него, подумал что полный аналог прерывания по окончанию передачи. Продолжил ковырять со старым прерыванием. Пока экспериментировал проследил в дебаге как меняются все регистры состояния и контроля юарта, вот там то и заметил, что когда буфер передатчика пуст - флаг TXE всегда установлен, и как только разрешено прерывание - оно сразу генерируется, в виду пустого передатчика.
В отличии от флага окончания передачи, который до прерывания сброшен.
Цитата
Помоему нужно сформировать прерывание по нажатию кнопки (изменению сигнала на пине ) и там начать передачу первого байта передать, а остальные уже по вашей технологии через окончание передачи. Можно при помощи DMA (автоматом все нужные байты передадутся из памяти в UART). Можно послать первый байт там, где формируется message_must_send=1, если передатчик пуст, а если он занят, то сработает прерывание завершения передачи и дальше Ваш метод сработает.
У меня антидребезг еще программно реализован с помощью прерываний таймера.
А передавать первый байт с установкой флага - мне казалось каким-то извратом. В общем сейчас все заработало как хотелось, что не может не радовать.
DMA контроллер - вещь весьма полезная, надо будет с нею разобраться.
Цитата
Дружище, а подскажите какая у вас среда разработки и были-ли проблемы запустить STM32?
Сам я к ST взор обратил недавно. Разобрался уже с STM8, а вот с STM32 проблемы.
Среда разработки - IAR 6.21.
Проблемы, конечно же, были. Куда без этого?!))
Были проблемы и с работой IARа, т.к. в новая версия(6.21) не хотела работать с внешними хидерами core_cm3.h, и с включением прерываний(пытался их включить, не добавив в проект файл с заголовками прерываний- startup для моего контроллера).
Но, для начала, хочу вам обьяснить, каким вообще образом можно создавать проекты для данных контроллеров:
Спасоб 1 : читая даташит и управляя всеми необходимыми регистрами для запуска и управления периферией(в этом случае используются только те стандартные библиотеки, где описываются бит-маски, обработчики прерываний и т.п.).
Спасоб 2 : используя стандартные библиотеки для работы с периферией(STM32F10x_StdPeriph), где, в принципе, интуитивно понятно происходит работа с периферией. Хотя, даташит, скорее всего, читать все же прийдется. Многие ругаются на её глючность.
Я покаместь использую только первый спасоб.
Для начала советую помотреть видео с данного ресурса:
http://bsvi.ru/category/embedded/arm/Там небольшое вступление по документации и настройка ИАРа плюс создание простейшего проекта. Видео на русском, лишним однозначно не будет.
Много информации(статьи с примерами) есть на ресурсах:
http://easyelectronics.ru/ и
http://we.easyelectronics.ru/Поиск по тегам : STM32
http://eugenemcu.ru/publ/13 - тоже хороший ресурс
В принципе, почти все эти статьи - это переводы даташитов + примеры. Тем не менее, мне приятнее читать на родном языке. Потом я все равно еще пересматриваю описание работы нужной периферии в ДШ.
Всем еще раз спасибо за помощь.
Сообщение отредактировал ierofant - Oct 28 2011, 19:31