برنامه نویسی

Uart را با STM32F411RE – انجمن DEV راه اندازی کنید

Summarize this content to 400 words in Persian Lang

1. بلوک دیاگرام را در دیتاشیت باز کنید

ما از رابط USART2 استفاده خواهیم کرد زیرا به همان گذرگاه (APB1) با رابط برق متصل است. این بدان معناست که ما می‌توانیم مستقیماً از طریق USB با کامپیوتر بدون داشتن تراشه برای تبدیل از UART به USB ارتباط برقرار کنیم.

2. تابع ارسال UART را به USB کامپیوتر بنویسید

نگاشت تابع جایگزین را در دیتاشیت باز کنید. می بینیم که ایجاد UART TX شامل PA2 و AF07 (بعدا ذکر خواهد شد)

ابتدا باید پورت PA2 را برای نوع عملکرد جایگزین مانند جدول بالا تنظیم کنیم

RCC->AHB1ENR |= GPIOAEN;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

PA2 را روی حالت متناوب تنظیم کنید به عنوان جدول، باید بیت 5 و 4 پین 2 را روی مقدار 10 قرار دهیم.

GPIOA->MODER &=~(1U<<4);
GPIOA->MODER |= (1U<<5);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نوع جایگزین PA2 را روی UART_TX تنظیم کنید همانطور که در بالا ذکر شد، علاوه بر PA2، باید AF07 را نیز تغییر دهیم. AFRL یک ثبات کم برای عملکرد جایگزین است

2 رجیستر تابع جایگزین وجود دارد و ما با PA2 سروکار داریم، بنابراین از AFR استفاده می کنیم[0] برای low برای مکان یابی به AFRL2، و ما بیت 8، 9، 10، 11 را تغییر می دهیم. برای تنظیم روی AF7، از مقدار 0111 استفاده کنید.

GPIOA->AFR[0] |= (1U<<8);
GPIOA->AFR[0] |= (1U<<9);
GPIOA->AFR[0] |= (1U<<10);
GPIOA->AFR[0] &= ~(1U<<11);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ساعت را روی پورت USART2 تنظیم کنید

#define UART2EN (1U<<17)
RCC->APB1ENR |= UART2EN;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

جهت UART را روی ارسال تنظیم کنید ما باید حالت TE را تنظیم کنیم

#define CR1_TE (1U<<3)
USART2->CR1 = CR1_TE;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس باید USART را در بیت 13 فعال کنیمبه یاد داشته باشید که ما فقط پس از تنظیم تمام تنظیمات را فعال می کنیم.

#define CR1_UE (1U<<13)
USART2->CR1 |= CR1_UE;

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بادریت را تنظیم کنیدفرکانس را 16 مگاهرتز و baudrate را 115200 تنظیم می کنیم. و به صورت فرمول زیر محاسبه کنیدسپس باید مقدار را روی ثبات BRR تنظیم کنیم
داده ها را برای پین کردن بنویسیدقبل از ارسال، باید بررسی کنیم که آیا وضعیت ارسال خوب است یا خیر

#define SR_TXE (1U<<7)
USART2->SR & SR_TXE

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و ما فقط می توانیم یک کاراکتر در هر نوشتن بنویسیم

USART2->DR = (character & 0xFF);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد منبع

#include “stm32f4xx.h”
#include
#include

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

#define CR1_TE (1U<<3)
#define CR1_UE (1U<<13)
#define SR_TXE (1U<<7)

#define SYS_FREQ 16000000
#define APB1_CLK SYS_FREQ
#define UART_BAUDRATE 115200

static void uart_set_baudrate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t BaudRate);
static uint16_t compute_uart_bd(uint32_t PeriphClk,uint32_t BaudRate);
void uart2_tx_init(void);
void uart2_write(int ch);

int __io_putchar(int ch){
uart2_write(ch);
return ch;
}
int main(void){
uart2_tx_init();
while(1){
uart2_write(‘O’);
//printf(“hello\n\r”);
}
return 0;
}

void uart2_tx_init(void){
//Enable GPIOA
RCC->AHB1ENR |= GPIOAEN;

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

//Set PA2 alternate function type to UART_TX (AF07)
GPIOA->AFR[0] |= (1U<<8);
GPIOA->AFR[0] |= (1U<<9);
GPIOA->AFR[0] |= (1U<<10);
GPIOA->AFR[0] &= ~(1U<<11);
//Enable clock access to uart2
RCC->APB1ENR |= UART2EN;

//Configure baudrate
uart_set_baudrate(USART2, APB1_CLK, UART_BAUDRATE);
//Configure transfer direct
USART2->CR1 = CR1_TE;

//Enable uart module
USART2->CR1 |= CR1_UE;

}

void uart2_write(int ch){
while( !(USART2->SR & SR_TXE)){}
USART2->DR = (ch & 0xFF);
}

static void uart_set_baudrate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t BaudRate){
USARTx->BRR |= compute_uart_bd(PeriphClk, BaudRate);
}

static uint16_t compute_uart_bd(uint32_t PeriphClk,uint32_t BaudRate){
return ((PeriphClk + (BaudRate/2U))/BaudRate);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

1. بلوک دیاگرام را در دیتاشیت باز کنید

توضیحات تصویر
ما از رابط USART2 استفاده خواهیم کرد زیرا به همان گذرگاه (APB1) با رابط برق متصل است. این بدان معناست که ما می‌توانیم مستقیماً از طریق USB با کامپیوتر بدون داشتن تراشه برای تبدیل از UART به USB ارتباط برقرار کنیم.
توضیحات تصویر

2. تابع ارسال UART را به USB کامپیوتر بنویسید

نگاشت تابع جایگزین را در دیتاشیت باز کنید. می بینیم که ایجاد UART TX شامل PA2 و AF07 (بعدا ذکر خواهد شد)
توضیحات تصویر

  1. ابتدا باید پورت PA2 را برای نوع عملکرد جایگزین مانند جدول بالا تنظیم کنیم
RCC->AHB1ENR |= GPIOAEN;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • PA2 را روی حالت متناوب تنظیم کنید به عنوان جدول، باید بیت 5 و 4 پین 2 را روی مقدار 10 قرار دهیم.
    توضیحات تصویر
GPIOA->MODER &=~(1U<<4);
GPIOA->MODER |= (1U<<5);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • نوع جایگزین PA2 را روی UART_TX تنظیم کنید همانطور که در بالا ذکر شد، علاوه بر PA2، باید AF07 را نیز تغییر دهیم. AFRL یک ثبات کم برای عملکرد جایگزین است
    توضیحات تصویر
    2 رجیستر تابع جایگزین وجود دارد و ما با PA2 سروکار داریم، بنابراین از AFR استفاده می کنیم[0] برای low برای مکان یابی به AFRL2، و ما بیت 8، 9، 10، 11 را تغییر می دهیم. برای تنظیم روی AF7، از مقدار 0111 استفاده کنید.
GPIOA->AFR[0] |= (1U<<8);
GPIOA->AFR[0] |= (1U<<9);
GPIOA->AFR[0] |= (1U<<10);
GPIOA->AFR[0] &= ~(1U<<11);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • ساعت را روی پورت USART2 تنظیم کنید
    توضیحات تصویر
#define UART2EN (1U<<17)
RCC->APB1ENR |= UART2EN;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • جهت UART را روی ارسال تنظیم کنید ما باید حالت TE را تنظیم کنیم
    توضیحات تصویر
    توضیحات تصویر
#define CR1_TE (1U<<3)
USART2->CR1 = CR1_TE;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس باید USART را در بیت 13 فعال کنیم
به یاد داشته باشید که ما فقط پس از تنظیم تمام تنظیمات را فعال می کنیم.
توضیحات تصویر

#define CR1_UE (1U<<13)
USART2->CR1 |= CR1_UE;
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • بادریت را تنظیم کنید
    فرکانس را 16 مگاهرتز و baudrate را 115200 تنظیم می کنیم.
    و به صورت فرمول زیر محاسبه کنید
    توضیحات تصویر
    سپس باید مقدار را روی ثبات BRR تنظیم کنیم
    توضیحات تصویر

  • داده ها را برای پین کردن بنویسید
    قبل از ارسال، باید بررسی کنیم که آیا وضعیت ارسال خوب است یا خیر
    توضیحات تصویر
    توضیحات تصویر

#define SR_TXE (1U<<7)
USART2->SR & SR_TXE
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و ما فقط می توانیم یک کاراکتر در هر نوشتن بنویسیم
توضیحات تصویر

USART2->DR = (character & 0xFF);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد منبع

#include "stm32f4xx.h"
#include 
#include 

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

#define CR1_TE (1U<<3)
#define CR1_UE (1U<<13)
#define SR_TXE (1U<<7)

#define SYS_FREQ 16000000
#define APB1_CLK SYS_FREQ
#define UART_BAUDRATE 115200

static void uart_set_baudrate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t BaudRate);
static uint16_t compute_uart_bd(uint32_t PeriphClk,uint32_t BaudRate);
void uart2_tx_init(void);
void uart2_write(int ch);

int __io_putchar(int ch){
    uart2_write(ch);
    return ch;
}
int main(void){
    uart2_tx_init();
    while(1){
        uart2_write('O');
        //printf("hello\n\r");
    }
    return 0;
}

void uart2_tx_init(void){
    //Enable GPIOA
    RCC->AHB1ENR |= GPIOAEN;

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

    //Set PA2 alternate function type to UART_TX (AF07)
    GPIOA->AFR[0] |= (1U<<8);
    GPIOA->AFR[0] |= (1U<<9);
    GPIOA->AFR[0] |= (1U<<10);
    GPIOA->AFR[0] &= ~(1U<<11);
    //Enable clock access to uart2
    RCC->APB1ENR |= UART2EN;

    //Configure baudrate
    uart_set_baudrate(USART2, APB1_CLK, UART_BAUDRATE);
    //Configure transfer direct
    USART2->CR1 = CR1_TE;

    //Enable uart module
    USART2->CR1 |= CR1_UE;

}

void uart2_write(int ch){
    while( !(USART2->SR & SR_TXE)){}
    USART2->DR = (ch & 0xFF);
}

static void uart_set_baudrate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t BaudRate){
    USARTx->BRR |= compute_uart_bd(PeriphClk, BaudRate);
}

static uint16_t compute_uart_bd(uint32_t PeriphClk,uint32_t BaudRate){
    return ((PeriphClk + (BaudRate/2U))/BaudRate);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا