[原创] STM32L476RG Nuleo 评测四 开始MBED IO口输入输出

damiaa   2015-10-21 16:21 楼主
STM32L476RG Nuleo 评测四 开始MBED IO mbed的数字输入输出

GPIO是英文General Purpose Input Output(通用输入/输出)的输出.

mbed数字输入输出API

在mbed中,一共有三个类和数字输入输出相关,分别是DigitalIn(数字管脚输入类)、DigitalOut(数字管脚输出类)、DigitalInOut(数字管脚输入输出类),各个类的公用方法描述如下:

类名
方法
用途
DigitalIn
DigitalIn(PinName pin)
构造函数,设定pin为数字输入管脚
int read()
读取管脚值
void mode(PinMode pull)
设定管脚的工作模式,可以是PullUp(上拉), PullDown(下拉), PullNone(无), OpenDrain(开漏输出)等状态
operator int()
读取管脚值的简写方式
DigitalOut
DigitalOut(PinName pin)
构造函数,设定pin为数字输出管脚
void write(int value)
设定管脚值
int read()
读取管脚值
DigitalOut& operator= (int value)
操作符重载,相当于设定管脚值
DigitalOut& operator= (DigitalOut& rhs)
操作符重载,相当于设定管脚值为另一管脚的值
operator int()
读取管脚值的简写方式
DigitalInOut
DigitalInOut(PinName pin)
构造函数,设定pin为数字输入输出管脚
void write(int value)
设定管脚值
int read()
读取管脚值
output()
把管脚设成输出状态
void input()
把管脚设成输入状态
void mode(PinMode pull)
设定管脚的工作模式,可以是PullUp(上拉), PullDown(下拉), PullNone(无), OpenDrain(开漏输出)等状态
DigitalOut& operator= (int value)
操作符重载,相当于设定管脚值
DigitalOut& operator= (DigitalOut& rhs)
操作符重载,相当于设定管脚值为另一管脚的值

在上面的方法中,比较难以理解的就是操作符重载,如下面的代码片断,其中的led1=1就相当于led1.write(1),而led2=led1就相当于led2.write(led1.read())。

DigitalOut led1(LED1);

DigitalOut led2(LED2);

led1=1;

led2=led1;

那么具体的管脚名称,如这里的LED1,LED2是在哪里定义的呢?一般来说,mbed的管脚定义会出现在hal目录对应MCU下的PinNames.h,所有的管脚名称都被定义成枚举常量,其中的有些是管脚的实际名称,有些是别名。

typedefenum {

// LPC Pin Names

P0_0 = LPC_GPIO0_BASE,

P0_1, P0_2, P0_3, P0_4, P0_5, P0_6, P0_7, P0_8, P0_9, P0_10,

P0_11, P0_12, P0_13, P0_14, P0_15, P0_16, P0_17, P0_18, P0_19,

P0_20, P0_21, P0_22, P0_23, P0_24, P0_25, P0_26, P0_27, P0_28,

P0_29, P0_30, P0_31,

……

// mbed DIP Pin Names

p5 = P0_9,

p6 = P0_8,

p7 = P0_7,

p8 = P0_6,

p9 = P0_0,

……

// Not connected

NC = (int)0xFFFFFFFF

} PinName;

mbed数字输入输出初步应用

DigitalOut led1(LED1);

DigitalOut led2(LED2);

DigitalIn btn(P2_8);

int main()

{

led1=0;

led2=0;

while (1)

{

led1=!btn;

}

}

while (1)

{

if (btn==0 )

{

wait_ms(1000);

if (btn==0 )

{

led1=!led1;

while (btn==0);

}

}

}

mbed的模拟输入输出
在mbed中,用AnalogIn表示ADC模拟输入,AnalogOut表示DAC模拟输出,主要API描述如下:
类名
方法
用途
AnalogIn
AnalogIn(PinName pin)
构造函数,把pin设定成模拟输入
float read()
读取ADC采样值,返回的是0-1之间的小数,即0代表0V,1代表3.3V
unsigned short read_u16()
读取ADC采样值,返回的是整数,,范围在0到65535之间
operator float()
操作符重载,相当于float read()
AnalogOut
AnalogOut(PinName pin)
构造函数,把pin设定成模拟输出
void write(float value)
设定DAC的输出值,范围为0-1之间的小数,即0代表0V,1代表3.3V
void write_u16(unsigned short value)
设定DAC的输出值,范围为0到65535之间
float read()
返回刚才DAC的0到1的输出值
AnalogOut& operator= (float percent)
操作符重载,相当于float read()
AnalogOut& operator= (AnalogOut& rhs)
操作符重载,相当于float read()
mbed模拟输入输出初步应用
AnalogIn light(p20);
DigitalOut led1(LED1);
float lvf=0;
ushort lvu=0;
int main()
{
while(1)
{
lvf=(float)light;
lvu=light.read_u16();
printf("light adc count is %f , %d \n",lvf,lvu);
wait(2);
if (lvf<0.7)
led1=1;
else
led1=0;
}
}
DAC模拟输出:
AnalogOut led(p18);
float ledvalue=1.0;
int main()
{
while (1)
{
while(1)
{
led.write(ledvalue);
wait (2);
ledvalue=ledvalue-0.1;
if (ledvalue<0.1)
break;
}
}
}
当然,我们也可以直接将DAC输出与ADC输入相连,再通过串口输出查看DAC和ADC的效果,我们只需要把p18,p19相连即可,相应的代码如下:
AnalogOut ao(p18);
AnalogIn ai(p19);
float aoValue=0;
float aiValue=0;
int main()
{
while (1)
{
while(1)
{
aoValue=aoValue+0.01;
ao.write(aoValue);
aiValue=ai.read();
wait (0.5);
printf("Aout is %f ,A in is %f, adc value is %f \n",aoValue, aiValue, aiValue*3.3);
}
}
}
printf到串口的数据我们可以看到运行的结果。
进一步了接IO的事情我们可以到MBED开发网站看文档资料或者直接到库的源代码里面看定义。
QQ图片20151021162714.jpg
AnalogIn.h
AnalogOut.h
DigitalIn.h
DigitalOut.h
DigitalInOut.h
本帖最后由 damiaa 于 2015-10-21 16:26 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复