嵌入式 > 技术百科 > 详情

STM8的GPIO驱动

发布时间:2025-02-18 发布时间:
|

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

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



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

主要依靠这几个寄存器



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




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

以下是操作代码

 

 

  1. #include "key.h"  

  2.   

  3. u8 keyValue = 0;  

  4. #define KEY1_IN (GPIOD->IDR&0X80)  

  5. #define KEY2_IN (GPIOE->IDR&0X08)  

  6.   

  7.   

  8. static void Delay(u16 nCount)  

  9. {  

  10.   /* Decrement nCount value */  

  11.   while (nCount != 0)  

  12.   {  

  13.     nCount--;  

  14.   }  

  15.   

  16. }  

  17.   

  18.   

  19. void KeyInit(void)  

  20. {  

  21.     //D7初始化  

  22.     GPIOD->DDR &= ~(1<<7);//设置为输入  

  23.     GPIOD->CR1 |=  (1<<7);  

  24.     GPIOD->CR2 &= ~(1<<7);//10 上拉输入  

  25.       

  26.     //E3初始化  

  27.     GPIOE->DDR &= ~(1<<3);//设置为输入  

  28.     GPIOE->CR1 |=  (1<<3);  

  29.     GPIOE->CR2 &= ~(1<<3);//10 上拉输入  

  30. }  

  31.   

  32. u8 KeyScan(void)  

  33. {  

  34.     if(KEY1_IN == 0)  

  35.     {  

  36.         Delay(16000);  

  37.         if(KEY1_IN == 0)  

  38.         {  

  39.             keyValue = KEY_VALUE1;  

  40.             return KEY_VALUE1;  

  41.         }  

  42.     }  

  43.     if(KEY2_IN == 0)  

  44.     {  

  45.         Delay(16000);  

  46.         if(KEY2_IN == 0)  

  47.         {  

  48.             keyValue = KEY_VALUE2;  

  49.             return KEY_VALUE2;  

  50.         }  

  51.     }  

  52.     return 0;  

  53. }  


  1. #ifndef __KEY_H_  

  2. #define __KEY_H_  

  3. #include "stm8s.h"  

  4.   

  5. //按键使用D7 E3  

  6. //按键按下低电平,按键松开高电平  

  7.   

  8. #define KEY_VALUE1  1  

  9. #define KEY_VALUE2  2  

  10.   

  11. extern u8 keyValue;  

  12.   

  13.   

  14. void KeyInit(void);  

  15.   

  16. u8 KeyScan(void);  

  17.   

  18.   

  19.   

  20. #endif  


  1. #include "led.h"  

  2.   

  3. void LedInit(void)  

  4. {  

  5.       

  6.     //D1初始化  

  7.     GPIOD->DDR |= (1<<1);//设置为输出  

  8.     GPIOD->CR1 |= 1<<1;  

  9.     GPIOD->CR2 &= ~(1<<1);//10 推挽输出  

  10.       

  11.     //d0  

  12.     GPIOD->DDR |= (1<<0);//设置为输出  

  13.     GPIOD->CR1 |= 1<<0;  

  14.     GPIOD->CR2 &= ~(1<<0);//10 推挽输出  

  15.       

  16.     //c3  

  17.     GPIOC->DDR |= (1<<3);//设置为输出  

  18.     GPIOC->CR1 |= 1<<3;  

  19.     GPIOC->CR2 &= ~(1<<3);//10 推挽输出  

  20.     LedSet(1,1);  

  21.     LedSet(2,1);  

  22.     LedSet(3,1);  

  23. }  

  24.   

  25. void LedSet(u8 ch,u8 value)  

  26. {  

  27.       

  28.     switch(ch)  

  29.     {  

  30.     case 1:  

  31.         if(value)GPIOD->ODR |= 1<<1;  

  32.         else GPIOD->ODR &= ~(1<<1);  

  33.         break;  

  34.     case 2:  

  35.         if(value)GPIOD->ODR |= 1<<0;  

  36.         else GPIOD->ODR &= ~(1<<0);  

  37.         break;  

  38.     case 3:  

  39.         if(value)GPIOC->ODR |= 1<<3;  

  40.         else GPIOC->ODR &= ~(1<<3);  

  41.         break;  

  42.     }  

  43. }  



 

  1. #ifndef __LED_H_  

  2. #define __LED_H_  

  3. #include "stm8s.h"  

  4.   

  5. //led1  PD1 swim  

  6. //led2  pd0   

  7. //led3  pc3 d12_cs  

  8.   

  9. void LedInit(void);  

  10.   

  11. void LedSet(u8 ch,u8 value);  

  12.   

  13.   

  14.   

  15. #endif  






『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
显示器故障的原因 显示器维护六大纪律