zoukankan      html  css  js  c++  java
  • 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
    
    
    
    
    

  • 相关阅读:
    HTML5之特效
    css3圆角矩形、盒子阴影
    vertical-align垂直居中
    CSS3选择器
    经典导航栏
    C#获得时间段
    C#抓取和分析网页的类
    c#基础知识索引器
    强制浏览器重定向到另一页
    雅虎公司C#笔试题及参考答案
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4279405.html
Copyright © 2011-2022 走看看