برد STM

استفاده از printf برای برد STM32f4

نوشته شده توسط اروند طباطبایی

اگر شما بتوانید فقط از printf در دستورات خروجی خود به صورت مستقیم بر روی USART یا lcd و چیزهای دیگر استفاده کنید بسیار عالی است. شما با ARMc میتوانید این کار را انجام دهید. فقط نیاز به پیاده‌سازی یک سری چیزها دارید و پس از آن آماده برای کار هستید. کتابخانه جدید استودیو در اینجا قرار داده شده است .

برای فعال کردن قابلیت printf ابتدا نیاز دارید تا یک ساختار FILE _ _ این ساختار از این به بعد ساختار file خطاب خواهد شد. تنها میتواند یک پارامتر ساختگی داشته باشد. اما باید ساخته شود چرا که شما نیاز به یک نشانگر برای ساختار دارید. حال باید برای خود یکی از این نشانگر ها بنویسید؛ من برای خودم یکی از آن‌ها را در زیر نوشته‌ام.

/* We need to implement own __FILE struct */

/* FILE struct is used from __FILE */

struct __FILE {

int dummy;

};

پس از آن باید یک متغیر برای ساختار file ایجاد کنیم :

/* You need this if you want use printf */

/* Struct FILE is implemented in stdio.h */

FILE __stdout;

متغیر با نام stdout __ یک متغیر مهم است. شما نمیتوانید از نام های دیگری استفاده کنید. زیرا در آن صورت دیگر دستور پرینت کار نخواهد داد. آخرین چیزی که نیاز داریم بسازیم یک تابع است که printf را صدا کرده و کاراکتر مورد نظر شمارا چاپ کند. این تابع دارای نام ثابت است و نباید آن را تغییر داد.

int fputc(int ch, FILE *f) {

/* Do your stuff here */

/* Send your custom byte */

/* If everything is OK, you have to return character written */

return ch;

/* If character is not correct, you can return EOF (-1) to stop writing */

//return -1;

}

شما آماده هستید تا تابع printf را استفاده کنید. در زیر یک مثال ساده قرار داده شده است که شما میتوانید اطلاعات را به USART1 و با printf به وسیله کتابخانه usart خروجی بگیرید.

/**
 *	@author 	Tilen Majerle
 *	@email		tilen@majerle.eu
 *	@website	http://stm32f4-discovery.com
 *	@ide		Keil uVision 5
 */
/* Include core modules */
#include "stm32f4xx.h"
/* Include my libraries here */
#include "defines.h"
#include "tm_stm32f4_usart.h"

/* In stdio.h file is everything related to output stream */
#include "stdio.h"

/* We need to implement own __FILE struct */
/* FILE struct is used from __FILE */
struct __FILE {
  int dummy;
};

/* You need this if you want use printf */
/* Struct FILE is implemented in stdio.h */
FILE __stdout;

int fputc(int ch, FILE *f) {
  /* Do your stuff here */
  /* Send your custom byte */
  /* Send byte to USART */
  TM_USART_Putc(USART1, ch);

  /* If everything is OK, you have to return character written */
  return ch;
  /* If character is not correct, you can return EOF (-1) to stop writing */
  //return -1;
}

int main(void) {
  /* Initialize system */
  SystemInit();

  /* Initialize USART1, TX: PA9 */
  TM_USART_Init(USART1, TM_USART_PinsPack_1, 115200);

  /* Put string to USART1 */
  printf("USART1 Streamn");

  while (1) {

  }
}

همچنین شما به کتابخانه USART من نیاز دارید که آن را در زیر قرار داده ام.

TM STM32F4 USART Library

 

 

درباره نویسنده

اروند طباطبایی

بنیانگذار دیجی اسپارک: اولین مرجع تخصصی امبدد سیستم به زبان فارسی / کارشناس سئو و تولید محتوا

هرچه می آموزم میبینم که خیلی کم آموختم. علاقه به رباتیک و تکنولوژی دارم. امیدوارم بتونم دانشی را که آموخته‌ام، به روش‌های مختلفی به کاربران علاقمند منتقل کنم.

تبادل نظر و رفع عیب با ثبت دیدگاه

۳ دیدگاه

  • سلام استاد .
    چطوری میشه فهمید که کتابخانه stdio.h که در keil اتعریف شده از کدام usart استفاده میکنه؟
    تشکر

    • با سلام
      کتابخانه stdio.h در نرم‌افزار KEIL بصورت پیشفرض به USART دیتایی ارسال نمی کند، شما با اضافه نمودن کد خاصی به برنامه، مشخص میکنید که دیتای که Print می‌شود. به کدام USART ارسال شود.

  • سلام . برای میکرو ارم کد sprintfدر keil که وارد میکنم ارور نمیدهد اما warning میده . شما میدونید چرا ؟