STM8 GPIO入门讲解笔记
- 格式:pdf
- 大小:566.54 KB
- 文档页数:45
STM8学习笔记——时钟和GPIO说起STM8 的时钟,那还真是个杯具,用HSI 没问题,切换到HSE 也没问题,就是切LSI 怎么都不行,然后百思不得其解人,然后上论坛求教,才知道还有个选项字节(OPTION BYTE),数据手册上有这么一段描述:选项字节包括芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的块内。
除了ROP(读出保护)字节,每个选项字节必须被保存两次,一个是通常的格式(OPTx)和一个用来备份的互补格式(NOPTx)要使用内部低速RC 必须将LSI_EN 置1,就是这个地方让我纠结了半天,然后用IAR 将其置1,方法是:进入调试模式,在上面有个ST-LINK,点击,看到OPTION BYTE,左键点进去,右键单击上面的选项,就可更改了,然后全速运行,就写进去了。
STM8 的时钟分为HSI,HSE,LSI,最常用的是HSI,STMS105S4 内置的是16M 的RC,叫fhsi。
它可以分频输出为fhsidiv=fhsi/hsidiv,如果选择其为主时钟源,那么主时钟fmaster=fhsidiv。
CPU 时钟fcpu=fmaster/cpudiv。
可以通过外设时钟门控寄存器CLK_PCKENR1 和CLK_PCKENR2 选择是否与某个外设连接。
好了上个切换内部时钟的源代码,测试通过void CLK_Init(void){ //切换到内部LSI(!!!需要修改选项字节的LSI_EN 为1)CLK_ICKR|=0x08;//开启内部低速RC 震荡while(CLK_ICKR&0x10==0); //LSI 准备就绪CLK_SWR=0xd2; while(CLK_SWCR&0x08==0); //等待目标时钟源就绪CLK_SWCR|=0x02; //CPU 分频设置CLK_CKDIVR=0;//内部RC 输出。
STM8 实战篇
一、参考文档《STM8单片机入门V3.0》安装软件。
建议安装在C盘(默认路径)主要看软件安装和cosmic和STVD的结合使用
二、自己建立C语言工程。
(不使用库文件)
建议先新建文件夹
添加头文件和文件路径
路径在
D:\Program Files\STMicroelectronics\st_toolset\include
Stm8s105k.h中定义了特殊寄存器。
下面开始编写程序
硬件中PE5口有一个LED。
做一个闪烁灯。
在线
使用标准库:
和上面一样建立普通的工程。
从其他以库建立的工程中复制以上文件
其中main 和stm8_interrupt_vector 为替换
添加文件:
继续添加使用模块对应的文件
根据主程序使用的配置来添加响应的东西。
可以建立如下的结构
添加文件为
编译后成功。
当然附件了又demo的程序,大家可以拷贝其中的文件,还可以直接在此文件上写程序。
STM8库函数学习笔记之GPIO【整理者】【提供者】885783【详细说明】STM8库函数学习笔记之GPIOSTM8库函数学习笔记之GPIO作者:BH7KQK日期:2010.12.30相关的函数:void GPIO_DeInit(GPIO_TypeDef* GPIOx);void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDefGPIO_Mode);void GPIO_Write(GPIO_TypeDef* GPIOx, u8 PortVal);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);BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin); void GPIO_ExternalPullUpConfig(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin,FunctionalState NewState);//---------------------------------------------------------------------------------------void GPIO_DeInit(GPIO_TypeDef* GPIOx);这个函数用来恢复指定端口的寄存器ODR、DDR、CR1及CR2到默认值0x00,即无中断功能的浮动输入,无返回值。
STM8l最白菜的入门笔记(2)——gpio篇v\:* {behavior:url(#default#VML);}o\:* {behavior:url(#default#VML);}w\:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}我们先来观察一下例程里是怎么操作 gpio的。
我们打开discover这个例程。
我们看到main刚开始的几句就是gpio初始化。
(因为我曾折腾过STM32,所以多少熟一点,一看到这个,我就知道,事情就在这,所以不会再看太多。
)我们截取其中几句看看。
* USER button init: GPIO set in inputinterrupt active mode */GPIO_Init( BUTTON_GPIO_PORT, USER_GPIO_PIN, GPIO_Mode_In_FL_IT);/* Green led init: GPIO set in output */GPIO_Init( LED_GREEN_PORT, LED_GREEN_PIN, GPIO_Mode_Out_PP_High_Fast);/* Blue led init: GPIO set in output */GPIO_Init( LED_BLUE_PORT, LED_BLUE_PIN, GPIO_Mode_Out_PP_High_Fast);/* Counter enable: GPIO set in output forenable the counter */GPIO_Init( CTN_GPIO_PORT, CTN_CNTEN_GPIO_PIN, GPIO_Mode_Out_OD_HiZ_Slow);/* Wake up counter: for detect end ofcounter GPIO set in input interupt active mode */GPIO_Init( WAKEUP_GPIO_PORT, ICC_WAKEUP_GPIO_PIN,GPIO_Mode_In_FL_IT);注释已经写得很明白了。
STM8S 学习笔记之三(STM8 SysClk)STM8S 系统时钟设置,对于单片机来说是非常重要的,不同的用处必须应用不同的时钟。
举个例子,做AVR 时在高稳定的串口通讯时用的时钟一般是3.6864M,主要是这个算波特率精确。
STM8S 同样重要。
STM8S 时钟源:●1-24MHz高速外部晶体振荡器(HSE) ●最大24MHz 高速外部时钟信号(HSE user-ext) ●16MHz高速内部RC 振荡器(HSI) ●128KHz低速内部RC(LSI) 各个时钟源可单独打开或关闭,从而优化功耗。
对于我这么懒得人一般都是用的内部或者外部晶振。
这个芯片时钟方面很大的一个亮点就是时钟可以自由分频。
在降低功耗方面,如果有特殊需求的时候还是考虑STM8L 系列或者430 的吧,不得不承认术业有专攻。
按照技术手册寄存器功能给寄存器赋值写成一下函数://启动时钟配置void SysClkInit(void) { // CLK_SWR=0xe1; //HSI 为主时钟源CLK_SWR=0xb4; //HSE 为主时钟源CLK_CKDIVR=0x00;//CPU 时钟0 分频,系统时钟0 分频CLK_CSSR=0x01;//时钟安全监测使能CLK_SWCR=0x02;//使能自动时钟切换}首先设置时钟源,也就是时钟是用内部还是外部,如果对时间精度要求不高,用内部也可以。
然后是时钟分频。
这个分频需要设定系统时钟和CPU时钟,这两个时钟,如果对此有特殊要求就得好好斟酌一下了,而我全部不分频。
时钟安全监测还是打开吧,如果用的外部时钟,但是外部时钟突然出现故障的话,单片机会自动启用内部时钟,内部时钟默认为8 分频也就是2M。
然后时钟自动切换,好像这个有没有都可以,去掉能不能使回头再试。
开机初始化,在不调用此函数时CPU 时钟默认开启2M,但是调用此函数后,时钟切换为16M,LED 闪烁速度明显加快、、。
stm8s 开发(二)GPIO 的使用:点亮LED!
通用输入输出口(GPIO)是我们使用单片机最基本的,主要功能:
●端口的各个位可以被单独配置
●可选择的输入模式:浮动输入和带上拉输入
●可选择的输出模式:推挽式输出和开漏输出
●外部中断可以单独使能和关闭
用户手册上描述:
每一个端口都有一个输出数据寄存器(ODR),一个引脚输入寄存器(IDR) 和一个数据方向寄存器(DDR)总是同相关的。
控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。
任何一个I/O引脚可以通过对
DDR,ODR,CR1和CR2寄存器的相应位进行编程来配置。
各种不同配置总结如下:
配置模式DDRCR1CR2配置模式上拉电阻
输入000悬浮输入OFF
010上拉输入ON
001中断悬浮输入OFF
011中断上拉输入ON
输出100开漏输出OFF
110推挽输出
1x1输出(最快速度10MHZ)
xxx真正的开漏输出未采用
这里作为练习控制3个LED,分别是PA1,PA2,PD4,都设置为推挽输出模式。
STM8的IO口的使用STM8s的通用IO口的使用总结1、上拉输入:上拉就是把电位拉高,比如拉到Vcc。
上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!弱强只是上拉电阻的阻值不同,没有什么严格区分。
2、下拉输入:就是把电压拉低,拉到GND。
与上拉原理相似。
3、浮空输入:浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。
由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。
一般实际运用时,引脚不建议悬空,易受干扰。
通俗讲就是让管脚什么都不接,浮空着。
输出的电平为高电平。
4、模拟输入:模拟输入是指传统方式的输入.数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。
5、推挽输出:可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。
高低电平由IC的电源低定。
是属于输出模式,也是输出高低电平。
6、开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).7、复用开漏输出、复用推挽输出:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。
在STM32中选用IO模式,下面是参考网上的总结一下。
(1)浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX(2)带上拉输入_IPU——IO内部上拉电阻输入(3)带下拉输入_IPD——IO内部下拉电阻输入(4)模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。
当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。
STM8学习笔记——初步认识最近项目要求找个便宜又够用的单片机,本来是想选STC 的,但其实STC 也并不便宜,且调试比较麻烦,而且AD 不是很好,所以选择了STM8。
昨天买来了ST-LINK III,拿了一块STM8S105S4,此单片机有16K ROM,2K RAM,1K 的EEPROM,带10bitADC,定时器(ICOCPWM)和SPI I2C UART 通讯接口,看门狗等,封装为LQFP44。
这款单片机的供电分得很细,主电源、IO 口、模拟供电都分开,这样就可以非常灵活的配置,比如模拟供电可以选用5V 以扩大量程;IO 口可以配置位3.3 或5V 以适应一些设备。
上图中VDD/VSS 引脚用于给内部主电压调节器(MVR)和内部低功耗电压(LPVR)调节器供电。
这两个调节器的输出连接在一起,向MCU 的核(CPU,FLASH 和RAM)提供1.8V 电源(V18)。
在低功耗模式下,系统会将供电电源从MVR 自动切换到LPVR 以减少电流消耗。
为稳定MVR,在VCAP 引脚必须连接一个电容。
该电容应该拥有较低的等效串联电阻值(ESR),电容最小的推荐容值为470nF。
ST-LINK III 管脚定义及接法:ST-LINK III LED 灯三种状态含义:常亮:目标板与ST-LINK 在SWIM 模式或者JTAG/SWD 模式下已经通讯初始化。
闪烁:目标板与ST-LINK 正在进行数据交换。
熄灭:目标板与ST-LINK 没有通讯初始化。
开发平台:还是比较习惯用IAR,查了下果然有IAR for STM8,于是下了并和谐,然后随便写了个程序,下载调试,发现出错,更新ST-LINK III 的固件,无果。
难道是IAR 的问题?于是下载官方的STVD,安装后发现也无法下载,提示是。
所用芯片 stm8s105s4开发环境:ST Visual DevelopStm8s的库为V1.1.1CPU频率及所有外设频率/时钟系统复位后,所有外设时钟均处于开的状态。
用户可通过清除CLK_PCKENR1或CLK_PCKENR2中的PCKEN位来关闭相应的外设时钟。
但是在关闭外设的时钟前,用户必须设置相应的位禁用该外设。
为了使能一个外设,用户必须先设置寄存器CLK_PCKENR中对应的PCKEN位,然后设置外设控制寄存器中的外设使能位。
AWU计数器是由独立于fMASTER的内部或外部时钟(LSI或HSE)驱动,因此,即使寄存器的时钟已被关掉,该外设依然可以继续运行。
例如禁用所有外设时钟:CLK_PCKENR1 = 0x00;// close all clks of PeripheralCLK_PCKENR2 = 0x00;开启定时器TIME1定时器时钟:CLK_PCKENR1 |= 0x20; //具体参考STM8S_Reference 59页CPU分频因子:CPU时钟(fCPU)由主时钟(fMASTER)分频而来,分频因子由时钟分频寄存器(CLK_CKDIVR)中的位CPUDIV[2:0]决定。
共7个分频因子可供选择(1至128中,2的幂)。
如图13所示。
fCPU为CPU和窗口看门狗提供时钟。
时钟分频寄存器(CLK_CKDIVR)通用端口GPIO和其他的单片机一样,我是习惯从端口开始学习。
Stm8s105s系列最多有7组I/O端口,A~G,而根据不同的封装可能没有其中的一些,在这里根据具体项目,我选择的是44脚封装的。
使用任何的外设前,我们都要根据需要的将参考手册和数据手册看一边,当然端口也不能另外了。
作为通用的IO口,每一个GPIO端口都有5个对应的寄存器如下表:注意:初始复位时,所有引脚设置为浮空输入。
其中1. Px_ODR是ODR[7:0]:端口输出数据寄存器位;(1)在输出模式下,写入寄存器的数值通过锁存器加到相应的引脚上。
STM8微控制器设计入门(三)GPIOV1.0王志杰2014/7/7版权所有,翻版必究目录1概述 (1)2STM8引脚说明 (2)2.1大电流I/O(HS) (2)2.2I2C接口 (3)2.3复用功能 (3)3未使用的I/O (4)4Option Byte (4)4.1软件操作Option byte (5)4.2读取等待 (7)5I/O保护 (7)5.1I/O电压 (7)5.2ESD保护 (8)5.3编程引脚 (8)1概述GPIO是MCU的通用输入输出端口,是与外界进行数据交换的基本通道。
为适应不同的应用,现代的MCU设计更是赋予了I/O更多的功能。
了解一些I/O内部的一些机制对于硬件工程师来说仍然非常有用。
通过保护设计,可以减少一些风险。
本文对STM8基本的I/O 及一些使用情况进行一些梳理,作为设计时的参考。
下图是STM8的I/O端口结构框图。
图 1 GPIO框图注意:当模拟选择模拟输入时,输出状态被禁止2STM8引脚说明在STM8数据手册中,常用如下的符号和缩写说明I/O端口类型或特性。
在使用I/O或进行设计时要特别注意一些I/O的特性。
图 2 STM8S105xx LQFP48引脚图2.1大电流I/O(HS)标注(HS)的I/O是高吸收电流或大电流灌入。
从数据手册上看,电流值最大为20mA。
并不是每个I/O都是HS引脚。
选择HS驱动一些电流较大的器件。
表 1 STM8S105xx绝对最大额定值电流特性2.2I2C接口在引脚图上标注(T)是真正的开漏输出。
STM8中I2C多为开漏输出。
若不使用I2C接口功能时,作为普通I/O口使用时,此引脚需要接上拉电阻。
如下图所示。
2.3复用功能标注[ ]复用功能重映射选项(如果相同的复用功能显示两次,用户也只能选择其中的一个,并不是其中一个是另一个的备份)。
3未使用的I/O在设计中,STM8的部分管脚可能会不用,对于这些剩余未用的管脚,好多人都会置之不理。
STM8的C语言编程(3)―― GPIO输出和输入今天要进行的实验,是利用GPIO进行输入和输出。
在ST的三合一开发板上,按键接在GPIO的PD7上,LED接在GPIO的PD3上,因此我们要将GPIO的PD7初始化成输入,PD3初始化成输出。
关于GPIO的引脚设置,主要是要初始化方向寄存器DDR,控制寄存器1(CR 1)和控制寄存器2(CR2),寄存器的每一位对应GPIO的每一个引脚。
具体的设置功能定义如下:DDR CR1 CR2 引脚设置0 0 0 悬浮输入0 0 1 上拉输入0 1 0 中断悬浮输入0 1 1 中断上拉输入1 0 0 开漏输出1 1 0 推挽输出1 X 1 输出(最快速度为10MHZ)另外,输出引脚对应的寄存器为ODR,输入引脚对应的寄存器为IDR。
下面的程序是检测按键的状态,当按键按下时,点亮LED,当按键抬起时,熄灭LED。
同样也是利用ST的开发工具,先生成一个C语言程序的框架,然后修改其中的main.c,修改后的代码如下。
编译通过后,下载到开发板,运行程序,按下按键,LED就点亮,抬起按键,L ED就熄灭了。
另外,要注意,将STM8S207C_S.h拷贝到当前项目的目录下。
// 程序描述:检测开发板上的按键,若按下,则点亮LED,若抬起,则熄灭LE D// 按键接在MCU的GPIO的PD7上// LED接在MCU的GPIO的PD3上#include "STM8S207C_S.h"main(){PD_DDR = 0x08;PD_CR1 = 0x08; // 将PD3设置成推挽输出PD_CR2 = 0x00;while(1) // 进入无限循环{if((PD_IDR & 0x80) == 0x80) // 读入PD7的引脚信号{PD_ODR = PD_ODR & 0xF7; // 如果PD7为1,则将PD3的输出设置成0,熄灭LED}else{PD_ODR = PD_ODR | 0x08; // 否则,将PD3的输出设置成1,点亮L ED}}}。
STM8L探索套件学习笔记-GPIO端口操作(一)STM8 与STM32 一样提供了固件库函数,方便用户快速开发,不需要花费很多时间去查寄存器。
不过没有STM32 的库完善,给的说明文档是chm 格式的,名字是stm8l15x_stdperiph_lib_um.chm,这个官网有下载,今天按照官方给的模板自己做个模板文件夹,方便后期的移植,这样就不要再重复设置了。
首先我们看看GPIO 模块,在用固件库之前先了解下GPIO 里面的大体的寄存器,方便后期使用固件库。
缺点是你所以输入的参数都会检测是否符合规范,必须得按照库函数里面定义的参数写。
GPIO 寄存器有:输出寄存器(ODR),输入寄存器(IDR),方向寄存器(DDR),控制寄存器1(CR1)和控制寄存器2(CR2).后面三个寄存器组和可以配置为8 种GPIO 的模式,如下图:而固件库函数给出了8 中模式,在上面的基础上加入了输出高/输出低电平的状态。
GPIO_Mode_In_FL_No_IT 浮空输入无中断Input floating, no external interruptGPIO_Mode_In_PU_No_I 上拉输入无中断Input pull-up, no external interruptGPIO_Mode_In_FL_IT 浮空输入有中断Input floating, external interruptGPIO_Mode_In_PU_IT 上拉输入有中断Input pull-up, external interruptGPIO_Mode_Out_OD_Low_Fast 开漏-输出低-高速Output open-drain, low level, 10MHzGPIO_Mode_Out_PP_Low_Fast 推挽-输出低-高速Output push- pull, low level, 10MHzGPIO_Mode_Out_OD_Low_Slow 开漏-输出低-低速Output open-drain, low level, 2MHzGPIO_Mode_Out_PP_Low_Slow 推挽-输出低-低速Output push-pull, low level, 2MHzGPIO_Mode_Out_OD_HiZ_Fast 开漏-输出高阻- 高速Output open-drain, high-impedance level, 10MHzGPIO_Mode_Out_PP_High_Fast 推挽-输出高-高速Output push-pull, high level, 10MHzGPIO_Mode_Out_OD_HiZ_Slow 开漏-输出高阻-低速Output open-。
STM8l最白菜的入门笔记(2)——gpio篇v\:* {behavior:url(#default#VML);}o\:* {behavior:url(#default#VML);}w\:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}我们先来观察一下例程里是怎么操作 gpio的。
我们打开discover这个例程。
我们看到main刚开始的几句就是gpio初始化。
(因为我曾折腾过STM32,所以多少熟一点,一看到这个,我就知道,事情就在这,所以不会再看太多。
)我们截取其中几句看看。
* USER button init: GPIO set in inputinterrupt active mode */GPIO_Init( BUTTON_GPIO_PORT, USER_GPIO_PIN, GPIO_Mode_In_FL_IT);/* Green led init: GPIO set in output */GPIO_Init( LED_GREEN_PORT, LED_GREEN_PIN, GPIO_Mode_Out_PP_High_Fast);/* Blue led init: GPIO set in output */GPIO_Init( LED_BLUE_PORT, LED_BLUE_PIN, GPIO_Mode_Out_PP_High_Fast);/* Counter enable: GPIO set in output forenable the counter */GPIO_Init( CTN_GPIO_PORT, CTN_CNTEN_GPIO_PIN, GPIO_Mode_Out_OD_HiZ_Slow);/* Wake up counter: for detect end ofcounter GPIO set in input interupt active mode */GPIO_Init( WAKEUP_GPIO_PORT, ICC_WAKEUP_GPIO_PIN,GPIO_Mode_In_FL_IT);注释已经写得很明白了。
玩过430或者stm32的童鞋应该多少都知道,这些比较新款的单片机,跟以前的51不太一样,那就是外部中断源贼多,而且是跟着gpio走的。
坦白说,现在回想起来,其实51的外部中断也是跟着io口走的,想起来了吗?INT0和INT1就是P3.0和P3.1,只不过它少一点而已。
但鉴于我们现在是要入门,所以,我们先不管中断——说起来,玩这个还真费了我不少劲,不过说起来已经不错了,哈哈,那时候STM32还不会定时中断呢(当然,现在也没弄定时,但既然外部中断都会了,想来也差不多吧~~~)所以,我们的目标先设得简单一点:我们只要实现基本的gpio读写功能,读用来读按键,写用来点亮LED。
右键就可以点开相关函数的定义位置(这里说一下,所谓定义,对函数来说,就是函数实现,与函数声明区分,在讨论程序时,我提到实现,大多是指的都是这个意义上的实现,而不再是一般说的那个实现的意思。
)void GPIO_Init(GPIO_TypeDef* GPIOx,uint8_t GPIO_Pin,GPIO_Mode_TypeDef GPIO_Mode)没事,我们不会去看源码。
我们只要看函数接口。
一个是gpio的port口,一个是gpio的pin数,一个是gpio的配置模式。
对单片机比较熟悉的朋友基本不用多说,这里还是简单说一下,在单片机里,io口都是按组划分。
比如说,最常见的8位机一组8个,然后可能有4到6组。
当然也有16位机的16个一组,让我有点奇怪的是STM32是32位ARM,一组却也只有16个。
更有甚者,比如我玩的一个32位系统,居然只有8个一组,看来这个跟位数没必然关系。
说了这么多,我们来看看我们这个stm8l-discover开发套件上的gpio口情况。
用不着看pdf,从开发板引出的管脚就知道。
它总共有41个io口,共分6组,五组8个,最后一组1个,它以A~F按顺序命名。
分别是GPIOA~GPIOF.这就是我们的port然后每组分8位,这就是我们的pin。
好了,现在我们搞清楚数目上的状况了。
我们再看第三个参数,IO口类型。
我们可以通过查看gpio.h这个头文件获取相关的信息。
看的时候不妨多看一些我们曾见到的熟面孔,这样会加快熟悉对与其相关的宏和操作函数的了解程度。
比如说,首先我们看到的就是io口类型typedef enum{GPIO_Mode_In_FL_No_IT =(uint8_t)0x00, /*!< Input floating, no external interrupt */GPIO_Mode_In_PU_No_IT = (uint8_t)0x40, /*!< Input pull-up, no external interrupt */GPIO_Mode_In_FL_IT =(uint8_t)0x20, /*!< Input floating, external interrupt */GPIO_Mode_In_PU_IT =(uint8_t)0x60, /*!< Input pull-up, external interrupt */GPIO_Mode_Out_OD_Low_Fast = (uint8_t)0xA0, /*!< Outputopen-drain, low level, 10MHz */GPIO_Mode_Out_PP_Low_Fast = (uint8_t)0xE0, /*!< Outputpush-pull, low level, 10MHz */GPIO_Mode_Out_OD_Low_Slow = (uint8_t)0x80, /*!< Outputopen-drain, low level, 2MHz */GPIO_Mode_Out_PP_Low_Slow =(uint8_t)0xC0, /*!< Outputpush-pull, low level, 2MHz */GPIO_Mode_Out_OD_HiZ_Fast =(uint8_t)0xB0, /*!< Outputopen-drain, high-impedance level, 10MHz */GPIO_Mode_Out_PP_High_Fast = (uint8_t)0xF0, /*!< Output push-pull, high level, 10MHz*/GPIO_Mode_Out_OD_HiZ_Slow =(uint8_t)0x90, /*!< Output open-drain,high-impedance level, 2MHz */GPIO_Mode_Out_PP_High_Slow = (uint8_t)0xD0 /*!< Output push-pull, high level, 2MHz*/}GPIO_Mode_TypeDef;这是个结构体,如果你熟悉,光看名字就猜到了,如果你不熟悉,看看英文注释也差不多了,当然,假如你对电路的了解不深,那可能不知其所然。
而对我来说,尽管我了解这些都是什么玩意,但是对于部分模式,我并不了解它的作用和意义。
于是我另外花了一些时间,去找这方面的的信息看,最后找到一份周立功的文档,感觉相当不错,比起那些坑爹的强太多了——说的都是废话。
基本就是把STC那种乱七八糟的pdf里的内容半通不通地翻译成中文而已。
没有任何解释。
具体的文档可以上百度搜索,我记得我是请朋友帮我在百度文库里下的,刚找了找,没找着,下次看看补上链接什么的。
下面是简单总结:基本输入电路基本IO输入电路施密特触发输入电路弱上拉输入电路基本IO输入,三态缓冲器,只在读取时,外部状态会反映到内部总线上,其余时刻不影响内部电路。
读取时,CPU发出一个外部选通信号施密特输入电路对外部输入脉冲进行整形,它可以去除某种程度的抖动。
带外部弱上拉的输入电路弱上拉的好处是对外部干扰信号有较好的抵抗能力,但输入阻抗显著降低。
而悬空态的输入电路,对于干扰信号抵抗能力较差。
至于输出,实际上只有两种:1 开漏输出2 内部上拉输出。
对这两个我简单解释一下,开漏和开集电极是很接近的。
这里的漏说的是场效应管的漏极,它在功能上类似于三极管的集电极。
英文称之为 open drain 和 open collection,也就是别人总是神侃的OD门和OC门。
它就是少了一个上拉电阻,我个人认为它的最大意义有两个:1 第一,它不怕外部IO短路,可以起相当的保护作用。
2 它适合不同电平之间的匹配,比如常见的5V系统和3.3V系统。
但它的缺陷却是,输出的电平是不定的。
也就是高不一定能高到电源电压,低不能低到地的零电平。
而外部上拉,它则可以保证输出永远是稳定的高或者低电平,但是,很显然它遇到IO短路,会有烧毁IO口的危险。
关于这一部分,其实我并没说的很明白,这其中的内容,咱们有需要再多找资料看吧,嘿嘿,我懂的也就这么多了。
我们这里普普通通,只用外部上拉输入和外部上拉输入输出。
接着看一下这个不是很长的头文件。
typedef enum{GPIO_Pin_0 =((uint8_t)0x01), /*!< Pin 0 selected */GPIO_Pin_1 =((uint8_t)0x02), /*!< Pin 1 selected */GPIO_Pin_2 =((uint8_t)0x04), /*!< Pin 2 selected */GPIO_Pin_3 =((uint8_t)0x08), /*!< Pin 3 selected */GPIO_Pin_4 =((uint8_t)0x10), /*!< Pin 4 selected */GPIO_Pin_5 =((uint8_t)0x20), /*!< Pin 5 selected */GPIO_Pin_6 =((uint8_t)0x40), /*!< Pin 6 selected */GPIO_Pin_7 =((uint8_t)0x80), /*!< Pin 7 selected */GPIO_Pin_LNib = ((uint8_t)0x0F), /*!< Low nibble pins selected */GPIO_Pin_HNib = ((uint8_t)0xF0), /*!< High nibble pins selected */GPIO_Pin_All =((uint8_t)0xFF) /*!< All pins selected */}GPIO_Pin_TypeDef;首先是这个结构体,注意观察,从0到7很有规律的是十六进制的 01到80,显然这是位操作模式。