IAR FOR STM8 学习笔记 固件库 GPIO

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

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

时间: 2024-09-19 09:31:59

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

PHP学习笔记 (1) 环境配置与代码调试

一配置PHP环境 1.了解什么是PHP PHP("PHP: Hypertext Preprocessor",超文本预处理器的字母缩写) PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用 2.PHP的背景和优势 PHP的发展背景 1).1994年由Rasmus Lerdorf创建,开始是一个简单的Perl语言编写的程序,用统计

php5学习笔记(转)

php5|笔记 作者: whhwq在phpv.net看到的感觉不错/*+-------------------------------------------------------------------------------+| = 本文为Haohappy读<<Core PHP Programming>> | = 中Classes and Objects一章的笔记 | = 翻译为主+个人心得 | = 为避免可能发生的不必要的麻烦请勿转载,谢谢 | = 欢迎批评指正,希望和所有

动态网页学习:JSP学习笔记全记录

js|笔记|动态|网页 JSP学习笔记(一)-----概述 JSP学习笔记(二)-----使用Tomcat运行JSP文件 JSP学习笔记(三)-----使用JSP处理用户注册和登陆 JSP学习笔记(四)-----JSP动作的使用 JSP学习笔记(五)-----JSP中使用JavaBean JSP学习笔记(六)-----在多个JSP页面之间传递参数 JSP学习笔记(七)-----猜数字游戏 JSP学习笔记(八)-----include的运用 JSP学习笔记(九)-----JSP标签库

MySQL数据库学习笔记(一)

mysql|笔记|数据|数据库         我一直从事Informix和Oracle数据库开发,有一天发现网络上有一种小巧别致的数据库,被广泛使用,从MySQL的网站http://www.mysql.com/我下载了它的数据库软件,使用过后觉得真的挺好,这是我的一点学习笔记希望对各位初学者有点帮助. 1.       MySQL数据库介绍 MySQL 是瑞典的MySQL AB公司开发的一个可用于各种流行操作系统平台的关系数据库系统,它具有客户机/服务器体系结构的分布式数据库管理系统.MySQ

jsp2 tag学习笔记

js|笔记 JSP2.0标签学习笔记1. 说明本文档是学习tomcat中例子的笔记,并没有参考相应的说明文档,因此不能保证本文观点的正确性.如果有不对之处,不妨email至8280338@tzenet.com,大家共同进步. 2. JSP2.0标签使用方法JSP2.0中标签的使用由多个部分组成: (1) WEB_INF/web.xml中添加标签引用 (2) 标签的实现,可能是class也可能是web templet (3) 在jsp文件中添加引用 在实际使用中,分析jsp2.0标签可以先从jsp

Python中Random和Math模块学习笔记

  这篇文章主要介绍了Python中Random和Math模块学习笔记,本文讲解了math模块的数学常量.常用简单函数.三角函数等,讲解了random模块的常用函数.随机挑选和排序等内容,需要的朋友可以参考下 由于最近经常使用到Python中random,math和time``datetime模块, 所以决定花时间系统的学习一下 1. math模块 math中的函数不可以用于太过复杂的数的运算, 如果需要复杂数的运行最好使用cmath模块中同名函数, 如果想要更加高级的数学功能,可以考虑选择标准

作为一个新手的Oracle(DBA)学习笔记

Oracle数据库笔记 Jack Chaing 作者QQ595696297 交流群 127591054 祝大家学习进步. 如果大家想看Word版本的可以去下载:Word排版比较清晰一些. http://download.csdn.net/detail/jack__chiang/9810532 此笔记是作者本人去年开始从一个DBA新人的学习笔记,积累至今,希望拿出来给那些对DBA有兴趣的童孩学习,大家一起努力嘛. 此笔记记录了作者工作学习中从零基础的学习的记录,和从中遇见的问题与问题的解决!很高兴

Java中jqGrid 学习笔记整理——进阶篇(二)_java

相关阅读: Java中jqGrid 学习笔记整理--进阶篇(一) 本篇开始正式与后台(java语言)进行数据交互,使用的平台为 JDK:java 1.8.0_71 myEclisp 2015 Stable 2.0 Apache Tomcat-8.0.30 Mysql 5.7 Navicat for mysql 11.2.5(mysql数据库管理工具) 一.数据库部分 1.创建数据库 使用Navicat for mysql创建数据库(使用其他工具或直接使用命令行暂不介绍) 2. 2.创建表 双击打

AM335x(TQ335x)学习笔记——挂载Ramdisk

上篇文章中我们已经能够通过u-boot启动内核了,但是没有能够启动成功,从内核的log中可以看出,内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramdisk供u-boot启动内核使用. (1)制作根文件系统 使用busybox构建根文件系统的步骤可以参考本博客的另外一篇文章,该文章链接如下: S5PV210(TQ210)学习笔记--内核移植与文件系统构建 需要补充的是,文章"S5PV210(TQ210)学习笔记--内核移植与文件系统构建"