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

共75条 4/8 |‹ 2 3 4 5 6 7 ›| 跳转至
工程师
2012-04-25 22:29:34     打赏
31楼


代码
//------
//main.c
//------
#include "STM32Lib\\stm32f10x.h"
u8 const pwm_duty[]={
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c};
int main(void)

 RCC_Configuration();
 GPIO_Configuration();
 Tim1_Configuration();
 NVIC_Configuration();
 for(;;)
 {
 }
}
//-------
//NVIC.C
//-------
#include "STM32Lib\\stm32f10x.h"
void NVIC_Configuration(void)
{
 NVIC_InitTypeDef NVIC_InitStructure;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);
}
//-------
//GPIO.C
//-------
void GPIO_Configuration(void)
{ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 GPIO_InitTypeDef GPIO_InitStructure;
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //开漏输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
 GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//-------
//TIM.C
//------- 
#include "STM32Lib\\stm32f10x.h"
void Tim1_Configuration(void)
{
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
 TIM_DeInit(TIM1);
 TIM_TimeBaseStructure.TIM_Prescaler = 10;
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 TIM_TimeBaseStructure.TIM_Period = 256; 
 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
 TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
 TIM_OCInitStructure.TIM_Pulse = 1;
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; 
 TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
 TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; 
 TIM_OC1Init(TIM1,&TIM_OCInitStructure);
 TIM_OC2Init(TIM1,&TIM_OCInitStructure);
 TIM_OC3Init(TIM1,&TIM_OCInitStructure);
 TIM1->CCR1=1;
  TIM1->CCR2=33;
 TIM1->CCR3=66;
 TIM1->CR2   &=~0x01;
  TIM_CtrlPWMOutputs(TIM1,ENABLE);
 TIM_Cmd(TIM1,ENABLE);

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
 TIM_DeInit(TIM2);
 TIM_TimeBaseStructure.TIM_Prescaler = 20;
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 TIM_TimeBaseStructure.TIM_Period = 267; 
 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;
 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
 TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);
 TIM_Cmd(TIM2,ENABLE);
}
//-------
//中断函数
//------
void TIM2_IRQHandler(void)
{
 static unsigned char i=0;
 static unsigned char j=85;
 static unsigned char k=170;
  if (TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
   {
   TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
      TIM1->CCR1 =  pwm_duty[i];
      TIM1->CCR2 =pwm_duty[j];
      TIM1->CCR3 = pwm_duty[k];
      i++;
   j++;
   k++;
    }
   return;
}


工程师
2012-05-07 16:26:24     打赏
32楼

ARM DIY进程10:CAN双机通信

    觉得CAN如果玩Polling有点象陆地学游泳,还是搞个双机通信才能真正体会真实效果,但这需要2台STM32。弄来一部万利EK-STM32F,这种开发板不知道当初为何要捆绑J-LINK下载器在板上,而且其驱动程序只能兼容低版本的IAR,不支持KEIL下载,外部下载器一接上就发生冲突。花费了不少时间对其进行改造,终于能支持KLEIL下载了,并将该板的LCD显示代码从IAR环境移植到了KEIL环境,现在可以实战演练CAN了,呵呵!
    CAN的接收采用中断方式,DIY开发板上的CAN连接到了PB8和PB9,需要对CAN复用功能重映射,参见图1的《用户手册》截图。
GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
    双机通信中两机的通信协议设置一定要相同,而甲乙两机的ID地址要错开,本例中甲机设为TxMessage.StdId=0x12,乙机设为TxMessage.StdId=0x11 .程序运行过程按住发送键,发送方就将本机的ADC转换结果发送给对方,接收方将传送的数据显示在LCD屏幕上,并根据数值的大小分别点亮1-4只LED。连接2台机器的导线使用了双绞线,H对H,L对L。



                                                             图1



                                                      CAN双机通信连接


工程师
2012-05-07 16:37:50     打赏
33楼


                                                 甲机data<1000     亮 1个LED



                                                 甲机data<2000     亮 2个LED

                                               

工程师
2012-05-07 16:40:06     打赏
34楼


                                  甲机data  <3000亮3个LED



                                   甲机data  >3000亮4个LED

工程师
2012-05-07 16:42:23     打赏
35楼



                                     乙机data  <1000亮1个LED



                                        乙机data  <2000亮2个LED

工程师
2012-05-07 16:45:11     打赏
36楼




                                    乙机data  <3000亮3个LED



                                      乙机data  >3000亮4个LED

工程师
2012-05-07 16:55:17     打赏
37楼

部分代码
void CAN_Configuration(void)

 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
}
//--------------
//中断初始化函数
//--------------

void CAN_Interrupt(void)
{
 CAN_InitTypeDef        CAN_InitStructure;
 CAN_FilterInitTypeDef  CAN_FilterInitStructure;
 CAN_DeInit(CAN1);
 CAN_StructInit(&CAN_InitStructure);
 CAN_InitStructure.CAN_TTCM=DISABLE;
 CAN_InitStructure.CAN_ABOM=DISABLE;
 CAN_InitStructure.CAN_AWUM=DISABLE;
 CAN_InitStructure.CAN_NART=DISABLE;
 CAN_InitStructure.CAN_RFLM=DISABLE;
 CAN_InitStructure.CAN_TXFP=DISABLE;
 CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
 CAN_InitStructure.CAN_BS1=CAN_BS1_12tq;
 CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
 CAN_InitStructure.CAN_Prescaler=9;
 CAN_Init(CAN1,&CAN_InitStructure);
 CAN_FilterInitStructure.CAN_FilterNumber=0;
 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_FilterInitStructure.CAN_FilterActivation=ENABLE;
 CAN_FilterInit(&CAN_FilterInitStructure);
 CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);
}
//-------
//发送函数
//-------
void SendCan(u16 dat)
{
 CanTxMsg TxMessage;
 if(GET_LEFT())
 {
  TxMessage.StdId=0x12;
  TxMessage.ExtId=0x34;
  TxMessage.IDE=CAN_ID_STD;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.DLC=2;
  TxMessage.Data[0]=dat&0xff;
  TxMessage.Data[1]=dat>>8;
  CAN_Transmit(CAN1,&TxMessage);
 }
}

//-------
//中断函数
//-------
extern u16 Get_Ad;
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
 RxMessage.ExtId=0;
 CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);
 
 if(RxMessage.StdId==0x11)
 {
  Get_Ad=RxMessage.Data[1]+(RxMessage.Data[0]<<8);
 }
}

void NVIC_Configuration(void)
{
 NVIC_InitTypeDef NVIC_InitStructure;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);
}

 

 


工程师
2012-05-07 19:16:21     打赏
38楼
谢谢楼上。你再多弄快板子也可以CAN通信的

工程师
2012-05-07 19:32:32     打赏
39楼
楼上,你没看到我33楼那个板子是借来的吗?五湖四海皆有朋友嘛。

工程师
2012-05-07 22:12:45     打赏
40楼
回楼上,任何事情都要自己去实践。我的实例应该能鼓励你动手下去。希望你能成功。

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

回复

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