Последовательный порт очень полезен при отладке программ, а также может быть использован в различных устройствах
Программатор платы Mik32-V2 имеет встроенный USB-UART преобразователь, его можно отключить при помощи двух перемычек на части платы с программатором (обозначено CON13).
Этот последовательный порт выведен к UART_1 микроконтроллера и находится на GPIO 1.9 (TX) и 1.8 (RX)
Для вывода в последовательный порт компьютера, нужно будет немного исправить стандартную библиотеку:
Напечатайте в программе функцию xputc() и щелкните по ней правой кнопкой мыши. Выберите пункт "Go to definition"
Откроется исходный код этой функции
Замените функцию xputc и добавьте одну новую (в файле uart_lib.c)
UART_TypeDef* useUART = UART_1;
void setUART(UART_TypeDef* u) { // Set UART used for xprintf command
useUART = u;
}
void __attribute__((weak)) xputc(char c)
{
UART_WriteByte(useUART, c);
UART_WaitTransmission(useUART);
}
Продекларируйте функцию в файле uart_lib.h
void setUART(UART_TypeDef* uart);
Теперь можно выбирать, в какой из UART портов будет отправлено сообщение при помощи функции setUART()
Например: setUART(UART_0) или setUART(UART_1)
// Для использования языка C, удалите "extern..."
extern "C" {
#include "mik32_hal_timer32.h"
#include "xprintf.h"
#include "uart_lib.h"
#include "stdlib.h"
}
void SystemClock_Config(void) // Функция настройки всех часов мироконтроллера
{
PCC_InitTypeDef PCC_OscInit = {0};
PCC_OscInit.OscillatorEnable = PCC_OSCILLATORTYPE_ALL;
PCC_OscInit.FreqMon.OscillatorSystem = PCC_OSCILLATORTYPE_OSC32M;
PCC_OscInit.FreqMon.ForceOscSys = PCC_FORCE_OSC_SYS_UNFIXED;
PCC_OscInit.FreqMon.Force32KClk = PCC_FREQ_MONITOR_SOURCE_OSC32K;
PCC_OscInit.AHBDivider = 0;
PCC_OscInit.APBMDivider = 0;
PCC_OscInit.APBPDivider = 0;
PCC_OscInit.HSI32MCalibrationValue = 128;
PCC_OscInit.LSI32KCalibrationValue = 128;
PCC_OscInit.RTCClockSelection = PCC_RTC_CLOCK_SOURCE_AUTO;
PCC_OscInit.RTCClockCPUSelection = PCC_CPU_RTC_CLOCK_SOURCE_OSC32K;
HAL_PCC_Config(&PCC_OscInit);
}
int main() {
SystemClock_Config(); // Настройка всех часов микроконтроллера
// Параметр 1: номер UART, например UART_0 или UART_1
// Параметр 2: Делитель частоты (делитель = 32`000`000 / скорость передачи)
UART_Init(UART_1, 3333, UART_CONTROL1_TE_M | UART_CONTROL1_M_8BIT_M | UART_CONTROL1_RE_M, 0, 0);
setUART(UART_1); // Указать UART_1 для печати при помощи xprintf
xprintf("UART init\n"); // Функция печати
xprintf("9*9 = %d\n", 9*9); // Может выводить числа в десятичном виде (%d)
xprintf("hex(37) = %x\n", 37); // Может выводить числа в шестнадцатеричном формате (%x)
xprintf("Hello, %s!!!\n\n", "world"); // Может выводить строки (%s)
xprintf("Enter your name:\n");
const uint32_t len = 32; // Длина буфера для ввода
char buffer[len]; // Создание буфера, куда будет созранено введенное сообщение
int i = 0; // Номер символа, который сейчас считывается
char c; // символ, считанный из UART
while(c!='\n' and i < len - 1) { // Пока не пришёл символ конца строки и буфер не переполнился
UART_WaitReceiving(UART_1); // Функция ждёт, пока не придет символ
c = UART_ReadByte(UART_1); // В переменную c записывается пришедший символ
buffer[i] = c; // Символ дописывается в конец буфера
i++; // Номер ячейки увеличивается на 1
}
buffer[i-1] = 0; // В конце строки обязательно должен стоять символ '\0' = (int) 0
xprintf("Hello, %s!\n", buffer);
}