Отговори на тема  [ 14 мнения ] 
Програмиране на регистри на STM32L4R5ZI за USART 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 01, 2023 9:59 am
Мнения: 302
Мнение Програмиране на регистри на STM32L4R5ZI за USART
Здрасти,
"Зарибих" се с едни туториали в Удеми за Bare Metal programming. Изкарах два от тях с STM32L4 и STM32F4. Сега обаче реших да сменя хардуера с STM32L4R5ZI и срещнах стена от проблеми която не успявам да преодолея.
Опитвам се направя един от туроалите, в който USART настройва да изпраща сигнал, който да бъде уловен с RealTerm.

В общи линии кодът е това:

Код:

#include <stdint.h>
#include <stdio.h>
#include "stm32l4xx.h"



#define GPIOAEN       (1U<<0)
#define UART2EN         (1U<<17)

#define SYS_FREQ       48000000
#define APB1_CLK       SYS_FREQ

#define CR1_TE          (1U<<3)
#define CR1_UE         (1U<<0)

#define ISR_TXE       (1U<<7)


static uint16_t compute_uart_div(uint32_t PeriphClk, uint32_t Baudrate);

static void uart_set_baudrate (USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t Baudrate);

static void uart2_write(uint8_t ch);

void uart2_tx_init (USART_TypeDef *USARTx);


int __io_putchar (int ch)
{
   uart2_write(ch);
   return ch;
}

int main(){

   uart2_tx_init (USART2);

   while (1)
   {
      printf ("Hello from STM32L4....\n\r");
   }

}

void uart2_tx_init (USART_TypeDef *USARTx)
{
   //*******************Configure the UART pin*******************
   //Enable clock access to GPIOA for PA2 as TX line
   RCC->AHB2ENR |= GPIOAEN;

   //Set PA2 mode as alternate function mode
   GPIOA->MODER &=~(1U<<4);
   GPIOA->MODER |=(1U<<5);

   //Set the alternate function type to UART
   GPIOA->AFR[0] |=(1U<<8);
   GPIOA->AFR[0] |=(1U<<9);
   GPIOA->AFR[0] |=(1U<<10);
   GPIOA->AFR[0] &=~(1U<<11);

   //*******************Configure the UART module*******************
   //Enable clock access to UART2
   RCC->APB1ENR1 |=UART2EN;

   //Configure baudrate
   uart_set_baudrate (USARTx, APB1_CLK, 115200);

   //Configure transfer direction
   USARTx->CR1 = CR1_TE;

   // Enable UART module
   USARTx->CR1 |= CR1_UE;
}

static void uart2_write(uint8_t ch)
{
   //Wait for transmit data register to be empty
   while (!(USART2->ISR & ISR_TXE)) {}

   //Transmit value
   USART2->TDR = (ch & 0xFF);
   
}

static void uart_set_baudrate (USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t Baudrate)
{
   USARTx->BRR = compute_uart_div( PeriphClk, Baudrate);
}
USART с програмиране на регистри на STM32L4R5ZI

static uint16_t compute_uart_div(uint32_t PeriphClk, uint32_t Baudrate)
{
   return ((PeriphClk + (Baudrate/2))/Baudrate);
}



Компилира се и се ъплоадва. Realterm не получава нищо. Не мога да установя от къде е проблемът. Може би SYS_FREQ? Но пробвах с различни. Тази последната я взех от скоростта на APB1 bus. Някой може ли да помогне?


Пон Май 08, 2023 7:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
За да ползваш scanf/printf трябва някъде да имаш:

Код:
int _read(int file, char *data, int len)
{
    int count;

    for (count = 0; count < len; count++)
    {
        *data = (char)__io_getchar(); /* каквото чете от конзолата */
        data++;
    }
    return count;
}


int _write(int file,char *ptr, int len)
{
   int idx;
   for(idx= 0; idx < len; idx++)
   {
      __io_putchar(*ptr++); /* каквото пише в конзолата */
   }
   return len;
}

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Пон Май 08, 2023 8:57 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 01, 2023 9:59 am
Мнения: 302
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
Много благодаря да за включването! Променям system frequency на 120 MHz. Принципно кодът работи. Правих два туториала с идентичен код, за F401RE и L4 нещо си и нещата вървяха. Конкретно за printf имам това:

Код:
int __io_putchar (int ch)
{
   uart2_write(ch);
   return ch;
}


Все си мисля че е нещо от регистрите, което е конкретно за тази платка Nucleo-L4R5ZI, обаче не откривам какво. Единствените разлики, които намирам са в честотата на APB1 bus и USART2->CR1 Където при мен са два, до колкото разбирам за със и без FIFO, задавайки USARTx->CR1 = CR1_TE; , където CR1_TE е (1U<<3) би трябвало да нулирам всичко друго и така FIFO да е изключено. Нищо друго не мога да хвана.


Вто Май 09, 2023 8:28 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юни 07, 2005 6:20 pm
Мнения: 3532
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
Аз не съм голям специалист, но поне според мен платката няма общо. На ST платките са сравнително прости и дори CubeMX не конфигурира кой знае какво, дори да е зададена конкретна платка. Направо почти нищо не конфигурира.
Това с каква среда го ползваш? Не че бих могъл да ти помогна особено, просто ми е любопитно.


Вто Юни 13, 2023 5:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
само int __io_putchar (...) е за ИАР

за ГЦЦ _write()
Код:
int __attribute__((weak)) _write(int file, char *ptr, int len)
{
  for (int i = 0; i < len; i++)
    HAL_UART_Transmit(&huart_x, (const uint8_t *)ptr++, 1, -1); // или там каквото за Сенд
  return len;
  // setvbuf(stdout, NULL, _IONBF, 0); // this line after uart init
}

_________________
main[-1u]={1};


Вто Юни 13, 2023 6:31 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 01, 2023 9:59 am
Мнения: 302
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
Благодаря за включването!

Velio: ползвам CubeIDE

The Wizard: В настоящия случай не се ползват HAL библиотеки.


Сря Юни 14, 2023 10:37 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
VPavlov написа:
Благодаря за включването!

Velio: ползвам CubeIDE

The Wizard: В настоящия случай не се ползват HAL библиотеки.


ми заместваш HAL_UART_Transmit() с твоя UART_Transmit()

_________________
main[-1u]={1};


Сря Юни 14, 2023 12:43 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
По-горе пуснах пример, ама на колегата нещо не му се чете...

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Сря Юни 14, 2023 1:13 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 01, 2023 9:59 am
Мнения: 302
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
syscop написа:
По-горе пуснах пример, ама на колегата нещо не му се чете...

Съжалявам, нов съм в тия работи и сигурно не съм разбрал дробре. Благодаря все пак!


Сря Юни 14, 2023 5:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юни 07, 2005 6:20 pm
Мнения: 3532
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
VPavlov написа:
syscop написа:
По-горе пуснах пример, ама на колегата нещо не му се чете...

Съжалявам, нов съм в тия работи и сигурно не съм разбрал дробре. Благодаря все пак!


Syscop има предвид че printf в CubeIDE не работи по подразбиране. Трябва малко да му се побае (виж там неговия пример).


Пет Юни 23, 2023 5:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
velio написа:
VPavlov написа:
syscop написа:
По-горе пуснах пример, ама на колегата нещо не му се чете...

Съжалявам, нов съм в тия работи и сигурно не съм разбрал дробре. Благодаря все пак!


Syscop има предвид че printf в CubeIDE не работи по подразбиране. Трябва малко да му се побае (виж там неговия пример).


Те много неща не работят в Cube...
Тук работи, няма смисъл да се мъчи:

https://www.mikroe.com/mikroc-arm


Пон Юни 26, 2023 9:05 am
Профил ICQ WWW
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 01, 2023 9:59 am
Мнения: 302
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
Уча се... гледам туториали, няма много голям избор. Каквото покават туториалите такова правя и в която ИДЕ се ползва. Но напредвам по малко. Взех едни туториали за HAL сега. До колкото разбирам съобщението от printf се пренасочва чрез УСАРТ чрез __io_putchar функцията. Ако разбирам правилно, то аз имам това пренасочване и мисля че то работи, защото виждам съобщението през RealTerm.
Що се отнася то предложението на Wizzard за използване на HAL_UART_Transmit() / UART_Transmit(), не съм сигурен че мога да го имплементирам защото тези туториали, бяха за програмиране чрез настройване директно на регистрите. Първо имам конфигурация на УАРТ модула, после чакаме да се изпразни transmit data register и след което изпращаме съобщението чрез задаване на нова стойност на същия регистър: USART2->TDR = (ch & 0xFF);. Сигурно подхождам малко като новобранец, какъвто съм де, и си мисля че HAL_UART_Transmit() импелемтира в себе си тези и други действия, които обезсмилят предходното програмиране на регистри и програмата би имала нужда от по-различни настройки, както разбирам от сегашните туториали. Може би просто L серията има нужда от други настройки на регистрите, тия дни, ако остане време ще пробвам с HAL подходът, тъй като програмирането там изглежда на по-високо ниво се надявам да тръгне :)


Нед Юли 23, 2023 1:39 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
https://shawnhymel.com/1873/how-to-use-printf-on-stm32/

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Нед Юли 23, 2023 1:49 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Апр 01, 2023 9:59 am
Мнения: 302
Мнение Re: Програмиране на регистри на STM32L4R5ZI за USART
syscop написа:
https://shawnhymel.com/1873/how-to-use-printf-on-stm32/


Благодаря, ще го пробвам.


Нед Юли 23, 2023 2:56 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 14 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни