STM8S学习GPIO操作

发布者:轻松自在最新更新时间:2017-09-19 来源: eefocus关键字:STM8S  GPIO操作 手机看文章 扫描二维码
随时随地手机看文章

STM8S的GPIO主要功能:

● 端口的各个位可以被单独配置
● 可选择的输入模式:浮动输入和带上拉输入 
● 可选择的输出模式:推挽式输出和开漏输出
● 数据输入和输出采用独立的寄存器
● 外部中断可以单独使能和关闭
● 输出摆率控制用以减少EMC噪声
● 片上外设的I/O功能复用
● 当作为模拟输入时可以关闭输入施密特触发器来降低功耗
● 在数据输出锁存时支持读-修改-写
● 输入兼容 5V电压
● I/O口工作电压范围为1.6 V 到V DDIOmax

每个端口都分配有一个输出数据寄存器,一个输入引脚寄存器,一个数据方向寄存器,一个选择寄存器,和一个配置寄存器。一个I/O口工作在输入还是输出是取决于该口的数据方向寄存器的状态。

 

GPIO的每个端口由输出数据寄存器 (ODR),引脚输入寄存器 (IDR),数据方向寄存器(DDR)控制,控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出模式配置。

模式配置图为:

 

可以得出将 DDRx 位清零就选择了输入模式。在该模式下读IDR寄存器的位将返回对应I/O引脚上的电平值。将 DDRx 位置1就选择了输出模式。在该模式下向ODR寄存器的位写入数据将会通过锁存器输出对应数字值到I/O口。读IDR的位将会返回相应的I/O引脚电平值。通过软件配置CR1,CR2寄存器可以得到不同的输出模式:上拉输出,开漏输出。

复位后引脚状态为悬空输入。注意!!没有使用的I/O口要连接到固定的电平值,上拉或下拉。

另有三个寄存器  端口 x  输出数据寄存器 (Px_ODR),  端口 x  输入寄存器 (Px_IDR)(可读),  端口 x  数据方向 (Px_DDR)[0输入:1输出]。均为8位寄存器。

还有两个配置寄存器  端口 x  控制寄存器 1 (Px_CR1), 端口 x  控制寄存器 2 (Px_CR2)。

库函数中的GPIO配置。

先来看GPIO的初始化函数,我们假设GPIOD,GPIO_PIN_0,GPIO_MODE_OUT_PP_HIGH_FAST,对应数值为GPIO_PIN_0=0x00,

GPIO_MODE_OUT_PP_HIGH_FAST=0xf0。

 


  1. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode)  

  2. {  

  3.     /*----------------------*/  

  4.     /* Check the parameters */  

  5.     /*----------------------*/  

  6.   

  7.     assert_param(IS_GPIO_MODE_OK(GPIO_Mode));  

  8.     assert_param(IS_GPIO_PIN_OK(GPIO_Pin));  

  9.   复位选中引脚的CR2寄存器    

  10.   /* Reset corresponding bit to GPIO_Pin in CR2 register */  

  11.   GPIOx->CR2 &= (uint8_t)(~(GPIO_Pin));  

  12.   

  13.   /*-----------------------------*/  

  14.     /* Input/Output mode selection */  

  15.     /*-----------------------------*/  

  16.   

  17.     if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x80) != (uint8_t)0x00) /* Output mode */  

  18.     {  

  19.         if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x10) != (uint8_t)0x00) /* High level */  

  20.         {  

  21.             GPIOx->ODR |= (uint8_t)GPIO_Pin;  

  22.         }   

  23.         else /* Low level */  

  24.         {  

  25.             GPIOx->ODR &= (uint8_t)(~(GPIO_Pin));  

  26.         }  

  27.         /* Set Output mode */  

  28.         GPIOx->DDR |= (uint8_t)GPIO_Pin;  

  29.     }   

  30.     else /* Input mode */  

  31.     {  

  32.         /* Set Input mode */  

  33.         GPIOx->DDR &= (uint8_t)(~(GPIO_Pin));  

  34.     }  

  35.   

  36.     /*------------------------------------------------------------------------*/  

  37.     /* Pull-Up/Float (Input) or Push-Pull/Open-Drain (Output) modes selection */  

  38.     /*------------------------------------------------------------------------*/  

  39.   

  40.     if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x40) != (uint8_t)0x00) /* Pull-Up or Push-Pull */  

  41.     {  

  42.         GPIOx->CR1 |= (uint8_t)GPIO_Pin;  

  43.     }   

  44.     else /* Float or Open-Drain */  

  45.     {  

  46.         GPIOx->CR1 &= (uint8_t)(~(GPIO_Pin));  

  47.     }  

  48.   

  49.     /*-----------------------------------------------------*/  

  50.     /* Interrupt (Input) or Slope (Output) modes selection */  

  51.     /*-----------------------------------------------------*/  

  52.   

  53.     if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x20) != (uint8_t)0x00) /* Interrupt or Slow slope */  

  54.     {  

  55.         GPIOx->CR2 |= (uint8_t)GPIO_Pin;  

  56.     }   

  57.     else /* No external interrupt or No slope control */  

  58.     {  

  59.         GPIOx->CR2 &= (uint8_t)(~(GPIO_Pin));  

  60.     }  

  61.   

  62. }  

  63.   

  64. 当确定为输出时,可以用:  


  1. void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal)  

  2. {  

  3.     GPIOx->ODR = PortVal;  

  4. }  


  1. 例:GPIO_Write(GPIOD, 0xff);  


  1. 还有GPIO_WriteLow(GPIOD, GPIO_PIN_0);和GPIO_WriteHigh(GPIOD, GPIO_PIN_0);对任意端口设置输出为高或低。  



关键字:STM8S  GPIO操作 引用地址:STM8S学习GPIO操作

上一篇:STM8S_001_GPIO基础知识
下一篇:STM8S之时钟设置

推荐阅读最新更新时间:2024-03-16 15:37

基于STM8S的AD采集系统
STM8S系列最多有16路AD,据封装大小而不同。许多引脚多有复用功能,其功能类似于普通的51,及对于有复用功能的IO口,可以直接使用而不需要什么复用设置。此外复用功能还可以引脚重映射,这就需要在选项字节中进行映射配置。对于要配置为AD采集口的引脚,一定要设置为浮空输入模式,而不是其他什么输出模式,这样会严重干扰输入电压的测量。由于使用的是小封装,因此没有专门的参考电压,内部是直接连到电源端,因此电源端的不稳就是参考电压的不稳,会直接导致转换值的不稳及跳动,一开始设计中就有一个闪烁灯,造成电源的小幅波动,影响到了转换值,在取消闪烁灯后,转换值稳定下来。由于采用的是分压电阻进行的大电压的测量,因此由分压电阻的误差造成的转换值不精确在所
[单片机]
stvd+stm8s单片机程序编译报错
编译stm8s程序过程报如下错误: Compiling stm8s_stdperiph_driversrcstm8s_adc2.c... cxstm8 +mods0 +debug -pxp -no -pp -l -istm8s_stdperiph_driverinc -i C:Program Files (x86)COSMICCXSTM8Hstm8 -i C:Program Files (x86)STMicroelectronicsst_toolsetinclude -clDebug -coDebug stm8s_stdperiph_driversrcstm8s_adc2.c #error cpstm8 stm8s_stdp
[单片机]
stm8s 定时器 延时 心得
用stm8s207s 使用定时器4(基本定时器)设计延时函数 us级 代码如下: void TIM4_Delay_us(unsigned int us) { unsigned char temp=0; temp=us*8; //TIM4_DeInit(); TIM4_TimeBaseInit(TIM4_PRESCALER_1,temp);//设置时钟 8M /8 = 1M ,装载计数值 TIM4_SelectOnePulseMode(TIM4_OPMODE_SINGLE);// 设置定时时间到了以后停止计数 TIM4_ClearFlag(TIM4_FLAG_UPDATE ); TIM4_Cmd(ENABLE);
[单片机]
stm8s 定时器2测量脉冲宽度(单位 us)
void Init_Timer2(void) { GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);//输入 无中断 TIM2_TimeBaseInit(TIM2_PRESCALER_16,65536-1); //16分频, 65ms 溢出 TIM2_Cmd(ENABLE); } uint16_t TIM2_GetCapture(void) { /* Get the Capture Register value */ uint16_t tmpccr = 0; uint8_t tmpccrl=0, tmpccrh=0; tmpccrh = TIM2- C
[单片机]
msp432快速入门第六节之按键扫描和GPIO中断操作
(一)按键扫描 (1)配置引脚 在按键扫描这一节,仅需要配置好引脚即可,打开TI的GPIO驱动库,可以看到GPIO设置函数H文件如下: 在这个函数上方有对函数的说明: 解释为:该函数配置MSP432的GPIO引脚为输入模式,没有指明被配置的引脚是否被上拉或者下拉,当然如果需要配置输入上拉或者输入下拉需要使用此函数配置: 在这里我们直接使用普通配置,配置引脚为输入即可。 如下进行引脚初始化:(板载两个按键,一左一右均可以使用,注意复位键是在上面的) //key pin init void Key_Init(void) { GPIO_setAsInputPinWithPullUpResistor(KEY_LEFT
[单片机]
msp432快速入门第六节之按键扫描和<font color='red'>GPIO</font>中断<font color='red'>操作</font>
STM32初识GPIO操作(by woody)
操作步骤为: 1) 使能 IO 口时钟。调用函数为 RCC_APB2PeriphClockCmd()。 2) 初始化 IO 参数。调用函数 GPIO_Init(); 3) 操作 IO。操作 IO 的方法就是上面我们讲解的方法 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin =; GPIO_InitStructure.GPIO_Mode =; GPIO_InitStructure.GPIO_Speed =; GPIO_Init(GPIOX, &GPIO_InitStructure); GPIO_Mode_AIN = 0x0, //模拟
[单片机]
GPIO做为输出时操作方法--stm32备忘
  这里就不说库函数操作了,因为库函数的本质是操作寄存器。当GPIO做为输出时,无非是输出0或者1。涉及到的寄存器有GPIOx_ODR、GPIO_BSRR、GPIO_BRR.下面分别介绍这三个寄存器的操作方法。   GPIOx_ODR: 端口输出数据寄存器,它的31:16位保留不用,15:0对应x的相应引脚,他只能以16位方式操作。   GPIOx_BSRR:端口位设置/复位寄存器,它的31:16位是清除位(BR15:BR0),用来复位对应的引脚;15:0位是设置位(BS15:BS0),用来设置对应的引脚。无论是BR还是BS,都是1有效,即相应位为0时无效,这样可以保证操作某个端口时对其他端口无影响。   GPIOx_
[单片机]
IAR中如何修改STM8S库(二)
如果需要在IAR中使用电容触摸按键库,需要将Stm8s_it_c中的TIM4中断屏蔽,因为触摸按键库中已经使用了这个中断 具体修改如下: #ifdef _IAR_SYSTEMS_ //此处修改,因为采用了触摸库 /* #pragma vector=0x19 __interrupt void TIM4_UPD_OVF_IRQHandler(void) */ #endif 即将中断屏蔽
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved