Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
unlimeted
1 / 1 / 1
Регистрация: 08.09.2014
Сообщений: 72
Завершенные тесты: 1
1

Программирование UART в STM32 Nucleo

04.12.2019, 21:04. Просмотров 288. Ответов 15

Привет всем, хотел у вас спросить, не так давно начал изучать программирование микроконтроллеров STM32, в связи с этим вопрос, хочу наладить передачу данных на компьютер по порту UART, используя переходник USB-UART CP2102, с помощью даташит написал вот такой код:
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
68
69
70
#define RCC_AHB1ENR (*(volatile unsigned long *) 0x40023830) //RCC AHB1 peripheral clock register
#define RCC_APB2ENR (*(volatile unsigned long *) 0x40023844) //RCC APB2 peripheral clock enable register
//--------------------------------------------------------------------------------------------------------------------------
#define GPIOA_MODER (*(volatile unsigned long *) 0x40020000) //GPIO port mode register
#define GPIOA_ODR   (*(volatile unsigned long *) 0x40020014) //GPIO port mode register
#define GPIOA_AFRL  (*(volatile unsigned long *) 0x40020024) //GPIO alternate function high register
 
//--------------------------------------------------------------------------------------------------------------------------
#define USART_CR1 (*(volatile unsigned long *) 0x40011000) // Control register 1
#define USART_BRR (*(volatile unsigned long *) 0x4001100C) // Baud rate register
#define USART_ISR (*(volatile unsigned long *) 0x4001101C) // Interrupt and status register
#define USART_TDR (*(volatile unsigned long *) 0x40011028) // Transmit data register
//----------------------------------------------------------------------------------------------------------------------------------------
 
void _delay(volatile unsigned long int index);
 
int main(void)
{
 
 
RCC_AHB1ENR |= 1<<0; //IO port A clock enable
RCC_APB2ENR |= 1<<4; //USART1 clock enabled
 
GPIOA_MODER |= (1<<19)|(0<<18); //PA9.TX alternate function mode
GPIOA_AFRL |= (0<<7)|(1<<6)|(1<<5)|(1<<4); //PA9 in AF7 mode
 
/**Character transmission procedure**/
//1. Program the M bits in USART_CR1 to define the word length.
//M[1:0] = 00: 1 Start bit, 8 data bits, n stop bits
 
//2. Select the desired baud rate using the USART_BRR register.
USART_BRR = 0x57E4; //Budrate 9600
 
//3. Program the number of stop bits in USART_CR2.
//00: 1 stop bit
 
//4. Enable the USART by writing the UE bit in USART_CR1 register to 1.
USART_CR1 |= 1<<0; //Bit 0 UE: USART enable
 
//6. Set the TE bit in USART_CR1 to send an idle frame as first transmission.
USART_CR1 |= 1<<3; //Bit 3 TE: Transmitter enable
 
 
 
 
 
while(1)
    {
        /*7. Write the data to send in the USART_TDR register (this clears the TXE bit). Repeat this
        for each data to be transmitted in case of single buffer.*/
 
 
        /*8. After writing the last data into the USART_TDR register, wait until TC=1. This indicates
        that the transmission of the last frame is complete. This is required for instance when
        the USART is disabled or enters the Halt mode to avoid corrupting the last
        transmission.*/
        while(!(USART_ISR & (1<<7)));
        USART_TDR = 'S';
      //  led = !led;
       // thread_sleep_for(BLINKING_RATE_MS);
 
        _delay(20000000);
    }
}
 
 
void _delay(volatile unsigned long int index) //Задержка
{
    while(index--);
}
Технически код работает, но есть проблема, данные бьются, присылаются нули, не пойму в чем дело, пользовался разными средами IAR, SW4ST, и т.д. в платформе mbed код работает правильно, но скорость порта надо ставить на компьютере не 9600 как задано на микроконтроллере, а 4800. В общем прошу помощи, может есть идеи почему так, до этого программировал плату STM32F3Discovery, там все работало.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2019, 21:04
Ответы с готовыми решениями:

STM32 Nucleo, муки выбора.
Всем привет! Это мое первое сообщение на этом форуме, хотя форум читаю давно. Решил начать изучать...

Stm32 nucleo f103rb и arduino
Всем привет. Хочу подключить пирометрический датчик gy-906 к stm32 nucleo f103rb. Всё подключаю как...

Организация связи по ethernet на stm32 nucleo-f767zi
Всем привет! Покопав в сторону вопроса организации связи между ПК и платой с МК, а также...

Проблема с передачей по spi stm32 Nucleo-L053R8
Здравствуйте, что-то никак не получается у меня с первого раза завести интерфейсы арма. На этот...

15

_SayHello
788 / 474 / 156
Регистрация: 30.07.2015
Сообщений: 1,580
04.12.2019, 22:24 2
unlimeted, ну получается что неправильно рассчитан BRR. Он от частоты системной шины. Какая у вас частота шины? И какой контроллер стоит
1
unlimeted
1 / 1 / 1
Регистрация: 08.09.2014
Сообщений: 72
Завершенные тесты: 1
04.12.2019, 23:07  [ТС] 3
_SayHello, Ну контроллер стоит Cortex-M7, а именно STM32F767ZIT6, 32 битный, тактируется до 216 MHz, но разве я не могу указать меньшую скорость, я ведь BRR из таблицы в datasheets брал
0
_SayHello
788 / 474 / 156
Регистрация: 30.07.2015
Сообщений: 1,580
05.12.2019, 10:39 4
unlimeted,
Цитата Сообщение от unlimeted Посмотреть сообщение
тактируется до 216 MHz, но разве я не могу указать меньшую скорость, я ведь BRR из таблицы в datasheets брал
В таблице числа указаны исходя из того что чатота тактирования составляет 216 МГц.
Какая у вас частота тактирования настроена - непонятно. Если у вас при таком коэффициенте фактическая скорость в два раза ниже, то скорее всего частота тактирования тоже в 2 раза меньше.
0
05.12.2019, 10:39
unlimeted
1 / 1 / 1
Регистрация: 08.09.2014
Сообщений: 72
Завершенные тесты: 1
05.12.2019, 10:52  [ТС] 5
_SayHello, Так понял, можно тогда вопрос, не знаете ли вы, где именно про это можно посмотреть в datasheets, в каких разделах это пишут, про тактирование?
0
_SayHello
788 / 474 / 156
Регистрация: 30.07.2015
Сообщений: 1,580
05.12.2019, 10:53 6
unlimeted, Раздел RCC
1
unlimeted
1 / 1 / 1
Регистрация: 08.09.2014
Сообщений: 72
Завершенные тесты: 1
05.12.2019, 10:59  [ТС] 7
_SayHello, Спасибо большое, буду дальше смотреть
0
COKPOWEHEU
2126 / 1253 / 287
Регистрация: 09.09.2017
Сообщений: 5,104
06.12.2019, 10:01 8
Из даташита:
On reset the 16 MHz internal HSI RC oscillator is selected as the default CPU clock.
Скорее всего, по умолчанию все делители и множители выключены (ахтунг! Эти рассуждения сделаны из общих соображений, у инженеров ST может быть другое представление)
Цитата Сообщение от unlimeted Посмотреть сообщение
USART_BRR = 0x57E4; //Budrate 9600
Задавать подобные числа в шестнадцатеричной системе бессмысленно и неудобно, лучше всего через формулу:
C
1
USART_BRR = 16000000 / 9600;
1
unlimeted
1 / 1 / 1
Регистрация: 08.09.2014
Сообщений: 72
Завершенные тесты: 1
06.12.2019, 11:42  [ТС] 9
COKPOWEHEU, Ну я это число взял из datasheets в таком виде, поэтому и задал, а так спасибо, буду знать, вообще я вчера сгенерировал проект с помощью куба(нашел в интернете вот эту статью:http://narodstream.ru/stm-urok-40-zn...o-stm32f767zi/ ) и вставил туда свой код и все заработало, я так понимаю из за этого кода:void
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
SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 
  /** Configure the main internal regulator output voltage 
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 216;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Activate the Over-Drive mode 
  */
  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
  {
    Error_Handler();
  }
}
Этот код куб создал, но в нем можно увидеть что там задается и генератор и частота и делитель, вот теперь хочу сам запрограммировать подобную вещь, только по своему, я пока не хочу переходить на куб, хочу по ближе с железом пообщаться без библиотек.
0
COKPOWEHEU
2126 / 1253 / 287
Регистрация: 09.09.2017
Сообщений: 5,104
06.12.2019, 12:10 10
Цитата Сообщение от unlimeted Посмотреть сообщение
я вчера сгенерировал проект с помощью куба
Я бы на вашем месте не полагался на всяческую магию, принципов действия которой не понимаете. Хотя бы по началу стоит реализовать все это ручками, как вы и пытались в начале, а уже потом, когда магия перестанет быть магией, можно и к ней переходить.
Или не переходить: написать собственную библиотеку абстракции.
Цитата Сообщение от unlimeted Посмотреть сообщение
сгенерировал проект с помощью куба и вставил туда свой код
Определитесь, вы через регистры работаете или через HAL? Не стоит смешивать эти подходы, а то потом разобраться сложно будет.
1
unlimeted
1 / 1 / 1
Регистрация: 08.09.2014
Сообщений: 72
Завершенные тесты: 1
06.12.2019, 12:36  [ТС] 11
COKPOWEHEU, Поэтому я и написал:
Цитата Сообщение от unlimeted Посмотреть сообщение
Этот код куб создал, но в нем можно увидеть что там задается и генератор и частота и делитель, вот теперь хочу сам запрограммировать подобную вещь, только по своему, я пока не хочу переходить на куб, хочу по ближе с железом пообщаться без библиотек.
. Я куб использовал что бы просто посмотреть.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Определитесь, вы через регистры работаете или через HAL? Не стоит смешивать эти подходы, а то потом разобраться сложно будет.
Мне больше нравится через регистры, поэтому на них и сижу, просто в интернете сейчас так мало кто работает.
0
COKPOWEHEU
2126 / 1253 / 287
Регистрация: 09.09.2017
Сообщений: 5,104
06.12.2019, 13:49 12
Цитата Сообщение от unlimeted Посмотреть сообщение
Этот код куб создал, но в нем можно увидеть что там задается и генератор и частота и делитель
Работа с RCC это, конечно, хорошо, но что мешает запустить на генераторе по умолчанию.
Цитата Сообщение от unlimeted Посмотреть сообщение
Мне больше нравится через регистры, поэтому на них и сижу
Мне тоже, правда я на L1 серии сижу (32L151). Не знаю как у вас в F7, а там есть набор CMSIS. Там прописаны имена регистров и битов (местами через известное место, но это решаемо). Вот тут говорят, что можно из Куба выковырять.
По сути это все еще работа с регистрами, но не надо их имена ручками вбивать, плюс они мало-мальски стандартные. Например, ваша инициализация тактирования будет выглядеть как-то так:
C
1
2
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
(писал из головы, мог опечататься)
0
unlimeted
1 / 1 / 1
Регистрация: 08.09.2014
Сообщений: 72
Завершенные тесты: 1
06.12.2019, 14:14  [ТС] 13
COKPOWEHEU, Да будет что то вроде этого:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
1 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
2 RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
Но, я пока и CMSIS особо не использую, это конечно же все хорошо, но я пока все же учусь, поэтому считаю нужно сначала с регистрами поиграться.
0
COKPOWEHEU
2126 / 1253 / 287
Регистрация: 09.09.2017
Сообщений: 5,104
06.12.2019, 16:20 14
CMSIS это и есть работа с регистрами. Посмотрите в соответствующем файле, это тоже самое, что вы писали простыню дефайнов.
0
unlimeted
1 / 1 / 1
Регистрация: 08.09.2014
Сообщений: 72
Завершенные тесты: 1
06.12.2019, 19:08  [ТС] 15
COKPOWEHEU, Я знаю про CMSIS, для STM32F3Discovery ее использовал. Для этой платы я не нашел еще CMSIS, все среды для нее загружают только HAL
0
COKPOWEHEU
2126 / 1253 / 287
Регистрация: 09.09.2017
Сообщений: 5,104
06.12.2019, 20:35 16
unlimeted, я же привел ссылку, что народ находил CMSIS в недрах Куба. А Куб у вас установлен.
0
06.12.2019, 20:35
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2019, 20:35

SPI и UART на STM32
Здравствуйте! Возник следующий вопрос. Как отправить значение (в шестнадцатеричном коде) по...

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

Или воспользуйтесь поиском по форуму:

16
Ответ Создать тему
Опции темы

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