UART: различия между версиями
Материал из MIK32 микроконтроллер
Sh-sergey (обсуждение | вклад) (Sh-sergey переименовал страницу UART в UART Arduino) Метка: новое перенаправление |
Sh-sergey (обсуждение | вклад) (Удалено перенаправление на UART Arduino) Метки: удалено перенаправление правка через визуальный редактор |
||
Строка 1: | Строка 1: | ||
# | Пример использования 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> |
Версия от 08: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)); } }