Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32F0 и USART

Вс окт 27, 2013 22:38:50

Не получается запустить 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

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

Re: STM32F0 и USART

Вс окт 27, 2013 23:08:55

посмотрите примеры из 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;

Re: STM32F0 и USART

Вс окт 27, 2013 23:22:31

Смотрел примеры, там вообще ничего не понятно…
Бит “RCC_USARTCLK” отсутствует в этом мк.

Re: STM32F0 и USART

Вс окт 27, 2013 23:48:10

это RCC_USART1CLK_SYSCLK

Re: STM32F0 и USART

Пн окт 28, 2013 01:21:15

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

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

Пробовал разные варианты битов “ RCC_CFGR3_USART1SW” – без результатов…
Вложения
usart.PNG
(16.3 KiB) Скачиваний: 8487

Re: STM32F0 и USART

Пн окт 28, 2013 01:31:18

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

Re: STM32F0 и USART

Пн окт 28, 2013 09:53:20

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;
}

Анализирую не флаг прерывания в регистре статуса прерывания, а флаг готовности передатчика в регистре статуса.

Re: STM32F0 и USART

Пн окт 28, 2013 10:25:01

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;

Re: STM32F0 и USART

Пн окт 28, 2013 15:26:53

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 KiB) Скачиваний: 8519

Re: STM32F0 и USART

Пн окт 28, 2013 15:33:42

wss60 писал(а):Теперь другая проблема: компилятор “ругается” на регистр AFRH!?
Код:
void Init_usart(void)
{
 
 
  GPIOA->AFRH    |= 0x0110;  // <----- !!!



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

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

Re: STM32F0 и USART

Пн окт 28, 2013 16:51:31

Да облазил его весь: искал 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);
}


Спасибо!!!

Re: STM32F0 и USART

Пн окт 28, 2013 17:25:32

wss60 писал(а):
Код:
 USART1->CR1 |= USART_CR1_UE; //Включаем USART1



Хорошая практика - включать периферию после ее настройки , так как многое изменить на включенной нельзя...

Re: STM32F0 и USART

Пн дек 02, 2013 09:40:53

Здравствуйте уважаемые Коты. Попробовал примерчик уважаемого 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 KiB) Скачиваний: 1295


У Вас, уважаемые Коты, в AFRH записывается число 0x0110, как вы определили что нужно записать именно это число? Если я правильно понимаю, то нужно пользоваться как раз этой таблицей и датащита (но как, я недотукиваю).

Re: STM32F0 и USART

Пн дек 02, 2013 11:27:46

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

И сразу же - какой камень ?

Re: STM32F0 и USART

Пн дек 02, 2013 12:16:26

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

Re: STM32F0 и USART

Пн дек 02, 2013 13:12:49

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


А так ?

Re: STM32F0 и USART

Пн дек 02, 2013 13:37:36

Т.е. Вы предлагаете просто добавить задержки?
К сожалению смогу попробовать только дома. А дома у меня нет интернета. Так что узнаем о результатах только завтра.
Хочу еще спросить у Вас по поводу странной фразы, сказанной вот здесь: 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?

Re: STM32F0 и USART

Пн дек 02, 2013 13:46:08

А вы не увидели что :
Плата под 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 ?

Re: STM32F0 и USART

Пн дек 02, 2013 14:13:43

Так, кажется начинаю въезжать. Спасибо за разъяснения :write: .
Проверяю компом. Связь осуществляется с помощью самодельной платы на FT232BL сконфигурированной для работы с 3-х вольтовой логикой. Плата рабочая точно (проверял по эхо-отклику закоротив rxd и txd). В качестве терминала использую программу COM Port Toolkit.

Re: STM32F0 и USART

Пн дек 02, 2013 15:06:46

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