好吧,从明天起开始更新官方提供的stm32cubemx实验程序的ioc文件设置和全程验证

软件教程ippouch 回复了问题 • 38 人关注 • 6 个回复 • 7080 次浏览 • 2015-01-13 13:37 • 来自相关话题

TL431的基本应用电路和几种不常见接法

其他分享admin 发表了文章 • 1 个评论 • 886 次浏览 • 2015-01-10 16:16 • 来自相关话题

熟悉电路制作的人大多对TL431并不陌生。由于TL431的动态抗阻的特性,其经常在电路设计当中被用于替代稳压二极管。不仅如此,TL431的开态响应速度快输出噪音低,并且价格低廉。因此受到电源工程师和初学者们大力好评。本篇文章主要为大家介绍了TL431的基本应用电路和几种并不常见的接法,并进行了讲解。

图(1)是TL431的典型接法,输出一个固定电压值,计算公式是: Vout = (R1+R2)*2.5/R2,同时R3的数值应该满足1mA < (Vcc-Vout)/R3 < 500mA。

当R1取值为0的时候,R2可以省略,这时候电路变成图(2)的形式,TL431在这里相当于一个2.5V稳压管。

利用TL431还可以组成鉴幅器,如图(3),这个电路在输入电压 Vin < (R1+R2)2.5/R2 的时候输出Vout为高电平,反之输出接近2V的电平。需要注意的是当Vin在(R1+R2)2.5/R2附近以微小幅度波动的时候,电路会输出不稳定的值。

TL431可以用来提升一个近地电压,并且将其反相。如图(4),输出计算公式为: Vout = ( (R1+R2)2.5 - R1Vin )/R2。

当R1 = R2的时候,Vout = 5 - Vin。这个电路可以用来把一个接近地的电压提升到一个可以预先设定的范围内,唯一需要注意的是TL431的输出范围不是满幅的。

TL431自身有相当高的增益(我在仿真中粗略测试,有大概46db),所以可以用作放大器。

图(5)显示了一个用TL431组成的直流电压放大器,这个电路的放大倍数由R1和Rin决定,相当于运放的负反馈回路,而其静态输出电压由R1和R2决定。 这个电路的优点在于,它结构简单,精度也不错,能够提供稳定的静态特性。缺点是输入阻抗较小,Vout的摆幅有限。

图(6)是交流放大器,这个结构和直流放大器很相似,而且具有同样的优缺点。我正在尝试用这个放大器代替次级运放来放大热释红外传感器的输出信号。

经过本篇文章的讲解,大家肯定对TL431的应用电路有了初步的认识,并且对TL431的一些优点和缺点有了自己的看法。希望通过此篇文章能让各位电源新手们对TL431有更多的理解。


一个简单的有限范围电压防反接电路: 查看全部
熟悉电路制作的人大多对TL431并不陌生。由于TL431的动态抗阻的特性,其经常在电路设计当中被用于替代稳压二极管。不仅如此,TL431的开态响应速度快输出噪音低,并且价格低廉。因此受到电源工程师和初学者们大力好评。本篇文章主要为大家介绍了TL431的基本应用电路和几种并不常见的接法,并进行了讲解。

图(1)是TL431的典型接法,输出一个固定电压值,计算公式是: Vout = (R1+R2)*2.5/R2,同时R3的数值应该满足1mA < (Vcc-Vout)/R3 < 500mA。

当R1取值为0的时候,R2可以省略,这时候电路变成图(2)的形式,TL431在这里相当于一个2.5V稳压管。

利用TL431还可以组成鉴幅器,如图(3),这个电路在输入电压 Vin < (R1+R2)2.5/R2 的时候输出Vout为高电平,反之输出接近2V的电平。需要注意的是当Vin在(R1+R2)2.5/R2附近以微小幅度波动的时候,电路会输出不稳定的值。

TL431可以用来提升一个近地电压,并且将其反相。如图(4),输出计算公式为: Vout = ( (R1+R2)2.5 - R1Vin )/R2。

当R1 = R2的时候,Vout = 5 - Vin。这个电路可以用来把一个接近地的电压提升到一个可以预先设定的范围内,唯一需要注意的是TL431的输出范围不是满幅的。

TL431自身有相当高的增益(我在仿真中粗略测试,有大概46db),所以可以用作放大器。

图(5)显示了一个用TL431组成的直流电压放大器,这个电路的放大倍数由R1和Rin决定,相当于运放的负反馈回路,而其静态输出电压由R1和R2决定。 这个电路的优点在于,它结构简单,精度也不错,能够提供稳定的静态特性。缺点是输入阻抗较小,Vout的摆幅有限。

图(6)是交流放大器,这个结构和直流放大器很相似,而且具有同样的优缺点。我正在尝试用这个放大器代替次级运放来放大热释红外传感器的输出信号。

经过本篇文章的讲解,大家肯定对TL431的应用电路有了初步的认识,并且对TL431的一些优点和缺点有了自己的看法。希望通过此篇文章能让各位电源新手们对TL431有更多的理解。


一个简单的有限范围电压防反接电路:

有哪个用cube搞定NAND的flash操作了?头大,求方法或程序......

问题困惑admin 回复了问题 • 2 人关注 • 3 个回复 • 2794 次浏览 • 2015-01-06 10:28 • 来自相关话题

这次准备利用stm32cube的库移植CANopen通信协议,有人已经移植出来的吗?能否共享看看呢?

回复

经验分享admin 回复了问题 • 1 人关注 • 1 个回复 • 1836 次浏览 • 2015-01-03 13:08 • 来自相关话题

(转)一种简单实用的双向电平转换电路的分析3.3V--5V(非常实用!)

经验分享admin 发表了文章 • 2 个评论 • 1379 次浏览 • 2015-01-03 11:37 • 来自相关话题

下图中,S1,S2为两个信号端,VCC_S1和VCC_S2为这两个信号的高电平电压.另外限制条件为:
1,VCC_S1<=VCC_S2.
2,S1的低电平门限大于0.7V左右(视NMOS内的二极管压降而定).
3,Vgs<=VCC_S1.
4,Vds<=VCC_S2
对于3.3V和5V/12V等电路的相互转换,NMOS管选择AP2306即可.原理比较简单,大家自行分析吧!此电路我已在多处应用,效果很好.

这个电路确实比较好,尤其是在i2c电平转换,或者总线上电平转换,效果不错。
我曾在mcu和cd之间的数据总线上用过,当时记得是5vmcu3.3v CD,不过这个电路还是基于OC上拉原理,当速度大于1M以上时,波形上升沿应该会有失真。





还有一种类似的电路应用
如下图:





分析资料如下:
电平转换器的操作
在电平转换器的操作中要考虑下面的三种状态:
1 没有器件下拉总线线路。“低电压”部分的总线线路通过上拉电阻Rp 上拉至3.3V。 MOS-FET 管的门极和源极都是3.3V, 所以它的VGS 低于阀值电压,MOS-FET 管不导通。这就允许“高电压”部分的总线线路通过它的上拉电阻Rp 拉到5V。 此时两部分的总线线路都是高电平,只是电压电平不同。

2 一个3.3V 器件下拉总线线路到低电平。MOS-FET 管的源极也变成低电平,而门极是3.3V。 VGS上升高于阀值,MOS-FET 管开始导通。然后“高电压”部分的总线线路通过导通的MOS-FET管被3.3V 器件下拉到低电平。此时,两部分的总线线路都是低电平,而且电压电平相同。
3 一个5V 的器件下拉总线线路到低电平。MOS-FET 管的漏极基底二极管“低电压”部分被下拉直到VGS 超过阀值,MOS-FET 管开始导通。“低电压”部分的总线线路通过导通的MOS-FET 管被5V 的器件进一步下拉到低电平。此时,两部分的总线线路都是低电平,而且电压电平相同。

这三种状态显示了逻辑电平在总线系统的两个方向上传输,与驱动的部分无关。状态1 执行了电平转换功能。状态2 和3 按照I2C 总线规范的要求在两部分的总线线路之间实现“线与”的功能。

除了3.3V VDD1 和5V VDD2 的电源电压外,还可以是例如:2V VDD1 和10V VDD2。 在正常操作中,VDD2必须等于或高于VDD1( 在开关电源时允许VDD2 低于VDD1)。 查看全部
下图中,S1,S2为两个信号端,VCC_S1和VCC_S2为这两个信号的高电平电压.另外限制条件为:
1,VCC_S1<=VCC_S2.
2,S1的低电平门限大于0.7V左右(视NMOS内的二极管压降而定).
3,Vgs<=VCC_S1.
4,Vds<=VCC_S2
对于3.3V和5V/12V等电路的相互转换,NMOS管选择AP2306即可.原理比较简单,大家自行分析吧!此电路我已在多处应用,效果很好.

这个电路确实比较好,尤其是在i2c电平转换,或者总线上电平转换,效果不错。
我曾在mcu和cd之间的数据总线上用过,当时记得是5vmcu3.3v CD,不过这个电路还是基于OC上拉原理,当速度大于1M以上时,波形上升沿应该会有失真。

ourdev_655284STMHVU.jpg

还有一种类似的电路应用
如下图:

ourdev_655406GBZ82V.jpg

分析资料如下:
电平转换器的操作
在电平转换器的操作中要考虑下面的三种状态:
1 没有器件下拉总线线路。“低电压”部分的总线线路通过上拉电阻Rp 上拉至3.3V。 MOS-FET 管的门极和源极都是3.3V, 所以它的VGS 低于阀值电压,MOS-FET 管不导通。这就允许“高电压”部分的总线线路通过它的上拉电阻Rp 拉到5V。 此时两部分的总线线路都是高电平,只是电压电平不同。

2 一个3.3V 器件下拉总线线路到低电平。MOS-FET 管的源极也变成低电平,而门极是3.3V。 VGS上升高于阀值,MOS-FET 管开始导通。然后“高电压”部分的总线线路通过导通的MOS-FET管被3.3V 器件下拉到低电平。此时,两部分的总线线路都是低电平,而且电压电平相同。
3 一个5V 的器件下拉总线线路到低电平。MOS-FET 管的漏极基底二极管“低电压”部分被下拉直到VGS 超过阀值,MOS-FET 管开始导通。“低电压”部分的总线线路通过导通的MOS-FET 管被5V 的器件进一步下拉到低电平。此时,两部分的总线线路都是低电平,而且电压电平相同。

这三种状态显示了逻辑电平在总线系统的两个方向上传输,与驱动的部分无关。状态1 执行了电平转换功能。状态2 和3 按照I2C 总线规范的要求在两部分的总线线路之间实现“线与”的功能。

除了3.3V VDD1 和5V VDD2 的电源电压外,还可以是例如:2V VDD1 和10V VDD2。 在正常操作中,VDD2必须等于或高于VDD1( 在开关电源时允许VDD2 低于VDD1)。

关于FreeRTOS的设置分析和官方例程实验

回复

软件教程admin 发起了问题 • 5 人关注 • 0 个回复 • 3093 次浏览 • 2014-12-31 17:17 • 来自相关话题

关于看门狗WWDG的一些东西.(过年了,整些简单的吧)

回复

问题困惑admin 回复了问题 • 2 人关注 • 3 个回复 • 2266 次浏览 • 2014-12-31 11:20 • 来自相关话题

您好,您最近有没有研究用Cube配置以太网通信呢

问题困惑lx09110718 回复了问题 • 2 人关注 • 3 个回复 • 1396 次浏览 • 2014-12-31 10:19 • 来自相关话题

滴答时钟计时修改systick记录

回复

经验分享admin 回复了问题 • 1 人关注 • 1 个回复 • 1928 次浏览 • 2014-12-31 10:07 • 来自相关话题

转载一篇usb_hid的文章,来自捷克的一个电子论坛,用google翻译的,耐心看吧

经验分享admin 发表了文章 • 0 个评论 • 4521 次浏览 • 2014-12-30 09:52 • 来自相关话题

国外的电子论坛的作品,捷克语,翻译来的...
今天的作品的内容是USB HID。 HID我们已经讨论过,它是USB设备的类别之一。的优点是,HID是Windows的一个通用的组成部分,因此,就不需要驱动器和连接到PC的装置。这就是为什么我喜欢的虚拟USB串口选择HID实施的第二个实际的例子。
介绍

HID,因为我们讨论了我的各种装备。你可以让鼠标套件,这将是在屏幕上平移光标(如演示套件为例)或键盘,它允许你打开文件直接写入测量值。然而,在实践中,往往你可能会使用HID称,自定义页面,因此,它不会是一个“正常的装置”,但他们没有把它定义将如何表现,让PC控制,并从设备接收数据为您服务。

HID具有除的优势,一些缺点。缺点是由于这类USB设备的定义。 HID主要用于与人沟通 - 这是非常缓慢的外设相比,今天的计算机。所以HID设备只发送少量数据和缓慢的。然而,对于我们的许多应用中可能是足够的。我注意到在事先有人试图实现使用HID类,例如,逻辑分析仪或示波器,然后是惊讶,收集的数据不能传送到PC上。相反地,HID是适合于需要测量温度,电压,或从时间到时间的设备,以要求其它的当前值,或甚至USB字符显示到不时发送一些值。应用程序通过ST“USB HID演示”很好地展示了与HID沟通的可能性。在PC上运行的USB HID演示应用程序,点击图标点亮LED也对套件,反之亦然,当你按下工具包,让你出现在屏幕上相应的变化。它也发送来自AD转换器的一个值。所以数据并不多,但是当你编写自己的程序在PC上,这样你就不必想知道一些特殊的USB驱动程序,当编写应用程序的PC将使用一个简单的通用库,你přilinkujete他们的计划。但它会发现,在未来的一部分。在这一部分中,您将验证使用的是USB HID演示的功能。


实现

正如上面写的,我用这个软件的ST(USB HID演示),但它必须设置。第一USB HID演示下载(链接在最后),并安装它。第一次运行之后(你翻译这个演示工具包和连接第二USB电缆连接到PC之前)设置如下:





巴赫到VariableInput1他是06!在VariableOutput实现我走了,但你当然可以使用D/ A转换器产生一个相应的电压。无论如何,你可以尝试一下功课,谁可以先做到这一点,所以获得STM32F的一个样本。

设置完成后,您可以切换到正常的图形模式,然后你可以转换演示。仍有一些bug(有些嗡嗡声使整数赋给指针,未作类型转换等,但你也知道,基切食者warnigy不这样做,因此,有些跟你说实话可以对其进行编辑),但更主要的是,它的作品。我希望如此。因为我还没有尝试过这种测量A / D转换器引脚PA1,但我希望它的工作原理(并要求确认在评论中,如果有人测试过)。

至于其他MCU的实施和自然再利用STM32F4探索套件,它通过两个USB线与PC连接,如部分描述了USB虚拟串口。即使这个演示应用程序是用Atollic TrueSTUDIO这样你就可以将它解压缩,并将其导入您的环境。我们试图编写应用程序,因此您可以在IAR和Keil使用它,但因为没有这些环境不目前在PC,所以我没有检查导入功能。

翻译应用程序启动调试TrueSTUDIO,它被装载到MCU固件后,您F8,这是你运行了该程序的简历。在PC应该跳的连接到新的硬件(HID)和枚举后的图标,你会看到“控制面板 - 系统 - 硬件 - 设备管理器”中,你开始一个新的USB设备列表的末尾。这只是验证USB HID正确介绍。然后您可以点击USB HID演示和挤压USER按钮(蓝色),以STM32F4探索套件,它应该工作。我的意思是,当你按下USER按钮,表格USB HID演示看看它是如何变成绿色圆圈,左,反之亦然,通过PC屏幕上的表单弹将点亮LED的套件。在屏幕上,它看起来像下图。





在SW细节

我出来的时候自然地从现有的演示,STM32F4探索,它实现了HID鼠标。然而,鼠标只发送数据,并且不接受任何东西,所以我不得不注册谱写新的功能USBD_HID_DataOut。注册我进行如下:


USBD_Class_cb_TypeDef USBD_HID_cb =
{
USBD_HID_Init,
USBD_HID_DeInit,
USBD_HID_Setup,
NULL, /[i]EP0_TxSent[/i]/
NULL, /[i]EP0_RxReady[/i]/
USBD_HID_DataIn, /[i]DataIn[/i]/
/[i] NULL,[/i]/
USBD_HID_DataOut, /[i]DataOut[/i]/
NULL, /[i]SOF [/i]/
NULL,
NULL,
USBD_HID_GetCfgDesc,
#ifdef USB_OTG_HS_CORE
USBD_HID_GetCfgDesc, /[i] use same config as per FS [/i]/
#endif
};

函数如下:


/**
* @brief USBD_HID_DataOut
* handle data OUT Stage
* @param pdev: device instance
* @param epnum: endpoint index
* @retval status
*/
static uint8_t USBD_HID_DataOut (void *pdev, uint8_t epnum)
{
uint16_t USB_RecData_Cnt;
BitAction Led_State;
if (epnum == HID_OUT_EP)
{
/[i] Get the received data buffer and update the counter [/i]/
USB_RecData_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count;
/* USB data will be immediately processed, this allow next USB traffic being
NAKed till the end of the application Xfer */
if (((USB_OTG_CORE_HANDLE*)pdev)->dev.device_status == USB_OTG_CONFIGURED )
{
/[i] predpokladame ze delka = 2 bajty [/i]/
USB_OTG_ReadPacket((USB_OTG_CORE_HANDLE[i])pdev, [/i]Buffer, HID_OUT_PACKET);
/[i] process the report setting [/i]/
if (Buffer[1] == 0)
Led_State = Bit_RESET;
else
Led_State = Bit_SET;
switch (Buffer[0])
{
case 1: /[i] Led 1 [/i]/
if (Led_State != Bit_RESET)
STM32F4_Discovery_LEDOn(LED3);
else
STM32F4_Discovery_LEDOff(LED3);
break;
case 2: /[i] Led 2 [/i]/
if (Led_State != Bit_RESET)
STM32F4_Discovery_LEDOn(LED4);
else
STM32F4_Discovery_LEDOff(LED4);
break;
case 3: /[i] Led 3 [/i]/
if (Led_State != Bit_RESET)
STM32F4_Discovery_LEDOn(LED5);
else
STM32F4_Discovery_LEDOff(LED5);
break;
case 4: /[i] Led 4 [/i]/
if (Led_State != Bit_RESET)
STM32F4_Discovery_LEDOn(LED6);
else
STM32F4_Discovery_LEDOff(LED6);
break;
default:
STM32F4_Discovery_LEDOff(LED3); /[i] oranzova [/i]/
STM32F4_Discovery_LEDOff(LED4); /[i] zelena [/i]/
STM32F4_Discovery_LEDOff(LED5); /[i] cervena [/i]/
STM32F4_Discovery_LEDOff(LED6); /[i] modra [/i]/
break;
}
/[i] Prepare Out endpoint to receive next packet [/i]/
DCD_EP_PrepareRx(pdev,
HID_OUT_EP,
(uint8_t*)(Buffer),
HID_OUT_PACKET);
}
}
return USBD_OK;
}

你怎么看你自己的代码,因此函数从PC直接处理收到的报告,并没有设置按试剂盒的LED。但是,这是问题的一个方面,即在数据的方向从PC向USB设备。但你也想从一个工具包,以PC发送数据(没有多少那里,只有用户按下按钮,但我们无论如何写)。观察整个事情在main()。


/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
STM32F4_Discovery_LEDInit(LED3);
STM32F4_Discovery_LEDInit(LED4);
STM32F4_Discovery_LEDInit(LED5);
STM32F4_Discovery_LEDInit(LED6);
STM32F4_Discovery_PBInit(BUTTON_USER, BUTTON_MODE_GPIO);

/[i] zapneme LED3 [/i]/
STM32F4_Discovery_LEDOn(LED3); /[i] oranzova [/i]/
Delay(0xFFFF);
STM32F4_Discovery_LEDOff(LED3); /[i] oranzova [/i]/

USBD_Init(&USB_OTG_dev,
#ifdef USE_USB_OTG_HS
USB_OTG_HS_CORE_ID,
#else
USB_OTG_FS_CORE_ID,
#endif
&USR_desc,
&USBD_HID_cb,
&USR_cb);

Init_ADC_Reading();
while (1)
{
if (STM32F4_Discovery_PBGetState(BUTTON_USER) == Bit_SET)
{
/[i] STM32F4_Discovery_LEDOn(LED3); oranzova - debug only [/i]/
if (UserButtonPressed != 0x01)
{
/[i] new action [/i]/
UserButtonPressed = 0x01;
Delay(0xFF);
Buffer[0]=0x05; /[i] report cislo 5 [/i]/
Buffer[1]=0x01;
USBD_HID_SendReport (&USB_OTG_dev, Buffer, 2);
}
}
else
{
/[i] STM32F4_Discovery_LEDOff(LED3); oranzova - debug only[/i]/
if (UserButtonPressed != 0x00)
{
/[i] new action [/i]/
UserButtonPressed = 0x00;
Delay(0xFF);
Buffer[0]=0x05; /[i] report cislo 5 [/i]/
Buffer[1]=0x00;
USBD_HID_SendReport (&USB_OTG_dev, Buffer, 2);
}
}
}
}

操作通信,也不得不写,而不是原来的一个新的报告描述符。新如下所示。


__ALIGN_BEGIN static uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] __ALIGN_END =
{
0x06, 0xFF, 0x00, /[i] USAGE_PAGE (Vendor Page: 0xFF00) [/i]/
0x09, 0x01, /[i] USAGE (Demo Kit) [/i]/
0xA1, 0x01, /[i] COLLECTION (Application) [/i]/
/[i] 6 [/i]/
/[i] Led 1 [/i]/
0x85, 0x01, /[i] REPORT_ID (1) [/i]/
0x09, 0x01, /[i] USAGE (LED 1) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x25, 0x01, /[i] LOGICAL_MAXIMUM (1) [/i]/
0x75, 0x08, /[i] REPORT_SIZE (8) [/i]/
0x95, 0x01, /[i] REPORT_COUNT (1) [/i]/
0xB1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
0x85, 0x01, /[i] REPORT_ID (1) [/i]/
0x09, 0x01, /[i] USAGE (LED 1) [/i]/
0x91, 0x82, /[i] OUTPUT (Data,Var,Abs,Vol) [/i]/
/[i] 26 [/i]/
/[i] Led 2 [/i]/
0x85, 0x02, /[i] REPORT_ID 2 [/i]/
0x09, 0x02, /[i] USAGE (LED 2) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x25, 0x01, /[i] LOGICAL_MAXIMUM (1) [/i]/
0x75, 0x08, /[i] REPORT_SIZE (8) [/i]/
0x95, 0x01, /[i] REPORT_COUNT (1) [/i]/
0xB1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
0x85, 0x02, /[i] REPORT_ID (2) [/i]/
0x09, 0x02, /[i] USAGE (LED 2) [/i]/
0x91, 0x82, /[i] OUTPUT (Data,Var,Abs,Vol) [/i]/
/[i] 46 [/i]/
/[i] Led 3 [/i]/
0x85, 0x03, /[i] REPORT_ID (3) [/i]/
0x09, 0x03, /[i] USAGE (LED 3) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x25, 0x01, /[i] LOGICAL_MAXIMUM (1) [/i]/
0x75, 0x08, /[i] REPORT_SIZE (8) [/i]/
0x95, 0x01, /[i] REPORT_COUNT (1) [/i]/
0xB1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
0x85, 0x03, /[i] REPORT_ID (3) [/i]/
0x09, 0x03, /[i] USAGE (LED 3) [/i]/
0x91, 0x82, /[i] OUTPUT (Data,Var,Abs,Vol) [/i]/
/[i] 66 [/i]/
/[i] Led 4 [/i]/
0x85, 0x04, /[i] REPORT_ID 4) [/i]/
0x09, 0x04, /[i] USAGE (LED 4) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x25, 0x01, /[i] LOGICAL_MAXIMUM (1) [/i]/
0x75, 0x08, /[i] REPORT_SIZE (8) [/i]/
0x95, 0x01, /[i] REPORT_COUNT (1) [/i]/
0xB1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
0x85, 0x04, /[i] REPORT_ID (4) [/i]/
0x09, 0x04, /[i] USAGE (LED 4) [/i]/
0x91, 0x82, /[i] OUTPUT (Data,Var,Abs,Vol) [/i]/
/[i] 86 [/i]/
/[i] key USER Button [/i]/
0x85, 0x05, /[i] REPORT_ID (5) [/i]/
0x09, 0x05, /[i] USAGE (USER Button) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x25, 0x01, /[i] LOGICAL_MAXIMUM (1) [/i]/
0x75, 0x01, /[i] REPORT_SIZE (1) [/i]/
0x81, 0x82, /[i] INPUT (Data,Var,Abs,Vol) [/i]/
0x09, 0x05, /[i] USAGE (USER Button) [/i]/
0x75, 0x01, /[i] REPORT_SIZE (1) [/i]/
0xb1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
0x75, 0x07, /[i] REPORT_SIZE (7) [/i]/
0x81, 0x83, /[i] INPUT (Cnst,Var,Abs,Vol) [/i]/
0x85, 0x05, /[i] REPORT_ID (5) [/i]/
0x75, 0x07, /[i] REPORT_SIZE (7) [/i]/
0xb1, 0x83, /[i] FEATURE (Cnst,Var,Abs,Vol) [/i]/
/[i] 114 [/i]/
/[i] ADC IN [/i]/
0x85, 0x06, /[i] REPORT_ID (6) [/i]/
0x09, 0x07, /[i] USAGE (ADC IN) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x26, 0xff, 0x00, /[i] LOGICAL_MAXIMUM (255) [/i]/
0x75, 0x08, /[i] REPORT_SIZE (8) [/i]/
0x81, 0x82, /[i] INPUT (Data,Var,Abs,Vol) [/i]/
0x85, 0x06, /[i] REPORT_ID (6) [/i]/
0x09, 0x06, /[i] USAGE (ADC in) [/i]/
0xb1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
/[i] 133 [/i]/
0xc0 /[i] END_COLLECTION [/i]/
}; /[i] CustomHID_ReportDescriptor [/i]/

正如你可以从报告的描述看,所以要控制每一个元素,都必须在报告中恰当的描述。当然还有另一种解决方案 - 编写需要一个30字节的数据包的长度只有一个报告,内容你自己定义一个通用的元素。但是,如果我想使用USB HID演示,所以我不得不坚持要求该报告,在上述声明中表示标准。

结论

我有这个计划,努力不够。而唯一的原因是我的狗屎当我忽视的是,在定义中描述的设备我有一个不正确长度的描述,当然,这导致了他的中间枚举下降。哦耶。好吧,我终于,两天后,他擦额头出汗出现。所以我希望至少有一小的奖励将是我希望这是USB的第一实施HID自定义页面STM32F4探索套件的世界。

接下来的时间,我们将展示如何使用Visual Studio的C#写的东西,如USB HID演示从ST。

如果你认为你的文字和连接演示程序值得你欣赏,你可以提交你的资助。谢谢你提前给大家!你会支持其他文章的出现。
参考

材料HID这里找到。
USB HID演示你下载的ST网站在这里。

这项工作的压缩项目都可以在这里找到。

入门STM32F4套件第一个链接(开发环境等)
入门STM32F4第二连接套件(USB首页)
入门STM32F4第三连接套件(USB枚举)
入门STM32F4套件第四连接(USB虚拟COM口)
Modifikce USB HID的STM32F103链接
入门STM32F4套件第五连杆(端口名称,选择功能)
与STM32F4套件第六连杆(VGA显示器)入门

补充

尽管如此,我忘了写了A / D转换器,一个试剂盒PC的价值将中断触发时,ADC转换完成的文本。因此,它可以在处理程序的中断中找到。

本文转自:http://mcu.cz/comment-n2848.html

本文配套的图示软件,在本站百度网盘中可以找到 !请自行下载 ! 查看全部
国外的电子论坛的作品,捷克语,翻译来的...
今天的作品的内容是USB HID。 HID我们已经讨论过,它是USB设备的类别之一。的优点是,HID是Windows的一个通用的组成部分,因此,就不需要驱动器和连接到PC的装置。这就是为什么我喜欢的虚拟USB串口选择HID实施的第二个实际的例子。
介绍

HID,因为我们讨论了我的各种装备。你可以让鼠标套件,这将是在屏幕上平移光标(如演示套件为例)或键盘,它允许你打开文件直接写入测量值。然而,在实践中,往往你可能会使用HID称,自定义页面,因此,它不会是一个“正常的装置”,但他们没有把它定义将如何表现,让PC控制,并从设备接收数据为您服务。

HID具有除的优势,一些缺点。缺点是由于这类USB设备的定义。 HID主要用于与人沟通 - 这是非常缓慢的外设相比,今天的计算机。所以HID设备只发送少量数据和缓慢的。然而,对于我们的许多应用中可能是足够的。我注意到在事先有人试图实现使用HID类,例如,逻辑分析仪或示波器,然后是惊讶,收集的数据不能传送到PC上。相反地,HID是适合于需要测量温度,电压,或从时间到时间的设备,以要求其它的当前值,或甚至USB字符显示到不时发送一些值。应用程序通过ST“USB HID演示”很好地展示了与HID沟通的可能性。在PC上运行的USB HID演示应用程序,点击图标点亮LED也对套件,反之亦然,当你按下工具包,让你出现在屏幕上相应的变化。它也发送来自AD转换器的一个值。所以数据并不多,但是当你编写自己的程序在PC上,这样你就不必想知道一些特殊的USB驱动程序,当编写应用程序的PC将使用一个简单的通用库,你přilinkujete他们的计划。但它会发现,在未来的一部分。在这一部分中,您将验证使用的是USB HID演示的功能。


实现

正如上面写的,我用这个软件的ST(USB HID演示),但它必须设置。第一USB HID演示下载(链接在最后),并安装它。第一次运行之后(你翻译这个演示工具包和连接第二USB电缆连接到PC之前)设置如下:

hiddemonstrator.png

巴赫到VariableInput1他是06!在VariableOutput实现我走了,但你当然可以使用D/ A转换器产生一个相应的电压。无论如何,你可以尝试一下功课,谁可以先做到这一点,所以获得STM32F的一个样本。

设置完成后,您可以切换到正常的图形模式,然后你可以转换演示。仍有一些bug(有些嗡嗡声使整数赋给指针,未作类型转换等,但你也知道,基切食者warnigy不这样做,因此,有些跟你说实话可以对其进行编辑),但更主要的是,它的作品。我希望如此。因为我还没有尝试过这种测量A / D转换器引脚PA1,但我希望它的工作原理(并要求确认在评论中,如果有人测试过)。

至于其他MCU的实施和自然再利用STM32F4探索套件,它通过两个USB线与PC连接,如部分描述了USB虚拟串口。即使这个演示应用程序是用Atollic TrueSTUDIO这样你就可以将它解压缩,并将其导入您的环境。我们试图编写应用程序,因此您可以在IAR和Keil使用它,但因为没有这些环境不目前在PC,所以我没有检查导入功能。

翻译应用程序启动调试TrueSTUDIO,它被装载到MCU固件后,您F8,这是你运行了该程序的简历。在PC应该跳的连接到新的硬件(HID)和枚举后的图标,你会看到“控制面板 - 系统 - 硬件 - 设备管理器”中,你开始一个新的USB设备列表的末尾。这只是验证USB HID正确介绍。然后您可以点击USB HID演示和挤压USER按钮(蓝色),以STM32F4探索套件,它应该工作。我的意思是,当你按下USER按钮,表格USB HID演示看看它是如何变成绿色圆圈,左,反之亦然,通过PC屏幕上的表单弹将点亮LED的套件。在屏幕上,它看起来像下图。

hiddemonstrator2.png

在SW细节

我出来的时候自然地从现有的演示,STM32F4探索,它实现了HID鼠标。然而,鼠标只发送数据,并且不接受任何东西,所以我不得不注册谱写新的功能USBD_HID_DataOut。注册我进行如下:


USBD_Class_cb_TypeDef USBD_HID_cb =
{
USBD_HID_Init,
USBD_HID_DeInit,
USBD_HID_Setup,
NULL, /[i]EP0_TxSent[/i]/
NULL, /[i]EP0_RxReady[/i]/
USBD_HID_DataIn, /[i]DataIn[/i]/
/[i] NULL,[/i]/
USBD_HID_DataOut, /[i]DataOut[/i]/
NULL, /[i]SOF [/i]/
NULL,
NULL,
USBD_HID_GetCfgDesc,
#ifdef USB_OTG_HS_CORE
USBD_HID_GetCfgDesc, /[i] use same config as per FS [/i]/
#endif
};

函数如下:


/**
* @brief USBD_HID_DataOut
* handle data OUT Stage
* @param pdev: device instance
* @param epnum: endpoint index
* @retval status
*/
static uint8_t USBD_HID_DataOut (void *pdev, uint8_t epnum)
{
uint16_t USB_RecData_Cnt;
BitAction Led_State;
if (epnum == HID_OUT_EP)
{
/[i] Get the received data buffer and update the counter [/i]/
USB_RecData_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count;
/* USB data will be immediately processed, this allow next USB traffic being
NAKed till the end of the application Xfer */
if (((USB_OTG_CORE_HANDLE*)pdev)->dev.device_status == USB_OTG_CONFIGURED )
{
/[i] predpokladame ze delka = 2 bajty [/i]/
USB_OTG_ReadPacket((USB_OTG_CORE_HANDLE[i])pdev, [/i]Buffer, HID_OUT_PACKET);
/[i] process the report setting [/i]/
if (Buffer[1] == 0)
Led_State = Bit_RESET;
else
Led_State = Bit_SET;
switch (Buffer[0])
{
case 1: /[i] Led 1 [/i]/
if (Led_State != Bit_RESET)
STM32F4_Discovery_LEDOn(LED3);
else
STM32F4_Discovery_LEDOff(LED3);
break;
case 2: /[i] Led 2 [/i]/
if (Led_State != Bit_RESET)
STM32F4_Discovery_LEDOn(LED4);
else
STM32F4_Discovery_LEDOff(LED4);
break;
case 3: /[i] Led 3 [/i]/
if (Led_State != Bit_RESET)
STM32F4_Discovery_LEDOn(LED5);
else
STM32F4_Discovery_LEDOff(LED5);
break;
case 4: /[i] Led 4 [/i]/
if (Led_State != Bit_RESET)
STM32F4_Discovery_LEDOn(LED6);
else
STM32F4_Discovery_LEDOff(LED6);
break;
default:
STM32F4_Discovery_LEDOff(LED3); /[i] oranzova [/i]/
STM32F4_Discovery_LEDOff(LED4); /[i] zelena [/i]/
STM32F4_Discovery_LEDOff(LED5); /[i] cervena [/i]/
STM32F4_Discovery_LEDOff(LED6); /[i] modra [/i]/
break;
}
/[i] Prepare Out endpoint to receive next packet [/i]/
DCD_EP_PrepareRx(pdev,
HID_OUT_EP,
(uint8_t*)(Buffer),
HID_OUT_PACKET);
}
}
return USBD_OK;
}

你怎么看你自己的代码,因此函数从PC直接处理收到的报告,并没有设置按试剂盒的LED。但是,这是问题的一个方面,即在数据的方向从PC向USB设备。但你也想从一个工具包,以PC发送数据(没有多少那里,只有用户按下按钮,但我们无论如何写)。观察整个事情在main()。


/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
STM32F4_Discovery_LEDInit(LED3);
STM32F4_Discovery_LEDInit(LED4);
STM32F4_Discovery_LEDInit(LED5);
STM32F4_Discovery_LEDInit(LED6);
STM32F4_Discovery_PBInit(BUTTON_USER, BUTTON_MODE_GPIO);

/[i] zapneme LED3 [/i]/
STM32F4_Discovery_LEDOn(LED3); /[i] oranzova [/i]/
Delay(0xFFFF);
STM32F4_Discovery_LEDOff(LED3); /[i] oranzova [/i]/

USBD_Init(&USB_OTG_dev,
#ifdef USE_USB_OTG_HS
USB_OTG_HS_CORE_ID,
#else
USB_OTG_FS_CORE_ID,
#endif
&USR_desc,
&USBD_HID_cb,
&USR_cb);

Init_ADC_Reading();
while (1)
{
if (STM32F4_Discovery_PBGetState(BUTTON_USER) == Bit_SET)
{
/[i] STM32F4_Discovery_LEDOn(LED3); oranzova - debug only [/i]/
if (UserButtonPressed != 0x01)
{
/[i] new action [/i]/
UserButtonPressed = 0x01;
Delay(0xFF);
Buffer[0]=0x05; /[i] report cislo 5 [/i]/
Buffer[1]=0x01;
USBD_HID_SendReport (&USB_OTG_dev, Buffer, 2);
}
}
else
{
/[i] STM32F4_Discovery_LEDOff(LED3); oranzova - debug only[/i]/
if (UserButtonPressed != 0x00)
{
/[i] new action [/i]/
UserButtonPressed = 0x00;
Delay(0xFF);
Buffer[0]=0x05; /[i] report cislo 5 [/i]/
Buffer[1]=0x00;
USBD_HID_SendReport (&USB_OTG_dev, Buffer, 2);
}
}
}
}

操作通信,也不得不写,而不是原来的一个新的报告描述符。新如下所示。


__ALIGN_BEGIN static uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] __ALIGN_END =
{
0x06, 0xFF, 0x00, /[i] USAGE_PAGE (Vendor Page: 0xFF00) [/i]/
0x09, 0x01, /[i] USAGE (Demo Kit) [/i]/
0xA1, 0x01, /[i] COLLECTION (Application) [/i]/
/[i] 6 [/i]/
/[i] Led 1 [/i]/
0x85, 0x01, /[i] REPORT_ID (1) [/i]/
0x09, 0x01, /[i] USAGE (LED 1) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x25, 0x01, /[i] LOGICAL_MAXIMUM (1) [/i]/
0x75, 0x08, /[i] REPORT_SIZE (8) [/i]/
0x95, 0x01, /[i] REPORT_COUNT (1) [/i]/
0xB1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
0x85, 0x01, /[i] REPORT_ID (1) [/i]/
0x09, 0x01, /[i] USAGE (LED 1) [/i]/
0x91, 0x82, /[i] OUTPUT (Data,Var,Abs,Vol) [/i]/
/[i] 26 [/i]/
/[i] Led 2 [/i]/
0x85, 0x02, /[i] REPORT_ID 2 [/i]/
0x09, 0x02, /[i] USAGE (LED 2) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x25, 0x01, /[i] LOGICAL_MAXIMUM (1) [/i]/
0x75, 0x08, /[i] REPORT_SIZE (8) [/i]/
0x95, 0x01, /[i] REPORT_COUNT (1) [/i]/
0xB1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
0x85, 0x02, /[i] REPORT_ID (2) [/i]/
0x09, 0x02, /[i] USAGE (LED 2) [/i]/
0x91, 0x82, /[i] OUTPUT (Data,Var,Abs,Vol) [/i]/
/[i] 46 [/i]/
/[i] Led 3 [/i]/
0x85, 0x03, /[i] REPORT_ID (3) [/i]/
0x09, 0x03, /[i] USAGE (LED 3) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x25, 0x01, /[i] LOGICAL_MAXIMUM (1) [/i]/
0x75, 0x08, /[i] REPORT_SIZE (8) [/i]/
0x95, 0x01, /[i] REPORT_COUNT (1) [/i]/
0xB1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
0x85, 0x03, /[i] REPORT_ID (3) [/i]/
0x09, 0x03, /[i] USAGE (LED 3) [/i]/
0x91, 0x82, /[i] OUTPUT (Data,Var,Abs,Vol) [/i]/
/[i] 66 [/i]/
/[i] Led 4 [/i]/
0x85, 0x04, /[i] REPORT_ID 4) [/i]/
0x09, 0x04, /[i] USAGE (LED 4) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x25, 0x01, /[i] LOGICAL_MAXIMUM (1) [/i]/
0x75, 0x08, /[i] REPORT_SIZE (8) [/i]/
0x95, 0x01, /[i] REPORT_COUNT (1) [/i]/
0xB1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
0x85, 0x04, /[i] REPORT_ID (4) [/i]/
0x09, 0x04, /[i] USAGE (LED 4) [/i]/
0x91, 0x82, /[i] OUTPUT (Data,Var,Abs,Vol) [/i]/
/[i] 86 [/i]/
/[i] key USER Button [/i]/
0x85, 0x05, /[i] REPORT_ID (5) [/i]/
0x09, 0x05, /[i] USAGE (USER Button) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x25, 0x01, /[i] LOGICAL_MAXIMUM (1) [/i]/
0x75, 0x01, /[i] REPORT_SIZE (1) [/i]/
0x81, 0x82, /[i] INPUT (Data,Var,Abs,Vol) [/i]/
0x09, 0x05, /[i] USAGE (USER Button) [/i]/
0x75, 0x01, /[i] REPORT_SIZE (1) [/i]/
0xb1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
0x75, 0x07, /[i] REPORT_SIZE (7) [/i]/
0x81, 0x83, /[i] INPUT (Cnst,Var,Abs,Vol) [/i]/
0x85, 0x05, /[i] REPORT_ID (5) [/i]/
0x75, 0x07, /[i] REPORT_SIZE (7) [/i]/
0xb1, 0x83, /[i] FEATURE (Cnst,Var,Abs,Vol) [/i]/
/[i] 114 [/i]/
/[i] ADC IN [/i]/
0x85, 0x06, /[i] REPORT_ID (6) [/i]/
0x09, 0x07, /[i] USAGE (ADC IN) [/i]/
0x15, 0x00, /[i] LOGICAL_MINIMUM (0) [/i]/
0x26, 0xff, 0x00, /[i] LOGICAL_MAXIMUM (255) [/i]/
0x75, 0x08, /[i] REPORT_SIZE (8) [/i]/
0x81, 0x82, /[i] INPUT (Data,Var,Abs,Vol) [/i]/
0x85, 0x06, /[i] REPORT_ID (6) [/i]/
0x09, 0x06, /[i] USAGE (ADC in) [/i]/
0xb1, 0x82, /[i] FEATURE (Data,Var,Abs,Vol) [/i]/
/[i] 133 [/i]/
0xc0 /[i] END_COLLECTION [/i]/
}; /[i] CustomHID_ReportDescriptor [/i]/

正如你可以从报告的描述看,所以要控制每一个元素,都必须在报告中恰当的描述。当然还有另一种解决方案 - 编写需要一个30字节的数据包的长度只有一个报告,内容你自己定义一个通用的元素。但是,如果我想使用USB HID演示,所以我不得不坚持要求该报告,在上述声明中表示标准。

结论

我有这个计划,努力不够。而唯一的原因是我的狗屎当我忽视的是,在定义中描述的设备我有一个不正确长度的描述,当然,这导致了他的中间枚举下降。哦耶。好吧,我终于,两天后,他擦额头出汗出现。所以我希望至少有一小的奖励将是我希望这是USB的第一实施HID自定义页面STM32F4探索套件的世界。

接下来的时间,我们将展示如何使用Visual Studio的C#写的东西,如USB HID演示从ST。

如果你认为你的文字和连接演示程序值得你欣赏,你可以提交你的资助。谢谢你提前给大家!你会支持其他文章的出现。
参考

材料HID这里找到。
USB HID演示你下载的ST网站在这里。

这项工作的压缩项目都可以在这里找到。

入门STM32F4套件第一个链接(开发环境等)
入门STM32F4第二连接套件(USB首页)
入门STM32F4第三连接套件(USB枚举)
入门STM32F4套件第四连接(USB虚拟COM口)
Modifikce USB HID的STM32F103链接
入门STM32F4套件第五连杆(端口名称,选择功能)
与STM32F4套件第六连杆(VGA显示器)入门

补充

尽管如此,我忘了写了A / D转换器,一个试剂盒PC的价值将中断触发时,ADC转换完成的文本。因此,它可以在处理程序的中断中找到。

本文转自:http://mcu.cz/comment-n2848.html



本文配套的图示软件,在本站百度网盘中可以找到 !请自行下载 !

关于例程中用usb的hid模式和LIS302DL三轴加速度传感器用于joy的一些记录

回复

新手交流admin 回复了问题 • 1 人关注 • 12 个回复 • 2486 次浏览 • 2014-12-26 23:45 • 来自相关话题

(快乐的搬运工)怎样给STM32产品进行加密,利用stm32的唯一ID编码的简单实现!

经验分享admin 发表了文章 • 0 个评论 • 1383 次浏览 • 2014-12-24 09:24 • 来自相关话题

产品唯一的身份标识非常适合:
● 用来作为序列号(例如USB字符序列号或者其他的终端应用)
● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。
● 用来激活带安全机制的自举过程
96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。
这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。
基地址:0x1FFF F7E8
每个CPU 出厂的时候都
配置的一个ID,96 位的.这个唯一码可以利用作软件加密.......


static u32 CpuID[3];
static u32 Lock_Code;
void GetLockCode(void)
{
//获取CPU唯一ID
CpuID[0]=[url=vu32[/i]]i[url=0x1ffff7e8]/url[/url];
CpuID[1]=[url=vu32[/i]]i[url=0x1ffff7ec]/url[/url];
CpuID[2]=[url=vu32[/i]]i[url=0x1ffff7f0]/url[/url];
//加密算法,很简单的加密算法
Lock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);
}


此处内容转自与非网论坛(stmcu.org/module/forum/thread-597912-1-1.html),感谢坛友:小里子
[quote] 多逛论坛,有益身心健康![/quote] 查看全部
产品唯一的身份标识非常适合:
● 用来作为序列号(例如USB字符序列号或者其他的终端应用)
● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。
● 用来激活带安全机制的自举过程
96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。
这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。
基地址:0x1FFF F7E8
每个CPU 出厂的时候都
配置的一个ID,96 位的.这个唯一码可以利用作软件加密.......


static u32 CpuID[3];
static u32 Lock_Code;
void GetLockCode(void)
{
//获取CPU唯一ID
CpuID[0]=[url=vu32[/i]]i[url=0x1ffff7e8]/url[/url];
CpuID[1]=[url=vu32[/i]]i[url=0x1ffff7ec]/url[/url];
CpuID[2]=[url=vu32[/i]]i[url=0x1ffff7f0]/url[/url];
//加密算法,很简单的加密算法
Lock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);
}


此处内容转自与非网论坛(stmcu.org/module/forum/thread-597912-1-1.html),感谢坛友:小里子
[quote] 多逛论坛,有益身心健康!

[/quote]

今天看到一个有趣的问题,如图所示,怎么样判断是哪个按键产生的中断呢?你知道吗

问题困惑admin 发表了文章 • 1 个评论 • 1077 次浏览 • 2014-12-23 20:51 • 来自相关话题

很有意思的一个问题
如下图所示
图中红色框中共有五处管脚,分别是
PC13 , PE13 , PB13 , PD13 , PA13
框框中的几个管脚都是对应的相同的外部中断EXIT13
问题是:
当这几个管脚都分别接一个按钮开关用来做外部中断判断,
做判断后分别用来点亮不同的LED灯.
那么问题来了:
相同的中断怎么去判断究竟是哪个管脚的开关被按下导致的呢?

你知道答案吗?
欢迎讨论 查看全部
很有意思的一个问题
如下图所示
图中红色框中共有五处管脚,分别是
PC13 , PE13 , PB13 , PD13 , PA13
框框中的几个管脚都是对应的相同的外部中断EXIT13
问题是:
当这几个管脚都分别接一个按钮开关用来做外部中断判断,
做判断后分别用来点亮不同的LED灯.
那么问题来了:
相同的中断怎么去判断究竟是哪个管脚的开关被按下导致的呢?

你知道答案吗?
欢迎讨论

d8ce9dd68a77b31e6c044f4c8ea91b60.png

(转载)关于UART中用Printf()输出float型数据

经验分享admin 发表了文章 • 2 个评论 • 1736 次浏览 • 2014-12-23 13:05 • 来自相关话题

在coocox上看到有人问关于Printf打印浮点型数据会输出0或者其他的问题
The code:
printf("float: %f \n\r", 10.02);
Produce that result:
float: H
帖子的楼猪问必须使用printf下怎么输出浮点型数据呢?
斑猪做了回答,代码如下:
The retarget printf don't support print float value now.
目前不支持float型......
然后可以做一些修改使其支持,如下
To printf float argument through UART, Semihosting or other communication method, you cannot use the Retarget Printf component in CoIDE. That component is a simple example for print int, char value.

You can do the followings:

[]Check C Library Component[/]
[]Open syscall/syscall.c, then modify the[/]

int _read(int file, char ptr, int len)
{
return 0;
}
int _write(int file, char ptr, int len)
{
return len;
}

to:
int _read(int file, char ptr, int len) {
int c, rxCount = 0;

(void) file;

while (len--) {
if ((c = GetChar()) != -1) { // Getchar Function need to be replaced by the function you used to get values.
ptr++ = c;
rxCount++;
} else {
break;
}
}

if (rxCount <= 0) {
return -1; / Error exit /
}

return rxCount;
}

int _write(int file, char ptr, int len) {
int txCount;

(void) file;

for (txCount = 0; txCount < len; txCount++) {
SendChar(ptr++); // SendChar Function need to be replaced by the function you used to print values.

}

return len;
}

[]Then you can use printf, scanf or other c library function to print and get value in your project.[/]然后斑猪又提到一点:
The old version often hung up on Win7.

The new version support SWO Trace, and quicker, more stable than the old version.

Different version of firmware need different version of driver.

The virture COM is for SWO trace for M3 chips only (which have ITM function). They cannot be use as UART to USB function.
貌似意思是用usb虚拟串口的话,这样的printf是不能这样用的...................
本文转自coocox论坛,如有冒犯请指出,谢谢 查看全部
在coocox上看到有人问关于Printf打印浮点型数据会输出0或者其他的问题
The code:
printf("float: %f \n\r", 10.02);
Produce that result:
float: H
帖子的楼猪问必须使用printf下怎么输出浮点型数据呢?
斑猪做了回答,代码如下:
The retarget printf don't support print float value now.
目前不支持float型......
然后可以做一些修改使其支持,如下
To printf float argument through UART, Semihosting or other communication method, you cannot use the Retarget Printf component in CoIDE. That component is a simple example for print int, char value.

You can do the followings:

    []Check C Library Component[/]

    []Open syscall/syscall.c, then modify the[/]


int _read(int file, char ptr, int len)
{
return 0;
}
int _write(int file, char ptr, int len)
{
return len;
}

to:
int _read(int file, char ptr, int len) {
int c, rxCount = 0;

(void) file;

while (len--) {
if ((c = GetChar()) != -1) { // Getchar Function need to be replaced by the function you used to get values.
ptr++ = c;
rxCount++;
} else {
break;
}
}

if (rxCount <= 0) {
return -1; / Error exit /
}

return rxCount;
}

int _write(int file, char ptr, int len) {
int txCount;

(void) file;

for (txCount = 0; txCount < len; txCount++) {
SendChar(ptr++); // SendChar Function need to be replaced by the function you used to print values.

}

return len;
}

    []Then you can use printf, scanf or other c library function to print and get value in your project.[/]
然后斑猪又提到一点:
The old version often hung up on Win7.

The new version support SWO Trace, and quicker, more stable than the old version.

Different version of firmware need different version of driver.

The virture COM is for SWO trace for M3 chips only (which have ITM function). They cannot be use as UART to USB function.
貌似意思是用usb虚拟串口的话,这样的printf是不能这样用的...................
本文转自coocox论坛,如有冒犯请指出,谢谢

cubemax使用stm32f103vb创建简单的led例程错误

问题困惑codesys 回复了问题 • 3 人关注 • 2 个回复 • 1424 次浏览 • 2014-12-21 10:48 • 来自相关话题