hex.pp.ua

UART в STM8

Вывод на COM-порт. UART в STM8




Последовательный порт (RS-232) в области микроконтроллеров это основа основ, потому что через него удобно, допустим, выводить какую-нибудь текстовую информацию во время отладки. Да и прошиваются большинство микроконтроллеров через COM-порт.

Когда я начинаю работать с новым видом микроконтроллеров, первое, что я делаю — ищу информацию, как в нём инициализировать UART.

В STM8 использование UART проще некуда. Достаточно вот так его инициализировать:

void Init_UART(void)
{  
  UART1_DeInit();
  // 115200 8N1
  UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
              UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);  

  UART1_Cmd(ENABLE);
}

И на этом всё. Подключаешь в проекте stdio.h, и функция printf сама, автоматически, будет выводить текстовую информацию на UART. Вот так всё просто.

Инициализация UART должна происходить после того, как настроена частота работы микроконтроллера. Если изменить рабочую частоту микроконтроллера после того, как выполнена настройка UART, вывод символов окажется испорченным, так как в регистрах UART будет информация о старой частоте. Будут одни кракозябры.

Для удобства, я сделал себе несколько макросов, которые позволяют мне подсвечивать вывод цветом (ANSI). Терминалы, такие как putty или Tera Term понимают такой способ задания цвета текста.

Ещё один макрос UART_CLEAR делает следующее: очищает консоль и перемещает курсор в верхний левый угол экрана. Это удобно для вывода обновляющейся информации на консоль. Макросы выглядят так:

#define CSI "\x1B["
#define CRLF "\r\n"
#define COLOR_ON printf(CSI "1m" CSI "32m")
#define COLOR_OFF printf(CSI "0m")

// Цвет текста в консоли
#define COLOR_BLACK   printf(CSI "1m" CSI "30m")
#define COLOR_RED     printf(CSI "1m" CSI "31m")
#define COLOR_GREEN   printf(CSI "1m" CSI "32m")
#define COLOR_YELLOW  printf(CSI "1m" CSI "33m")
#define COLOR_BLUE    printf(CSI "1m" CSI "34m")
#define COLOR_MAGENTA printf(CSI "1m" CSI "35m")
#define COLOR_CYAN    printf(CSI "1m" CSI "36m")
#define COLOR_WHITE   printf(CSI "1m" CSI "37m")

// Цвет фона в консоли
#define BACKGROUND_BLACK   printf(CSI "1m" CSI "40m")
#define BACKGROUND_RED     printf(CSI "1m" CSI "41m")
#define BACKGROUND_GREEN   printf(CSI "1m" CSI "42m")
#define BACKGROUND_YELLOW  printf(CSI "1m" CSI "43m")
#define BACKGROUND_BLUE    printf(CSI "1m" CSI "44m")
#define BACKGROUND_MAGENTA printf(CSI "1m" CSI "45m")
#define BACKGROUND_CYAN    printf(CSI "1m" CSI "46m")
#define BACKGROUND_WHITE   printf(CSI "1m" CSI "47m")

// Очистить экран и переместить курсор в верхний левый угол экрана
#define UART_CLEAR printf("\x1B[2J\x1B[1;1H")

Эти два макроса и одна дополнительная функция позволяют мне легко выводить на консоль состояние того или иного пина порта ввода-вывода общего назначения (GPIO).

#define SHOW_PORT(x, y, z)    printf("[%c] %s" CRLF, GPIO_ReadInputPin(x,  y)  ? ' ' : '+', z)
#define SHOW_OUTPORT(x, y, z) printf("[%c] %s" CRLF, GPIO_ReadOutputPin(x,  y) ? ' ' : '¤', z) 

/**
  * @brief Читает из регистра, содержащего данные на вывод.
  * @param[in] GPIOx : Порт GPIO (x = от A до I).
  * @param[in] GPIO_Pin : Разряд регистра (элемент перечисления @ref GPIO_Pin_TypeDef).
  * @retval BitStatus : Статус бита GPIO (элемент перечисления @ref BitStatus).  
  * @par Условие:
  * Порт должен быть сконфигурирован в режим вывода.
  */
BitStatus GPIO_ReadOutputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
  return ((BitStatus)(GPIOx->ODR & (vu8)GPIO_Pin));
}

Пример использования:

  UART_CLEAR;
  COLOR_GREEN;
  printf("ПРОГРАММА, собрано %s (%s)" CRLF, __DATE__, __TIME__);
  printf("Частота: %.3f МГц" CRLF, ((float)CLK_GetClockFreq())/1000000.);
  COLOR_OFF;
  
  SHOW_PORT(IN_PORT, IN_BUTTON_PIN, "Кнопка");
  SHOW_OUTPORT(LAMP_PORT, OUT_LAMP_PIN, "Лампа");      


Автор: амдф
Дата: 03.10.2012


При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт. По поводу рекламы обращайтесь на почту [email protected]