打印
[STM8]

【转】STM8的GPIO驱动

[复制链接]
600|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
风萧寒|  楼主 | 2016-11-27 23:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

芯片的外设一般按照这么几个流程来进行,GPIO,外部中断,定时器,串口,ADC,IIC,SPI,下面我就按照各个模式来写

   首先是GPIO,STM8的GPIO拥有复用功能,这句话告诉我们必然需要配置IO的复用功能才能使用,看这张表



DDR决定输入输出方向,CR1 CR2决定输入输出模式,上拉,下拉,推挽,开漏等

主要依靠这几个寄存器



还有一个控制寄存器2,懒得传了


沙发
风萧寒|  楼主 | 2016-11-27 23:14 | 只看该作者

按照这张表,输出写输出寄存器,输入读输入寄存器,就能完成GPIO的操作了

以下是操作代码



[cpp] view plain copy


  • #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;  
  • }  


[cpp] view plain copy


  • #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  


[cpp] view plain copy


  • #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;  
  •     }  
  • }  




[cpp] view plain copy


  • #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  


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

134

帖子

3

粉丝