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

从网上下一个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

IAR FOR STM8 学习笔记 固件库 GPIO的更多相关文章

  1. IAR FOR STM8 学习笔记 IAR工程的建立

    STM8是ST意法半导体针对工业应用和消费电子开发而推出的8位单片机. 每种MCU都有自身的优点与缺点,与其它8-bit MCU相比,STM8 8-bit MCU最大的特点是: · 内核: o 最高f ...

  2. [Golang学习笔记] 03 库源码文件

    库源码文件:不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用. 代码包声明的基本规则: 1. 同目录下的源码文件的代码包声明语句要一致.也就是说,它们要同属于一个代码包( ...

  3. [Android学习笔记]jackson库的使用

    Jackson库一般用于序列化和反序列化操作,通常会涉及到的操作是: 1. Java Object -> Json String 2. Java Object -> Xml String ...

  4. [Python学习笔记] turtle库的基本使用

    turtle库常用函数 引入turtle模块 import turtle turtle的绘图窗体 #setup()设置窗口大小及位置#setup()可省略turtle.setup(width,heig ...

  5. 爬虫学习笔记-urllib库

    urllib库是python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数:在python3的urllib库中,所有和网络 ...

  6. 【托业】【新托业TOEIC新题型真题】学习笔记9-题库七+八--P4-5

    109.intend 意为“打算,意欲”,含有将来的含义,故不用将来时态 110.must do sth 必须做某事 111.recession 经济衰退,不景气 rebound 反弹:反应 recr ...

  7. Docker技术入门与实战 第二版-学习笔记-6-仓库

    仓库(Repository)是集中存放镜像的地方 一个容易混淆的概念是注册服务器(Registry). 实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像. ...

  8. python学习笔记——urllib库中的parse

    1 urllib.parse urllib 库中包含有如下内容 Package contents error parse request response robotparser 其中urllib.p ...

  9. VC学习笔记----STL库

      STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Muss ...

随机推荐

  1. 【转】C# HttpWebRequest提交数据方式

    [转]C# HttpWebRequest提交数据方式 HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.它们支持一系列有用的属性.这两个类位 于Sy ...

  2. 无比强大!Python抓取cssmoban网站的模版并下载

    Python实现抓取http://www.cssmoban.com/cssthemes网站的模版并下载 实现代码 # -*- coding: utf-8 -*- import urlparse imp ...

  3. 洛谷 P3902 递增

    P3902 递增 题目描述 现有数列A_1,A_2,\cdots,A_NA1​,A2​,⋯,AN​,修改最少的数字,使得数列严格单调递增. 输入输出格式 输入格式: 第1 行,1 个整数N 第2 行, ...

  4. DICOM:Transfer Syntax传输语义之奇葩GE Private TS

    背景: 专栏之前对Transfer Syntax(暂定中文翻译为传输语义,8月初博客中提到的DICOM3.0标准中文版开源书籍计划顺利启动.兴许会面临诸多专有名词的翻译工作,欢迎广大博友提意见)进行过 ...

  5. 【POJ 2195】 Going Home(KM算法求最小权匹配)

    [POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  6. Ubuntu系统下的Mysql安装与使用

    摘要 在本篇博文中.笔者将从基础出发.介绍Mysql在Linux环境下的安装和基本使用命令,仅适用于Mysql刚開始学习的人.大牛请绕道-- 安装Mysql数据库 这里介绍最最简单的安装方式,至于编译 ...

  7. 25.内置API

    转自:https://www.cnblogs.com/best/tag/Angular/ 3.1.数据转换 示例: 默认情况JavaScript中对象是传引用的: var tom={name:&quo ...

  8. OpenGL编程逐步深入(二)在窗口中显示一个点

    准备知识 在本文中我们将会接触到OpenGl的扩展库GLEW( OpenGL Extension Wrangler Library),GLEW可以帮助我们处理OpenGl中繁琐的扩展管理.一旦初始化后 ...

  9. PHP date()获取某时间段以周、月、季度为粒度的时间段数组

    date()函数: PHP date()  参考:https://www.hi-docs.com/php/date.html Linux date()参考:http://www.cnblogs.com ...

  10. sparkR处理Gb级数据集

    spark集群搭建及介绍:敬请关注 数据集:http://pan.baidu.com/s/1sjYN7lF 总结:使用sparkR进行数据分析建模相比R大致有3-5倍的提升 查看原始数据集:通过iri ...