Showing posts with label ARM. Show all posts
Showing posts with label ARM. Show all posts

Sunday, January 11, 2015

Stm8 - Input


Để giao tiếp với nút nhấn, chúng ta sử dụng hàm:
GPIO_ReadInputPin(GPIOx, GPIO_PIN_x);
Trong đó GPIOx là port cần đọc tín hiệu( A, B, C, D), GPIO_PIN_x là chân có số thứ tự x của port tương ứng.
 Sau đây là chương trình mẫu

Stm8 - 7seg

     Vi điều khiển giao tiếp với led 7 đoạn thường không phải là vấn đề quá phức tạp. Tuy nhiên đối với chip stm8s003f3p6 thì mọi chuyện lại khác. Chip này không có port nào liên tục đủ 8 chân để xuất dữ liệu điều khiển led 7 đoạn.


      Để giải quyết vấn đề này, ở đây chúng ta sẽ dụng cùng lúc2 port C và D để thực hiện xuất mã led, chương trình con:
void hien_thi(unsigned char data)
{
  GPIO_Write(GPIOC,(maled[data])<<3); //dich du lieu sang ben trai 3bit de lay 5 bit thap
  GPIO_Write(GPIOD,((maled[data])>>4)); //dich du lieu sang ben phai 4bit de lay 3 bit cao
}
  Vấn đề đã được giải quyết, sau đây là chương trình đầy đủ:
 #include"stm8s_conf.h" // goi thu vien config
//***** Dinh nghi cho cac chan*****/
#define led1 (GPIO_PIN_2)
#define led2 (GPIO_PIN_3)
#define led3 (GPIO_PIN_1)
#define led4 (GPIO_PIN_5)
const unsigned long delay=16000000;
//***** Khai bao bien *****//
unsigned char maled[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned int i,j;
//***** Ham tao thoi gian tre *****//
void delay_ms(unsigned int timer)
{
  while(timer--)
    {
      for(int count=0; count<(delay/1000000);count++);
    }
}
void delay_us(unsigned int timer)
{
  while(timer--);
}
//***** Ham hien thi cho led 7seg *****//
void hien_thi(unsigned char data)
{
  GPIO_Write(GPIOC,(maled[data])<<3); //dich du lieu sang ben trai 3bit de lay 5 bit thap
  GPIO_Write(GPIOD,((maled[data])>>4)); //dich du lieu sang ben phai 4bit de lay 3 bit cao
}
//***** Ham cau hinh xung clock cho he thong *****//
static void CLK_Config(void)
{
    CLK_DeInit();
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);      //f_Master = HSI/1 = 16MHz
    CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);            //f_CPU = f_Master/1 = 16MHz
    while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY)!=SET);     //wait until HSI ready
}
//***** Ham chinh *****//
int main( void )
{
  CLK_Config();
  GPIO_DeInit(GPIOD);
  GPIO_DeInit(GPIOC);
  GPIO_DeInit(GPIOA);
  GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
  GPIO_Init(GPIOA,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
  GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
  GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);

  GPIO_WriteHigh(GPIOA,led1);
  GPIO_WriteHigh(GPIOA,led2);
  GPIO_WriteHigh(GPIOA,led3);
  GPIO_WriteHigh(GPIOB,led4);
  while(1)
  {
        for(i=0;i<=9999;i++)
          {
            for(j=0;j<=100;j++)
            {
              GPIO_Write(GPIOD,0xff);
              GPIO_Write(GPIOC,0xff);
              GPIO_WriteLow(GPIOA,led1);
              hien_thi(i/1000);
              delay_ms(1);
              GPIO_WriteHigh(GPIOA,led1);
           
              GPIO_Write(GPIOD,0xff);
              GPIO_Write(GPIOC,0xff);
              GPIO_WriteLow(GPIOA,led2);
              hien_thi((i%1000)/100);
              delay_ms(1);
              GPIO_WriteHigh(GPIOA,led2);
           
              GPIO_Write(GPIOD,0xff);
              GPIO_Write(GPIOC,0xff);
              GPIO_WriteHigh(GPIOB,led4);
              GPIO_WriteLow(GPIOA,led3);
              hien_thi(((i%1000)%100)/10);
              delay_ms(1);
              GPIO_WriteHigh(GPIOA,led3);
           
              GPIO_Write(GPIOD,0xff);
              GPIO_Write(GPIOC,0xff);
              GPIO_WriteLow(GPIOB,led4);
              hien_thi(((i%10000)%100)%10);
              delay_ms(1);
              GPIO_WriteHigh(GPIOB,led4);
            }
          }
  }
}

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();
  }
}

Saturday, December 13, 2014

Công cụ lập trình STM8


- Phần mềm lập trình: IAR
Crack: tại đây (hướng dẫn: xem video trong file tải về) 
- Thư viện: thưviện 
- Ép thư viện: tạiđây
- Hướng dẫn tạo project: 
   (tác giả: Nguyễn Văn Tuấn)

STM8S003F3P6 - Datasheet


STM8S003F3P6 TSSOP-20


Hãng sản xuất:STMicroelectronics
Product Category:8-bit Microcontrollers - MCU
Core:STM8
Độ rộng bus dữ liệu:8 bit
Tần số xung Clock Max:16 MHz
Dung lượng bộ nhớ Memory :8 kB
Dung lượng dữ liệu của RAM:1 kB
Bộ biến đổi ADC:10 bit
Điện áp hoạt động:2.95 V to 5.5 V
Nhiệt độ tối đa:+ 85 C
Chuẩn chân:TSSOP-20
Mounting Style:SMD/SMT
A/D Channels Available:5
Brand:STMicroelectronics
Data RAM Type:RAM
Độ rộng dữ liệu ROM:128 B
Data ROM Type:EEPROM
Interface Type:I2C, SPI, UART
Minimum Operating Temperature:- 40 C
Số bộ Timers:3 Timer
On-Chip ADC:Yes
On-Chip DAC:Without DAC
Packaging:Reel
Processor Series:STM8S
Program Memory Type:Flash
Series:STM8S003F3
Factory Pack Quantity:2500
Supply Voltage - Max:5.5 V
Supply Voltage - Min:2.95 V
Datasheet: >>"STM8S003F3P6"<<.
Nguồn: http://linhkienvn.com/

inmoov finger voice test

Inmoov finger voice test