#define _BAUDRATE 115200後はボーレートを好きな値にすれば良い筈だが、ボーレートジェネレータがインテリジェンスなのは分かるが1Mbps以下でしか誤差率を吸収してくれないし、Chip_Clock_SetUSARTNBaseClockRate に指定しているボーレートに対する *16 なんてデータシートまともに読まないと怪しい倍数にしか思えない。
Chip_UART_Enable (LPC_USART0);
Chip_UART_ConfigData (LPC_USART0,
UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1 | UART_CFG_OETA | UART_CFG_OESEL | UART_CFG_OEPOL);
Chip_Clock_SetUSARTNBaseClockRate (_BAUDRATE * 16, true);
Chip_UART_SetBaud (LPC_USART0, _BAUDRATE);
Chip_Clock_SetupSystemPLL(7, 0);てな感じにすればオーバー気味だが fclkout=96MHz, sysclk=32MHz になる。
Chip_Clock_SetSysClockDiv(3);
Chip_Clock_SetUSARTNBaseClockRate ((2000000 * 8), true);としておけば良いかな。ボーレートは
LPC_USART0->OSR = 7;
uint32_t setbaudrate (uint32_ baudrate) {で決めてみてはどうでしょう。今回はOSRをデフォルトの16から8にしたが、この辺は必要に応じて変えればOK。
LPC_USART0->BRG = (Chip_Clock_GetUSARTNBaseClockRate () / (8 * baudrate)) - 1;
return (Chip_Clock_GetUSARTNBaseClockRate () / (_OSR * (LPC_USART0->BRG + 1)));
}
Name | Output | Dimension(mm) | Weight(g) | Price |
DYNAMIXEL PRO H54-200-S500-R | 200W | 54x54x126 | 855 | ¥301,320 |
DYNAMIXEL PRO H54-100-S500-R | 100W | 54x54x108 | 732 | ¥279,720 |
DYNAMIXEL PRO H42-20-S300-R | 20W | 42x42x84 | 340 | ¥160,920 |
DYNAMIXEL PRO M54-60-S250-R | 60W | 54x54x126 | 853 | ¥182,520 |
DYNAMIXEL PRO M54-40-S250-R | 40W | 54x54x108 | 710 | ¥171,720 |
DYNAMIXEL PRO M42-10-S260-R | 10W | 42x42x72 | 269 | ¥85,320 |
DYNAMIXEL PRO L54-50-S500-R | 50W | 54x54x108 | 662 | ¥106,920 |
DYNAMIXEL PRO L54-50-S290-R | 50W | 54x54x108 | 656 | ¥106,920 |
DYNAMIXEL PRO L54-30-S500-R | 30W | 54x54x108 | 612 | ¥96,120 |
DYNAMIXEL PRO L54-30-S400-R | 30W | 54x54x108 | 591 | ¥96,120 |
DYNAMIXEL PRO L42-10-S300-R | 10W | 42x42x72 | 257 | ¥63,720 |
#include <stdio.h>DXLIBを使っていますので、コンパイルにはGCC Developer Liteを使用したコンパイルの方法を参考にしてください。
#include <conio.h>
#include "dxlib.h"
#define OFFSETTIME (50) // タイムアウトオフセット[ms]
void main (void) {
TDeviceID dev;
char inputcomport[10], mycomport[20]="\\\\.\\";
int bdiv=-1, baud, i, yn;
uint16_t val16;
uint8_t val8;
printf ("input com name=");
gets (inputcomport);
printf ("use [%s]\n",inputcomport);
strcat (mycomport, inputcomport);
if ((dev = DX_OpenPort (mycomport, 3000000))) {
DX_SetTimeOutOffset (dev, OFFSETTIME);
printf ("Open success\n");
for (bdiv=-1;bdiv<250;bdiv++) {
// ボーレートの変更
if (bdiv >= 0) DX_SetBaudrate (dev, (baud=2000000 / (bdiv + 1)));
else DX_SetBaudrate (dev, (baud=3000000));
printf("\rbaud=%7d ",baud);
uint32_t num = 253;
TDxAlarmStatus stat[255];
// Ping2で検索
if (DX_Ping2 (dev, &num, stat, NULL)) {
printf ("%d device found\n", num);
// 検索で見つかったデバイスを列挙
for (i = 0; i < num; i++) {
// アドレス16(Status Return Level)を読み出し
if (DX_ReadWordData (dev, stat[i].id, 0, &val16, NULL)) {
printf ("Found ID=%d stat:$%04X modelno:$%04X\n", stat[i].id, stat[i].Status, val16);
} else {
// 読み出しに失敗したらおそらくStatus Return Levelが0だろう
printf ("Found ID=%d stat:$%04X modelno:???? \n", stat[i].id, stat[i].Status);
printf ("Do you want to reset Status Return Level ? (y/n)->");
yn = getch ();
putch( yn);
if (yn == 'y' || yn == 'Y') {
printf ("\nupdate....");
DX_WriteByteData (dev, stat[i].id, 16, 2, NULL);
Sleep (800);
if (DX_ReadByteData (dev, stat[i].id, 16, &val8, NULL)) {
if (val8 == 2) printf ("success\n"); else printf("fail\n");
} else printf ("fail\n");
} printf ("\n");
}
}
}
}
DX_ClosePort (dev);
} else {
printf ("Open error\n");
}
}
STM32F3 BootloaderST社のDfuSeというツールを使えばUSB経由でチップのフラッシュへ書き込む事ができますが、その前にBOOT0端子(CN2-38)を3.3V端子(CN1-2)につないでからUSBケーブルを接続してください。