STM8S 固件库GPIO设置问题

发布者:幸福的时光最新更新时间:2017-02-17 来源: eefocus关键字:STM8S  固件库  GPIO  设置问题 手机看文章 扫描二维码
随时随地手机看文章

ST对STM8S系列都有提供固件库,而不同的版本自然存在一些不同,版本也一直从V1.0.0升级到目前的V1.1.1。

环境: FWLIB V1.0.1版本,采用STM8SF103

在使用GPIO库时,一个偶然发现stm8s_gpio.h中的宏定义是存在问题的。

代码定义如下:


  1.   ******************************************************************************  

  2.   * @file stm8s_gpio.h  

  3.   * @brief This file contains all functions prototype and macros for the GPIO peripheral.  

  4.   * @author STMicroelectronics - MCD Application Team  

  5.   * @version V1.0.1  

  6.   * @date 09/22/2008  

  7.   ******************************************************************************  

  8. /** 

  9.   * @brief GPIO modes 

  10.   * 

  11.   * Bits definitions: 

  12.   * - Bit 7: 0 = INPUT mode 

  13.   *          1 = OUTPUT mode 

  14.   *          1 = PULL-UP (input) or PUSH-PULL (output) 

  15.   * - Bit 5: 0 = No external interrupt (input) or No slope control (output) 

  16.   *          1 = External interrupt (input) or Slow control enabled (output) 

  17.   * - Bit 4: 0 = Low level (output) 

  18.   *          1 = High level (output push-pull) or HI-Z (output open-drain) 

  19.   */  

  20. typedef enum  

  21. {  

  22.   GPIO_MODE_IN_FL_NO_IT      = (u8)0b00000000,  /*!< Input floating, no external interrupt */  

  23.   GPIO_MODE_IN_PU_NO_IT      = (u8)0b01000000,  /*!< Input pull-up, no external interrupt */  

  24.   GPIO_MODE_IN_FL_IT         = (u8)0b00100000,  /*!< Input floating, external interrupt */  

  25.   GPIO_MODE_IN_PU_IT         = (u8)0b01100000,  /*!< Input pull-up, external interrupt */  

  26.   GPIO_MODE_OUT_OD_LOW_FAST  = (u8)0b10000000,  /*!< Output open-drain, low level, no slope control */  

  27.   GPIO_MODE_OUT_PP_LOW_FAST  = (u8)0b11000000,  /*!< Output push-pull, low level, no slope control */  

  28.   GPIO_MODE_OUT_OD_LOW_SLOW  = (u8)0b10100000,  /*!< Output open-drain, low level, slow slope */  

  29.   GPIO_MODE_OUT_PP_LOW_SLOW  = (u8)0b11100000,  /*!< Output push-pull, low level, slow slope */  

  30.   GPIO_MODE_OUT_OD_HIZ_FAST  = (u8)0b10010000,  /*!< Output open-drain, high-impedance level, no slope control */  

  31.   GPIO_MODE_OUT_PP_HIGH_FAST = (u8)0b11010000,  /*!< Output push-pull, high level, no slope control */  

  32.   GPIO_MODE_OUT_OD_HIZ_SLOW  = (u8)0b10110000,  /*!< Output open-drain, high-impedance level, slow slope */  

  33.   GPIO_MODE_OUT_PP_HIGH_SLOW = (u8)0b11110000   /*!< Output push-pull, high level, slow slope */  

  34. }GPIO_Mode_TypeDef;  

我在main.c中是直接这样用的 GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST); //将GPIOC所有IO口设置成推挽输出,10M速度。空闲IO口设置为输出低电平能降低不必要的功耗。


但是调试查看寄存器时发现 CR2寄存器全为0,不应该才对。手册上清晰的表明了为1为设置10M速度。

翻看stm8s_gpio.c中的GPIO_Init函数,有设置CR2寄存器,前提是根据GPIO_MODE掩码来进行判断,判断的根据就是 Bit 5。如下:


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

  2. {  

  3.   GPIOx->CR2 |= GPIO_Pin;  

  4. } else /* No external interrupt or No slope control */  

  5. {  

  6.   GPIOx->CR2 &= (u8)(~(GPIO_Pin));  

  7. }  



继续查看固件库,对于V1.1.1来说不存在这个问题,如:


  1.   ******************************************************************************  

  2.   * @file stm8s_gpio.h  

  3.   * @brief This file contains all functions prototype and macros for the GPIO peripheral.  

  4.   * @author STMicroelectronics - MCD Application Team  

  5.   * @version V1.1.1  

  6.   * @date 06/05/2009  

  7.   ******************************************************************************  

  8.  /** 

  9.   * @brief GPIO modes 

  10.   * 

  11.   * Bits definitions: 

  12.   * - Bit 7: 0 = INPUT mode 

  13.   *          1 = OUTPUT mode 

  14.   *          1 = PULL-UP (input) or PUSH-PULL (output) 

  15.   * - Bit 5: 0 = No external interrupt (input) or No slope control (output) 

  16.   *          1 = External interrupt (input) or Slow control enabled (output) 

  17.   * - Bit 4: 0 = Low level (output) 

  18.   *          1 = High level (output push-pull) or HI-Z (output open-drain) 

  19.   */  

  20. typedef enum  

  21. {  

  22.   GPIO_MODE_IN_FL_NO_IT      = (u8)0b00000000,  /*!< Input floating, no external interrupt */  

  23.   GPIO_MODE_IN_PU_NO_IT      = (u8)0b01000000,  /*!< Input pull-up, no external interrupt */  

  24.   GPIO_MODE_IN_FL_IT         = (u8)0b00100000,  /*!< Input floating, external interrupt */  

  25.   GPIO_MODE_IN_PU_IT         = (u8)0b01100000,  /*!< Input pull-up, external interrupt */  

  26.   GPIO_MODE_OUT_OD_LOW_FAST  = (u8)0b10100000,  /*!< Output open-drain, low level, 10MHz */  

  27.   GPIO_MODE_OUT_PP_LOW_FAST  = (u8)0b11100000,  /*!< Output push-pull, low level, 10MHz */  

  28.   GPIO_MODE_OUT_OD_LOW_SLOW  = (u8)0b10000000,  /*!< Output open-drain, low level, 2MHz */  

  29.   GPIO_MODE_OUT_PP_LOW_SLOW  = (u8)0b11000000,  /*!< Output push-pull, low level, 2MHz */  

  30.   GPIO_MODE_OUT_OD_HIZ_FAST  = (u8)0b10110000,  /*!< Output open-drain, high-impedance level,10MHz */  

  31.   GPIO_MODE_OUT_PP_HIGH_FAST = (u8)0b11110000,  /*!< Output push-pull, high level, 10MHz */  

  32.   GPIO_MODE_OUT_OD_HIZ_SLOW  = (u8)0b10010000,  /*!< Output open-drain, high-impedance level, 2MHz */  

  33.   GPIO_MODE_OUT_PP_HIGH_SLOW = (u8)0b11010000   /*!< Output push-pull, high level, 2MHz */  

  34. }GPIO_Mode_TypeDef;  


同样是GPIO_MODE_OUT_PP_HIGH_FAST,前者定义为 0b11010000,而后者则是 0b11110000。


后来从发行日志里也了解到,ST已经更正了这个错误。

V1.1.1 - 06/05/2009



@code
 General
 -------
     + Project template updated for both STVD and RIDE toolchains
     + Almost peripheral examples reviewed and validated with both Cosmic and Raisonance
     compilers  

 library
 -------
     + stm8s.h:
        - __CONST  definition added for Cosmic and Raisonance compilers
        - TINY definition added for Cosmic and Raisonance compilers
        - NEAR definition added for Raisonance compilers
        - CAN registers declaration updated
        - ADC1 registers declaration updated
               
    + stm8s_adc1.h:
         -  IS_ADC1_BUFFER_OK macro definition updated
    
    + stm8s_beep.c:
         -  BEEP_Init function updated
            - BEEP->CSR |= BEEP_CSR_BEEPEN; removed from init function
    
     + stm8s_can.c/.h:
        - Private variables declaration changed to volatile
        - CAN_DeInit function updated
        - CAN_Receive function updated
        - CAN_FilterInit funtion updated
        - CAN_Transmit function updated
        -  CAN_IT_TypeDef enum updated:
             - CAN_IT_ERR and CAN_IT_LEC definition updated to avoid ANSI check 
             error with Cosmic
     
     + stm8s_clk.h:
         -  CLK_Peripheral_TypeDef enum updated:
             - CLK_PERIPHERAL_UART1 definition updated and conditioned by the 
             device to use
        
     
     + stm8s_gpio.h:
         -  The GPIO_Mode_TypeDef enum element definition updated:
             - GPIO_MODE_OUT_OD_LOW_FAST
             - GPIO_MODE_OUT_PP_LOW_FAST
             - GPIO_MODE_OUT_OD_LOW_SLOW 
             - GPIO_MODE_OUT_PP_LOW_SLOW
             - GPIO_MODE_OUT_OD_HIZ_FAST
             - GPIO_MODE_OUT_PP_HIGH_FAST
             - GPIO_MODE_OUT_OD_HIZ_SLOW 
             - GPIO_MODE_OUT_PP_HIGH_SLOW


使用FWLIB V1.1.1替换FWLIB V1.0.1过程中,需要注意新版本中不存在 stm8s_macro.h,stm8s_map.h,取而代之的是stm8s.h,而且stm8s.h中外设宏配置也与旧版本不同。对于外设的编译判断旧版采用的是stm8s_conf.h文件,而新版则是根据芯片的型号。

旧版: 在stm8s_map.h中进行编译宏条件判断

#ifdef _ADC1
#define ADC1 ((ADC1_TypeDef *) ADC1_BaseAddress)
#endif

#ifdef _ADC2
#define ADC2 ((ADC2_TypeDef *) ADC2_BaseAddress)
#endif

#ifdef _ITC
#define ITC ((ITC_TypeDef *) ITC_BaseAddress)
#endif

#ifdef _CFG
#define CFG ((CFG_TypeDef *) CFG_BaseAddress)
#endif

.......

.......



 新版: 在stm8s.h中进行宏条件判断
#if defined(STM8S105) || defined(STM8S103) || defined(STM8S903)
 #define ADC1 ((ADC1_TypeDef *) ADC1_BaseAddress)
#endif /* (STM8S105) ||(STM8S103) || (STM8S903) */

#if defined(STM8S208) || defined(STM8S207)
#define ADC2 ((ADC2_TypeDef *) ADC2_BaseAddress)
#endif /* (STM8S208) ||(STM8S207)  */

#define AWU ((AWU_TypeDef *) AWU_BaseAddress)

#define BEEP ((BEEP_TypeDef *) BEEP_BaseAddress)

#ifdef STM8S208
 #define CAN ((CAN_TypeDef *) CAN_BaseAddress)
#endif /* (STM8S208) */

#define CLK ((CLK_TypeDef *) CLK_BaseAddress)

......

......


新版固件库无需使用stm8s_conf.h来配置外设,转而是使用芯片的型号即可。如果使用了USE_STDPERIPH_DRIVER宏,则仍然会包含stm8s_conf.h配置文件。STM8S103,编译过程中自然就能够将ADC1等外设编译进去。


还有要注意的就是,不存在的外设不要加入到项目中,这样会导致编译不过。

剔除了stm8s_adc2.c、stm8s_can.c、stm8s_tim3.c、stm8s_tim5.c、stm8s_tim6.c、stm8s_uart2.c、stm8s_uart3.c,这些外设对于STM8S103是不存在的。


关键字:STM8S  固件库  GPIO  设置问题 引用地址:STM8S 固件库GPIO设置问题

上一篇:STM8L101 与 STM8S103区别
下一篇:STM8S103 独立按键检测

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

记录1--s3c2440 GPIO && UART的控制
一.初始化对应的UART void Uart_Init(int pclk, int baud) { if(pclk == 0) pclk = PCLK; if(UartNum==0) //判断是否使用UART0 { rGPHCON = rGPHCON & (~(0xffff)); //UART0: RXD0 == GPH3 TXD0 == GPH2 rGPHCON = rGPHCON | (0xaaa0) ; //设置GPH端口为UART口 rGPHUP = 0x0; //使能上拉功能 rUFCON0=0x0; // 不使用FIFO rUMCON
[单片机]
基于STM8S的LCD驱动电路和LCD显示原理分析
一、LCD的显示原理。 LCD的工作原理和驱动电路 液晶是一种有机化合物,这种有机物质在一定的温度范围内,既具有液体的流动性和连续性,又具有某些晶体的光学性质。LCD就是利用这种物质在电场的作用下能产生特殊的电光效应而制成的。按照使用的电光效应的不同,LCD可分为动态散射效应和扭曲一向列效应两种类型;按采光方式的不同又可分为透射式和反射式。 LCD的基本结构由内表面刻有透明电极(典型图形为7段字形)的两块平板玻璃中间注入薄薄(约10pm厚)的液晶层构成。它的上、下表面各放了一块偏振片(起偏振片、检偏振片)。下偏振片下面常常再放一块高效的反射器件,以获得良好的清晰度。 LCD采用表面排列技术,对刻有透明电极的玻璃进行表面处理
[单片机]
基于<font color='red'>STM8S</font>的LCD驱动电路和LCD显示原理分析
STM8S(207)BootLoader制作(在BootLoader和App中都可以使用中断)
最近这段时间使用stm8,要在项目中用到IAP升级,同时还要在BootLoader和App中同时使用中断,花了一些时间查找了很多博客,集合大家的知识,写了一篇文章来总结一下自己的成果。这是我第一次写文章,有错误的地方欢迎大家指出 BootLoader制作分析 1、单片机需要有一个对外的通信接口,一般使用的是单片机自带的串口 2、网上寻找一个稳定的通信协议,保证你的单片机在IAP升级的时,能正确稳定的传输数据。我使用的是 Ymodem协议(如果不知道的可以度娘去了解一下),因为网上有编写好的上位机,比较方便 3、了解stm8的内存分布情况,使用flash读写函数把升级的数据写入单片机的ROM里面 4、重定向中断向量表
[单片机]
<font color='red'>STM8S</font>(207)BootLoader制作(在BootLoader和App中都可以使用中断)
STM32自学笔记GPIO寄存器
GPIO寄存器一览 以下图片全部摘自STM32中文参考手册 GPIOx- CRL(x=A…E) 这个寄存器主要是设置GPIO的低8位(0~7)端口的配置 MODE 用来设置端口输出的速度 (在输入模式下不需要配置,仅在输出模式下需要配置) CNF 用来设置输入模式或者输出模式 例如 设置PA0为推挽输出速度为50MHz GPIOA- CRL&=0XFFFFFFF0;//PA0配置清零 GPIOA- CRL|=0X00000003;//PA0输出 速度50MHz 设置PA0为上下拉输入(默认下拉) GPIOA- CRL&=0XFFFFFFF0;//PA0配置清零 GPIOA- CRL|=0X00000008
[单片机]
STM32自学笔记<font color='red'>GPIO</font>寄存器
恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--GPIO模块(一)
KEA128芯片有7组IO,PORTA--H每组8个引脚,PORTI有7个引脚,共计71个。 单个引脚驱动能力是2.5mA,内部均可上拉到VDD,无内部下拉。应通过编程将未使用引脚内部上拉。 MCU处在运行、等待、调试模式下,GPIO正常工作,停止模式下,GPIO停止工作。 下面是端口控制寄存器介绍,主要是端口滤波寄存器,上拉使能寄存器和高驱动能力使能寄存器 GPIO有三组寄存器,分别为GPIOA、GPIOB、GPIOC。每组有7个寄存器,分别为输出寄存器(PDOR)、输出置1寄存器(PSOR)、输出清0寄存器(PCOR)、输出取反寄存器(PTOR)、输入寄存器(PDIR)、数据放向寄存器(PDD
[单片机]
恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--<font color='red'>GPIO</font>模块(一)
STM8S 带缓冲区 串口中断 使用心得
#include UART.H /*-------------------------串口初始化函数------------------------*/ /*********************************************************** * 函数名称:void UART2_Init(void) * * 功能描述:UART2初始化函数 * * 参数列表:无 * * 返回结果:无 ***********************************************************/ void UART2_Init(void) { UART2_CR1=0x00;
[单片机]
GPIO 配置之ODR, BSRR, BRR 详解
用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。 管脚对于位写1 gpio 管脚为高电平,写 0 为低电平 BSRR 只写寄存器: 既能控制管脚为高电平,也能控制管脚为低电平。 对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作 BRR 只写寄存器:只能改变管脚状态为低电平,对寄存器 管脚对于位写 1 相应管脚会为低电平。写 0 无动作。 刚开始或许你跟我一样有以下疑惑: 1.既然ODR 能控制管脚高低电平为什么还需要BSRR和SRR寄存器? 2.既
[单片机]
<font color='red'>GPIO</font> 配置之ODR, BSRR, BRR 详解
STM32的GPIO使用的函数剖析
该文是自己学习了一段STM32后所写,是对STM32使用固件库编程最简单的一段程序,是对固件库函数的一部分进行解析。如有错误之处请指正,不胜感激。 一、 GPIO_Init函数解析 1 1、参数GPIO_TypeDef 1 2、参数GPIO_InitStruct 2 3、函数代码详解 4 4、备注 6 一、GPIO_Init函数解析 首先来看一下GPIO_Init函数的原型void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)。这个函数的实现是在Stm32f10x_gpio.c文件中,若要使用该函数在相应的应用程序的前
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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