Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
НеСказочник
58 / 46 / 13
Регистрация: 12.11.2012
Сообщений: 367
Записей в блоге: 2
1

UART на STM32F030F4P6

10.03.2015, 10:03. Просмотров 3748. Ответов 10
Метки нет (Все метки)

Пишу програмку для контроллера, которая будет зажигать диодики на портах 0, 1, 2, 3 и ещё общаться с ПК через COM порт. Возникла такая проблема: когда я инициализирую порты 0, 1, 2, 3, у меня перестаёт работать UART.

Вот этот код я тестил:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "stm32f0xx.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_usart.h"
#include "stm32f0xx_adc.h"
#include "stdlib.h"
 
int main()
{
    uint16_t*TS_CAL1 = ((uint16_t*)0x1FFFF7B8);
    uint16_t*TS_CAL2 = ((uint16_t*)0x1FFFF7C2);
    
    
    USORT_InitTypeDef USORT_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    SystemInit();
    
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USORT1,ENABLE);
    
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
    
    //Configure USORT1 pins:  Rx and Tx ----------------------------
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    USORT_InitStructure.USORT_BaudRate = 9600;
    USORT_InitStructure.USORT_WordLength = USORT_WordLength_8b;
    USORT_InitStructure.USORT_StopBits = USORT_StopBits_2;
    USORT_InitStructure.USORT_Parity = USORT_Parity_Even;
    USORT_InitStructure.USORT_HardwareFlowControl = USORT_HardwareFlowControl_None;
    USORT_InitStructure.USORT_Mode = USORT_Mode_Rx | USORT_Mode_Tx;
    USORT_Init(USORT1, &USORT_InitStructure);
 
    USORT_Cmd(USORT1,ENABLE);
    
    
    /////______ВОТ ТОТ ЗЛАЩАСНЫЙ КОД, ПОСЛЕ КОТОРОГО ВКЛЮЧАЮТСЯ ПОРТЫ 0,1,2,3, но выключается UART
    GPIO_InitTypeDef ITD_PA0;
    
    RCC->AHBENR = RCC_AHBENR_GPIOAEN;
    
    GPIO_StructInit(&ITD_PA0);
    ITD_PA0.GPIO_Mode = GPIO_Mode_OUT;
    //ITD_PA0.GPIO_OType = GPIO_OType_PP;
    ITD_PA0.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    ITD_PA0.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&ITD_PA0);  
    /////////////////////////////////// 
    
 
    while(1)
    {
                
        if ((USORT1->ISR & USORT_ISR_TXE))  
        {
            uint16_t tmp = '^';
            USORT1->TDR = tmp; 
        }
}
Это тестовый пример, который я использовал для отлавливания бага.


Раньше я программировал AVR и на ассемблере, а на STM32 и Си пересел недавно и чувствую, что тут всё гораздо сложнее.

Кто знает, что я делаю не так подскажите.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2015, 10:03
Ответы с готовыми решениями:

STM32F030F4P6 АЦП
Добрый день - пытаюсь настроить АЦП на данном микроконтроллере STM32F030F4P6 - 3 канала. Но первое...

UUID в STM32f030f4p6
Не подскажите, есть ли в этом камне заводской UUID и если да, то по какому адресу лежит?

STM32F030F4P6 not flashing
Контроллер STM32F030F4P6. Проблема - не заливается прошивка. Сделал макетку для вывода ног на...

STM32F030F4P6 WTF -> LifeHack
Короче, учился тут писать во флеш (эмуляция еепром) с удивлением обнаружил, что запись спокойно...

stm32f030f4p6 ШИМ (PWM)
Столкнулся с проблемой. Не работает ШИМ. Возможно я ЧДНТ. Контроллер: stm32f030f4p6. Среда...

10
ValeryS
Модератор
7490 / 5671 / 727
Регистрация: 14.02.2011
Сообщений: 19,386
Завершенные тесты: 1
10.03.2015, 10:13 2
Цитата Сообщение от НеСказочник Посмотреть сообщение
которая будет зажигать диодики на портах 0, 1, 2, 3
нет там таких портов
есть A B C D E F не все выведены на ножки
наверно имел ввиду пины
USORT 1 висит там же где GPIOA2 GPIOA3
так что или USORT или GPIOA
хотя можно перенести USORT на другие ноги
для того чтобы на выводaх работал USORT нужно включить альтернативную функцию

вообще информации маловато
что за камень? схему подключения
0
НеСказочник
58 / 46 / 13
Регистрация: 12.11.2012
Сообщений: 367
Записей в блоге: 2
10.03.2015, 10:16  [ТС] 3
STM32F030F4P6. UART у него на 9 и 10 пинах порта A. А диоды у меня на 0-3 пинах того же порта. Без включения пинов 0-3 UART работает идеально. И пины без него тоже. А вот вместе никак. Если ради 9 и 10 пинов мне нужно жертвовать всем портом А, то это даже больше, чем расточительство. Хотя я и могу перенести диоды на другие пины, поскольку использую самодельную отладочную плату.
0
ValeryS
Модератор
7490 / 5671 / 727
Регистрация: 14.02.2011
Сообщений: 19,386
Завершенные тесты: 1
10.03.2015, 10:16 4
скачай себе
STM32CubeMx и будешь видеть на каких ножках что висит
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
10.03.2015, 10:24 5
Камень какой?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define APBCLK   8000000UL
#define BAUDRATE 115200UL
 
void Init_usart(void)
{
  GPIOA_CLK_ENABLE;  //Включаем тактирование GPIOA
  USORT1_CLK_ENABLE; //Включаем тактирование USORT1
  
  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_USORT1SW;
  RCC->CFGR3     |=  RCC_CFGR3_USORT1SW_0;  //System clock (SYSCLK) selected as USORT1 clock
 
  
  USORT1->CR1 |= USORT_CR1_UE; //Включаем USORT1
  USORT1->CR1 &= ~USORT_CR1_M; //Данные - 8 бит
  USORT1->CR2 &= ~USORT_CR2_STOP; //1 стоп-бит
  USORT1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; //скорость usart
  USORT1->CR1 |= USORT_CR1_TE; //Включаем передатчик USORT1
  USORT1->CR1 |= USORT_CR1_RE; //Включаем приемник USORT1
  
}
0
ValeryS
Модератор
7490 / 5671 / 727
Регистрация: 14.02.2011
Сообщений: 19,386
Завершенные тесты: 1
10.03.2015, 10:24 6
Цитата Сообщение от НеСказочник Посмотреть сообщение
UART у него на 9 и 10 пинах порта A.
так же на 2 и 3
но можно перенести на 9 и 10
как сейчас не могу сказать с 0 серией не работал
поищи в интернете "Переназначение выводов"
вот здесь например расписано но только про 100 серию
http://robocraft.ru/blog/ARM/687.html
0
Voland_
1696 / 1040 / 98
Регистрация: 04.01.2010
Сообщений: 3,524
10.03.2015, 10:44 7
хм, я б еще придрался вот к этому:
Цитата Сообщение от НеСказочник Посмотреть сообщение
RCC->AHBENR = RCC_AHBENR_GPIOAEN;
т.к. такой код выключает все на шине клока AHB, кроме порта А, но все остальное не мешает работе по идее..
...попробуйте поменять местами инит портов для управления UART'ом и код настройки пинов. Вполне возможно это что-то поменяет. И еще - вы надергали код из нескольких примеров - и в структуре инита у вас две структуры "ITD_PA0" и "GPIO_InitStructure" выполняют одну роль - лучше оставить только одну переменную. И еще - многие компиляторы не любят объявлять переменные посередине блока в функции ( ограниченного { } ). Что вы используете в качестве IDE и что это IDE говорит в плане объявления вами переменной в середине блока?
1
НеСказочник
58 / 46 / 13
Регистрация: 12.11.2012
Сообщений: 367
Записей в блоге: 2
10.03.2015, 10:47  [ТС] 8
Цитата Сообщение от Voland_ Посмотреть сообщение
хм, я б еще придрался вот к этому:
Спасибо, я посмотрю и отпишусь. А по поводу остальных замечаний: я знаю, что мой стиль кода не айс, но волнует меня не это, а порты микросхемы, так что ещё раз спасибо.
0
ValeryS
Модератор
7490 / 5671 / 727
Регистрация: 14.02.2011
Сообщений: 19,386
Завершенные тесты: 1
10.03.2015, 14:14 9
Цитата Сообщение от Voland_ Посмотреть сообщение
И еще - многие компиляторы не любят объявлять переменные посередине блока в функции
по стандарту С99 уже можно
например Keil не любит, поскольку по умолчанию использует С90
но стоит дать ему ключик --c99,а еще паче --cpp,то нормально отрабатывает
0
ValeryS
Модератор
7490 / 5671 / 727
Регистрация: 14.02.2011
Сообщений: 19,386
Завершенные тесты: 1
10.03.2015, 14:33 10
вот что мне сгенерил STM32CubeMx
для данной микросхемы
1
Вложения
Тип файла: rar tstF0.rar (10.9 Кб, 18 просмотров)
Voland_
1696 / 1040 / 98
Регистрация: 04.01.2010
Сообщений: 3,524
11.03.2015, 10:34 11
ValeryS, посмотрел - вполне прилично получилось. Мне бы не понравился подход инита уарта, который оставляет в себе все настройки - как правило, они не нужны. Но во-первых, это можно переделать в одно движение, во-вторых, не так уж архиважно.
0
11.03.2015, 10:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2015, 10:34

Прошивка STM32F030F4P6 TSSOP20 via ST-LINK/V2
Помогите пожалуйста понять природу такого поведении - ST-LINK-ом с дискавери программирую целевой...

Не работают прерывания ADC на STM32f030f4p6
Здравствуйте, такая проблема - не получается включить прерывания по завершению преобразования ADC....

Внезапно перестал работать PLL на STM32F030F4P6
Есть две аналогичных платы. Подключил внешние кварцы, сконфигурировал на использование HSE через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru