Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Програмиране на регистри на STM32L4R5ZI за USART
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=18828
Страница 1 от 1

Автор:  VPavlov [ Пон Май 08, 2023 7:50 pm ]
Заглавие:  Програмиране на регистри на 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. Някой може ли да помогне?

Автор:  syscop [ Пон Май 08, 2023 8:57 pm ]
Заглавие:  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;
}

Автор:  VPavlov [ Вто Май 09, 2023 8:28 am ]
Заглавие:  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 да е изключено. Нищо друго не мога да хвана.

Автор:  velio [ Вто Юни 13, 2023 5:48 pm ]
Заглавие:  Re: Програмиране на регистри на STM32L4R5ZI за USART

Аз не съм голям специалист, но поне според мен платката няма общо. На ST платките са сравнително прости и дори CubeMX не конфигурира кой знае какво, дори да е зададена конкретна платка. Направо почти нищо не конфигурира.
Това с каква среда го ползваш? Не че бих могъл да ти помогна особено, просто ми е любопитно.

Автор:  TheWizard [ Вто Юни 13, 2023 6:31 pm ]
Заглавие:  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
}

Автор:  VPavlov [ Сря Юни 14, 2023 10:37 am ]
Заглавие:  Re: Програмиране на регистри на STM32L4R5ZI за USART

Благодаря за включването!

Velio: ползвам CubeIDE

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

Автор:  TheWizard [ Сря Юни 14, 2023 12:43 pm ]
Заглавие:  Re: Програмиране на регистри на STM32L4R5ZI за USART

VPavlov написа:
Благодаря за включването!

Velio: ползвам CubeIDE

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


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

Автор:  syscop [ Сря Юни 14, 2023 1:13 pm ]
Заглавие:  Re: Програмиране на регистри на STM32L4R5ZI за USART

По-горе пуснах пример, ама на колегата нещо не му се чете...

Автор:  VPavlov [ Сря Юни 14, 2023 5:05 pm ]
Заглавие:  Re: Програмиране на регистри на STM32L4R5ZI за USART

syscop написа:
По-горе пуснах пример, ама на колегата нещо не му се чете...

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

Автор:  velio [ Пет Юни 23, 2023 5:51 pm ]
Заглавие:  Re: Програмиране на регистри на STM32L4R5ZI за USART

VPavlov написа:
syscop написа:
По-горе пуснах пример, ама на колегата нещо не му се чете...

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


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

Автор:  relsys [ Пон Юни 26, 2023 9:05 am ]
Заглавие:  Re: Програмиране на регистри на STM32L4R5ZI за USART

velio написа:
VPavlov написа:
syscop написа:
По-горе пуснах пример, ама на колегата нещо не му се чете...

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


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


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

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

Автор:  VPavlov [ Нед Юли 23, 2023 1:39 pm ]
Заглавие:  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 подходът, тъй като програмирането там изглежда на по-високо ниво се надявам да тръгне :)

Автор:  syscop [ Нед Юли 23, 2023 1:49 pm ]
Заглавие:  Re: Програмиране на регистри на STM32L4R5ZI за USART

https://shawnhymel.com/1873/how-to-use-printf-on-stm32/

Автор:  VPavlov [ Нед Юли 23, 2023 2:56 pm ]
Заглавие:  Re: Програмиране на регистри на STM32L4R5ZI за USART

syscop написа:
https://shawnhymel.com/1873/how-to-use-printf-on-stm32/


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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/