你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 2480|回复: 10

转发:ARM®mbed OS入门开发(三 A)GPIO

[复制链接]

61

主题

1071

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2016-10-10 08:36:02 | 显示全部楼层 |阅读模式
本帖最后由 anywill 于 2016-10-12 12:01 编辑

ARM®mbed OS入门开发(三)2016-09-14 Summerain [url=]小白学嵌入式[/url]
【管脚定义】
上一期介绍了简单的数字输入输出,我们知道了mbed API对底层的高度封装。程序开发者想要知道可以使用哪些管脚,例如上一期的Blinky例子中Pin名称LED1的使用,可以查看mbed.org对这款开发板的Nucleo features的介绍,也可以在mbed library目录下targets/hal/对应开发板下面的PinNames.h的头文件下查看:
typedef enum {
    ... ... ...
    // Arduino connector namings
    ... ... ...
    // Generic signals namings
    LED1        = PA_5,
    LED2        = PA_5,
    LED3        = PA_5,
    LED4        = PA_5,
    USER_BUTTON = PC_13,
    SERIAL_TX   = PA_2,
    SERIAL_RX   = PA_3,
    USBTX       = PA_2,
    USBRX       = PA_3,
    I2C_SCL     = PB_8,
    I2C_SDA     = PB_9,
    SPI_MOSI    = PA_7,
    SPI_MISO    = PA_6,
    SPI_SCK     = PA_5,
    SPI_CS      = PB_6,
    PWM_OUT     = PB_3,
    // Not connected
    NC = (int)0xFFFFFFFF
} PinName;
可以看到LED1,LED2,LED3,LED4其实都是同一个管脚PA_5,所以使用任何一个名称均是对PA_5进行操作。

】Analog Input and Output
由于手头没有电位器(可变电阻器)调节输入电压,没有示波器观察输出波形,这部分就只有理论学习。
1. ADC: Analog ---> Digital
即:Voltage  ---> Binary Output
对于输入电压范围0~3.3V, 12-bit的ADC,其精度为3.3/(2^12), 约0.8mV。那么最坏情况下的量化误差为0.4mV。采样频率:Nyquist
AnalogIn API:
AnalogIn(PinName pin);
//构造函数,指定作为模拟输入的pin口
float read();
//读取输入电压,返回0.0~1.0之间的float值,其中,0代表0V,1代表3.3V
unsigned short read_u16();
//返回unsigned short in the range [0x0, 0xFFFF],范围在0到65535之间
例:
AnalogIn analog_value(A0);
float meas;
meas = analog_value;//等同于meas=analog_value.read();
2. DAC: Digital--->Analog
AnalogOut API:
AnalogOut(PinName pin);
void write(float value);
//写入 [0.0, 1.0] 范围之间的值,按照百分比设置输出电压,0.25对应输出电压值为0.25×3.3V
void write_u16(unsigned short value);//unsigned short in the range [0x0, 0xFFFF]

】Pulse width modulation(PWM)脉宽调制
1. 设置PWM周期period,决定PWM波形的频率。
2. 设置PWM波形的占空比duty-cycle,从而调平均电压。
duty_cycle=100% * (pulse on time) / (pulse period)
PWM API:
PwmOut(PinName pin);
//把管脚pin设成PwmOut输出管脚
void write(float value);
//设置输出 duty-cycle,范围在0到1之间,0表示在一个时钟周期内全部都是低电平,1表示全部都是高电平
float read();
void period(float seconds);
//设置PWM period,即时钟周期,单位秒
void period_ms(int ms);
void period_us(int us);
void pulsewidth(float seconds);
//设定PWM输出的脉宽,相当于设定PWM的输出值,假设时钟周期period是10ms,脉宽是5ms,那就相当于输出占空比(duty-cycle)为0.5,这里的单位是秒
void pulsewidth_ms(int ms);
void pulsewidth_us(int us);
请看下面的例子:
#include "mbed.h"
PwmOut PWM1(LED1);  //创建PWM1对LED1端口调制
int main() {
PWM1.period(0.010);
// PWM period = 10 ms 即输出频率为100Hz pulse;
PWM1=0.5;
// duty cycle= 50%,相当于平均电压为3.3×0.5V(或者是理论上的LED1=0.5);
}

GPIO Interrupt
学过微机原理的同学都知道,可以通过查询和中断方式传送数据和处理事件。而查询方式传送数据占用CPU大量时间,所以中断方式判断引脚状态处理事件效率较高。GPIO中断是微处理器中断系统中最简单最常用的中断类型,它可以让用户在某个管脚状态发生特定的变化(边沿触发)时执行相应的代码。需要注意的是,并不是所有的GPIO管脚都具备中断处理能力。
GPIO Interrupt API:
InterruptIn(PinName pin);
//把pin管脚设成中断处理管脚
int read();
//读取管脚的当前状态
void rise(void (*fptr)(void));
//上升沿触发 InterruptFunction
void fall(void (*fptr)(void));
//下降沿触发InterruptFunction
void mode(PinMode pull);
//设置管脚模式,上升沿设置为 Pulldown, 下降沿 PullUp
__disable_irq();//禁止所有可屏蔽中断;
__enable_irq();//允许所有未屏蔽中断;
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority):
//设置中断的优先级,IRQn表示需要设置的中断号,后面表示优先级,数字越小表示优先级越高。

下面是实例:
#include "mbed.h"
Serial pc(USBTX,USBRX);
InterruptIn btn(USER_BUTTON);
Timer mytimer;
int falltime;
int risetime;
void fallfunc()
{
    falltime=mytimer.read_us();
}
void risefunc()
{
    risetime=mytimer.read_us();
    pc.printf("You press button for %d us \n",risetime-falltime);
}
int main() {
    mytimer.start();
    btn.fall(&fallfunc);
    //按键上升沿读取当前时间
    btn.rise(&risefunc);
    //下降沿再次读取当前时间并输出时间间隔
    while (1);
}
Tip: 使用GPIO中断的时候要确认pin端口默认接上拉电阻还是下拉电阻,如果是上拉电阻,那么默认就是高电平,此时则选择下降沿触发。反之则使用上升沿触发。



<
回复

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-10-10 09:07:23 | 显示全部楼层
顶一下,,,,,,
回复 支持 反对

使用道具 举报

31

主题

1951

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-12-4
发表于 2016-10-10 09:32:31 | 显示全部楼层
回复 支持 反对

使用道具 举报

26

主题

1984

回帖

6

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2016-10-10 09:42:06 | 显示全部楼层
很不错的帖子,感谢分享。
回复 支持 反对

使用道具 举报

0

主题

159

回帖

0

蝴蝶豆

高级会员

最后登录
2017-3-9
发表于 2016-10-10 10:54:52 | 显示全部楼层
不错的教程
回复 支持 反对

使用道具 举报

23

主题

588

回帖

0

蝴蝶豆

高级会员

最后登录
2018-4-11
发表于 2016-10-23 00:16:14 | 显示全部楼层
很好的东西!!!!
回复 支持 反对

使用道具 举报

0

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
2018-9-15
发表于 2018-9-15 16:05:07 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2020-1-28
发表于 2019-5-13 11:21:40 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

0

主题

107

回帖

0

蝴蝶豆

高级会员

最后登录
2020-8-24
发表于 2019-5-14 10:18:55 | 显示全部楼层

谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
2019-5-25
发表于 2019-5-18 11:44:19 | 显示全部楼层
楼主请问mbed 通过什么确定按键按钮是否按下
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版