LPC1343 UARTの限界速度と処理時間をCheck!
出来た事
1.UARTの通信速度をチェック(Timerで確認)
現在の限界 Baudrate 230400
実際の転送時間はほぼBaudrate通り
開発Listへ戻る
マイコン初心者の私は、なんとなくイロイロと確認したかったりするので
今日はUARTの限界速度のチェックと
今後、開発するコードの実際の処理時間を確認する方法を試してみる意図で
Timerを使って処理時間を測定を行いました。
使ったもの
方法
4桁の数字を100個表示
数字間には,10個表示でCR+LF
この時間をタイマーで測定し最後にタイマーの値を表示
1000,1001,1002,・・・1009
1010,1011,1012,・・・1019
・
・
・
1099,1091,1092,・・・1099
21456 ← タイマーの値(us)
測定結果
UARTの限界 : 230400までいけました。その次の460800はダメでした。
原因までは追究していません。シリアル変換基板がNGなのか,LPC1343の限界か、
コードが悪いのか(コードはエレキジャックさんの記事から引っ張ってきただけなので・・)。。
処理時間確認 : ほぼ正しい。(期待値 22135us 測定値21456)
なぜだか期待値よりも早くなりましたが、まぁこの程度わかれば私の目的では十分です。
解説
今回は4桁の数字+","が90個, 4桁の数字+CR+LFが10個です。
計510charを送信します。
データ8bit パリティなしなので、スタートビット、ストップビットを加味すると
1文字10bitで送信できます。合計5100bitです。
ボーレート230400ですので
予想時間[us]=1000000us/230400x5100=22135us
code
#ifdef __USE_CMSIS
#include "LPC13xx.h"
#endif#include
#include
#include "uart.h"
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;
#include
#include//int-> char変換 itoi // Main loop
int main(void) {
// Variable declaration
char p[4]; // AD0 value
char q[10];
int data[99]; //
int i=0;
int t=0;
int l=0;
int m=0;
int time;// 32bit counter
LPC_SYSCON->SYSAHBCLKCTRL |=0x400; // Timer32B1 Turn ON
LPC_TMR32B1->PR =72-1; // 1us(Max 32bit dec:4294967295)
LPC_TMR32B1->MCR =0x600; // MR3 as Period of 32B1 and interrupt
LPC_TMR32B1->MR3 =10000000; // PWM Period 10kx100=100Hz
LPC_TMR32B1->TCR =2; // TCR Reset// Initialize UART
uart_init(230400);//Making 100xdummy data
while(t<=99){
data[t]=1000+t;
++t;
}LPC_TMR32B1->TCR =1; // TCR start = Start measurement
//Send 100xdummy data by UART
while(l<=99){
itoa(data[l], p, 10);
uart_puts(p);
if(m<=8){
uart_puts(",");
++m;
}else{
uart_puts("\r\n");
m=0;
}
++l;
}//Display measurement result
time=LPC_TMR32B1->TC;
itoa(time, q, 10);
uart_puts(q);
uart_puts("\r\n");
// Enter an infinite loop
while(1) { // Infinite loop
i++; // dummy count.
}
return 0 ;}
codeは今までの解説の組み合わせです。
UART.C UART.h UARTの送信関係の参照記事 : LPC1343 UARTでADCを制御する 2/2
Timerの動作の参照記事 : LPC1343 32bit TimerでPWM