Код: Выделить всё
#include "stm32f3xx.h" // Device header.
#include "stdio.h" // Библиотека стандартного ввода-вывода (ANSI C).
#include "string.h" // Строки (ANSI C).
void UART3_init()
{
// Настройка UART.
RCC->APB1ENR |= RCC_APB1ENR_USART3EN; // Запуск тактового генератора USART3.
USART3->BRR = 0x9c4; // Установка требуемой скорости.
USART3->CR1 |= USART_CR1_UE; // Включить передатчик USART.
USART3->CR1 |= USART_CR1_TE; // Включение передатчика.
RCC->AHBENR |= RCC_AHBENR_GPIOBEN; // Включить тактовый генератор порта.
// Настройка выводов порта (альтернативная функция).
GPIOB->MODER |= GPIO_MODER_MODER10_1;
// Установка альтернативной функции USART3_TX.
GPIOB->AFR[1] |= 0x00000700;
}
// Передача байта данных.
void UART3_TX_byte(char byte)
{
// Ждем готовность регистра TDR к приему (Transmission Complete).
while(!(USART3->ISR & USART_ISR_TC)) {};
USART3->TDR = byte; // Передача байта.
}
int main(void)
{
unsigned long int i;
UART3_init(); // Инициализация UART3
UART3_TX_byte('H');
UART3_TX_byte('E');
UART3_TX_byte('L');
UART3_TX_byte('L');
UART3_TX_byte('O');
UART3_TX_byte('!');
//for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
}Я ожидал, что будут отображаться символы слова "HELLO!". Этого не происходит. При включении кнопки ASCII на экране данных пусто. Кроме того, например, буква H имеет код 48. В принятых данных не то и отсутствуют повторяющиеся буквы L.
Пробовал ставить пауза между инициализацией и отправкой каждого символа. Заметил, что 1C 00 FC приходят разом, три байта.
Почему приходит по два-три байта, если я отправляю char? Можно ли сделать так, чтобы программа Terminal отображала символы?
Проект Keil uVision Добавлено after 3 hours 35 minutes 57 seconds:
Исправил код в части установки скорости. Подбирал методом тыка. Теперь почти работает. Иногда почему-то одну букву пишет неправильно.
Код: Выделить всё
#include "stm32f3xx.h" // Device header.
#include "stdio.h" // Библиотека стандартного ввода-вывода (ANSI C).
#include "string.h" // Строки (ANSI C).
void UART3_init()
{
// Настройка UART.
RCC->APB1ENR |= RCC_APB1ENR_USART3EN; // Запуск тактового генератора USART3.
USART3->BRR = 8000000L/9600; // Установка требуемой скорости.
USART3->CR1 |= USART_CR1_UE; // Включить передатчик USART.
USART3->CR1 |= USART_CR1_TE; // Включение передатчика.
RCC->AHBENR |= RCC_AHBENR_GPIOBEN; // Включить тактовый генератор порта.
// Настройка выводов порта (альтернативная функция).
GPIOB->MODER |= GPIO_MODER_MODER10_1;
// Установка альтернативной функции USART3_TX.
GPIOB->AFR[1] |= 0x00000700;
}
// Передача байта данных.
void UART3_TX_byte(char byte)
{
// Ждем готовность регистра TDR к приему (Transmission Complete).
while(!(USART3->ISR & USART_ISR_TC)) {};
USART3->TDR = byte; // Передача байта.
}
int main(void)
{
unsigned long int i;
UART3_init(); // Инициализация UART3
for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
UART3_TX_byte('H');
for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
UART3_TX_byte('E');
for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
UART3_TX_byte('L');
for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
UART3_TX_byte('L');
for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
UART3_TX_byte('O');
for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
UART3_TX_byte('!');
}
Появился ещё вопрос. Верно ли я понимаю, что частота передачи данных соответствует частоте работы порта?
Добавлено after 27 minutes 13 seconds:
Заменил самодельный кабель на короткие китайские перемычки для Ардуино. Работает. Буквы не теряются. Видимо, длинный кабель нельзя. Я для удобства сделал 700 мм примерно в длину. И он заглючил. Приложил код, может кому пригодится.



