Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
9 years, 10 months ago.
mbed HRM1017のPortOutの使い方について(再記入)
PortOutでp0からp7をデータバスとして一気に変更しようとしていますが、アクセスを行うと他のポートが勝手に変更されてしまう現象で悩んでします。 使い方、誤り等ご指摘いただけますと幸いです。
以下のソースで動かしています。 内容としまして、
- 1.DigitalOutでp19をHighに設定
- 2.PortOutでp0からp7を一斉に0(ゼロ)設定
- 3.DigitalOutでp19をHighに設定
各操作の後にはpc.printf()を行い3秒空けています。 この状態とp19出力をオシロで観測すると、2.のPortOutを実行した時に、p19がLowになってしまいます。
#include "mbed.h"
#include "BLEDevice.h"
Serial pc(USBTX, USBRX); // tx, rx for DEBUG
I2C i2c0(p22, p20); // sda0, scl0
DigitalOut testout(p19); // TEST out
DigitalOut led(p18); // access LED
DigitalIn sw1(p16); // next SW1
DigitalIn sw2(p17); // next SW2
#define DBUS_MASK 0x000000FF
PortOut dbus(Port0, DBUS_MASK); // data bus
///////////////////////////////////////////////////////////////////////////////
int main(void)
{
testout = 1; // H output p19
pc.printf("p19 = H output.\r\n");
wait(3.0);
dbus = 0x00000000; // Data Bus write 0x00
pc.printf("data = 0x00 output.\r\n");
wait(3.0);
testout = 1; // H output p19
pc.printf("p19 = H output.\r\n");
wait(3.0);
for(;;){
wait(0.5);
}
}
Question relating to:
1 Answer
9 years, 10 months ago.
私もnRF51822(RedBearLab)で同じ症状発生を確認しました。
HRM1017特有の問題ではなく、nRF51822使用のNordicファミリー全体の問題です。
mbed-dev(従来はmbed-srcでしたが、今はmbedソースファイルがこちらで管理されている)を覗いてみると、すぐに問題がわかりました。
/mbed-dev/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/port_api.c
の中で、書き込み時にマスクパターンを利用せずに、引数をポート全体(32Bit)に書き込んでいる単純なミスです。
port_api.c
void port_write(port_t *obj, int value)
{
*obj->reg_out = value;
}
修正は下記のようにすると良いでしょう(というより他のmbedのコードを拝借してきました)。
void port_write(port_t *obj, int value)
{
#if 0 // original
*obj->reg_out = value;
#else // Other mbed's implementation
*obj->reg_out = (*obj->reg_out & ~obj->mask) | (value & obj->mask);
#endif
}
急ぎで修正したいのであれば、
1) mbedライブラリーを削除
2) mbed-devのライブラリーインポート
3) 上記のファイル修正
で動きます(全ての状態を調べていないのでBugfixと呼べるか不明)。