Thứ Tư, 26 tháng 7, 2017

STM8L Discovery - 4 - USART

Bài này chúng ta sẽ cùng nhau tìm hiểu USART của STM8L sử dụng hàm printf trong thư viện "stdio.h" để gửi dữ liệu.

đầu tiên khai báo các hàm sau:

#include "stdio.h"

#define PUTCHAR_PROTOTYPE int putchar (int c)
#define GETCHAR_PROTOTYPE int getchar (void)


PUTCHAR_PROTOTYPE
{
  /* Write a character to the USART */
  USART_SendData8(USART1, c);
  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

  return (c);
}

GETCHAR_PROTOTYPE
{
  int c = 0;
  /* Loop until the Read data register flag is SET */
  while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    c = USART_ReceiveData8(USART1);
    return (c);
  }

Cấu hình cổng USART trong hàm main()

Cấu hình xung clock cho USART và cấu hình các ngõ I/O cho USART:

  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  
  CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);

  USART_Init( USART1, (uint32_t) 115200, USART_WordLength_8b, USART_StopBits_1,
                       USART_Parity_No, (USART_Mode_TypeDef) (USART_Mode_Tx|USART_Mode_Rx));

  USART_Cmd(USART1, ENABLE);

  GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);
  GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);

Tiếp theo ta sử dụng hàm printf để xuất dữ liệu ra cổng USART như sau:

 printf("\n\r USART STM8L DEMO \n\r");

hay trong hàm while(1){} ta có thể nhận và gửi dữ liệu từ chân RX qua TX của vi điều khiển như sau:

  while (1)
  {
    printf("%c", getchar());
  }

Code Github

STM8L Discovery - 3 - GPIO

Ở các ví dụ trước ta đã cùng tìm hiểu cách xây dựng, biên dịch và nạp một project mới. Trong ví dụ này ta sẽ xây dựng ứng dụng chớp tắt led trên kit STM8L Discovery.

Đầu tiên ta xây dựng nhanh gọn một hàm delay để tạo thời gian trễ giữa các trạng thái chớp và tắt của led:

void Delay(__IO uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}

Trong hàm main ta cấu hình ngõ ra LED LD4 Blue là chân PC7

GPIO_Init(GPIOC, GPIO_Pin_7, GPIO_Mode_Out_PP_Low_Fast);

Trong vòng lập while(1){} ta cho LED chớp tắt như sau:

  while (1)
  {
    /* Toggle LD4 */
    GPIO_ToggleBits(GPIOCGPIO_Pin_7);
    Delay(0xFFFF);
  }



Code Github