Trung tâm đào tạo thiết kế vi mạch Semicon


  • ĐĂNG KÝ TÀI KHOẢN ĐỂ TRUY CẬP NHIỀU TÀI LIỆU HƠN!
  • Create an account
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
semicon_lab.jpg

Thư Viện Mã Nguồn Mở Cho SMT32-Opencmx (Phần 2)

E-mail Print PDF

Thư Viện Mã Nguồn Mở Cho SMT32-Opencmx (Phần 2)

 

Phần 2: HÀM API CỦA KHỐI UART

Trước khi bắt đầu tìm hiểu các hàm API của thư viện OpenCMX, các bạn nên làm quen với công cụ biên soạn & tìm kiếm Source Code có tên Source Insight ở đây. Công cụ này sẽ giúp các bạn tiết kiệm được rất nhiều thời gian cho việc tìm kiếm thông tin của hàm và biến khi lập trình.

 
 

Khối hàm API của UART nằm trong 2 tập tin cmx_uart.h (chứa khai báo hàm) & cmx_uart.c (chứa định nghĩa hàm):

  • void cmxUart.init(cmxUART_NAME uart, cmxTRANSFER_MODE tfmode) : khởi tạo UART ở chế độ Polling hoặc Interrupt với tốc độ baudrate mặc định là 115200, 8bit data, No parity, 1 stop bit, No Hardware flow control.
  • void cmxUart.baud(cmxUART_NAME uart, uint16_t baudrate): thay đổi tốc độ baudrate
  • void cmxUart.format(cmxUART_NAME uart, cmxUART_DATA_FMT bits, cmxUART_PARITY parity, cmxUART_STOP_BITS stop_bits): thay đổi chiều dài data (8bit hoặc 9bit), Parity (No, Even, Odd), stop bit (1bit hoặc 2 bit)
  • void cmxUart.print(cmxUART_NAME uart, uint8_t *s, uint16_t n): xuất chuỗi ra cổng UART có hoặc không quan tâm đến kí tự kết thúc chuỗi NULL (‘\0’).
  • void cmxUart.putc(cmxUART_NAME uart, uint8_t c, cmxDATA_PIPELINE_TYPE pipeline): ghi dữ liệu vào bộ đệm hoặc ghi trực tiếp vào thanh ghi data của UART.
  • uint8_t cmxUart.getc(cmxUART_NAME uart, uint8_t *c, cmxDATA_PIPELINE_TYPE pipeline) : đọc về dữ liệu từ bộ đệm hoặc đọc trực tiếp từ thanh ghi data của UART.
  • uint16_t cmxUart.txdatalen(cmxUART_NAME uart): trả về  n byte dữ liệu đang chờ xử lí trong bộ đệm truyền. 
  • uint16_t cmxUart.rxdatalen(cmxUART_NAME uart): trả về  n byte dữ liệu đang chờ xử lí trong bộ đệm nhận. 
  • uint8_t cmxUart.setTxIntCb(cmxUART_NAME uart, cmxUartIntHandler tx_inthandler, uint8_t *tx_ringbuf, uint16_t size): cài đặt hàm xử lí ngắt truyền và bộ đệm truyền cùng với kích thước của bộ đệm.
  • uint8_t cmxUart.setRxIntCb(cmxUART_NAME uart, cmxUartIntHandler rx_inthandler, uint8_t *rx_ringbuf, uint16_t size): cài đặt hàm xử lí ngắt nhận và bộ đệm nhận cùng với kích thước của bộ đệm.

Trong ví dụ này chúng ta sẽ dùng cổng USART1 có pin PA9(TXD1) và PA10(RXD1) của chíp STM32F103 kết nối với máy tính qua cổng RS232. Cổng USART1 được cấu hình ở chế độ ngắt truyền-nhận. Chương trình sẽ truyền ngược lại bất kì kí tự nào được nhận từ máy tính. Chương trình  được viết trên nền Keil-MDK4.2 và kít OPENCMX-STM3210D:

#includecmx.h

// declare buffer and ISR (Interrupt Service Routine) for transmit-receive
uint8_t tx_buf[32];
uint8_t rx_buf[32];
void USART1_TxIntHandler(void);
void USART1_RxIntHandler(void);

/**
  * @brief      Main program.
  * @param      None
  * @retval     None
  *
/
int main(void)
{               
    uint8_t byte;
   
    /* init uart1 with interrupt mode */
    cmxUart.init(UART_1, IT_MODE);
    /* set tx, rx interrupt call back function with buffer size is 32bytes */
    cmxUart.setTxIntCb(UART_1, USART1_TxIntHandler, tx_buf, 32);
    cmxUart.setRxIntCb(UART_1, USART1_RxIntHandler, rx_buf, 32);   

#ifdef CMX_INT_HANDLER  // this Macro is defined in ..\OpenCMX\cmx_api\config\cmx_appconf.h
cmxNvic.init();                  // the last function call for system interrupt initiation, after other peripheral is
                                      //initialized in case one or more interrupt is used

#endif

    cmxUart.print(UART_1, "Please type some characters...\r\n", 0);
    /* Insert delay */
    Delay(5);
   
    /* main program */
    while(1)
    {       
        //wait until receive at least one data
        while(!cmxUart.rxdatalen(UART_1));
        //get one data from receive buffer
        cmxUart.getc(UART_1, &byte, RX_PIPELINE);
        //put one data to transmit buffer
        cmxUart.putc(UART_1, byte, TX_PIPELINE);       
    }   
}

/**
  * @brief      These functions below handle USART1 interrupt request.
  * @param    None
  * @retval     None
  */ 

void USART1_TxIntHandler(void)
{
    uint8_t byte;
   
    /* The interrupt was caused by the transmit register become empty. Are there any more data to transmit? */
    if (cmxUart.txdatalen(UART_1))
    {
        /* get data from tx buffer */
        cmxUart.getc(UART_1, &byte, TX_PIPELINE);
        /* write data to uart register */
        cmxUart.putc(UART_1, byte, BYPASS_PIPELINE);
    }   
    else        // no more data to transmit
    {cmxUart.setTxLineStatus(UART_1, DISABLE);// disable transmit line}
}

void USART1_RxIntHandler(void)
{
    uint8_t byte;

    /* get data from uart register */
    cmxUart.getc(UART_1, &byte, BYPASS_PIPELINE);
    /* push data to rx buffer */
    cmxUart.putc(UART_1, byte, RX_PIPELINE);
}

Chú ý:
•    Trong ví dụ này chúng ta không thêm tập tin stm32f10x_it.c (OpenCMX\chip_vendor_stdperiph_lib\ST\STM32F10x_App_Config) vào project là vì chúng ta xử dụng phương thức xử lí ngắt của thư viện Opencmx.
•    stm32f10x_it.c : tập tin này do người dùng tự định nghĩa, không phải là tập tin hệ thống của thư viện ngoại vi chuẩn, nên có thể thêm hoặc không thêm tập tin này vào Project. Tập tin này được tạo sẵn cho người dùng dễ dàng định nghĩa các hàm xử lí ngắt.

Sau khi biên dịch chương trình xong, các bạn có thể chạy simulink trên Keil để xem terminal UART1 của Keil hiển thị thông tin hoặc nạp chương trình (Opencmx.hex) vào kít để chạy thử.

Sau khi chạy Simulink, các bạn có thể gõ vài chữ vào Terminal UART1 của Keil, các bạn sẽ thấy khi UART1 của MCU nhận được kí tự và sẽ xuất ngược kí tự đó lên Terminal, kết quả là các bạn thấy được các kí tự mà mình vữa gõ.

 Nguồn: arm.vn

Bạn Có Đam Mê Với Thiết Kế Vi Mạch - Bạn Muốn Có Mức Lương 1000 USD

Bạn Chưa Biết Phải Gửi Gắm Ước Mơ Của Mình Nơi Đâu

Hãy Đến Với Nghành Vi Mạch Tại SEMICON

 

 

Hotline: 0972.800.931 - 0938.838.404 (Ms Hồng)

Last Updated ( Monday, 15 August 2016 19:13 )  

Related Articles

Chat Zalo