STM8的GPIO驅(qū)動
芯片的外設(shè)一般按照這么幾個(gè)流程來進(jìn)行,GPIO,外部中斷,定時(shí)器,串口,ADC,IIC,SPI,下面我就按照各個(gè)模式來寫
首先是GPIO,STM8的GPIO擁有復(fù)用功能,這句話告訴我們必然需要配置IO的復(fù)用功能才能使用,看這張表
DDR決定輸入輸出方向,CR1 CR2決定輸入輸出模式,上拉,下拉,推挽,開漏等
主要依靠這幾個(gè)寄存器
還有一個(gè)控制寄存器2,懶得傳了
按照這張表,輸出寫輸出寄存器,輸入讀輸入寄存器,就能完成GPIO的操作了
以下是操作代碼
#include"key.h"
u8keyValue=0;
#defineKEY1_IN(GPIOD->IDR&0X80)
#defineKEY2_IN(GPIOE->IDR&0X08)
staticvoidDelay(u16nCount)
{
/*DecrementnCountvalue*/
while(nCount!=0)
{
nCount--;
}
}
voidKeyInit(void)
{
//D7初始化
GPIOD->DDR&=~(1<<7);//設(shè)置為輸入
GPIOD->CR1|=(1<<7);
GPIOD->CR2&=~(1<<7);//10上拉輸入
//E3初始化
GPIOE->DDR&=~(1<<3);//設(shè)置為輸入
GPIOE->CR1|=(1<<3);
GPIOE->CR2&=~(1<<3);//10上拉輸入
}
u8KeyScan(void)
{
if(KEY1_IN==0)
{
Delay(16000);
if(KEY1_IN==0)
{
keyValue=KEY_VALUE1;
returnKEY_VALUE1;
}
}
if(KEY2_IN==0)
{
Delay(16000);
if(KEY2_IN==0)
{
keyValue=KEY_VALUE2;
returnKEY_VALUE2;
}
}
return0;
}
#ifndef__KEY_H_
#define__KEY_H_
#include"stm8s.h"
//按鍵使用D7E3
//按鍵按下低電平,按鍵松開高電平
#defineKEY_VALUE11
#defineKEY_VALUE22
externu8keyValue;
voidKeyInit(void);
u8KeyScan(void);
#endif
#include"led.h"
voidLedInit(void)
{
//D1初始化
GPIOD->DDR|=(1<<1);//設(shè)置為輸出
GPIOD->CR1|=1<<1;
GPIOD->CR2&=~(1<<1);//10推挽輸出
//d0
GPIOD->DDR|=(1<<0);//設(shè)置為輸出
GPIOD->CR1|=1<<0;
GPIOD->CR2&=~(1<<0);//10推挽輸出
//c3
GPIOC->DDR|=(1<<3);//設(shè)置為輸出
GPIOC->CR1|=1<<3;
GPIOC->CR2&=~(1<<3);//10推挽輸出
LedSet(1,1);
LedSet(2,1);
LedSet(3,1);
}
voidLedSet(u8ch,u8value)
{
switch(ch)
{
case1:
if(value)GPIOD->ODR|=1<<1;
elseGPIOD->ODR&=~(1<<1);
break;
case2:
if(value)GPIOD->ODR|=1<<0;
elseGPIOD->ODR&=~(1<<0);
break;
case3:
if(value)GPIOC->ODR|=1<<3;
elseGPIOC->ODR&=~(1<<3);
break;
}
}
#ifndef__LED_H_
#define__LED_H_
#include"stm8s.h"
//led1PD1swim
//led2pd0
//led3pc3d12_cs
voidLedInit(void);
voidLedSet(u8ch,u8value);
#endif