IAR FOR STM8 学习笔记 固件库 GPIO

发布者:码字奇才最新更新时间:2020-03-06 来源: eefocus关键字:IAR  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

关键字:IAR  STM8  固件库  GPIO 引用地址:IAR FOR STM8 学习笔记 固件库 GPIO

上一篇:关于stm8l05RB的usart1串口复用A2,A3配置
下一篇:STM8S开发入门之使用EWSTM8(IAR STM8S)新建工程点亮一个LED

推荐阅读最新更新时间:2024-11-11 10:36

STM32F0xx_GPIO配置详细过程
前言 对于初学STM32的人来说,很多基础的知识没有掌握,这些基础知识就成为阻挡他们入门的门槛。因此,今天也把基础的知识分享出来,带领那些还没有迈过这个门槛的人入门。 今天总结“GPIO配置详细”,以F0标准外设库初始化结构体来重点讲解。接着昨天“新建软件工程详细过程”来进行讲解,今天分两大部分内容总结。工程描述、IO配置源代码详细讲解。 下载 ST标准外设库和参考手册、数据手册等都可以在ST官网下载的到(请自行下载)。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议使用这个,以后如果你换用一种型号芯片也方便了解。 今天提供下载的软
[单片机]
STM32F0xx_<font color='red'>GPIO</font>配置详细过程
STM8 IO口模拟串口通信
使用普通的IO口,模拟串口协议, 和PC端串口调试软件实现通信。 网上找了很多资料,有很多网友有些程序,但是感觉都不是很完整,无意间看到ST官方居然有实现,直接下载代码开始用。 针对官方的IO口模拟串口软件,简单介绍下用到资源。 由于模拟的串口RX脚,对于电平的输入判断用到定时器的输入捕获功能,所以官方用的是定时器3的通道2。 我自己在STM8S003F3P6最小系统上,移植到了TIM2的CH1即PD4用来做串口的RX脚,和PC端串口调试器的TX脚连接。 模拟串口的TX脚没有特殊要求,我这里用的PD3。。。。 修改了MAIN里面的函数,实现模拟串口直接发送接收到的数据。 PPS,关于串口波特率的配置,
[单片机]
STM32_GPIO配置及库函数讲解——独立按键
User Button硬件连接如下图所示:当按键被按下,PB9检测到低电平,相反PB9被3.3V电源拉高。 LED硬件连接如下图所示:高电平点亮LED。 要想将PB9管脚配置成输入模式,程序所需如下步骤:(必须的) 第一步:配置系统时钟。见 STM32F103x RCC寄存器配置 除此之外,还需将GPIO外设时钟打开。 /* Enable GPIOC and GPIOB clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENAB
[单片机]
STM32_<font color='red'>GPIO</font>配置及库函数讲解——独立按键
STM8单片机的中断控制和中断功能
内部中断:一般是由硬件错误或者运算过程中出错引起的,一般是不可避免的; 外部中断:是处理器的外设发出的中断请求,如定时器中断,UART 接收中断,外部中断一般都可以通过中断控制器进行屏蔽; 1.ITC 功能概述: ……所有 IO 引脚都具有外部中断能力,每个端口都有独立的中断向量以及独立的标志;外设中断能力; ……软件中断能力(TRAP) ……具有灵活的优先级和中断等级管理,支持可嵌套和同级中断管理: ——多达 4 个软件可编程的嵌套等级;——最多有 32 个中断向量,其入口地址由硬件固定;——2 个不可避免的中断:RESET,TRAP;——1 个不可避免的最高优先级硬件中断 TL1; 2. 中断的主要功能 1.
[单片机]
GPIO I/O口——八种工作模式
通用模式:4种输入模式,2种输出模式(此时GPIO受CM3内核(即:cpu)控制) 复用模式:2种复用输出模式:推挽式复用功能输出模式、开漏复用功能输出模式(在复用模式下,GPIO受STM32片上外设(如:I^2C、UART、TIM、pwm、ADC等)所控制,(此时I/O口输出/输入的信息,都是由片上外设来发送/接收) 一共八种模式 4种输入模式: 1.浮空输入: 浮空输入,就是I/O口在输入模式时,红框中的上/下拉电阻都是断开连接的情况下,stm32外部输入的信号进行读取。注意:VDD为3.3v,VSS为0v。 拓展:这个上/下拉电阻的阻值范围在30k~50k之间。 经过的路径:
[单片机]
<font color='red'>GPIO</font> I/O口——八种工作模式
stm8编程tips(stvd)
编译完成时显示程序占用的flash和ram大小 将附件压缩包中的mapinfo.exe解压到stvd的安装路径stvd中 在工程上点右键选settings 右侧的选项卡选择Linker,将category的下拉框选成output,然后在Generate Map file前打勾 再将选项卡上选择到Post-Build,在下方文本框中新粘贴一行内容mapinfo $(OutputPath)$(TargetSName).map 点OK按键确定,菜单File- save workspace,保存工程 重新编译下,你就能看到flash,ram,eeprom占用字节数了 修改工程选用的MCU Settings- MCU Select
[单片机]
STM8学习笔记---寄存器操作之位或和位与运算
刚开始学习STM8单片机时,看别人的代码,在设置寄存器的时候经常使用,位或、位与、左移、右移等运算,就很不理解,为什么不直接给寄存器赋值,非要搞的这么复杂。直到后来程序写的多了,才明白这样写的好处。比如我们现在要设置PB5口为输出口。首先我们需要设置PB口的方向寄存器PB_DDR。 我们要设置PB5口为输出,那么就要把DDR5位设置为1。那么要设置的寄存器PB_DDR寄存器二进制数据为 0010 0000,转换为16进制为 0x20。设置寄存器的语句为 PB_DDR = 0x20; 这样操作寄存器看起来没什么问题,也挺方便。唯一的问题就是每次要先将设置的二进制数确定好,然后再转换为16进制数,再赋值给寄存器。代码少的时
[单片机]
<font color='red'>STM8</font>学习笔记---寄存器操作之位或和位与运算
IAR环境下ucosii在STM32上的移植
Ucosii移植到STM32上 1.使用的开发环境是IAR 5.4 STM32芯片为STM32F103ZET6 使用ST官方提供的标准固件库,建立工程, 我下载的苦艰苦的版本为STM32F10x_StdPeriph_Lib_V3.5.0,里面的文件分布为: 其中,Libraries文件夹里面放的是标准库文件,Project文件夹里面放的是STM32的各个外设的使用范例和一个工程模板,Utilities文件夹里面放的是ST公司的评估板例子,剩下的文件就是教我们怎样使用标准库,而我们主要使用的就是Libraries和Project里面的文件。 1.1首先新建stm32这个文件夹,在里面再新建3个文件夹include,proj
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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