Cortex-M3 USB的“JoyStickMouse”例程结构分析(二)

发布者:会弹琴的鲸鱼3312最新更新时间:2017-11-08 来源: eefocus关键字:Cortex-M3 手机看文章 扫描二维码
随时随地手机看文章

TM32笔记之八:来跟PC打个招呼,基本串口通讯


a) 目的:在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。


b) 初始化函数定义:


void USART_Configuration(void);        //定义串口初始化函数


c) 初始化函数调用:


void UART_Configuration(void); //串口初始化函数调用


初始化代码:


void USART_Configuration(void)                      //串口初始化函数


{


//串口参数初始化  


   USART_InitTypeDef USART_InitStructure;              //串口设置恢复默认参数


//初始化参数设置


   USART_InitStructure.USART_BaudRate = 9600;                                  //波特率9600


USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长8位


   USART_InitStructure.USART_StopBits = USART_StopBits_1;                 //1位停止字节


   USART_InitStructure.USART_Parity = USART_Parity_No;                   //无奇偶校验


   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流控制


   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//打开Rx接收和Tx发送功能


USART_Init(USART1, &USART_InitStructure);                                         //初始化


   USART_Cmd(USART1, ENABLE);                                                       //启动串口


}


RCC中打开相应串口


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);


GPIO里面设定相应串口管脚模式


//串口1的管脚初始化  


   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                      //管脚9


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出


   GPIO_Init(GPIOA, &GPIO_InitStructure);                            //TX初始化


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                    //管脚10


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入


   GPIO_Init(GPIOA, &GPIO_InitStructure);                             //RX初始化


d) 简单应用:


发送一位字符


USART_SendData(USART1, 数据); //发送一位数据


while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送完毕


接收一位字符


while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){} //等待接收完毕


变量= (USART_ReceiveData(USART1)); //接受一个字节


发送一个字符串


先定义字符串:char rx_data[250];


   然后在需要发送的地方添加如下代码


   int i;                                                                   //定义循环变量


while(rx_data!='\0')                                        //循环逐字输出,到结束字'\0'


{USART_SendData(USART1, rx_data);          //发送字符


    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待字符发送完毕


    i++;}


e) USART注意事项:


发动和接受都需要配合标志等待。


只能对一个字节操作,对字符串等大量数据操作需要写函数


使用串口所需设置:RCC初始化里面打开RCC_APB2PeriphClockCmd


(RCC_APB2Periph_USARTx);GPIO里面管脚设定:串口RX(50Hz,IN_FLOATING);串口TX(50Hz,AF_PP);


f) printf函数重定义(不必理解,调试通过以备后用)


(1) 需要c标准函数:


#i nclude "stdio.h"


(2) 粘贴函数定义代码


#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)   //定义为putchar应用


(3) RCC中打开相应串口


(4) GPIO里面设定相应串口管脚模式


(6) 增加为putchar函数。


int putchar(int c)                                           //putchar函数


{


   if (c == '\n'){putchar('\r');}                                //将printf的\n变成\r


   USART_SendData(USART1, c);                                  //发送字符


   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束


   return c;                                                     //返回值


}


(8) 通过,试验成功。printf使用变量输出:%c字符,%d整数,%f浮点数,%s字符串,/n或/r为换行。注意:只能用于main.c中。


3、 NVIC串口中断的应用


a) 目的:利用前面调通的硬件基础,和几个函数的代码,进行串口的中断输入练习。因为在实际应用中,不使用中断进行的输入是效率非常低的,这种用法很少见,大部分串口的输入都离不开中断。


b) 初始化函数定义及函数调用:不用添加和调用初始化函数,在指定调试地址的时候已经调用过,在那个NVIC_Configuration里面添加相应开中断代码就行了。


c) 过程:


i. 在串口初始化中USART_Cmd之前加入中断设置:


USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//TXE发送中断,TC传输完成中断,RXNE接收中断,PE奇偶错误中断,可以是多个。


ii. RCC、GPIO里面打开串口相应的基本时钟、管脚设置


iii. NVIC里面加入串口中断打开代码:


NVIC_InitTypeDef NVIC_InitStructure;//中断默认参数


NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;//通道设置为串口1中断


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //中断占先等级0


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;              //中断响应优先级0


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //打开中断


NVIC_Init(&NVIC_InitStructure);                                              //初始化


iv. 在stm32f10x_it.c文件中找到void USART1_IRQHandler函数,在其中添入执行代码。一般最少三个步骤:先使用if语句判断是发生那个中断,然后清除中断标志位,最后给字符串赋值,或做其他事情。


void USART1_IRQHandler(void)                            //串口1中断


{


char RX_dat;                                                       //定义字符变量


   if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //判断发生接收中断


   {USART_ClearITPendingBit(USART1,   USART_IT_RXNE);       //清除中断标志


    GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)0x01);          //开始传输


RX_dat=USART_ReceiveData(USART1) & 0x7F;                       //接收数据,整理除去前两位


USART_SendData(USART1, RX_dat);                                     //发送数据


while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}//等待发送结束


   }


}


d) 中断注意事项:


可以随时在程序中使用USART_ITConfig(USART1, USART_IT_TXE, DISABLE);来关闭中断响应。


NVIC_InitTypeDef NVIC_InitStructure定义一定要加在NVIC初始化模块的第一句。


全局变量与函数的定义:在任意.c文件中定义的变量或函数,在其它.c文件中使用extern+定义代码再次定义就可以直接调用了。


STM32笔记之九:打断它来为我办事,EXIT (外部I/O中断)应用


a) 目的:跟串口输入类似,不使用中断进行的IO输入效率也很低,而且可以通过EXTI插入按钮事件,本节联系EXTI中断。


b) 初始化函数定义:


void EXTI_Configuration(void); //定义IO中断初始化函数


c) 初始化函数调用:


EXTI_Configuration();//IO中断初始化函数调用简单应用:


d) 初始化函数:


void EXTI_Configuration(void)


{ EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构定义


EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);//清除中断标志


GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);//管脚选择


GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);


    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);


    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);


EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//事件选择


   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发模式


   EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4; //线路选择


   EXTI_InitStructure.EXTI_LineCmd = ENABLE;//启动中断


   EXTI_Init(&EXTI_InitStructure);//初始化


}


e) RCC初始化函数中开启I/O时钟


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);


GPIO初始化函数中定义输入I/O管脚。


//IO输入,GPIOA的4脚输入


   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       //上拉输入


   GPIO_Init(GPIOA, &GPIO_InitStructure);             //初始化


f) 在NVIC的初始化函数里面增加以下代码打开相关中断:


   NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //通道


   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//占先级


   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应级


   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启动


   NVIC_Init(&NVIC_InitStructure); //初始化


g) 在stm32f10x_it.c文件中找到void USART1_IRQHandler函数,在其中添入执行代码。一般最少三个步骤:先使用if语句判断是发生那个中断,然后清除中断标志位,最后给字符串赋值,或做其他事情。


   if(EXTI_GetITStatus(EXTI_Line3) != RESET)                               //判断中断发生来源


{ EXTI_ClearITPendingBit(EXTI_Line3);                                        //清除中断标志


USART_SendData(USART1, 0x41);                                           //发送字符“a”


GPIO_WriteBit(GPIOB, GPIO_Pin_2, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_2)));//LED发生明暗交替


}


h) 中断注意事项:


中断发生后必须清除中断位,否则会出现死循环不断发生这个中断。然后需要对中断类型进行判断再执行代码。


使用EXTI的I/O中断,在完成RCC与GPIO硬件设置之后需要做三件事:初始化EXTI、NVIC开中断、编写中断执行代码。


STM32笔记之十:工作工作,PWM输出


a) 目的:基础PWM输出,以及中断配合应用。输出选用PB1,配置为TIM3_CH4,是目标板的LED6控制脚。


b) 对于简单的PWM输出应用,暂时无需考虑TIM1的高级功能之区别。


c) 初始化函数定义:


void TIM_Configuration(void);   //定义TIM初始化函数


d) 初始化函数调用:


TIM_Configuration();   //TIM初始化函数调用


e) 初始化函数,不同于前面模块,TIM的初始化分为两部分——基本初始化和通道初始化:


void TIM_Configuration(void)//TIM初始化函数


{


   TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;//定时器初始化结构


   TIM_OCInitTypeDef   TIM_OCInitStructure;//通道输出初始化结构


//TIM3初始化


   TIM_TimeBaseStructure.TIM_Period = 0xFFFF;        //周期0~FFFF


   TIM_TimeBaseStructure.TIM_Prescaler = 5;       //时钟分频


   TIM_TimeBaseStructure.TIM_ClockDivision = 0;    //时钟分割


   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式


   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //基本初始化


   TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);//打开中断,中断需要这行代码


   //TIM3通道初始化


   TIM_OCStructInit(& TIM_OCInitStructure);                                              //默认参数


   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                    //工作状态


   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       //设定为输出,需要PWM输出才需要这行代码


   TIM_OCInitStructure.TIM_Pulse = 0x2000;                   //占空长度


   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                 //高电平


   TIM_OC4Init(TIM3, &TIM_OCInitStructure);                   //通道初始化


TIM_Cmd(TIM3, ENABLE);                                                                      //启动TIM3


}


f) RCC初始化函数中加入TIM时钟开启:


RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM3, ENABLE);


g) GPIO里面将输入和输出管脚模式进行设置。信号:AF_PP,50MHz。


h) 使用中断的话在NVIC里添加如下代码:


//打开TIM2中断


   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;   //通道


   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//占先级


   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;           //响应级


   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       //启动


   NVIC_Init(&NVIC_InitStructure);                                            //初始化


中断代码:


void TIM2_IRQHandler(void)


{


   if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)    //判断中断来源


   {


TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);          //清除中断标志


GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_11)));//变换LED色彩


IC4value = TIM_GetCapture4(TIM2);                //获取捕捉数值


   }  


}


i) 简单应用:


//改变占空比


TIM_SetCompare4(TIM3, 变量);


j) 注意事项:


管脚的IO输出模式是根据应用来定,比如如果用PWM输出驱动LED则应该将相应管脚设为AF_PP,否则单片机没有输出


我的测试程序可以发出不断循环三种波长并捕获,对比结果如下:


捕捉的稳定性很好,也就是说,同样的方波捕捉到数值相差在一两个数值。


捕捉的精度跟你设置的滤波器长度有关,在这里


TIM_ICInitStructure.TIM_ICFilter = 0x4;        //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF


这个越长就会捕捉数值越小,但是偏差几十个数值,下面是0、4、16个周期滤波的比较,out是输出的数值,in是捕捉到的。


现在有两个疑问:


1、在TIM2的捕捉输入通道初始化里面这句


TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2); //选择时钟触发源


按照硬件框图,4通道应该对应TI4FP4。可是实际使用TI1FP1,TI2FP2都行,其他均编译错误未注册。这是为什么?

2、关闭调试器和IAR程序,直接供电跑出来的结果第一个周期很正常,当输出脉宽第二次循环变小后捕捉的数值就差的远了。不知道是为什么








                                                      时钟不息工作不止,systic时钟应用


a) 目的:使用系统时钟来进行两项实验——周期执行代码与精确定时延迟。


b) 初始化函数定义:


void SysTick_Configuration(void);


c) 初始化函数调用:


SysTick_Configuration();


d) 初始化函数:


void SysTick_Configuration(void)


{


   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//时钟除8


   SysTick_SetReload(250000);                                                 //计数周期长度


   SysTick_CounterCmd(SysTick_Counter_Enable);                //启动计时器


   SysTick_ITConfig(ENABLE);                                                     //打开中断


}


e) 在NVIC的初始化函数里面增加以下代码打开相关中断:


NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 1, 0);//中断等级设置,一般设置的高一些会少受其他影响


f) 在stm32f10x_it.c文件中找到void SysTickHandler 函数


void SysTickHandler(void)


{


执行代码


}


g) 简单应用:精确延迟函数,因为systic中断往往被用来执行周期循环代码,所以一些例程中使用其中断的启动和禁止来编写的精确延时函数实际上不实用,我自己编写了精确计时函数反而代码更精简,思路更简单。思路是调用后,变量清零,然后使用时钟来的曾变量,不断比较变量与延迟的数值,相等则退出函数。代码和步骤如下:


i. 定义通用变量:u16 Tic_Val=0; //变量用于精确计时


ii. 在stm32f10x_it.c文件中相应定义:


extern u16 Tic_Val;//在本文件引用MAIN.c定义的精确计时变量


iii. 定义函数名称:void Tic_Delay(u16 Tic_Count);//精确延迟函数


iv. 精确延时函数:


void Tic_Delay(u16 Tic_Count)             //精确延时函数


{ Tic_Val=0;                         //变量清零


   while(Tic_Val != Tic_Count){printf("");}//计时


}


v. 在stm32f10x_it.c文件中void SysTickHandler 函数里面添加


    Tic_Val++;//变量递增


vi. 调用代码:Tic_Delay(10); //精确延时


vii. 疑问:如果去掉计时行那个没用的printf("");函数将停止工作,这个现象很奇怪


C语言功底问题。是的,那个“注意事项”最后的疑问的原因就是这个


Tic_Val应该改为vu16


while(Tic_Val != Tic_Count){printf("");}//计时


就可以改为:


while(Tic_Val != Tic_Count);              //检查变量是否计数到位


STM32笔记之十三:恶搞,两只看门狗


a) 目的:


了解两种看门狗(我叫它:系统运行故障探测器和独立系统故障探测器,新手往往被这个并不形象的象形名称搞糊涂)之间的区别和基本用法。


b) 相同:


都是用来探测系统故障,通过编写代码定时发送故障清零信号(高手们都管这个代码叫做“喂狗”),告诉它系统运行正常。一旦系统故障,程序清零代码(“喂狗”)无法执行,其计数器就会计数不止,直到记到零并发生故障中断(狗饿了开始叫唤),控制CPU重启整个系统(不行啦,开始咬人了,快跑……)。


c) 区别:


独立看门狗Iwdg——我的理解是独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器。(这条狗是借来的,见谁偷懒它都咬!)主要用于监视硬件错误。


窗口看门狗wwdg——我的理解是系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了。(这条狗是老板娘养的,老板不干活儿他不管!)主要用于监视软件错误。


d) 初始化函数定义:鉴于两只狗作用差不多,使用过程也差不多初始化函数栓一起了,用的时候根据情况删减。


void WDG_Configuration(void);


e) 初始化函数调用:


WDG_Configuration();


f) 初始化函数


void WDG_Configuration()             //看门狗初始化


{


//软件看门狗初始化


   WWDG_SetPrescaler(WWDG_Prescaler_8); //时钟8分频4ms


// (PCLK1/4096)/8= 244 Hz (~4 ms)


WWDG_SetWindowValue(65);             //计数器数值


   WWDG_Enable(127);                //启动计数器,设置喂狗时间


// WWDG timeout = ~4 ms * 64 = 262 ms


WWDG_ClearFlag();                //清除标志位


   WWDG_EnableIT();                    //启动中断


//独立看门狗初始化


   IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//启动寄存器读写


   IWDG_SetPrescaler(IWDG_Prescaler_32);//40K时钟32分频


   IWDG_SetReload(349);                 //计数器数值


   IWDG_ReloadCounter();             //重启计数器


   IWDG_Enable();                       //启动看门狗


}


g) RCC初始化:只有软件看门狗需要时钟初始化,独立看门狗有自己的时钟不需要但是需要systic工作相关设置。


RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);


h) 独立看门狗使用systic的中断来喂狗,所以添加systic的中断打开代码就行了。软件看门狗需要在NVIC打开中断添加如下代码:


   NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; //通道


   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //占先中断等级


   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //响应中断优先级


   NVIC_Init(&NVIC_InitStructure);                      //打开中断


i) 中断程序,软件看门狗在自己的中断中喂狗,独立看门狗需要使用systic的定时中断来喂狗。以下两个程序都在stm32f10x_it.c文件中。


void WWDG_IRQHandler(void)


{


   WWDG_SetCounter(0x7F);       //更新计数值


WWDG_ClearFlag();             //清除标志位


}


void SysTickHandler(void)


{   IWDG_ReloadCounter();       //重启计数器(喂狗)


}


j) 注意事项:


i. 有狗平常没事情可以不理,但是千万别忘了喂它,否则死都不知道怎么死的!


ii. 初始化程序的调用一定要在systic的初始化之后。


iii. 独立看门狗需要systic中断来喂,但是systic做别的用处不能只做这件事,所以我写了如下几句代码,可以不影响systic的其他应用,其他systic周期代码也可参考:


第一步:在stm32f10x_it.c中定义变量


int Tic_IWDG;           //喂狗循环程序的频率判断变量


第二步:将SysTickHandler中喂狗代码改为下面:


Tic_IWDG++;          //变量递增


if(Tic_IWDG>=100)    //每100个systic周期喂狗


{   IWDG_ReloadCounter();//重启计数器(喂狗)


   Tic_IWDG=0;       //变量清零


}



关键字:Cortex-M3 引用地址:Cortex-M3 USB的“JoyStickMouse”例程结构分析(二)

上一篇:Cortex-M3 USB的“JoyStickMouse”例程结构分析(一)
下一篇:STM32的DMA演示,USART

推荐阅读最新更新时间:2024-03-16 15:43

USB电池充电规范1.2版概述及适配器仿真器重要性
  引言   无论您身处何处,环顾四周时,很可能会看到有人正在使用便携式设备。无论是在家里、车上还是插入到计算机,USB供电的便携设备均需要采用智能方法确定正常工作以及充电所需的合适功率。由于便携设备种类繁多、USB端口千差万别以及可充电电池的特性复杂,2010年颁布的USB电池充电规范1.2版 (简称为BC1.2) 成为建立通过USB端口为电池充电的正确方式的关键标准。但是,即使有了BC1.2规范,有些便携设备制造商仍然采用专有的充电器,使得USB电池充电领域更为复杂。   本文讨论USB电池充电最新行业标准的推动力及其定义的技术规范,也给出了实现对各种专有便携充电设备进行大电流充电的USB端口的简单策略。   电池充电标
[电源管理]
<font color='red'>USB</font>电池充电规范1.2版概述及适配器仿真器<font color='red'>的</font>重要性
STM32(Cortex-M3)启动过程+IAR中xcl及icf文件详解
一:STM32(Cortex-M3)启动过程(入口地址) ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的。 Cortex-M3内核规定中断向量表中第一个32位数据内容为栈顶地址,第二个32位数据内容则是复位中断向量的入口地址。 这样CPU复位后会自动从中断向量表中第二个32位数据中取出复位中断向量的入口地址,PC就跳转到中断服务程序。这也就是为什么调试的时候程序会直接跳到0x08000144(中断向量表中第二个32位数据为0x08000145),而不是停在0x08000000。 Cortex-M3的中断向量表的结构是固定的,而位置的地址是可
[单片机]
采用Cortex-M3单片机设计WiFi物联网小车
  WiFi物联网小车设计方案,采用电脑上位机软件通过无线WiFi 控制小车的运动,采集小车的信息。与传统的“智能小车”相比,主要特点在于使用32 位高性能单片机控制、互联网通信机制和电脑上位机软件控制。此方案融合了电脑软件、网络通信、图像处理、图形显示、运动控制、速度采集和温度采集等技术,具有“物联网”的相关特点。传统的小车控制大多使用红外通信,使用遥控器进行控制,不但受到距离的限制,而且远没有电脑软件直观美观。互联网通信使小车具备远程控制的能力,这是红外通信望尘莫及的。此外,本方案小车控制芯片采用Cortex-M3单片机,该单片机具有极丰富的外设,这给小车以后功能升级和扩展奠定了基础。   1 总体设计方案   WiFi 物联
[电源管理]
采用<font color='red'>Cortex-M3</font>单片机设计<font color='red'>的</font>WiFi物联网小车
安捷伦推出业界最低价位USB 2.0 信号质量测试选件
北京,2013 年 2 月4 日——安捷伦科技有限公司(NYSE: A)日前宣布推出业内最低价位的 USB 2.0 信号质量测试选件。适用于 InfiniiVision 4000 X 系列示波器,支持低速、全速和高速的 USB2.0 应用。USB2.0 接口目前已广泛用于计算机和嵌入式电子产品中。 长期以来,示波器一直是电气工程师验证USB2.0设计信号完整性的主要工具。在 Agilent InfiniiVision 4000 X 系列示波器上安装新的 DSOX4USBSQ 信号质量测试选件后,您可以根据USB-IF标准来快速验证 USB 的信号质量,不管它是集线器、主机还是器件。 嵌入式电子产品工程师一般不会进行正式的 US
[测试测量]
取自USB端口电源电路
     每台PC都有一个USB(通用串行总线)端口,它可以为外设提供500 mA的5V±5%供电。带电源的USB集线器也能提供这种供电能力。用USB端口可以为外部电路供电,在没有其它直流电源的情况下,这种方式很有用。   USB端口中有电源脚VBUS;返回脚GND(地);和两个信号管脚。如果只需要一个5V电源,可以从USB连接器中接出电源脚,但应在电源与地脚之间放一个10μF的滤波电容。   不过,通过一个可调稳压器,还可以获得1.25V?3.75V的电压,大多数电路都使用这个范围。图1中的电路就覆盖了这个区间。通过R3可改变这个区间,如下式所示:VOUT=1.25V×(1+R3/R2)。式中的1.25V出现的原因是LM
[嵌入式]
锁定USB接口几种办法
很多公司都不允许员工利用USB接口把公司的重要文件拷贝回家。但是如何既方便又彻底地锁定USB接口却是一个很难很难的问题。难在哪里?难就难在“既方便又彻底”这六个字上面!目前网上能够找到的无非是以下几种办法:     办法一:修改组策略或注册表     通过修改组策略或注册表,可以禁止访问某些特定盘符的U盘。但是懂点组策略和注册表知识的员工可以轻轻松松地取消对U盘的限制。所以实际上没什么用处。老板不会采取这种办法。     办法二:修改BIOS设置,禁止使用USB设备     在BIOS里面,把USB设备设置为disable。然后为BIOS设一个登录密码,员工就无法使用优盘了。这一招很猛,老板比较满意。但是,这么一来,USB鼠标和US
[嵌入式]
数字温温度记录仪中USB主机设计
引 言 在USB拓扑结构中PC机扮演着核心作用,没有PC机的参与,USB设备将无用武之地;但随着USB-OTG规范的提出和USB主机接口芯片的产出,USB主机逐渐应用到各种场合中,如数码伴侣、打印机等。目前,大多数的温湿度记录仪都是通过单片机的A/D模块多次采样.经过软件滤波,得到一个均值,然后再通过模拟传感器的数据校正表换算出实际的温湿度,而且都是通过串口与上位机进行通信,上位机需要编写一个数据分析软件来设置记录仪的工作模式,并对记录的历史数据进行分析与处理。根据对以往记录仪的分析和对USB-OTG技术的深入研究,提出了数字温湿度记录仪系统中USB主机设计的实现方案。将USB主机嵌入到数字温湿度记录仪系统中,把对记录仪的设置预
[传感技术]
基于USB 2.0集成芯片H.264解码器芯片设计
H.264/AVC标准具有一系列优于MPEG4和H.263的新特性,在相同的重建图像质量下,H.264比H.263节约50%左右的码率。但是节约码率的代价是增加了算法复杂度。由于仅用软件已经无法实现实时地解码过程。所以必须利用硬件加速,这正是本解码器设计的初衷。 虽然H.264相较同质量的H.263图像,码率节约一半,但是由于本解码器的目标是解决H.264的高清图像(1080i)的解码工作,同时也要适用于普遍的视频外设,所以选用的接口既需要完成高速的码流源文件的传输工作也要易于插拔。而USB接口恰好符合这两个条件。高质量的源码文件数据量较大,对传输接口要求较高。并且在FPGA的仿真环境下,USB接口还要担负起向PC上位机回
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved