在线时间279 小时
UID3181444
注册时间2015-12-8
NXP金币8
TA的每日心情 | 开心 2017-11-15 10:33 |
---|
签到天数: 79 天 [LV.6]常住居民II
金牌会员
- 积分
- 1779
- 最后登录
- 2020-8-22
|
本帖最后由 何昌昕 于 2016-10-27 21:48 编辑
LPC824,板载资源很多是优点也是缺点,不如资源占据的IO口无法作为其他用途,除非更改硬件。笔者移植OLED时就被这些IO坑过,最后发现有些有上拉,有些接了芯片,所以建议外接模块时不要使用以下IO口,减少麻烦。
1.串口:P0_0和P0_4作为默认的串口 非常好用
2.SWD下载接口:P0_2和P0_3 不能作为通用口
3.晶振接口:P0_8和P0_9作为晶振口,尽量不要使用
4.电位器口:P0_23 挺好用的,但无法作为他用
5.SPI芯片接口:P0_15/P0_24/P0_25/P0_26
6.IIC芯片接口:P0_10/P0_11
7.ISP和RST:P0_5和P0_12尽量不要使用
这样一看剩下的接口还剩一半不到,资源宝贵。
目前主要完成了获取上位机"迹"的信息获取,这款APP是网上一位大神开发的,APP就不做过多的介绍了,具体APK和arduino库下载可以看这个帖子目标跟随小车-让手机成为Arduino的眼睛
附上处理串口数据的代码。
#include "chip.h"
#include "board.h"
#include "string.h"
#include "tick.h"
#include "math.h"
#include "lcd.h"
#define TICKRATE_HZ 1000
#define MAX_SIZE 128
typedef struct{
char RevBuff[MAX_SIZE];
unsigned int RevCount;
volatile unsigned int RevTime;
unsigned char RevFlag;
unsigned char RevOver;
}UART_RevInfo;
typedef struct{
uint16_t X;
uint16_t Y;
uint16_t T;
}TraceData;
TraceData tData;
UART_RevInfo info;
UART_RevInfo *UART_Info = &info;
//static uint16_t data;
char str;
void Task_200ms(void)
{
Board_LED_Toggle(0);
}
void Task_500ms(void)
{
Board_LED_Toggle(1);
}
void Task_1000ms(void)
{
Board_LED_Toggle(2);
}
void USART_RevSave(char input,UART_RevInfo *Struct)
{
if(Struct->RevCount<MAX_SIZE)
{
Struct->RevBuff[Struct->RevCount++]=input;
}
Struct->RevTime=GetTime();
Struct->RevFlag=0xff;
}
void UART0_IRQHandler(void)
{
if((Chip_UART_GetStatus(LPC_USART0)&UART_STAT_RXRDY)!=0)
{
//data = Chip_UART_ReadByte(LPC_USART0);
str = Chip_UART_ReadByte(LPC_USART0);
//USART_RevSave(data,UART_Info);
USART_RevSave(str,UART_Info);
}
}
uint8_t Convert(char num)
{
uint8_t temp;
switch(num)
{
case '0':temp=0;break;
case '1':temp=1;break;
case '2':temp=2;break;
case '3':temp=3;break;
case '4':temp=4;break;
case '5':temp=5;break;
case '6':temp=6;;break;
case '7':temp=7;;break;
case '8':temp=8;break;
case '9':temp=9;break;
default:break;
}
return temp;
}
void DataSplit(void)
{
uint8_t j;
uint8_t temp=0;
uint8_t S1,S2,S3;
for(j=3;j<UART_Info->RevCount;j++)
{
if(UART_Info->RevBuff[j]==','||UART_Info->RevBuff[j]==';')//判断分号和逗号
{
//DEBUGOUT("SplitNum is %d\r\n",j);
temp++;
if(temp==1){S1=j;} //Round 1
if(temp==2){S2=j;} //Round 2
if(temp==3){S3=j;}
}
}
//DEBUGOUT("%d %d\r\n",S1,S2);
for(j=3;j<S1;j++)
{
//DEBUGOUT("%c ",UART_Info->RevBuff[j]);
//DEBUGOUT("%d",Convert(UART_Info->RevBuff[j]));
//DEBUGOUT("%d",(int)pow(10,S1-j-1));
tData.X+=Convert(UART_Info->RevBuff[j])*pow(10,S1-j-1);
}
for(j=S1+1;j<S2;j++)
{
//DEBUGOUT("%c ",UART_Info->RevBuff[j]);
tData.Y+=Convert(UART_Info->RevBuff[j])*pow(10,S2-j-1);
}
for(j=S2+1;j<S3;j++)
{
//DEBUGOUT("%c ",UART_Info->RevBuff[j]);
tData.T+=Convert(UART_Info->RevBuff[j])*pow(10,S3-j-1);
}
//DEBUGOUT(" ");
/*DEBUGOUT("X:%d ",tData.X);
DEBUGOUT("Y:%d ",tData.Y);
DEBUGOUT("T:%d\r\n",tData.T);*/
Display(tData.X,64,2);
Display(tData.Y,64,4);
Display(tData.T,64,6);
if(tData.X>=160){Board_LED_Set(6,true);LCD_Print(0,0," left");}else{Board_LED_Set(6,false);LCD_Print(0,0,"right");}
if(tData.Y>=240){Board_LED_Set(7,true);LCD_Print(50,0," up ");}else{Board_LED_Set(7,false);LCD_Print(50,0,"down");}
if(tData.T>=20){Board_LED_Set(4,true);LCD_Print(90,0,"near");}else{Board_LED_Set(4,false);LCD_Print(90,0,"far ");}
tData.X=0;
tData.Y=0;
tData.T=0;
}
void SysTick_Handler(void)
{
static uint16_t sys_count;
sys_count++;
CalacCounter();
if(sys_count%200==0)
{
Task_200ms();
}
if(sys_count%500==0)
{
Task_500ms();
}
if(sys_count%1000==0)
{
Task_1000ms();
}
if(sys_count>=1000)
{
sys_count=0;
}
}
int main(void)
{
//uint16_t i;
SystemCoreClockUpdate();
Board_Init();
LCD_Init();
SysTick_Config(SystemCoreClock / TICKRATE_HZ);
DEBUGOUT("UART IRQ example for both TX and RX\r\n");
Chip_UART_IntEnable(LPC_USART0, UART_INTEN_RXRDY);
NVIC_EnableIRQ(UART0_IRQn);
LCD_Print(50,2,"X:");
LCD_Print(50,4,"Y:");
LCD_Print(50,6,"T:");
while(1)
{
if(UART_Info->RevFlag==0xff)
{
if(DiffTime(UART_Info->RevTime,GetTime())>50)
{
/*for(i=0;i<UART_Info->RevCount;i++)
{
DEBUGOUT("%c",UART_Info->RevBuff);
}*/
if(UART_Info->RevBuff[0]=='o'&&UART_Info->RevBuff[1]=='k'
&&UART_Info->RevBuff[2]==','&&UART_Info->RevBuff[UART_Info->RevCount-1]==';')
{
//DEBUGOUT("Data is OK!\r\n");
DataSplit();
}
/*else if(UART_Info->RevBuff[0]=='f'&&UART_Info->RevBuff[1]=='a'
&&UART_Info->RevBuff[2]=='i'&&UART_Info->RevBuff[3]=='l'
&&UART_Info->RevBuff[4]==';')
{
//DEBUGOUT("Error!\r\n");
}*/
UART_Info->RevCount=0;
UART_Info->RevFlag=0;
}
}
}
}
最后附上视频,OLED用于显示指定颜色物体的X、Y轴坐标和距离T,通过这些信息,我们可以控制小车完成视觉跟踪的功能。等过两天有空了,自己移植一下Opencv试试,简单学习一下图像处理。
|
|