реклама на сайте
подробности

 
 
> STM32L053 проблема с USART
Ешь
сообщение Nov 6 2015, 15:10
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 19-10-14
Пользователь №: 83 224



Всем привет!
Использую плату STM32L053 Discovery с контроллером STM32L053C8T6, и не могу запустить USART. Чтобы не пробовал USART "молчит". Сейчас использую вот такой код, который взял от сюда и модифицировал под свой контроллер.

CODE
#include "stm32l0xx.h" // Device header

void Init(void); //Объявление функции инициализации RCC, GPIO, USART
void Usart1_Transmit(uint8_t); //Объявление функции передачи символа через USART
void Usart1_Transmit_str(char* str); //Объявление функции передачи строки через USART


int main()
{
Init(); //Вызов функции инициализации
while(1)
{
Usart1_Transmit_str("STM32L-DISCOVERY"); //Вызов функции передачи строки через USART
for(uint32_t i=0; i<0x002FFFFF; i++); //Временная задержка
}
}

void Init()
{
//RCC
RCC->CR |= RCC_CR_HSION; //Включаем тактовый генератор HSI
while(!(RCC_CR_HSIRDY)); //Ждем его стабилизации
RCC->CFGR |= RCC_CFGR_SW_HSI; //Выбираем источником тактовой частоты SYSCLK генератор HSI
RCC->CR &= ~RCC_CR_MSION; //Отключаем генератор MSI.

//GPIO
RCC->AHBENR |= RCC_IOPENR_GPIOAEN; //Включаем тактирование порта А
GPIOA->MODER |= GPIO_MODER_MODE9_1; //PA9 - выход AF
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_9; //PA9 - выход push-pull
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD9); //PA9 - без подтяжки
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEED9; //PA9 - скорость 40 МГц
/*Далее в разряды AFRH9[3:0] регистра альтернативных функций GPIOA_AFRH записываем
значение 0100, тем самым для вывода PA9 задаем значение
альтернативной функции - AF4, что соответствует USART1_TX*/
GPIOA->AFR[1] |= (0x4<<4);


//USART1
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; //Включаем тактирование модуля USART1
USART1->CR1 |= USART_CR1_UE; //Включаем USART1
USART1->CR1 &= ~USART_CR1_M; //Длина слова - 8 бит
USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
USART1->BRR = 0x683; //baud rate 9600 при частоте HSI = 16 МГц
USART1->CR1 |= USART_CR1_TE; //Разрешаем передачу данных
}

//Функци передачи символа через USART
void Usart1_Transmit(uint8_t data)
{
while(!(USART1->ISR & USART_ISR_TC)); //Ждем установки флага TC - завершения передачи
USART1->TDR = data;
}

//Функция передачи строки через USART
void Usart1_Transmit_str(char* str)
{
uint8_t i=0;
while(str[i])
{
Usart1_Transmit(str[i]);
i++;
}
Usart1_Transmit('n');
Usart1_Transmit('r');
}


На компьютер пробовал передавать используя и FT232 и ST-LINK (оба чипа работают как USART-USB - проверял). Сам контроллер работает, диодами мигает, предустановленная демо-прошивка тоже нормально работала. Не работает ни USART1, ни USART2, пробовал на разных ногах, все время одно и тоже.

В чем может быть проблема? С STM32 раньше не работал, но документацию прочитал уже вдоль и поперек и вроде все правильно.

Сообщение отредактировал IgorKossak - Nov 6 2015, 19:08
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Nov 6 2015, 16:57
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Ешь @ Nov 6 2015, 20:10) *
Код
//Функци передачи символа через USART
void Usart1_Transmit(uint8_t data)
{
  while(!(USART1->ISR & USART_ISR_TC)); //Ждем установки флага TC - завершения передачи
  USART1->TDR = data;
}

Ждать надо не TC, а TXE. В остальном, вроде, всё правильно.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Ешь
сообщение Nov 6 2015, 18:09
Сообщение #3





Группа: Участник
Сообщений: 8
Регистрация: 19-10-14
Пользователь №: 83 224



Цитата(Tarbal @ Nov 6 2015, 16:07) *
Проблема может быть в разрешении модуля UART и в подключении тактов правильной частоты к его входу.

Поясните вашу мысль пожалуйста. Мне кажется, если бы были проблемы с частотой, то я бы с UARTa получал бы какую-то абракадабру, а я не получаю вообще ничего.

Цитата(AHTOXA @ Nov 6 2015, 16:57) *
Ждать надо не TC, а TXE. В остальном, вроде, всё правильно.

Поправил, но ничего не поменялось. Так же сейчас задумался, похоже там не должно быть отрицания. В документации сказано, что 1 там ставится когда данные передались, т.е. эта строка так должна выглядить:

Код
while(USART1->ISR & USART_ISR_TXE); //Ждем установки флага TXE - конца передачи данных на сдвиговый регистр


После этой правки, он благополучно завис на этом месте. Видимо все-таки дело в том, что ещё нужно что-то инициализировать...
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 6 2015, 18:57
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Ешь @ Nov 6 2015, 21:09) *
Поясните вашу мысль пожалуйста. Мне кажется, если бы были проблемы с частотой, то я бы с UARTa получал бы какую-то абракадабру, а я не получаю вообще ничего.


Если модуль не разрешен, то работать не будет. В разных архитектурах по разному делают. Как в ST32 я не знаю. Если частота не подведена, например выбран неактивный источник, то работать ничто не будет. В AM3715 надо даже две частоты разрешать для модуля и для интерфейса.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 20:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016