UART: различия между версиями

Материал из me-robotics wiki
(Sh-sergey переименовал страницу UART в UART Arduino)
Метка: новое перенаправление
 
(Удалено перенаправление на UART Arduino)
Метки: визуальный редактор удалено перенаправление
 
Строка 1: Строка 1:
#перенаправление [[UART Arduino]]
+
Пример использования UART MIK32, программа возвращает принятые байты, установлена скорость 115200 бод.<syntaxhighlight lang="cpp">
 +
#include <mcu32_memory_map.h>
 +
#include <gpio.h>
 +
#include <analog_reg.h>
 +
#include <uart.h>
 +
#include <power_manager.h>
 +
#include <stdlib.h>
 +
 
 +
 
 +
void initUART(UART_TypeDef *uart, uint32_t uart_divider) {
 +
    uart->DIVIDER = uart_divider; // divider = 32 000 000 / baud
 +
uart->CONTROL1 = UART_CONTROL1_TE_M | UART_CONTROL1_RE_M
 +
| UART_CONTROL1_UE_M; //TX, RX, Enable
 +
 
 +
    while (!(uart->FLAGS & UART_FLAGS_TEACK_M)
 +
&& !(uart->FLAGS & UART_FLAGS_REACK_M));
 +
}
 +
 
 +
void writeByte(UART_TypeDef *uart, uint8_t byte) {
 +
uart->TXDATA = byte;
 +
while (!(uart->FLAGS & UART_FLAGS_TC_M));
 +
}
 +
 
 +
void writeLine(UART_TypeDef *uart, uint8_t *line) {
 +
for (int i = 0; line[i] != '\0'; i++) {
 +
writeByte(uart, line[i]);
 +
}
 +
}
 +
 
 +
void writeNum(UART_TypeDef *uart, int num, int base) {
 +
    char buf[12];
 +
    itoa(num, buf, base);
 +
for (int i = 0; buf[i] != '\0'; i++) {
 +
writeByte(uart, buf[i]);
 +
}
 +
}
 +
 
 +
uint8_t readByte(UART_TypeDef *uart) {
 +
while (!(uart->FLAGS & UART_FLAGS_RXNE_M));
 +
return uart->RXDATA;
 +
}
 +
 
 +
const uint32_t tickInMs = 3200;
 +
 
 +
void delay(uint16_t ms) {
 +
for (volatile uint32_t i = 0; i < (tickInMs * ms); i++);
 +
}
 +
 
 +
 
 +
int main()
 +
{
 +
    PM->CLK_APB_P_SET |= PM_CLOCK_UART_0_M;
 +
    PM->CLK_APB_M_SET |= PM_CLOCK_PAD_CONFIG_M | PM_CLOCK_WU_M | PM_CLOCK_PM_M;
 +
 
 +
    for (volatile int i = 0; i < 50000; i++) ;
 +
 
 +
    // for (volatile int i = 0; i < 4000000; i++);
 +
 
 +
    initUART(UART_0, 278); // 115200 baud
 +
    writeLine(UART_0, "init echo\n");
 +
 
 +
    while (1) {
 +
    writeByte(UART_0, readByte(UART_0));
 +
    }
 +
}
 +
 
 +
</syntaxhighlight>

Текущая версия на 11:44, 4 мая 2022

Пример использования UART MIK32, программа возвращает принятые байты, установлена скорость 115200 бод.

#include <mcu32_memory_map.h>
#include <gpio.h>
#include <analog_reg.h>
#include <uart.h>
#include <power_manager.h>
#include <stdlib.h>


void initUART(UART_TypeDef *uart, uint32_t uart_divider) {
    uart->DIVIDER = uart_divider; // divider = 32 000 000 / baud
	uart->CONTROL1 = UART_CONTROL1_TE_M | UART_CONTROL1_RE_M
		| UART_CONTROL1_UE_M; //TX, RX, Enable

    while (!(uart->FLAGS & UART_FLAGS_TEACK_M)
		&& !(uart->FLAGS & UART_FLAGS_REACK_M));
}

void writeByte(UART_TypeDef *uart, uint8_t byte) {
	uart->TXDATA = byte;
	while (!(uart->FLAGS & UART_FLAGS_TC_M));
}

void writeLine(UART_TypeDef *uart, uint8_t *line) {
	for (int i = 0; line[i] != '\0'; i++) {
		writeByte(uart, line[i]);
	}
}

void writeNum(UART_TypeDef *uart, int num, int base) {
    char buf[12];
    itoa(num, buf, base);
	for (int i = 0; buf[i] != '\0'; i++) {
		writeByte(uart, buf[i]);
	}
}

uint8_t readByte(UART_TypeDef *uart) {
	while (!(uart->FLAGS & UART_FLAGS_RXNE_M));
	return uart->RXDATA;
}

const uint32_t tickInMs = 3200;

void delay(uint16_t ms) {
	for (volatile uint32_t i = 0; i < (tickInMs * ms); i++);
}


int main()
{
    PM->CLK_APB_P_SET |= PM_CLOCK_UART_0_M;
    PM->CLK_APB_M_SET |= PM_CLOCK_PAD_CONFIG_M | PM_CLOCK_WU_M | PM_CLOCK_PM_M;

    for (volatile int i = 0; i < 50000; i++) ;

    // for (volatile int i = 0; i < 4000000; i++);

    initUART(UART_0, 278); // 115200 baud
    writeLine(UART_0, "init echo\n");

    while (1) {
    	writeByte(UART_0, readByte(UART_0));
    }
}