Skocz do zawartości

STM32F4 Nucleo F446ZE komunikacja UART


Qwazi

Pomocna odpowiedź

Witam,

Posiadam płytkę STM32F4 Nucleo F446ZE. Korzystam z kursu pod STM32F1. Utknąłem w miejscu z komunikacją UART. Próbowałem dostosować program do swojej płytki, następuje debugowanie lecz brak rezultatów w Tera Term. Czy ktoś może programował tą płytkę, wie o co chodzi?

Załączam swój program:

/**
 ******************************************************************************
 * @file    main.c
 * @author  Ac6
 * @version V1.0
 * @date    01-December-2013
 * @brief   Default main function.
 ******************************************************************************
*/

#include "stm32f4xx.h"

 void send_char(char c)
{
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2, c);
}

void send_string(const char* s)
{
while (*s)
send_char(*s++);
}

int main(void)
{
GPIO_InitTypeDef gpio;
USART_InitTypeDef uart;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOG, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

GPIO_StructInit(&gpio);
gpio.GPIO_Pin = GPIO_Pin_5;
gpio.GPIO_Mode = GPIO_Mode_AF;
gpio.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOD, &gpio);

gpio.GPIO_Pin = GPIO_Pin_6;
gpio.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOD, &gpio);

USART_StructInit(&uart);
uart.USART_BaudRate = 9600;
USART_Init(USART2, &uart);

USART_Cmd(USART2, ENABLE);

while (1) {
send_string("Hello world! \r\n");
}
}
Link do komentarza
Share on other sites

Musisz ustawić typ użytej funkcji alternatywnej dla pinów. Podpowiem, że potrzebujesz wywołać:

GPIO_PinAFConfig

Wygląda na to, że USART2 jest jako AF7, czyli pewnie coś w stylu GPIO_AF_USART2 trzeba będzie przekazać jako jeden z parametrów.

Link do komentarza
Share on other sites

Zastosowałem się do rad, kod wygląda tak:

#include "stm32f4xx.h"
#include <stdio.h>

void send_char(char c){
   while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
   USART_SendData(USART2, c);
}

void send_string(const char* s){
   while (*s)
       send_char(*s++);
}

volatile uint32_t timer_ms = 0;

void SysTick_Handler()
{
if (timer_ms) {
timer_ms--;
}
}

void delay_ms(int time)
{
timer_ms = time;
while (timer_ms) {};
}

int main(void)
{
   GPIO_InitTypeDef gpio;
   USART_InitTypeDef usart;

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

   GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);
   GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);
   GPIO_StructInit(&gpio);
   USART_StructInit(&usart);

//LED
   gpio.GPIO_Pin = GPIO_Pin_7;
   gpio.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_Init(GPIOB, &gpio);
//USART
   //Tx
   gpio.GPIO_Pin=GPIO_Pin_5;
   gpio.GPIO_Mode=GPIO_Mode_AF;
   GPIO_Init(GPIOD,&gpio);
   //Rx
   gpio.GPIO_Pin=GPIO_Pin_6;
   gpio.GPIO_Mode=GPIO_Mode_IN;
   GPIO_Init(GPIOD,&gpio);

//USART Config
   usart.USART_BaudRate = 115200;
   USART_Init(USART2,&usart);
   USART_Cmd(USART2,ENABLE);

   SysTick_Config(SystemCoreClock / 1000);

   while(1){
       GPIO_SetBits(GPIOB, GPIO_Pin_7);
       delay_ms(100);
       GPIO_ResetBits(GPIOB, GPIO_Pin_7);
       delay_ms(100);

       send_string("Hello\r\n");
   }
}

i nadal nic... Zaczynam myśleć, że jest to problem ze sterownikami, gdyż po napisaniu tego programu dioda działa jak powinna i w momencie jej zapalenia powinienem mieć komunikat, a komunikatu brak.

P.S. Zrobione! 4dni kombinowania i działa. Zmiana w rejestrach, dokładne przeczytanie dokumentacji, lekka modyfikacja i działa jak powinno!

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.