STM32F0 и USART

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
wss60
Потрогал лапой паяльник
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

STM32F0 и USART

Сообщение wss60 »

Не получается запустить USART на данном мк:
Пробовал:

Код: Выделить всё

void Init_usart(void)
{
  RCC->AHBENR |= RCC_AHBENR_GPIOAEN;     //Включаем тактирование GPIOA
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN;  //Включаем тактирование USART1
 
  GPIOA->MODER   |= GPIO_MODER_MODER9_1;       // PA9 (TX) - Alternate function mode
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9;    // PA9 (TX) - High speed
 
  USART1->CR1 |= USART_CR1_UE;    //Включаем USART1
  USART1->CR1 &= ~USART_CR1_M;    //Данные - 8 бит
  USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
  USART1->BRR = 0x681;            //Скорость обмена 9600 бод
  USART1->CR1 |= USART_CR1_TE;    //Включаем передатчик USART1
  USART1->CR1 |= USART_CR1_RE;    //Включаем приемник USART1
}
void Transmit(uint16_t Data)
{
  while(!(USART1->ISR & USART_ISR_TC));
  USART1->TDR = (Data & (uint16_t)0x01FF);
}


Reference manual

На выходе тишина…
Не могу понять, что не так?
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: STM32F0 и USART

Сообщение zöner »

посмотрите примеры из stm32f0xx_rcc.c и stm32f0xx_usart.c .
там вроде еще нужно дернуть ф-ю RCC_USARTCLKConfig:

Код: Выделить всё

  /* Clear USARTSW[1:0] bit */
  RCC->CFGR3 &= ~RCC_CFGR3_USART1SW;
  /* Set USARTSW bits according to RCC_USARTCLK value */
  RCC->CFGR3 |= RCC_USARTCLK;
Аватара пользователя
wss60
Потрогал лапой паяльник
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

Re: STM32F0 и USART

Сообщение wss60 »

Смотрел примеры, там вообще ничего не понятно…
Бит “RCC_USARTCLK” отсутствует в этом мк.
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: STM32F0 и USART

Сообщение zöner »

это RCC_USART1CLK_SYSCLK
Аватара пользователя
wss60
Потрогал лапой паяльник
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

Re: STM32F0 и USART

Сообщение wss60 »

zöner писал(а):это RCC_USART1CLK_SYSCLK

нету такого!?
Изображение

Пробовал разные варианты битов “ RCC_CFGR3_USART1SW” – без результатов…
Вложения
usart.PNG
(16.3 КБ) 8702 скачивания
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: STM32F0 и USART

Сообщение zöner »

есть. Пример взят из стандартной библиотеки STM32F0xx_StdPeriph_Examples/USART.
USART1 работает (правда, настраивал не напрямую регистры, а через функции из stm32f0xx_usart.c):

Код: Выделить всё

#define RCC_USART1CLK_SYSCLK               RCC_CFGR3_USART1SW_0
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32F0 и USART

Сообщение ut1wpr »

wss60 писал(а):Не получается запустить USART на данном мк:
Пробовал:

Код: Выделить всё

void Transmit(uint16_t Data)
{
  while(!(USART1->ISR & USART_ISR_TC));
  USART1->TDR = (Data & (uint16_t)0x01FF);
}

На выходе тишина…
Не могу понять, что не так?
С инитом не разбирался, там все просто.
С передачей у меня всегда так:

Код: Выделить всё

void USART_Tx( u8 data ){
   USART1->DR  =  data;
   while(!(USART1->SR & USART_SR_TC)) {};
   USART1->SR &=  ~USART_SR_TC;
}

Анализирую не флаг прерывания в регистре статуса прерывания, а флаг готовности передатчика в регистре статуса.
С уважением,
Виктор.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F0 и USART

Сообщение dosikus »

wss60 писал(а):Не получается запустить USART на данном мк:

На выходе тишина…
Не могу понять, что не так?


Смотрим внимательно:

Изображение
Изображение


И читаем http://kazus.ru/forums/showpost.php?p=6 ... stcount=38

В SPL кстати расчет скорость UART делается через жопу. Все намного проще .

Код: Выделить всё

USART1->BRR = 0x681;            //Скорость обмена 9600 бод


Что ???!!!! "Магические знаки" ????

Код: Выделить всё

#define APBCLK 48000000UL
#define BAUDRATE 115200UL


Код: Выделить всё

USART2->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE;
Аватара пользователя
wss60
Потрогал лапой паяльник
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

Re: STM32F0 и USART

Сообщение wss60 »

ut1wpr писал(а):Что ???!!!! "Магические знаки" ????

Магическое число решил взять из даташита пока не разберусь с инициализацией.

Теперь другая проблема: компилятор “ругается” на регистр AFRH!?

Код: Выделить всё

void Init_usart(void)
{
  GPIOA_CLK_ENABLE;  //Включаем тактирование GPIOA
  USART1_CLK_ENABLE; //Включаем тактирование USART1
 
  GPIOA->MODER   |= GPIO_MODER_MODER9_1;         // PA9 (TX) - Alternate function mode
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9;      // PA9 (TX) - High speed
 
  GPIOA->AFRH    |= 0x0110;  // <----- !!!
 
  /* тактирование usart(SYSCLK) */
  RCC->CFGR3     &= ~RCC_CFGR3_USART1SW;
  RCC->CFGR3     |=  RCC_CFGR3_USART1SW_0;
 
  USART1->CR1 |= USART_CR1_UE; //Включаем USART1
  USART1->CR1 &= ~USART_CR1_M; //Данные - 8 бит
  USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
  USART1->BRR = 0x681; //Скорость обмена 9600
  USART1->CR1 |= USART_CR1_TE; //Включаем передатчик USART1 
}

Изображение
Вложения
err.PNG
(3.7 КБ) 8728 скачиваний
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F0 и USART

Сообщение dosikus »

wss60 писал(а):Теперь другая проблема: компилятор “ругается” на регистр AFRH!?

Код: Выделить всё

void Init_usart(void)
{
 
 
  GPIOA->AFRH    |= 0x0110;  // <----- !!!



Можно же ради приличия слазать в stm32f0xx.h :)))

Код: Выделить всё

GPIOA->AFR[1]= (1<<(2*4))|(1<<(1*4));
Аватара пользователя
wss60
Потрогал лапой паяльник
Сообщения: 350
Зарегистрирован: Пт сен 10, 2010 20:48:01
Откуда: Минск

Re: STM32F0 и USART

Сообщение wss60 »

Да облазил его весь: искал AFRH…
А оказалось это массив! :))
Теперь все норм.

Код: Выделить всё

#define APBCLK   8000000UL
#define BAUDRATE 115200UL

void Init_usart(void)
{
  GPIOA_CLK_ENABLE;  //Включаем тактирование GPIOA
  USART1_CLK_ENABLE; //Включаем тактирование USART1
 
  GPIOA->MODER   |= GPIO_MODER_MODER9_1;         // PA9 (TX) - Alternate function mode
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9;      // PA9 (TX) - High speed
  GPIOA->AFR[1]    |= 0x0110;  //
 
  RCC->CFGR3     &= ~RCC_CFGR3_USART1SW;
  RCC->CFGR3     |=  RCC_CFGR3_USART1SW_0;  //System clock (SYSCLK) selected as USART1 clock
 
 
  USART1->CR1 |= USART_CR1_UE; //Включаем USART1
  USART1->CR1 &= ~USART_CR1_M; //Данные - 8 бит
  USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
  USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; //скорость usart
  USART1->CR1 |= USART_CR1_TE; //Включаем передатчик USART1
  USART1->CR1 |= USART_CR1_RE; //Включаем приемник USART1
 
}
void Transmit(uint16_t Data)
{
  while(!(USART1->ISR & USART_ISR_TC));
  USART1->TDR = (Data & (uint16_t)0x01FF);
}


Спасибо!!!
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F0 и USART

Сообщение dosikus »

wss60 писал(а):

Код: Выделить всё

 USART1->CR1 |= USART_CR1_UE; //Включаем USART1



Хорошая практика - включать периферию после ее настройки , так как многое изменить на включенной нельзя...
Аватара пользователя
Kvasshtain
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Ср фев 09, 2011 13:29:01
Откуда: г.Саратов

Re: STM32F0 и USART

Сообщение Kvasshtain »

Здравствуйте уважаемые Коты. Попробовал примерчик уважаемого wss60, но он у меня отказывается работать на отрез. Вот Код:

Код: Выделить всё

#include "stm32f0xx.h"

#define APBCLK   8000000UL
#define BAUDRATE 115200UL

void Init_usart(void)
{
  // Включить тактирование порта А
  RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
  // Включаем тактирование USART1
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
 
  GPIOA->MODER   |= GPIO_MODER_MODER9_1;         // PA9 (TX) - Alternate function mode
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9;      // PA9 (TX) - High speed
  GPIOA->AFR[1]    |= 0x0110;  // ????????????????????
 
  RCC->CFGR3     &= ~RCC_CFGR3_USART1SW;
  RCC->CFGR3     |=  RCC_CFGR3_USART1SW_0;  //System clock (SYSCLK) selected as USART1 clock
 
 
  USART1->CR1 &= ~USART_CR1_M; //Данные - 8 бит
  USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
  USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; //скорость usart
  USART1->CR1 |= USART_CR1_TE; //Включаем передатчик USART1
  USART1->CR1 |= USART_CR1_RE; //Включаем приемник USART1
  USART1->CR1 |= USART_CR1_UE; //Включаем USART1

}
void Transmit(uint16_t Data)
{
  while(!(USART1->ISR & USART_ISR_TC));
  USART1->TDR = (Data & (uint16_t)0x01FF);
}

// Главный цикл
int main(void)
{
  Init_usart();   
  while(1)
    {
     Transmit(0x45);
    }
}


Правильно ли я понял, что AFRL — это AFR[0], а AFRH - это AFR[1]? Еще хочу спросить про то как все же выбирать альтернативную функцию в регистре AFR. Т.е. Я не могу понять как пользоваться вот этой таблицей:

Безымянный.JPG
(109.48 КБ) 1754 скачивания


У Вас, уважаемые Коты, в AFRH записывается число 0x0110, как вы определили что нужно записать именно это число? Если я правильно понимаю, то нужно пользоваться как раз этой таблицей и датащита (но как, я недотукиваю).
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F0 и USART

Сообщение dosikus »

Kvasshtain, выше в моем посту с картинками , что не понятно ??? :)))

И сразу же - какой камень ?
Аватара пользователя
Kvasshtain
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Ср фев 09, 2011 13:29:01
Откуда: г.Саратов

Re: STM32F0 и USART

Сообщение Kvasshtain »

Здравствуйте уважаемый Dosikus. Рад Вас видеть :)) . У меня STM32F051. Не ясно что записывать в AFR[1], и как это делать для других случаев. Т.е. я не понимаю откуда взялось число 0x0110, ну или по другому (1<<(2*4))|(1<<(1*4))? Да и контроллер молчит как партизан на допросе в Гестапо. Если я правильно составил программу, то контроллер должен без остановки циклически слать в порт число 0x45. А на выходе тишина. С пином порта все точно в норме, т. к. я это проверял (вешал на него светодиод и заставлял его моргать).
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F0 и USART

Сообщение dosikus »

Код: Выделить всё

// Главный цикл
int main(void)
{
  Init_usart(); 
 Delay_mS(100);
  while(1)
    {
     Transmit(0x45);
    Delay_mS(100);
    }
}


А так ?
Аватара пользователя
Kvasshtain
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Ср фев 09, 2011 13:29:01
Откуда: г.Саратов

Re: STM32F0 и USART

Сообщение Kvasshtain »

Т.е. Вы предлагаете просто добавить задержки?
К сожалению смогу попробовать только дома. А дома у меня нет интернета. Так что узнаем о результатах только завтра.
Хочу еще спросить у Вас по поводу странной фразы, сказанной вот здесь: http://kazus.ru/forums/showpost.php?p=6 ... stcount=38
Вы там говорите дословно следующее: «...Первый вариант пролетает ибо на PA9 и PA10 на плате уже висит USB-DET и USB-ID .
А вот далее PB6 и PB7 свободны . ...». Дело в том, что я использую именно PA9 и PA10 (точнее только PA9, т. к. я пока ни чего не принимаю, а только передаю). Судя по Вашим словам, ни какие другие функции кроме USB-DET и USB-ID работать не будут, но светодиод то моргал.
И все же по поводу AFR[1] (он же AFRH) :roll: . Как было определено это магическое число 0x0110?
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F0 и USART

Сообщение dosikus »

А вы не увидели что :
Плата под F4 http://www.mikroe.com/mini/stm32/ и USB-DET и USB-ID название линий подключенных к PA9 и PA10 ,
и к тому же не имеет никакого отношения к Вашей STM32F0 Discovery ?

Еще раз внимательно посмотрите на мой первый пост в этой ветке, там как раз Ваш случай и все расписано.

По первой таблице мы находим что UART1 для пинов PA9 и PA10 соответствует AF1 .
По второму скрину видим что AF1 соответствует 0001 бинарное или 0х01 .
Вот это самой число и надо занести в тетрады AFRH10 и AFRH9 , что и делает сей код :

Код: Выделить всё

GPIOA->AFR[1]= (1<<(2*4))|(1<<(1*4));


Где AFR[1] соответствует AFRH , первые 1(единицы) это AF1(0x01), произведения в скобках вычисляют позицию тетрады.




Чем Вы проверяете выход UART ?
Аватара пользователя
Kvasshtain
Нашел транзистор. Понюхал.
Сообщения: 170
Зарегистрирован: Ср фев 09, 2011 13:29:01
Откуда: г.Саратов

Re: STM32F0 и USART

Сообщение Kvasshtain »

Так, кажется начинаю въезжать. Спасибо за разъяснения :write: .
Проверяю компом. Связь осуществляется с помощью самодельной платы на FT232BL сконфигурированной для работы с 3-х вольтовой логикой. Плата рабочая точно (проверял по эхо-отклику закоротив rxd и txd). В качестве терминала использую программу COM Port Toolkit.
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F0 и USART

Сообщение dosikus »

Проект полностью в архиве выложите .
И уточню - STM32F051 , это дискавери же, или своя плата ?
Ответить

Вернуться в «ARM»