TA的每日心情 | 奋斗 2020-5-27 15:41 |
---|
签到天数: 868 天 连续签到: 1 天 [LV.10]以坛为家III
|
本帖最后由 wambob 于 2016-12-29 18:56 编辑
Fireduino 的API和Arduino兼容。
Fireduino 维基上介绍了三个:打开wirish_digital.c这个文件,除了和Arduino的兼容文件名称相同外,函数实现不同,还有各自的其它函数。在Arduino中,让led BLINK使用了digitalWrite();
在学习Cortex-m3的核的MCU时,曾经使用过togglePin()这样的函数来对I/O口输出翻转 ,加上延迟也可以实现led BLINK。
Fireduino 使用了digitalWrite()实现了togglePin()。- void togglePin(unsigned char pin)
- {
- if (digitalRead(pin))
- digitalWrite(pin,0);
- else
- digitalWrite(pin,1);
- }
复制代码 看到这也许回想到,能不能在Arduino也添加这样的函数呢?
先写段码验证下togglePin()吧- void setup() {
- // put your setup code here, to run once:
- pinMode(13,OUTPUT);
- }
- void loop() {
- // put your main code here, to run repeatedly:
- togglePin(13);
- delay(500);
- }
复制代码 编译上传。可见绿灯闪了起来。
再来细看数字脚的源文件。开头三个头文件。- #include "io.h"
- #include "ard_gpio.h"
- #include "wiring.h"
复制代码 其中io.h中枚举了管脚的模式宏定义了两个常量。其它的就是I/O驱动函数了。
OUTPUT ------输出模式
INPUT ------输入模式
INPUT_PULLUP ------上拉输入模式
INPUT_PULLDOWN ------下拉输入模式- #define HIGH 0x1
- #define LOW 0x0
复制代码 第二个头文件只给了一些接口函数、宏定义和中断枚举模式。- #define BUTTON_DEBOUNCE_DELAY 1
- #define BOARD_BUTTON_PIN 2
- #define PIN_MAX 30
- enum int_tri_mode
- {
- T_LOW = 0,
- T_HIGH,
- T_RISE,
- T_FALL,
- };
- extern void ard_pin_mode(unsigned char pin, WiringPinMode mode);
- extern uint32_t ard_gpio_read(unsigned char pin);
- extern void ard_gpio_write(unsigned char pin, unsigned char val);
- extern void ard_gpio_int_enable(uint32_t pin,void (*callback)(void),enum int_tri_mode mode);
- extern void ard_gpio_int_disable(uint32_t pin);
- extern void interrupts(void);
- extern void noInterrupts(void);
- unsigned int _get_port(unsigned int pin);
- unsigned int _get_mask(unsigned int pin);
- unsigned int* _get_dr(unsigned int port);
- unsigned int* _get_ind(unsigned int port);
- unsigned int* _get_ddr(unsigned int port);
复制代码 这个是MCU驱动的接口函数。
第三个头文件里是延时函数的声明。
先分析下pinMode();- void pinMode(unsigned char pin, WiringPinMode mode)
- {
- ard_pin_mode(pin,mode);
- }
复制代码 里面是个封装的函数。到这似乎没路了,打开官方的手册
驱动MCU因该是下面几个函数。- unsigned int _get_port(unsigned int pin);
- unsigned int _get_mask(unsigned int pin);
- unsigned int* _get_dr(unsigned int port);
- unsigned int* _get_ind(unsigned int port);
- unsigned int* _get_ddr(unsigned int port);
复制代码 第一个是获得外部引脚所在的端口;
第二个是外部引脚在寄存器的的mask位;
第三个是获得端口的数据输出寄存器地址
第四个是获得端口的数据输入寄存器地址
第五个是获得端口的数据方向寄存器的地址
在Arduino.h中可以看- #define digitalPinToPort(P) ( _get_port(P))
- #define digitalPinToBitMask(P) ( _get_mask(P) )
- #define portOutputRegister(port) ( _get_dr(port) )
- #define portInputRegister(port) ( _get_ind(port) )
- #define portDirectRegister(port) ( _get_ddr(port) )
复制代码 数据寄存器
数据方向寄存器
下面就验证下,板上有两个灯,用3的LED验证下- unsigned int Port,Bit;
- void setup() {
- // put your setup code here, to run once:
- //pinMode(13,OUTPUT);
- Port =_get_port(3); //3所在的端口
- Bit =_get_mask(3); //3的mask位
- *_get_ddr(Port) |= Bit; //设置方向为输出
- }
- void loop() {
- // put your main code here, to run repeatedly:
- //togglePin(13);
- *_get_dr(Port) |=Bit; //写3所在的数据寄存器的位为 1
- delay(500);
- *_get_dr(Port) &=~Bit; //写3所在的数据寄存器的位为0
- delay(500);
- }
复制代码 编译上传,OK,蓝灯亮了。和使用接口函数一样的效果。
|
评分
-
查看全部评分
|