历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2020年03月06日 | IAR FOR STM8 学习笔记 固件库 GPIO

2020-03-06 来源:eefocus

经过一番挣扎,还是决定使用官方的固件库了。。

从网上下一个STM8S的固件库,记得是FOR IAR的。

找到里面的IAR模板就可以开始用了。

 

 

这些都是直接写好的库函数,可以直接调用,但首先得先读懂,先了解些必备知识。

STM8的寄存器的地址 

在STM8中,与某个外围设备有关的寄存器在地址上都是顺序排列的;比如与GPIO有关的寄存器有ODR、IDR、DDR、CR1、CR2,与PA口有关的这五个寄存器就被安排在了0x00 5000~0x00 5004这5个地址空间中,它们有一个0x005000的基地址,分别偏移0,1,2,3,4。 

 

”stm8s.h"中与GPIO有关的定义,以及固件库中访问外围设备寄存器的方法 

typedef struct GPIO_struct 

  vu8 ODR; /*!< Output Data Register */ 

  vu8 IDR; /*!< Input Data Register */ 

  vu8 DDR; /*!< Data Direction Register */ 

  vu8 CR1; /*!< Configuration Register 1 */ 

  vu8 CR2; /*!< Configuration Register 2 */ 

GPIO_TypeDef; 

 

#define GPIOA_BaseAddress       0x5000 

#define GPIOB_BaseAddress       0x5005 

#define GPIOC_BaseAddress       0x500A 

#define GPIOD_BaseAddress       0x500F 

#define GPIOE_BaseAddress       0x5014 

#define GPIOF_BaseAddress       0x5019 

 

#define GPIOA ((GPIO_TypeDef *) GPIOA_BaseAddress) 

#define GPIOB ((GPIO_TypeDef *) GPIOB_BaseAddress) 

#define GPIOC ((GPIO_TypeDef *) GPIOC_BaseAddress) 

#define GPIOD ((GPIO_TypeDef *) GPIOD_BaseAddress) 

#define GPIOE ((GPIO_TypeDef *) GPIOE_BaseAddress) 

#define GPIOF ((GPIO_TypeDef *) GPIOF_BaseAddress) 

 

在结构体GPIO_TypeDef中,ODR,IDR,DDR,CR1,CR2的偏移分别是0,1,2,3,4正好与STM8S208RB对这几个安排一致,当我们将0x5000这个地址转换为指向GPIO_TypeDef的指针后, 

我们就可以用类似GPIOA->ODR的方法访问寄存器了。

 

 

 

 

 

另外固件库在函数的参数入口都有断言,

 

判断参数设置是否符合要求,方便调试程序。如果在调试时程序跑到void assert_failed(u8* file, u32 line){}。里面去,可以看看是否是参数设置出现问题 

 

 

 

 

先从对STM8的GPIO操作开始。

 以前没有过,只用过51的。操作管脚,给1就是1给0就是0.虽然简单但是功能不够给力啊。。

先了解下GPIO吧:

General Purpose Input Output (通用输入/输出)简称为GPIO 

STM8的每一个GPIO引脚都可以独立的作为输入/输出IO引脚使用,

作为输入IO引脚使用时,每一个IO引脚都可以作为外部中断的触发输入端使用,输入有上拉和悬浮,

输出有模拟开漏和推挽模式。 

DDR用于设置方向,ODR用于输出,IDR用于输入,CR1、CR2用于控制。

具体可参考数据手册。

 

固件库为我们提供了GPIO_Init这个函数,用于GPIO工作模式的初始化设置,它的原型为 

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

第一个参数是上面提到的GPIOA这样的指针,第二、三个参数都是枚举型变量(本质就是一些常数),用来制定要初始化的引脚和工作模式,具体设置可在GPIO.h中找到。 

 

typedef enum 

  GPIO_PIN_0    = ((u8)0x01),  /*!< Pin 0 selected */ 

  GPIO_PIN_1    = ((u8)0x02),  /*!< Pin 1 selected */ 

  GPIO_PIN_2    = ((u8)0x04),  /*!< Pin 2 selected */ 

  GPIO_PIN_3    = ((u8)0x08),   /*!< Pin 3 selected */ 

  GPIO_PIN_4    = ((u8)0x10),  /*!< Pin 4 selected */ 

  GPIO_PIN_5    = ((u8)0x20),  /*!< Pin 5 selected */ 

  GPIO_PIN_6    = ((u8)0x40),  /*!< Pin 6 selected */ 

  GPIO_PIN_7    = ((u8)0x80),  /*!< Pin 7 selected */ 

  GPIO_PIN_LNIB = ((u8)0x0F),  /*!< Low nibble pins selected */ 

  GPIO_PIN_HNIB = ((u8)0xF0),  /*!< High nibble pins selected */ 

  GPIO_PIN_ALL  = ((u8)0xFF)   /*!< All pins selected */ 

}GPIO_Pin_TypeDef; 

 

我们可以如此使用这个函数: 

 

#define LEDS_PORT (GPIOH) 

#define LED1_PIN  (GPIO_PIN_3) 

#define LED2_PIN  (GPIO_PIN_2) 

#define LED3_PIN  (GPIO_PIN_1) 

#define LED4_PIN  (GPIO_PIN_0) 

 

#define BUTTON_PORT (GPIOC) 

#define BUTTON_PIN  (GPIO_PIN_0) 

 

/* Initialize I/Os in Output Mode */ 

GPIO_Init(LEDS_PORT, (LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN), GPIO_MODE_OUT_PP_LOW_FAST); 

/* Initialize I/O in Input Mode with Interrupt */ 

GPIO_Init(BUTTON_PORT, BUTTON_PIN, GPIO_MODE_IN_FL_IT); 

 

GPIO的操作函数 

void GPIO_Write(GPIO_TypeDef* GPIOx, u8 PortVal);             //写端口,8个脚一起设置 

void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); // 将指定脚设置为高 

void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);  // 讲指定脚设置为低 

void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);  // 指定脚取反 

u8 GPIO_ReadInputData(GPIO_TypeDef* GPIOx);  // 读引脚 

u8 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);  // 读端口,上次锁存到ODR中的数据 

BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin); // 读制定脚的状态,高电平返回非0,低返回0 

 

写一个点亮LED的程序:

#include "stm8s.h"

#define LED_PORT (GPIOD) 

#define LED1_PIN  (GPIO_PIN_3) 

#define LED2_PIN  (GPIO_PIN_2) 

#define LED3_PIN  (GPIO_PIN_0) 

 

 

#define BUTTON_PORT (GPIOD) 

#define BUTTON_PIN  (GPIO_PIN_7) 

/* Private defines -----------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/

 

void main(void)

{

  /* Infinite loop */

   GPIO_Init(LED_PORT, LED1_PIN,GPIO_MODE_OUT_PP_LOW_SLOW);

   GPIO_WriteHigh(LED_PORT, LED1_PIN);

 

}


下载测试,没有问题。

from:http://www.eefocus.com/w7838207178/blog/11-11/235052_ff6b7.html

推荐阅读

史海拾趣

AF International公司的发展小趣事

随着国内市场的逐渐饱和,AF International开始寻求海外市场的拓展。公司派遣专业的销售团队前往欧美、东南亚等地区,与当地企业建立合作关系,推广自己的产品。同时,AF International还积极参与国际电子展会,展示公司的最新技术和产品,吸引了众多国际客户的关注。通过不断的努力,AF International成功打开了海外市场,实现了国际化发展的目标。

广州基安彼(GMB)公司的发展小趣事

随着公司业务规模的不断扩大,AF International意识到建立完善的质量管理体系至关重要。公司引进了先进的质量管理理念和方法,建立了严格的质量控制流程,确保从原材料采购到产品生产的每一个环节都符合质量标准。同时,AF International还加强了对员工的培训和教育,提高员工的质量意识和操作技能。这些措施使得公司的产品质量得到了有效保障,赢得了客户的广泛赞誉。

Apex Tool Group公司的发展小趣事

随着电子行业的快速发展和技术的不断进步,Analytic Instruments Corp面临着日益激烈的市场竞争。为了保持领先地位,公司不断调整产品结构和市场策略,积极应对行业变革。公司加大了研发投入,推出了一系列具有创新性和竞争力的新产品。同时,公司还加强了与客户的沟通和合作,深入了解客户需求,为客户提供更加个性化的解决方案。

Advanced Detector Corp公司的发展小趣事

为了进一步提升竞争力,ADC积极寻求与其他企业的战略合作。通过与业界领先的企业建立合作关系,ADC成功整合了各方资源,共同研发新技术、新产品。这些合作不仅加速了ADC的技术创新步伐,也为其带来了更多的商业机会。

Carlo Gavazzi公司的发展小趣事

为了进一步拓展市场,Carlo Gavazzi公司开始实施国际化战略。公司先后在多个国家和地区设立销售和服务团队,将产品和服务推向全球市场。这一过程中,公司不仅面临着文化差异和市场环境的挑战,也积极寻求与当地企业的合作与共赢。通过不断努力,公司逐渐在全球范围内建立起自己的品牌形象和市场地位。

Devar Inc公司的发展小趣事

随着电商的兴起,Devar Inc公司看到了智能包装的巨大潜力。公司研发了一系列智能包装解决方案,利用传感器、RFID技术和物联网技术,实现了产品的追踪、溯源和防伪功能。同时,Devar还积极探索将AR技术应用于包装设计中,为消费者提供与产品包装互动的体验。这些创新不仅提升了产品的附加值,也增强了消费者对品牌的认同感。

问答坊 | AI 解惑

ARM菜鸟进阶

ARM菜鸟快速上手…

查看全部问答>

LED控制器

菲克电子引领LED灯饰技术潮流,菲克电子大量提供LED护栏管点光源控制器,背光模组控制器,lED控制器,有全彩单片机方案,DM134方案,脱机,联机,USB,CF,SD,电脑控制,遥控,可根据客户要求制作。吕先生13232392096…

查看全部问答>

红外摄像机的常见的几个问题随笔(转)

  关于红外的些小想法,由来已久,正值五一放假来临之际,随便写写,有些想法是公司由来已久,有些是同事告知,有些是在同行那儿收集,现在,趁这个五一放假而有小小空时,在自己喜爱的千家上,写一下关于红外的随笔,希望能得到行家的指正;    & ...…

查看全部问答>

意念轮椅

据英国媒体报道 西班牙科学家研制出一部可以用人的意念来操作的轮椅。“意念轮椅”上装备着一部电脑,通过连接着轮椅的激光扫描仪,周围环境将会以三维图像的形式出在电脑的显示屏上。使用者只要对着屏幕上想去的地方集中精力,头上的电极头盔就能 ...…

查看全部问答>

初学者问题 关于RST引脚

单片机复位是什么意思啊,请不要讲得太专业, 什么是两个机器周期复位一次,程序执行时也复位吗 小弟刚刚自学单片机请大家帮下忙 …

查看全部问答>

“赔了夫人又折兵”----- EK-LM4F120XL板购买历程

花了4.99美元,用的支付宝,合RMB三十多,得到TI的邮件告知 Order Number:  170562 Ordered on: 9/8/2012 4:22:15 AM 等啊等啊,并经多方查询,终于知道了Shipped FedEx# is  876383xxxxxx, 后来发现,那个件送到了武 ...…

查看全部问答>

51单片机modbus协议问题

各位好,51单片机能作为主机与支持modbus RTU协议的传感器进行通讯么 这个问题困扰半个月了,求告知…

查看全部问答>

n设计一个电路欺骗GPS模块

有办法实现不? 我本人不是学电子专业的 有人能否提供相关资料以及建议不? [ 本帖最后由 q397064399 于 2013-5-18 10:48 编辑 ]…

查看全部问答>

AD9854 有问题

在淘宝淘了一片AD9854 ,七十多大洋,拿回来焊上,但是发现时钟不能倍频到200M 以上,而且还有个严重问题,就是 I 路DAC 打不开,怎么回事哦?不会是芯片有问题吧,看了两天了,配置应该没问题,就是这里不对,求助!…

查看全部问答>

EEWORLD大学堂---- SYS BIOS 简介(7) —— 对MSP430的支持_1

SYS BIOS 简介(7) —— 对MSP430的支持_1:https://training.eeworld.com.cn/course/359…

查看全部问答>