Jumat, 21 Juni 2013

Using USART on STM32F100

Fitur USART (Universal Synchoronous Asynchronous Receiver Transmitter)

Kali ini saya akan ngebahas tentang penggunaan fitur USART pada STM32F100. Untuk menghubungkan mikonkontroler dengan PC, saya gunakan board FTDI dengan FT232 untuk komunikasi serialnya. Untuk menghubungkannya, cukup dengan menghubungkan pin TX, RX dan GND dari mikrokontroler ke FTDI.
USART pada STM32F100 ada tiga buah USART1, USART2, USART3, bebas mau nggunain yang mana aja yang penting pin di mikro-nya sesuai. Kalo misalnya kita gak pengen nggunain pin bawaan dari mikronya karena udah digunain buat fitur lain, kita bisa pindah fitur USART tersebut ke pin yang lain, yang bukan pin bawaan dari mikronya, pakai fitur REMAP sesuai tabel dari datasheet mikronya. USART yang bisa di-remap pada STM32F100 yaitu USART1 dan USART3. 
Inisialisasi awal yang wajib ditulis adalah
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include <stdio.h> 
 dan jangan lupa untuk mencentang tiap library tersebut pada repository-peripheral (untuk compiler coocox). Setelah itu, inisialisasi juga utuk clocknya dari tiap fitur (GPIO, USART) dan inisialisasi pin-pin pada port apa saja yang digunakan baik untuk USART ataupun I/O.

Next, ikutian aja listing program berikut ini.
char kata2[16];
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
Untuk inisialisasi pengaturan gunakan ini.
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
Untuk mengaktifkan clock tiap fiturnya gunakan void berikut ini.
void RCC_config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
}
 Untuk konfigurasi pin input dan output-nya gunakan void ini.
void GPIO_config(void)
{
//USART TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//USART RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE );
Selanjutnya lakukan konfigurasi untuk fitur USART seperti berikut ini.
void USART_config(void)
{
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = \
        USART_HardwareFlowControl_None;
USART_Init(USART3, &USART_InitStructure);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
USART_Cmd(USART3, ENABLE);
}

Untuk menggunakan fitur USART dapat kita gunakan sprintf, puts dan lainya pada void main berikut ini.
RCC_config();
GPIO_config();
USART_config();
setvbuf( stdout, 0, _IONBF, 0 );
unsigned int i=0;
while(1)
{
if (i<=1000)
    {
       sprintf(kata2,"Hitungan ke- %d \n\r", i );
       usart_puts(kata2);
       i++;
      delay(66);
      }
else i=0;
}
Untuk nampilin hasilnya, agan2 bisa pake hyperterminal, terminal bawaan dari arduino, terminal bawaan dari codevision ato bikin aplikasi sendiri, ato pake yang lainya.

Catatan penting : Jangan centang Retarget Printf pada repository-peripherals. Setelah itu pada configuration-link  pilih library use nano C library, centang printf float dan scan float. Kemudian pada Linked Library pilih add dan ketik "m" (tanpa tanda petik). Selain itu, hilangkan tanda centang pada Enable LTO. Semoga bisa jalan di PC agan2.

Untuk usart_puts - nya, tambahkan void berikut ini.
void usart_putchar(char c)
{
uint8_t ch;
ch = c;
USART_SendData(USART3, (uint8_t) ch);
while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET) {}
}
void usart_puts(char *data)
{
int i=0;
int n = strlen(data);
for(i=0;i<n;i++)
{
usart_putchar(data[i]);
}
}
Jika berfungsi sebagai receiver, agan2 bisa pake void GetChar berikut ini.
char GetChar()
{
    uint8_t ch;
    ch = USART_ReceiveData(USART3);
    return ch;
}
Untuk aplikasinya bisa pake ini.
bInChar[0] = GetChar();
if (GetChar()==85)
{
GPIOC->ODR = GPIO_Pin_9;
delay(100000);
}
else if (GetChar()==0)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
        }
Untuk inisialisasi delay dan GPIO port C, agan2 bisa cek postingan sebelumnya.

Selain cara yang udah dibahas, ada juga cara lain seperti berikut ini.
const unsigned char menu[] = " Welcome to CooCox! \r\n";
UARTSend(menu, sizeof(menu));
Kemudian tambahkan void berikut ini.
void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)
{
    // Loop while there are more characters to send.
    while(ulCount--)
    {
        USART_SendData(USART3, (uint16_t) *pucBuffer++);
        /* Loop until the end of transmission */
        while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
        {
        }
    }
}
Pada dasarnya, kedua cara tersebut memiliki penggunaan comand yang sama yaitu USART_SendData dan USART_GetFlagStatus.

Ok, sekian duu gan penjelasannya.
Semoga bermanfaat.
Thanks.

3 komentar:

  1. Terima kasih mas buat ilmunya...ijin copas &diotak atik dikit...buat latihan...baru belajar ARM jg...

    BalasHapus
  2. ada tutorial untuk stm32f100 connect sht11 sam gps pmb648???

    BalasHapus

"Orang boleh pandai setinggi langit, tapi selama ia tak menulis, ia akan hilang di dalam masyarakat dan dari sejarah" Pramoedya Ananta Toer (Rumah Kaca, hlm. 352)