STM8的GPIO驱动
芯片的外设一般按照这么几个流程来进行,GPIO,外部中断,定时器,串口,ADC,IIC,SPI,下面我就按照各个模式来写
首先是GPIO,STM8的GPIO拥有复用功能,这句话告诉我们必然需要配置IO的复用功能才能使用,看这张表
DDR决定输入输出方向,CR1 CR2决定输入输出模式,上拉,下拉,推挽,开漏等
主要依靠这几个寄存器
还有一个控制寄存器2,懒得传了
按照这张表,输出写输出寄存器,输入读输入寄存器,就能完成GPIO的操作了
以下是操作代码
#include "key.h"
u8 keyValue = 0;
#define KEY1_IN (GPIOD->IDR&0X80)
#define KEY2_IN (GPIOE->IDR&0X08)
static void Delay(u16 nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}
void KeyInit(void)
{
    //D7初始化
    GPIOD->DDR &= ~(1<<7);//设置为输入
    GPIOD->CR1 |=  (1<<7);
    GPIOD->CR2 &= ~(1<<7);//10 上拉输入
    
    //E3初始化
    GPIOE->DDR &= ~(1<<3);//设置为输入
    GPIOE->CR1 |=  (1<<3);
    GPIOE->CR2 &= ~(1<<3);//10 上拉输入
}
u8 KeyScan(void)
{
    if(KEY1_IN == 0)
    {
        Delay(16000);
        if(KEY1_IN == 0)
        {
            keyValue = KEY_VALUE1;
            return KEY_VALUE1;
        }
    }
    if(KEY2_IN == 0)
    {
        Delay(16000);
        if(KEY2_IN == 0)
        {
            keyValue = KEY_VALUE2;
            return KEY_VALUE2;
        }
    }
    return 0;
}#ifndef __KEY_H_ #define __KEY_H_ #include "stm8s.h" //按键使用D7 E3 //按键按下低电平,按键松开高电平 #define KEY_VALUE1 1 #define KEY_VALUE2 2 extern u8 keyValue; void KeyInit(void); u8 KeyScan(void); #endif
#include "led.h"
void LedInit(void)
{
    
    //D1初始化
    GPIOD->DDR |= (1<<1);//设置为输出
    GPIOD->CR1 |= 1<<1;
    GPIOD->CR2 &= ~(1<<1);//10 推挽输出
    
    //d0
    GPIOD->DDR |= (1<<0);//设置为输出
    GPIOD->CR1 |= 1<<0;
    GPIOD->CR2 &= ~(1<<0);//10 推挽输出
    
    //c3
    GPIOC->DDR |= (1<<3);//设置为输出
    GPIOC->CR1 |= 1<<3;
    GPIOC->CR2 &= ~(1<<3);//10 推挽输出
    LedSet(1,1);
    LedSet(2,1);
    LedSet(3,1);
}
void LedSet(u8 ch,u8 value)
{
    
    switch(ch)
    {
    case 1:
        if(value)GPIOD->ODR |= 1<<1;
        else GPIOD->ODR &= ~(1<<1);
        break;
    case 2:
        if(value)GPIOD->ODR |= 1<<0;
        else GPIOD->ODR &= ~(1<<0);
        break;
    case 3:
        if(value)GPIOC->ODR |= 1<<3;
        else GPIOC->ODR &= ~(1<<3);
        break;
    }
}
#ifndef __LED_H_ #define __LED_H_ #include "stm8s.h" //led1 PD1 swim //led2 pd0 //led3 pc3 d12_cs void LedInit(void); void LedSet(u8 ch,u8 value); #endif
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号