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

从网上下一个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. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  2. STM8学习笔记----普通IO口模拟串口功能

    串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...

  3. 【STM32学习笔记】#002 GPIO设置练习

    系列文章目录 -[STM32学习笔记]#001 前期准备 文章目录 系列文章目录 前言 一.目标功能 二.CubeMX设置 1 端口设置1(Port Setting) 2 端口设置2(Port Set ...

  4. STM8学习笔记3 STM8简介

    概述 STM8单片机的开发商是意法半导体(ST),于2009年推出.它具有3级流水线架构.性价比高.开发方便的等优点.根据应用场合的不同,分为三个系列:STM8S,STM8L和STM8A. 个人认为, ...

  5. STM8学习笔记1:STM8简介

    文章目录 前言 从大学开始接触单片机,但对他的理解一直处于很表面,现在进入公司也有半年多的时间了,由于工作就是做底层驱动开发,现在更需要认真去学习一款单片机的使用.目前工作接触最多的单片机是英飞凌TC ...

  6. android jackson xml,[Android学习笔记]jackson库的使用

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

  7. STM8学习笔记---新建IAR工程文件

    1.打开IAR工具 2.选择Project-Create New Project 3.选择Empty project,点击OK. 4.选择文件存储路径,输入工程名,点保存按钮. 5单击左上角新建文件按 ...

  8. STM8学习笔记---IAR工程中添加文件夹

    将demo工程重命名为led后,然后再LED文件夹内新建一个文件夹,改名为 HardWare. 然后再HardWare文件夹内新建led.c和led.h文件. 然后双击led.eww,打开led工程. ...

  9. STM8学习笔记---IAR工程重命名

    将demo文件夹复制一份,重命名为LED. 打开LED文件夹,打开demo工程.选择 File-Save Workspace AS 在弹出的对话框中将demo改为LED,将工作区重命名为LED. 然后 ...

最新文章

  1. vs编译报错C1020: 意外的 #endif
  2. 三种方法,用Python轻松提取PDF中的全部图片
  3. view渐变色,透明度渐变
  4. php socket传递cookie,PHP Websocket在测试中验证用户(传递会话cookie)
  5. leetcode1005. K 次取反后最大化的数组和
  6. Android开发启动未注册的activity,Hook使用demo
  7. 定位需求 整理思路 组装函数
  8. 第六章 prototype和constructor
  9. ImageJ Merge荧光图片
  10. Qt5.5.1 VS2010中文乱码解决办法
  11. objective-C的内存管理机制琢磨不透
  12. Android-系统服务-ClipboardManager
  13. 亚马逊服务器EC2无法ping通的问题
  14. iOS进阶_地图上定位的标志——大头针
  15. 拒绝“累丑”,走进RPA的世界
  16. mysql计算折纸_折纸飞机实验报告.doc
  17. GPT3类自动补全助手,个体+超级团队成为可能 | 技术趋势
  18. PyCharm基本配置:设置绿色护眼绿豆沙背景等
  19. mysql query 优化_第 8 章 MySQL 数据库 Query 的优化
  20. iOS13.3Beta4发布,更新内容简介/资源站Unc0ver更新证书

热门文章

  1. primefaces教程_Primefaces Spring和Hibernate集成示例教程
  2. 人工智能应用在会计工作中的优势
  3. C语言基础教程篇之程序结构
  4. Java基础篇:什么是异常,异常处理的基础是什么?
  5. Java基础篇:finalize( )方法的使用
  6. 中文编程汉语编程开发的大型管理软件案例
  7. js进阶 10-4 jquery中基础选择器有哪些
  8. Linux的安装及忘记Linux密码的措施
  9. “玲珑杯”ACM比赛 Round #19
  10. 《R语言数据挖掘:实用项目解析》——2.6 变量分段