UART: различия между версиями
Материал из me-robotics wiki
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> | ||
Текущая версия на 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));
}
}