Страница 1 из 5
STM32F0 и USART
Добавлено: Вс окт 27, 2013 22:38:50
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На выходе тишина…
Не могу понять, что не так?
Re: STM32F0 и USART
Добавлено: Вс окт 27, 2013 23:08:55
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;
Re: STM32F0 и USART
Добавлено: Вс окт 27, 2013 23:22:31
wss60
Смотрел примеры, там вообще ничего не понятно…
Бит “RCC_USARTCLK” отсутствует в этом мк.
Re: STM32F0 и USART
Добавлено: Вс окт 27, 2013 23:48:10
zöner
это RCC_USART1CLK_SYSCLK
Re: STM32F0 и USART
Добавлено: Пн окт 28, 2013 01:21:15
wss60
zöner писал(а):это RCC_USART1CLK_SYSCLK
нету такого!?

Пробовал разные варианты битов “ RCC_CFGR3_USART1SW” – без результатов…
Re: STM32F0 и USART
Добавлено: Пн окт 28, 2013 01:31:18
zöner
есть. Пример взят из стандартной библиотеки STM32F0xx_StdPeriph_Examples/USART.
USART1 работает (правда, настраивал не напрямую регистры, а через функции из stm32f0xx_usart.c):
Код: Выделить всё
#define RCC_USART1CLK_SYSCLK RCC_CFGR3_USART1SW_0
Re: STM32F0 и USART
Добавлено: Пн окт 28, 2013 09:53:20
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;
}
Анализирую не флаг прерывания в регистре статуса прерывания, а флаг готовности передатчика в регистре статуса.
Re: STM32F0 и USART
Добавлено: Пн окт 28, 2013 10:25:01
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
Re: STM32F0 и USART
Добавлено: Пн окт 28, 2013 15:26:53
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
}

Re: STM32F0 и USART
Добавлено: Пн окт 28, 2013 15:33:42
dosikus
wss60 писал(а):Теперь другая проблема: компилятор “ругается” на регистр AFRH!?
Код: Выделить всё
void Init_usart(void)
{
GPIOA->AFRH |= 0x0110; // <----- !!!
Можно же ради приличия слазать в
stm32f0xx.h
Re: STM32F0 и USART
Добавлено: Пн окт 28, 2013 16:51:31
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);
}
Спасибо!!!
Re: STM32F0 и USART
Добавлено: Пн окт 28, 2013 17:25:32
dosikus
wss60 писал(а): Код: Выделить всё
USART1->CR1 |= USART_CR1_UE; //Включаем USART1
Хорошая практика - включать периферию после ее настройки , так как многое изменить на включенной нельзя...
Re: STM32F0 и USART
Добавлено: Пн дек 02, 2013 09:40:53
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. Т.е. Я не могу понять как пользоваться вот этой таблицей:
У Вас, уважаемые Коты, в AFRH записывается число 0x0110, как вы определили что нужно записать именно это число? Если я правильно понимаю, то нужно пользоваться как раз этой таблицей и датащита (но как, я недотукиваю).
Re: STM32F0 и USART
Добавлено: Пн дек 02, 2013 11:27:46
dosikus
Kvasshtain, выше в моем посту с картинками , что не понятно ???

И сразу же - какой камень ?
Re: STM32F0 и USART
Добавлено: Пн дек 02, 2013 12:16:26
Kvasshtain
Здравствуйте уважаемый Dosikus. Рад Вас видеть

. У меня STM32F051. Не ясно что записывать в AFR[1], и как это делать для других случаев. Т.е. я не понимаю откуда взялось число 0x0110, ну или по другому (1<<(2*4))|(1<<(1*4))? Да и контроллер молчит как партизан на допросе в Гестапо. Если я правильно составил программу, то контроллер должен без остановки циклически слать в порт число 0x45. А на выходе тишина. С пином порта все точно в норме, т. к. я это проверял (вешал на него светодиод и заставлял его моргать).
Re: STM32F0 и USART
Добавлено: Пн дек 02, 2013 13:12:49
dosikus
Код: Выделить всё
// Главный цикл
int main(void)
{
Init_usart();
Delay_mS(100);
while(1)
{
Transmit(0x45);
Delay_mS(100);
}
}
А так ?
Re: STM32F0 и USART
Добавлено: Пн дек 02, 2013 13:37:36
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)

. Как было определено это магическое число 0x0110?
Re: STM32F0 и USART
Добавлено: Пн дек 02, 2013 13:46:08
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 , что и делает сей код :
Где
AFR[1] соответствует
AFRH , первые 1(единицы) это AF1(0x01), произведения в скобках вычисляют позицию тетрады.
Чем Вы проверяете выход UART ?
Re: STM32F0 и USART
Добавлено: Пн дек 02, 2013 14:13:43
Kvasshtain
Так, кажется начинаю въезжать. Спасибо за разъяснения

.
Проверяю компом. Связь осуществляется с помощью самодельной платы на FT232BL сконфигурированной для работы с 3-х вольтовой логикой. Плата рабочая точно (проверял по эхо-отклику закоротив rxd и txd). В качестве терминала использую программу COM Port Toolkit.
Re: STM32F0 и USART
Добавлено: Пн дек 02, 2013 15:06:46
dosikus
Проект полностью в архиве выложите .
И уточню - STM32F051 , это дискавери же, или своя плата ?