最新日志

发表于:2008-8-15 0:00:32
标签:STM32  

21

STM32的TCP/IP网络采集器番外篇之摇杆LCD

这次是到摇杆和LCD了,我是第一次用摇杆,虽然原理跟按键那些没什么区别,但感觉很好玩!说说这次的程序目的吧,我就使用了摇杆的4个方向,就是上下左右,上电,LCD显示dEMO,按上就左手第一位显示0,如果按下就显示9,按左就把显示位置左移一位,不过这是你看不到东西,要再按上或下才能看到,如果按右就把显示位置右移一位。不停按上就是数字从0到9显示,不停按下就是9到0显示。好了,上代码。

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
#include "lcd.h"

/* Local includes ------------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
//vu32 ret; /* for return of the interrupt handling */
u8 frame_buf[5]="DEMO";
char character;
char position = 0;

/* Private functions ---------------------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void LcdShow_Init(void);

void Led_Config(void);
void Button_Config(void);
void KeyUp(void);
void KeyDown(void);
void KeyLeft(void);
void KeyRight(void);

void frame_gen(void);

void delay(void);
void delay()
{
int i,j;
j=0;
for (i=0; i<0x1ffff; i++) j++;
}

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{

#ifdef DEBUG
  debug();
#endif

  /* System Clocks Configuration */
  RCC_Configuration();

  /* GPIO ports pins Configuration */
  GPIO_Configuration();

  Button_Config();
  Led_Config();
  LcdShow_Init();
 
  /* NVIC Configuration */
  NVIC_Configuration();
 
  write_string("DEMO");
  while(1)
  {
  }
}

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  ErrorStatus HSEStartUpStatus;

  /* RCC system reset(for debug purpose) */
//  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* ADCCLK = PCLK2/6 */
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* PLLCLK = 4MHz * 9 = 36 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }

  /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
         | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);

  /* TIM2 clocks enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configures the different GPIO ports.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure PC.04 -- PC.11 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7
        | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Configure PD.03, PC.04, PC.11 -- PC.15 as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |
      GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* Configure PE.00 -- PE.15 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures the NVIC and Vector Table base address.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

  /* Configure the Priority Group to 2 bits */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  /* enabling interrupt */
  NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);


    /* Enable the EXTI10-15 Interrupt on PD.12-PD.15 */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* Configure the SysTick handler priority */
  NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 2, 0);
}

/*******************************************************************************
* Function Name  : LcdShow_Init
* Description    : Configure the lcd dispaly: TIM2 initialize in Output Compare
*                  Timing Mode
* Input          : None
* Return         : None
* Comment        : TIM2 Configuration: Output Compare Timing Mode:
                   TIM2CLK = 36 *2 =72MHz, Prescaler = 17, TIM2 counter clock = 4 MHz
                   TIM2 update Period = ARR / TIM2 counter Period = 2 ms
                   CC1 OC period = 1ms
*******************************************************************************/
void LcdShow_Init(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 8000;
  TIM_TimeBaseStructure.TIM_Prescaler = 17;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  TIM_ARRPreloadConfig(TIM2,DISABLE);
  /* only counter overflow/underflow generate U interrupt */
  TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Regular);

  /* Output Compare Timing Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;
  TIM_OCInitStructure.TIM_Pulse = 4000;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);

  /* TIM IT enable */
  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_Update, ENABLE);

  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
}


void Button_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;

  /* Enable GPIOD clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

  /* Configure PD.12-PD.15 as input float */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
 
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource12);
  /* Configure EXTI Line12 to generate an interrupt on falling edge */
  EXTI_InitStructure.EXTI_Line = EXTI_Line12;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
 
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource13);
  /* Configure EXTI Line12 to generate an interrupt on falling edge */
  EXTI_InitStructure.EXTI_Line = EXTI_Line13;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
 
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource14);
  /* Configure EXTI Line12 to generate an interrupt on falling edge */
  EXTI_InitStructure.EXTI_Line = EXTI_Line14;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
 
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource15);
  /* Configure EXTI Line12 to generate an interrupt on falling edge */
  EXTI_InitStructure.EXTI_Line = EXTI_Line15;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

void Led_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable GPIOC clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  /* Configure PC.06, PC.07, PC.08 and PC.09 as output push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}

void KeyUp(void)
{
  delay();
 
  if((character < '0') || (character > '8'))
    character = '0';
  else
    character++;
 
  frame_gen();
  while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14) == 0);
  delay();
}

void KeyDown(void)
{
  delay();
 
  if((character < '1') || (character > '9'))
    character = '9';
  else
    character--;
 
  frame_gen();
 
  while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15) == 0);
  delay();
}

void KeyLeft(void)
{
  delay();
 
  if((position > 0) && (position < 4))
    position--;
  else
    position = 3;
 
  frame_gen();
 
  while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13) == 0);
  delay();
}

void KeyRight(void)
{
  delay();
 
  if(position < 3)
    position++;
  else
    position = 0;
 
  frame_gen();
 
  while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12) == 0);
  delay();
}

void frame_gen(void)
{
  write_string("   ");
  write_char(&character,0,position);
}

#ifdef  DEBUG
/*******************************************************************************
* Function Name  : assert_failed
* Description    : Reports the name of the source file and the source line number
*                  where the assert error has occurred.
* Input          : - file: pointer to the source file name
*                  - line: assert error line source number
* Output         : None
* Return         : None
*******************************************************************************/
void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {

  }
}
#endif

程序包点击下载

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(3) | 阅读(539)
发表于:2008-8-11 23:23:30
标签:STM32  

36

STM32的TCP/IP网络采集器番外篇之键控LED

学习完流水LED,也要学习简单的输入控制,就是按键了,还是单独的按键,不是点阵按键,够简单了吧。按KEY2就点亮LED4,按KEY3就熄灭LED4,好了,上代码

#include <stm32f10x_lib.h>

GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化结构体
void Delay(vu32 nCount);
u16 getkey(void);

int main(void)
{
 //使能GPIO时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
       
        //初始化LED输出IO
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //带上拉输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //输出频率最大2M
 GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        //初始化KEY2,KEY3输入IO
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;  
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     //带上拉输入
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
 //KEY2点亮LED1,KEY3关闭LED1
        while(1)
  {
                   switch(getkey())
                   {
                    case 2:
                      GPIO_SetBits(GPIOC, GPIO_Pin_4);
        break;
                    case 3:
                      GPIO_ResetBits(GPIOC, GPIO_Pin_4);
                      break;
                   }
  }

}

/*****************************************************
函数: void Delay(vu32 nCount)
参数: vu32 nCount 延时时间
描述: 延时指定时间
返回: 无
******************************************************/
void Delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}

/*****************************************************
函数: u16 getkey(void)
参数:
描述: 延时指定时间
返回: 按键值
******************************************************/
u16 getkey(void)
{
    u16 input;
    while(1)
    {
        input = GPIO_ReadInputData(GPIOD);
        if(!(input & 0x08))
          return 2;
        if(!(input & 0x10))
          return 3;
    }
}

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(1) | 阅读(1247)
发表于:2008-8-10 22:01:05
标签:STM32  

52

STM32的TCP/IP网络采集器番外篇之水流LED

要做好STM32的TCP/IP网络采集器就要在STM32上写出驱动ENC28J60的程序,51上实现是没问题了,但现在STM32不论是开发环境还是本身片子的使用都很不一样,所以要先熟悉STM32的开发环境和片子的使用。我觉得要熟悉一种MCU,从最简单的IO开始是最好的,学51也是从流水LED起步,现在也不例外。这次感受是,STM32比51复杂,从他的时钟设置,IO设置就能看出,使用前都要设置一翻,51就简单了,直接赋值给IO,下面是今天的成果,借鉴了例子!其中正向LED的速度要慢很多,想看看效果。

#include <stm32f10x_lib.h>

GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化结构体
void Delay(vu32 nCount);


int main(void)
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOC时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
 //选择引脚4,5,6,7
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //带上拉输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大50M
 GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC4,5,6,7引脚

 while(1)
  {
                   //正向流水灯   
     GPIO_SetBits(GPIOC, GPIO_Pin_4);//点亮LED1
     Delay(0xaffff); //延时
     GPIO_ResetBits(GPIOC, GPIO_Pin_4);//关闭LED1
  
     GPIO_SetBits(GPIOC, GPIO_Pin_5);//点亮LED2
     Delay(0xaffff); //延时
     GPIO_ResetBits(GPIOC, GPIO_Pin_5);//关闭LED2
              
     GPIO_SetBits(GPIOC, GPIO_Pin_6);//点亮LED3
     Delay(0xaffff); //延时
     GPIO_ResetBits(GPIOC, GPIO_Pin_6);//关闭LED3

                   GPIO_SetBits(GPIOC, GPIO_Pin_7);//点亮LED4
                   Delay(0xaffff); //延时
     GPIO_ResetBits(GPIOC, GPIO_Pin_7);//关闭LED4
            
                   //逆向流水灯
                   GPIO_SetBits(GPIOC, GPIO_Pin_7);//点亮LED4
                   Delay(0x1ffff); //延时
     GPIO_ResetBits(GPIOC, GPIO_Pin_7);//关闭LED4
 
                   GPIO_SetBits(GPIOC, GPIO_Pin_6);//点亮LED3
     Delay(0x1ffff); //延时
     GPIO_ResetBits(GPIOC, GPIO_Pin_6);//关闭LED3
       
     GPIO_SetBits(GPIOC, GPIO_Pin_5);//点亮LED2
     Delay(0x1ffff); //延时
     GPIO_ResetBits(GPIOC, GPIO_Pin_5);//关闭LED2

                   GPIO_SetBits(GPIOC, GPIO_Pin_4);//点亮LED1
     Delay(0x1ffff); //延时
     GPIO_ResetBits(GPIOC, GPIO_Pin_4);//关闭LED1

                   //正向灯渐亮
                   GPIO_SetBits(GPIOC, GPIO_Pin_4);//点亮LED1
     Delay(0x1ffff); //延时
  
     GPIO_SetBits(GPIOC, GPIO_Pin_5);//点亮LED2
     Delay(0x1ffff); //延时
              
     GPIO_SetBits(GPIOC, GPIO_Pin_6);//点亮LED3
     Delay(0x1ffff); //延时

                   GPIO_SetBits(GPIOC, GPIO_Pin_7);//点亮LED4
                   Delay(0x1ffff); //延时
                  
                   //逆向流水灯渐灭
     GPIO_ResetBits(GPIOC, GPIO_Pin_7);//关闭LED4
                   Delay(0x1ffff); //延时

                   GPIO_ResetBits(GPIOC, GPIO_Pin_6);//关闭LED3
                   Delay(0x1ffff); //延时
        
                   GPIO_ResetBits(GPIOC, GPIO_Pin_5);//关闭LED2
     Delay(0x1ffff); //延时

                   GPIO_ResetBits(GPIOC, GPIO_Pin_4);//关闭LED1
     Delay(0x1ffff); //延时
  }

}

/*****************************************************
函数: void Delay(vu32 nCount)
参数: vu32 nCount 延时时间
描述: 延时指定时间
返回: 无
******************************************************/
void Delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(6) | 阅读(899)
发表于:2008-7-23 22:25:57
标签:ENC28J60  

98

STM32的TCP/IP网络采集器进度二

今天把ENC28J60小模块和STM32的板子焊接好了,用了STM32的PA5,PA6,PA7这个SPI口,还有3个控制脚,刚好ENC28J60也是3.3V,方便,我把图发上来给大家看看,接着就是写程序了

点击开大图

这个是ENC28J60模块的原理图

点击开大图

好了,硬件已经准备好了,接着下来是软件的事,加油!一定能做好的!

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(11) | 阅读(1207)
发表于:2008-7-22 20:59:28
标签:ENC28J60  

100

STM32的TCP/IP网络采集器进度一

给彩云说了下,觉得有点不好意思,一直给公司的事忙着,所以当初的计划发就没怎么理,这些也是很忙,但再忙也把它给搞出来吧!核算了一下,自己买ENC28J60和外围元件加上做PCB板的费用应该在100左右,而且时间需要10天,所以我觉得还是网上买一个ENC28J60的模块算了,起码省时间。想不到在淘宝上真的给我找到了ENC28J60的模块,找了一家经常在他那买东西的店,50包快递,爽啊!昨天收到模块,先上个图吧

点击开大图

 

右边的就是那个ENC28J60模块,小巧吧!接着就是把模块跟STM32板子连起来写程序了!STM32板上的留的孔是2.0的间距,ENC28J60模块的是2.54间距,需要转换一下,还好是SPI,只需要几条线,要不搞死人!让大家久等了,我会把这个东西搞好的!

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(11) | 阅读(1332)
发表于:2008-6-6 12:03:09
标签:STM32  

105

基于STM32的TCP/IP网络采集数据方案

现在Cortex-M3越来越火了,为了尝试一下,我也动手设计个小东西来玩玩,一直对TCP/IP很感兴趣,之前是玩51+8019做的TCP板,由于怕RAM不够,所以51是外加了外部RAM的,现在STM32可以选择大RAM的型号,不用外加了。这只是一个入门STM32的板子,板上只有一个TCP/IP网络功能,还有就是把IO给扩展了,方便加上其它功能。板具有ISP和JTAG,方便调试。主芯片是STM32F103R,具体型号可以自己定,网络芯片这次没采用RTL8019,用的是ENC28J60,接口更简洁,是SPI接口,比RTL8019布线更容易,但ENC28J60的外围电路比RTL8019稍微复杂一点,但之前没玩过ENC28J60,所以这次决定采用它。

这个是原理图pdf,由于是第一次使用STM32,希望大家提出不足之处。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(7) | 阅读(2758)
发表于:2008-5-8 14:10:31
标签:泰克数字示波器  

3

泰克数字60M存储示波器 TDS1002

TDS1000系列数字存储示波器扩展了TDS200系列的性能与操作简易性,是经济型示波器的新一代典范产品。这一系列的7个型号,为用户带来前所未有的高性能,无与伦比的操作简易性,以及经济的价格,并且极其轻便。她的性能,灵活性及经济的价格都使得他们成为应用广泛的工具-数字电路设计调试,生产测试,质量控制,维修维护,教育与培训等等。

值得关注的TDS1000 (单色)与TDS200系列比较,带给市场的新性能主要有:

 

  • 性能的增强:
        *所有型号具有高级触发功能, 包括脉冲触发及可选场(奇偶)选行的视频触发, 也包括外触发。
        *所有型号FFT标准配置
        *触发频率读出
     
  • 使用简易性的增强:
        *具有不同波形选择的自动设置功能
        *探头选择指南,保证正确的探头使用
        *内容相关在线帮助
        *11种波形参数自动测量
        *更简单的用户界面-最常用的功能都放在前面板,使用更加方便,比如,单次按钮,默认设置按钮

    TDS1000系列主要指标

     

    TDS1002

    显示

    单色

    通道数

    2

    带宽

    60 MHz

    取样率
    1.0 GS/s
    记录长度

    所有通道2.5K

    时基范围
    5 ns 到50 sec/div
    外触发

    所有型号标准配置

    脉冲宽度触发

    所有型号标准配置
    33ns10sec可选

    触发信号读出

    触发源触发频率读出,所有型号标准配置

    FFT运算功能

    所有型号标准配置

    自动设置菜单

    所有型号标准配置

    自动测量

    11 种波形参数测量

    探头检查指南

    所有型号标准配置

    TDS2CMA模块

    可选件
    RS-232 串口,GPIB仪器控制接口,打印并行接口

     

    TDS1000系列特点与特性

    性能/功能 优点
    高达200MHz 带宽,2GS/s最大取样速率
    • 比传统数字示波器精确得多的实时波形采集技术更加精确的数字测量
    • 显示与测量更高频率的信号,更快的上升时间,发生混叠的可能性更小
    • 理想的产品设计,维护,维修与生产工具
    5 mV/div及其以上的刻度全部达到全带宽
    • 5mV/格以上以全带宽采集信号,比TDS200系列有较大提高(TDS2002 mv/div and 5 mV/div 刻度时是20MHz 的带宽限制)
    • 所有型号的带宽灵敏度是20 MHz @ 2 mV/div
    • 模拟电路设计与调试的理想工具
    TDS2000系列具有彩色显示
    • TDS2000 系列每一通道具有不同颜色的波形,读出,以及游标
    • 简化多通道复杂波形的观测
    • 理想的设计,维护,维修与制造工具
    可选择波形的自动设置功能
    • 自动监测正弦波,方波及视频信号,并以图形化界面显示这些信号的自动设置选项
    • 使用者可以选择进一步的设置选择,包括上升下降沿,视频行场及FFT
    • 按照信号的不同类型,自动显示4种参数的自动测量值
    • 只显示有信号的通道(关闭无信号的通道)
    • 当多个信号连接至示波器时,使用频率最低的信号作为触发源(而不是最小数通道)
    • 提高测试效率
    探头连接在线指南
    • 指示使用者正确地调整探头补偿,确认探头衰减因数
    • 优化探头设置,保证测量精度
    11种自动设置
    • 简化与加速测量过程,减少人为误差
    • 包括:最小值,最大值,上升时间,下降时间,+脉冲宽度,-脉冲宽度,周期,平均值,周期有效值,峰峰值
    • 进行重复测试时尤其有用
    在线帮助
    • 象在线手册一样
    • 提供帮助目录,超文本链接主题,使用者可以有选择性地学习各种示波器的功能
    • 帮助语言与界面语言选择对应
    • 提高使用效率
    快速傅立叶变换(FFT)

    数学运算功能在所有型号作为标准配置

    • 显示频域谱线,快速谐波分析及其它频域测量
    • 分析,测量与调试电路更加快捷
    • 自动设置功能使得FFT通过一个按键就可以实现
    脉冲宽度触发(或者称为毛刺触发)
    • 触发于小于,大于或等于可选时间限制的脉冲,33 ns 10sec可选择
    • 加速数字电路设计,调试与分析
    可选行的视频触发功能
    • 触发于视频信号特定的行
    • 提高测试效率
    • 理想的视频设计,调试,维护工具
    外触发
    • 所有型号提供前面板不同于输入通道的外触发输入
    • 所有通道都可以用来进行测量
    • 设计调试多通道信号的理想工具
    触发频率读出
    • 由触发源自动激活(视频触发时除外)
    • 使用者可以测量触发信号的频率(包括外触发源),无需再使用一个通道做输出
    • 理想的设计,生产与维护手段
    触发观察按键
    • 显示触发信号,包括外触发信号
    预触发观测
    • 观察触发前的信息,发现造成故障的原因,而不是仅仅看到发生了什么故障
    • 通过前面板操作可设为零
    更加简单的用户界面
    • 简单的用户界面使得仪器更加容易使用,减少学习时间,提高效率
    • 传统的,熟悉的模拟风格的控制按钮,使用者可以通过前面板完成大部分常用功能,如自动设置,帮助,单次捕获,打印,扫描速度等
    • 前面板带灯光指示,指示位置与电平旋钮工作于特殊功能
    多语言用户界面
    • 菜单与显示可以选择10种操作界面:英语,法语,德语,意大利语,葡萄牙语,俄语,简体中午,繁体中文,朝鲜语,日语
    • 手册也具有多种文字
    • 前面板说明文字同样具有多语言
    单次捕获按键
    • 捕获偶发或非重复性信号更加简单
    • 前面板单次按键实现
    峰值检测
    • 捕获与观察高频信号成分,偶发毛刺等,可达12 ns
    冻结或停止波形
    • 保持并检测最后一次触发的波形
    存储调出波形
    • 将信号与参考波形比较
    存储调出设置
    • 快速存储设置及调出进行重复测试
    无闪烁显示
    • 观察低速信号的更多细节

     

    TDS1000系列与TDS200的比较

    功能

    TDS1000系列

    TDS200系列

    显示    
    通道数

    2

    2 4

    带宽

    60 100MHz

    60 100MHz

    采样率

    1.0 GS/s

    1.0 GS/s

    记录长度

    2.5K

    2.5K

    时基范围

    5 ns to50 sec/div

    5 ns to5 sec/div

    时基精度

    50 ppm

    100 ppm

    外触发

    所有型号标配

    2通道,TDS224

    脉冲宽度触发

    所有型号标配

    33 ns to10 sec

    触发信号频率读出

    所有型号标配

    FFT分析

    所有型号标配

    TDS2MM模块

    自动设置菜单

    所有型号标配

    简单设置

    自动波形参数测量

    11

    5

    探头检测指南

    所有型号标配

    在线帮助

    所有型号标配

    恢复默认设置按键

    所有型号标配

    存储/调出菜单里

    水平位置设为零按键

    所有型号标配

    单次捕获按键

    所有型号标配

    在触发菜单里

    带指示灯的前面板

    所有型号标配

    TDS2MM 模块

    内置测量功能,接口只需选用TDS2CMA

     
    TDS2CMA 模块

    选件

     
         

     

    定货信息

     

    TDS1000系列示波器

    产品 描述
    TDS1002 2 Channel, 60 MHz, 1.0GS/s, 单色DSO
    TDS1012 2 Channel, 100 MHz, 1.0GS/s, 单色DSO

     

    标准附件

      描述
    P2200 探头 200 MHz 10X-1X 可变衰减无源探头(每通道一只)
    操作手册 11种语言
    电源线  
    校准证书 NIM/NIST可溯源
    保修 3年保修,不包括探头

     

    推荐附件

      描述
    TDS2CMA TDS2CMA 通信接口模块
    WSTRO WaveStarTM软件
    TNGTDS01 操作培训套件
    编程手册 071-1075-00, 英语
    维修手册 071-1076-00, 英语
    AD007 LAN/WAN GPIB转换器
    RM2000 架装套件
    AC220 软携带包
    HCTDS32 硬携带包(需同时订AC220

     

    探头

      描述
    A621 2000 A 交流电流探头
    A622 100 A AC/DC 电流探头
    AM503S AC/DC 电流探测系统
    A6907 4 Channel, 50 MHz 电压隔离器
    P6101B 15 MHz, 1X 无源探头
    P6021 60 MHz AC 电流探头
    P6022 120 MHz AC 电流探头
    P6015A 75 MHz, 1000X 高压探头
    P5100 250 MHz, 100X 高压探头
    P5200 25 MHz, 1300 V 有源差分探头
    P2200 200 MHz 10X-1X 无源探头(标准附件)
  • 点击此处查看原文 >>

    系统分类: 虚拟仪器   |    用户分类:    |    来源: 转贴

    评论(0) | 阅读(609)
    发表于:2008-4-4 13:55:38
    标签:毕业设计  

    2

    新建了个小组,欢迎大家来交流

    http://group.ednchina.com/716/

    每年的毕业又要到,快毕业的你做了什么设计,快来跟大家交流吧!

    点击此处查看原文 >>

    系统分类: 资源共享   |    用户分类:    |    来源: 原创

    评论(1) | 阅读(812)
    发表于:2008-3-26 11:32:50
    标签:自锁互锁开关  

    2

    电子自锁互锁开关

    自锁互锁开关在电器上使用很广泛,一般都是机械式,缺点是:体积大,易磨损,按触力大,转换速度低。电子开关可以克服上述缺点。
    点击看大图
      一.开关特点。开关的核心器件为四运放LM324,经巧妙设计,使每个运放有两重功能,电压比较器和施密特触发器。电压适用范围宽,档位可任意设计,如果加一档空档,可作为总复位,与数字电路配合时,可用同一电源,开关的输入输出电平符合数字电路的接口电平,由于运放的输入阻抗高,开关的输入电流小,可以用轻触开关.导电橡胶.薄膜开关作按键,或光、电、磁等转换信号驱动,可用三极管.可控硅.继电器等。

      二.电路原理。每档电路相同,图中只画出三档。电阻根据电压选用,以保证开关可靠工作,尽量选用大阻值。
      接通电源,R1R2分压,为各运放反相端提供高电位,使各运放输出低电位。接通任一键,对应运放的同相端获得高电位,高于反相端1.4V(二极管压降),输出变为高断开关按键。因有R3R4分压的反馈,同相端电位仍高于反相端,输出端维持高电位。当另一个键接通时,电路重复上述过程,同时,通过两只二极管D1D2使所有运放的反相端电位高于R3R4分压形成的同相端电位,所以输出端由高变低。总之,每一次按键,只有该运放输出高位,其余的都是低,这就是开关的自锁互锁功能。

    点击此处查看原文 >>

    系统分类: 模拟技术   |    用户分类:    |    来源: 转贴

    评论(6) | 阅读(883)
    发表于:2008-3-26 11:29:28
    标签:运算放大器  

    2

    运算放大器的单电源供电方法 (收藏)

    运算放大器的单电源供电方法 (收藏)

    大部分运算放大器要求双电源(正负电源)供电,只有少部分运算放大器可以在单电源供电状态下工作,如LM358(双运放)LM324(四运放)CA3140(单运放)等。需要说明的是,单电源供电的运算放大器不仅可以在单电源条件下工作,也可在双电源供电状态下工作。例如,LM324可以在、+5+12V单电源供电状态下工作,也可以在+5±12V双电源供电状态下工作。  

    在一些交流信号放大电路中,也可以采用电源偏置电路,将静态直流输出电压降为电源电压的一半,采用单电源工作,但输入和输出信号都需要加交流耦合电容,利用单电源供电的反相放大器如图1(a)所示,其运放输出波形如图1(b)所示。
     


    该电路的增益Avf=-RFR1R2R3时,静态直流电压Vo(DC)12Vcc。耦合电容ClC2的值由所需的低频响应和电路的输入阻抗(对于C1)或负载(对于C2)来确定。ClC2可由下式来确定:C110002πfoRl(μF)C210002πfoRL(μF),式中,fo是所要求最低输入频率。若R1RL单位用fOHz,则求得的C1C2单位为μF。一般来说,R2R3≈2RF
     


    2是一种单电源加法运算放大器。该电路输出电压Vo=一RF(V1RlV2R2V3R3),若R1R2R3RF,则Vo=一(V1V2V3)。需要说明的是,采用单电源供电是要付出一定代价的。它是个甲类放大器,在无信号输入时,损耗较大。