这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » wenyangzeng ARM DIY进程贴 红外解码

共75条 5/8 |‹ 3 4 5 6 7 8 跳转至
工程师
2012-05-07 22:29:32     打赏
41楼
彩屏更应该利用。记得输出的GPIO口要设成推挽才可行

工程师
2012-05-08 19:49:19     打赏
42楼

CAN双机通信经验分享

楼上:如果你只有一部STM32,那么是没有必要使用中断的。这时。主程序大概是这样的:在进入for()前CAN_Polling()只执行1次,然后你判断返回的标志位去显示LED.如果要不断发送,就把该函数移到循环中。
int main(void)

  //片内硬件初始化

 
    FAG=CAN_Polling(); //如果没有节点通信,则使用自发自收通信 FAG是预先定义的标志位
// CAN_Interrupt();//如果有节点通信,则使用节点通信

 for(;;)

 {
          //FAG=CAN_Polling();移到这里就可以反复发送接收。

        
          //这里加入你要显示结果的函数


 }
}

bool CAN_Polling(void)
{
 CAN_InitTypeDef         CAN_InitStructure;
 CAN_FilterInitTypeDef   CAN_FilterInitStructure;

 CanTxMsg TxMessage;
 CanRxMsg RxMessage;
 u16 i=0;
 u8 TransmitMailbox;
 
 /* CAN register init */
 CAN_DeInit(CAN1);
 CAN_StructInit(&CAN_InitStructure);
 
 /* CAN cell init */
 CAN_InitStructure.CAN_TTCM=DISABLE;  //时间触发
 CAN_InitStructure.CAN_ABOM=DISABLE;  //自动离线管理
 CAN_InitStructure.CAN_AWUM=DISABLE;  //自动唤醒
 CAN_InitStructure.CAN_NART=ENABLE;  //自动重传(注意,DISABLE才是自动重传)
 CAN_InitStructure.CAN_RFLM=DISABLE;  //失能FIFO锁定模式
 CAN_InitStructure.CAN_TXFP=ENABLE;  //失能FIFO优先级
 CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;     //环回模式,自发自收
 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
 CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
 CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
 CAN_InitStructure.CAN_Prescaler=5;
 CAN_Init(CAN1,&CAN_InitStructure);
 
 /* CAN 过滤器设置 */
 CAN_FilterInitStructure.CAN_FilterNumber=0;      //过滤器编号(0-13)
 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //过滤方式
 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //位宽
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;//CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* transmit */
TxMessage.StdId=0x11;
//TxMessage.ExtId=0x34;
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.IDE=CAN_ID_STD;
TxMessage.DLC=2;
TxMessage.Data[0]=send_adc&0xff;;              //这里传送的已经是ADC的数据了。
TxMessage.Data[1]=send_adc8;
TransmitMailbox=CAN_Transmit(CAN1,&TxMessage);//这句是发送
i=0;
while((CAN_TransmitStatus(CAN1,TransmitMailbox)!=CANTXOK)&&(i!=0xFF))  i++;
i=0;
 while((CAN_MessagePending(CAN1,CAN_FIFO0)

 RxMessage.StdId=0x00;
 RxMessage.IDE=CAN_ID_STD;  //标准包
 RxMessage.DLC=2;

 RxMessage.Data[0]=0x00;
 RxMessage.Data[1]=0x00;

 

 CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);//这里是接收
 if (RxMessage.StdId!=0x11) return FALSE;
 
 if (RxMessage.IDE!=CAN_ID_STD) return FALSE;
 
 if (RxMessage.DLC!=2) return FALSE;
 
 if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xAAAA) return FALSE;
  return TRUE;
}

如果你使用单机进行调试,又打开了CAN中断,则有可能因为没有节点,使中断程序一直挂起。


工程师
2012-05-08 20:28:56     打赏
43楼
你最好是单机先自循环能成功后,再用中断方式连接2台机器。因为2台机器如果其中1台硬件或软件问题,都会造成不联机。这时你比较难判断到底问题出在哪里。

工程师
2012-05-08 20:32:15     打赏
44楼
忘了1点:板上R51和R52要对调1下,VD230第8脚平时要低电平。

写错了:是R50和R51。

或如下图


工程师
2012-05-09 11:22:53     打赏
45楼
    对不起,一时粗心了。楼上说的对,是R50和R51。
    我把自循环的源代码整个工程都上传大家共享。 下载后解压缩,编译后执行,ADC我是设定在原来超声波的接口通道9,你可以在代码中修改到你所需要的通道。
点击进入下载CAN自测试.rar

工程师
2012-05-09 11:58:18     打赏
46楼
    而双机就不要用CAN_Polling(),而改用接收中断CAN_Interrupt(),要注意的是两台机的波特率要一致,我设定的波特率是200KHZ,在下图的波形最小占空比5us,测试时示波器探头接在"L"端。注意开发板的RS232插座外壳是没有接公共地的。示波器地线夹子要找到真正的地线连接。
   还有要注意的是当两台机器其中1台未通电或双绞线未接通,这时是测试不到输出波形的。

          

                                          图1  CAN接口正常的波形

        一手按快门,一手按发送按键,照片抖动厉害,看不很清楚,示波器放在垂直200mV/格,水平5uS/格。当你能看到这样的波形时,起码刚发送的这台机器发送功能是正常的,且2台机的通信节点也连通了。

工程师
2012-05-09 14:16:17     打赏
47楼
        双机通信的关键代码都贴在进程里了,你应该先确定到底是硬件问题还是软件问题。测量一下2台机器节点通信的IC各脚工作电压是很有必要的。当你启动一台发送时,如果能看到上图波形,那至少能证明该机的发送基本是正常的了。而软件方面,能否进入中断服务函数也是一个很重要的环节,除非2台机器都有故障,否则至少能让一台机器顺利地断点进入中断服务函数的。还有请注意一下一个现象:如果你在KEIL仿真环境中双击中断服务函数欲设置断点但红色方块始终无法出现时,就证明你的中断设置有某个地方出错了,编译环境没能把CAN中断服务函数一起编译进去,断点就设置不了了。
       况且我的LCD与大家都不同,直接COPY过去是无法使用的。饭要一口一口咀嚼才有味道,当你凭自己努力搞定一个难题后,那种满足感和成就感是任何语言都无法形容的呀!对吗?

工程师
2012-05-10 13:00:54     打赏
48楼
恭喜。不过你既然经历过刀山火海了,就应该把过程与所有网友共享共享。

工程师
2012-05-11 20:22:58     打赏
49楼

ARM DIY进程11:USB虚拟鼠标
   
         练习利用开发板上的USB接口实现免驱动鼠标功能,免驱动鼠标属于人机交互设备HID。本次练习需要4只按键实现鼠标光标上下左右移动,开发板上的按键接口太少,只好在板外另外搭接4只按键使用,见图1。在开发板上“USB_Disconnect”通过JP2连接到GPIOA_10注明缺省状态为“Open”,此时T1(9013)由于B极0偏置故C-E极截至,USB接口第3脚D+将为0V,PC机将认不到插入的USB设备。所以要么将JP2短接,并在程序中设PA10为输出口并输出高电平,要么直接将R47接JP2端连接到3.3V或干脆将T1的C-E极直接短路来调试(图3)。
       说实在话,这个USB从底层一直到用户层,实在是太复杂了,要弄通它不是几个练习就可以做到的。本次练习只不过是发挥了DIY者的的特长:COPY+PASTE东拼西凑完成的,详细原理在此就不敢班门弄斧了。从ST官方网站下载的MDK例程JoStickMouse在开发板上都无法成功运行。本例程是移植了ST官方IAR的例程的。运行后仿真环境就无法进入DEBUG跟踪、断点了。当虚拟鼠标USB设备被PC识别后,在WindowsXP设备管理器里会增加一个USB人体学输入设备(图4图5),这时按UP、DN、RIGTH、LEFT其中一键屏幕上的鼠标会朝不同方向移动,移动的速度可在"HW_CONFIG.H"头文件的CURSOR_STEP变量中重新定义。有时侯增加的USB人体学输入设备会出现黄色问号警告,只要拔去USB连接线,把这个设备卸载,然后重新插上USB连接线,系统就会自动安装新设备正常工作了。


                          图1



                         图2


工程师
2012-05-11 20:29:07     打赏
50楼


                                     图3



                                   图4    按UP-DN




                                  图5 按RIGHT LEFT

共75条 5/8 |‹ 3 4 5 6 7 8 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]