Итак, товарищи, я хочу представить на суд общественности свое творение для LaunchPad - программную реализацию UART.
Надо сказать, что я с самого начала был изумлен тем, что на отладочной плате UART присутствует, а в контроллерах, к ней прилагающихся - нет. Мне сразу же показалось, что так изумился не только я, потому я стал искать готовую программную реализацию UART под эту платформу. Я бы соврал, если бы сказал, что не нашел ничего, что-то было, был найден даже аппноут от TI на эту тему, однако, то ли я плохо искал, то ли что-то еще - но все найденное с трудом тянуло на приличную и достаточно прозрачную реализацию. Воистину, хочешь, чтобы что-то было сделано хорошо - сделай это сам. Собственно, я так и поступил.
Модуль затачивался прежде всего под LaunchPad и конкретно под MSP430G2231, хотя я не вижу препятствий для его переноса на другие МК с минимальными коррективами. Для реализации протокола используется таймер A, который
должен быть сконфигурирован следующим образом: счет до 65536, тактирование от внешнего кварца 32768Гц (пример есть в заголовочном файле). В этом случае UART работает на скорости 4800bps, без четности, один стоп-бит (4800bps 8N1). В принципе, можно перестроить его на другую скорость, поменяв константы в заголовочном файле. Поскольку в MSP430G2231 таймер всего один, при реализации ставилась задача оставить одно прерывание для пользовательских целей. Побочным эфектом этого стало то, что эта реализация UART полудуплексная, т.е., может работать либо в режиме передачи, либо в режиме приема, которые нужно переключать руками. Файлы обильно прокомментированы.
Модуль содержит функции:
UART_SetTxMode(), UART_SetRxMode()Как уже говорилось, UART полудуплексный, что стало следствием того, что одно прерывание оставлено для пользовательских нужд. Потому режимы приема/передачи надо явно переключать, что и делается этими функциями.
UART_WaitTxCpl()Ожидание конца передачи.
UART_SendByte(unsigned char byte)Отправка байта. Перед отправкой функция ждет конца предыдущей передачи, так что вызовы UART_SendByte(...) могут следовать непосредственно один за другим или в цикле.
UART_SendStr(char str[])Отправка строки/массива. Строка/массив должны заканчиваться нулем (стандартное соглашение С о хранении строк).
UART_SendByte(...) и UART_SendStr(...) нельзя вызывать в прерывании - они отслеживают флаг, который также обновляется в прерывании, и потому в случае такого вызова контроллер с большой вероятностью повиснет.
UART_SetRxHandler(void (*_new_rx_handler)(unsigned char))Устанавливает отбработчик приема. Принимает указатель на функцию вида void <имя>(unsigned char rx_byte), вызываемую после приема байта. Ее параметр - принятый байт. Функция вызывается из прерывания, потому должна быть по-возможности короткой.
В архивах лежат собственно драйвер и проект-пример для IAR.
- Вложения
-
- msp430_uartexample.zip
- Пример использования в IAR
- (143.92 KiB) Скачиваний: 1236
-
- msp430_uartdrv.zip
- Реализация UARTа
- (3.03 KiB) Скачиваний: 1155