Форум РадиоКот https://radiokot.ru/forum/ |
|
STM32F0 и USART https://radiokot.ru/forum/viewtopic.php?f=59&t=96063 |
Страница 1 из 5 |
Автор: | wss60 [ Вс окт 27, 2013 22:38:50 ] |
Заголовок сообщения: | STM32F0 и USART |
Не получается запустить 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 [ Вс окт 27, 2013 23:08:55 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
посмотрите примеры из 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 [ Вс окт 27, 2013 23:22:31 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
Смотрел примеры, там вообще ничего не понятно… Бит “RCC_USARTCLK” отсутствует в этом мк. |
Автор: | zöner [ Вс окт 27, 2013 23:48:10 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
это RCC_USART1CLK_SYSCLK |
Автор: | wss60 [ Пн окт 28, 2013 01:21:15 ] | ||
Заголовок сообщения: | Re: STM32F0 и USART | ||
zöner писал(а): это RCC_USART1CLK_SYSCLK нету такого!? Пробовал разные варианты битов “ RCC_CFGR3_USART1SW” – без результатов…
|
Автор: | zöner [ Пн окт 28, 2013 01:31:18 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
есть. Пример взят из стандартной библиотеки STM32F0xx_StdPeriph_Examples/USART. USART1 работает (правда, настраивал не напрямую регистры, а через функции из stm32f0xx_usart.c): Код: #define RCC_USART1CLK_SYSCLK RCC_CFGR3_USART1SW_0
|
Автор: | ut1wpr [ Пн окт 28, 2013 09:53:20 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
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 [ Пн окт 28, 2013 10:25:01 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
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 [ Пн окт 28, 2013 15:26:53 ] | ||
Заголовок сообщения: | Re: STM32F0 и USART | ||
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 }
|
Автор: | dosikus [ Пн окт 28, 2013 15:33:42 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
wss60 писал(а): Теперь другая проблема: компилятор “ругается” на регистр AFRH!? Код: void Init_usart(void) { GPIOA->AFRH |= 0x0110; // <----- !!! Можно же ради приличия слазать в stm32f0xx.h Код: GPIOA->AFR[1]= (1<<(2*4))|(1<<(1*4));
|
Автор: | wss60 [ Пн окт 28, 2013 16:51:31 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
Да облазил его весь: искал 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 [ Пн окт 28, 2013 17:25:32 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
wss60 писал(а): Код: USART1->CR1 |= USART_CR1_UE; //Включаем USART1 Хорошая практика - включать периферию после ее настройки , так как многое изменить на включенной нельзя... |
Автор: | Kvasshtain [ Пн дек 02, 2013 09:40:53 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
Здравствуйте уважаемые Коты. Попробовал примерчик уважаемого 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, как вы определили что нужно записать именно это число? Если я правильно понимаю, то нужно пользоваться как раз этой таблицей и датащита (но как, я недотукиваю). |
Автор: | dosikus [ Пн дек 02, 2013 11:27:46 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
Kvasshtain, выше в моем посту с картинками , что не понятно ??? И сразу же - какой камень ? |
Автор: | Kvasshtain [ Пн дек 02, 2013 12:16:26 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
Здравствуйте уважаемый Dosikus. Рад Вас видеть . У меня STM32F051. Не ясно что записывать в AFR[1], и как это делать для других случаев. Т.е. я не понимаю откуда взялось число 0x0110, ну или по другому (1<<(2*4))|(1<<(1*4))? Да и контроллер молчит как партизан на допросе в Гестапо. Если я правильно составил программу, то контроллер должен без остановки циклически слать в порт число 0x45. А на выходе тишина. С пином порта все точно в норме, т. к. я это проверял (вешал на него светодиод и заставлял его моргать). |
Автор: | dosikus [ Пн дек 02, 2013 13:12:49 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
Код: // Главный цикл int main(void) { Init_usart(); Delay_mS(100); while(1) { Transmit(0x45); Delay_mS(100); } } А так ? |
Автор: | Kvasshtain [ Пн дек 02, 2013 13:37:36 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
Т.е. Вы предлагаете просто добавить задержки? К сожалению смогу попробовать только дома. А дома у меня нет интернета. Так что узнаем о результатах только завтра. Хочу еще спросить у Вас по поводу странной фразы, сказанной вот здесь: 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? |
Автор: | dosikus [ Пн дек 02, 2013 13:46:08 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
А вы не увидели что : Плата под 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 [ Пн дек 02, 2013 14:13:43 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
Так, кажется начинаю въезжать. Спасибо за разъяснения . Проверяю компом. Связь осуществляется с помощью самодельной платы на FT232BL сконфигурированной для работы с 3-х вольтовой логикой. Плата рабочая точно (проверял по эхо-отклику закоротив rxd и txd). В качестве терминала использую программу COM Port Toolkit. |
Автор: | dosikus [ Пн дек 02, 2013 15:06:46 ] |
Заголовок сообщения: | Re: STM32F0 и USART |
Проект полностью в архиве выложите . И уточню - STM32F051 , это дискавери же, или своя плата ? |
Страница 1 из 5 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |