Friday, December 26, 2014

Stm8 -GPIO


Trước tiên ta làm quen với một vài thuật ngữ:
- Input floating: đầu vào thả nổi (cần có trở kéo lên vcc).
- Input pull-up: đầu vào đẩy kéo (không cần trở kéo lên vcc).
- No external interrupt: không cho phép ngắt ngoài.
- External interrupt:cho phép ngắt ngoài.
- Output open-drain: đầu ra cực máng hở (cần có trở treo)
- High-impedance level: mức trở kháng cao (hở mạch)
- Output push-pull: đầu ra đẩy kéo. (không cần trở kéo)
- Low level: mức thấp.
- High level: mức cao.

Khởi tạo:
GPIO_DeInit(GPIOx); //X là port A,B,C,D
GPIO_Init(GPIOx,GPIO_Pin,GPIO_Mode);
/*
Trong đó: GPIOx có thể là GPIOA, GPIOB, GPIOC, GPIOD.
             GPIO_Pin là chân cần thiết lập bao gồm:
                          GPIO_PIN_0         //chân 0 được chọn
                          GPIO_PIN_1         //chân 1 được chọn
                          GPIO_PIN_2         //chân 2 được chọn 
                          GPIO_PIN_3         //chân 3 được chọn   
                          GPIO_PIN_4         //chân 4 được chọn
                          GPIO_PIN_5         //chân 5 được chọn
                          GPIO_PIN_6         //chân 6 được chọn
                          GPIO_PIN_7         //chân 7 được chọn
                          GPIO_PIN_LNIB    //4 chân dưới được chọn
                          GPIO_PIN_HNIB   //4 chân trên được chọn
                          GPIO_PIN_ALL     //tất cả chân được chọn
              GPIO_Mode là thiết lập chế độ, bao gồm:
                          GPIO_MODE_IN_FL_NO_IT /*!< Input floating, no external
                         interrupt */
                          GPIO_MODE_IN_PU_NO_IT /*!< Input pull-up, no external
                         interrupt */
                          GPIO_MODE_IN_FL_IT /*!< Input floating, external interrupt */
                          GPIO_MODE_IN_PU_IT  /*!< Input pull-up, external interrupt */
                          GPIO_MODE_OUT_OD_LOW_FAST /*!< Output open-drain, low
                         level, 10MHz (tần số thạch anh) */
                          GPIO_MODE_OUT_PP_LOW_FAST  /*!< Output push-pull, low 
                        level, 10MHz */
                          GPIO_MODE_OUT_OD_LOW_SLOW /*!< Output open-drain, low
                         level, 2MHz */
                          GPIO_MODE_OUT_PP_LOW_SLOW /*!< Output push-pull, low
                         level, 2MHz */
                          GPIO_MODE_OUT_OD_HIZ_FAST/*!< Output open-drain, high
                         impedance level,10MHz */
                          GPIO_MODE_OUT_PP_HIGH_FAST/*!< Output push-pull, high
                        level, 10MHz */
                          GPIO_MODE_OUT_OD_HIZ_SLOW /*!< Output open-drain, high
                         impedance level, 2MHz */
                          GPIO_MODE_OUT_PP_HIGH_SLOW /*!< Output push-pull, high
                         level, 2MHz */
*/
Ví dụ:
CODE:
GPIO_DeInit(GPIOA); 
GPIO_Init(GPIOA, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_FAST);
     
1. Output:

GPIO_Write(GPIOx,PortVal); // xuất mã tương ứng ra port
Ví dụ:
CODE:
GPIO_Write(GPIOD,0x7A);
GPIO_WriteHigh(GPIOx,PortPins); //đưa mức cao ra 1 chân nhất định
Ví dụ:
CODE:
GPIO_WriteHigh(GPIOA,GPIO_PIN_1);
GPIO_WriteLow(GPIOx,PortPins);//đưa mức thấp ra 1 chân nhất định
CODE:
GPIO_WriteLow(GPIOA,GPIO_PIN_1);
GPIO_WriteReverse(GPIOx, PortPins); // đảo trạng thái 1 chân nhất định
Ví dụ:
CODE:
GPIO_WriteReverse(GPIOA, GPIO_PIN_1);
Sau đây là một ví dụ cụ thể về output: (chạy led)
CODE:
#include"stm8s_conf.h"

void delay_ms(unsigned int timer)
{
  while(timer--)
    {
      for(int count=0; count<1000;count++);
    }
}
void delay_us(unsigned int timer)
{
  while(timer--);
}

void hieu_ung_1();

int main( void )
{
  GPIO_DeInit(GPIOA); 
  GPIO_DeInit(GPIOB);
  GPIO_DeInit(GPIOC);
  GPIO_DeInit(GPIOD);
  GPIO_Init(GPIOA, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_FAST);     
  GPIO_Init(GPIOB, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_FAST);    
  GPIO_Init(GPIOC, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_FAST);    
  GPIO_Init(GPIOD, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_FAST);    
  
  while(1)
    {
      hieu_ung_1();
    }
}

void hieu_ung_1()
{
      GPIO_WriteHigh(GPIOA,GPIO_PIN_1);
      delay_ms(20);
      GPIO_WriteLow(GPIOA,GPIO_PIN_1);
      delay_ms(20);
      GPIO_WriteHigh(GPIOA,GPIO_PIN_2);
      delay_ms(20);
      GPIO_WriteLow(GPIOA,GPIO_PIN_2);
      delay_ms(20);
      GPIO_WriteHigh(GPIOC,GPIO_PIN_3);
      delay_ms(20);
      GPIO_WriteLow(GPIOC,GPIO_PIN_3);
      delay_ms(20);
      GPIO_WriteHigh(GPIOC,GPIO_PIN_7);
      delay_ms(20);
      GPIO_WriteLow(GPIOC,GPIO_PIN_7);
      delay_ms(20);
      GPIO_WriteHigh(GPIOC,GPIO_PIN_4);
      delay_ms(20);
      GPIO_WriteLow(GPIOC,GPIO_PIN_4);
      delay_ms(20);
      GPIO_WriteHigh(GPIOC,GPIO_PIN_6);
      delay_ms(20);
      GPIO_WriteLow(GPIOC,GPIO_PIN_6);
      delay_ms(20);
      GPIO_WriteHigh(GPIOC,GPIO_PIN_5);
      delay_ms(20);
      GPIO_WriteLow(GPIOC,GPIO_PIN_5);
      delay_ms(20);
}
2. Input

GPIO_ReadInputData(GPIOx); // đọc trạng thái ngõ vào 1 port
GPIO_ReadOutputData(GPIOx); // đọc trạng thái ngõ ra 1 port
ví dụ:
CODE:
GPIO_ReadInputData(GPIOA);
GPIO_ReadOutputData(GPIOA);
GPIO_ReadInputPin(GPIOx, GPIO_Pin); // đọc trạng thái ngõ vào 1 chân nhất định
Ví dụ:

CODE:
GPIO_ReadInputPin(GPIOA, GPIO_Pin_2);
Code kiểm tra nút nhấn:
CODE:
#include"STM8S_conf.h"
#include"stdio.h"
//***** Dinh nghia co cac chan*****//
#define data    (GPIOD)
#define sw      (GPIO_PIN_3)
//*****Kai bao bien*****//
unsigned int data_sw;
//*****Ham tao thoi gian tre*****//
void delay(unsigned int timer)
{
  while(timer--);
}
//*****Ham doc nut nhan******//
void Read_sw(void)
{
  data_sw = GPIO_ReadInputPin(GPIOC,sw);
  if(data_sw==0)
  {
    delay(60000);
    if(data_sw==0)
    { 
      GPIO_WriteLow(GPIOD,GPIO_PIN_4);
    }
  }
  
  else
    GPIO_WriteHigh(GPIOD,GPIO_PIN_4);
}
void clk_config(void)
{
  CLK_DeInit();
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//cau hinh tan so xung noi HSI/1=16MHZ
  CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);// xung cpu=HSI/1=16MHZ 
  while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY)!=SET);
}
void main(void)
{
  clk_config();
  GPIO_DeInit(GPIOD);
  GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
  GPIO_DeInit(GPIOC);
  GPIO_Init(GPIOC,GPIO_PIN_3,GPIO_MODE_IN_FL_NO_IT);
  while(1)
  {
    Read_sw();
  }
}

No comments:

Post a Comment

inmoov finger voice test

Inmoov finger voice test