DBGU를 이용한 UART 통신 순서
Posted by 응이

AT91SAM7S256

ARM 2008. 9. 16. 09:16

#include "project.h"


#define MAIN_OSC  18432000    // 크리스탈 속도
#define MAIN_CLK  ((MAIN_OSC*73/14)/2) // 체배기를 거친 후 속도
#define DBGU_SPEED  115200     // 디버그 유닛 속도
void Test()
{
 // Reset and disable receiver
 AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;

 // Disable interrupts
 AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF;

 // Configure PIOs for DBGU
 AT91C_BASE_PIOA->PIO_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;
 AT91C_BASE_PIOA->PIO_BSR = 0;
 AT91C_BASE_PIOA->PIO_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;

 // === Configure serial link ===
 // Define the baud rate divisor register [BRGR = MAIN_CLK / (115200 * 16)]
 AT91C_BASE_DBGU->DBGU_BRGR = MAIN_CLK / (DBGU_SPEED * 16);
 // Define the USART mode
 AT91C_BASE_DBGU->DBGU_MR = AT91C_US_PAR_NONE | AT91C_US_CHMODE_NORMAL;

 // Disable the RX and TX PDC transfer requests
 AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_RXTDIS;
 AT91C_BASE_DBGU->DBGU_PTCR = AT91C_PDC_TXTDIS;

 // Enable transmitter
 AT91C_BASE_DBGU->DBGU_CR = AT91C_US_TXEN;
}

void DBGU_Write_String(const char *cData)
{
 while (0 != *cData)
 {
  while (0 == (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXRDY));

  AT91C_BASE_DBGU->DBGU_THR = (*cData++);
 }
}

int main()
{
 volatile unsigned int iCount = 0;

 Test();

 (*(volatile unsigned int *)0xFFFFF400) = 0x0000000F;
 (*(volatile unsigned int *)0xFFFFF410) = 0x0000000F;
 (*(volatile unsigned int *)0xFFFFF430) = 0x00000003;

 while (1)
 {
  for(iCount=0;1000000 >= iCount; ++iCount);
  (*(volatile unsigned int *)0xFFFFF430) = 0x00000001;

  DBGU_Write_String("test\n\r");

  for(iCount=0;1000000 >= iCount; ++iCount);
  (*(volatile unsigned int *)0xFFFFF434) = 0x00000001;

 }
}

Posted by 응이

API

API 2008. 9. 1. 11:11

#include<windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("Class");

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
      ,LPSTR lpszCmdParam,int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst = hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=lpszClass;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  NULL,(HMENU)NULL,hInstance,NULL);
 ShowWindow(hWnd,nCmdShow);

 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 HDC hdc;
 PAINTSTRUCT ps;

 switch(iMessage)
 {
  case WM_CREATE:
   hWndMain = hWnd;
   return 0;

  case WM_PAINT:
   hdc = BeginPaint(hWnd, &ps);
   EndPaint(hWnd, &ps);
   return 0;
 
  case WM_DESTROY:
   PostQuitMessage(0);
   return 0;
 }
 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

Posted by 응이

Dream come true.
응이

달력

태그목록