HAL库里面为什么没有 GPIO_Write 类似的功能函数呀

问题困惑中子星 回复了问题 • 2 人关注 • 2 个回复 • 1505 次浏览 • 2015-01-29 07:15 • 来自相关话题

福音:stm32Cubemx支持F1系列了,已经有库可以更新了!下载地址见本站网盘

其他分享王建 回复了问题 • 5 人关注 • 1 个回复 • 2386 次浏览 • 2015-01-27 12:54 • 来自相关话题

cube HAL库同以前的标准库

问题困惑admin 回复了问题 • 2 人关注 • 1 个回复 • 1418 次浏览 • 2015-01-23 12:50 • 来自相关话题

哎哟,我去!今天才发现个定时器TIM的问题,计数UP的时候Period不能是0,要不然不能中断

经验分享mantishell 回复了问题 • 3 人关注 • 2 个回复 • 4517 次浏览 • 2015-01-21 22:51 • 来自相关话题

(转)单片机/嵌入式上位机编程工具哪个好用?

问题困惑admin 发表了文章 • 5 个评论 • 1518 次浏览 • 2015-01-20 21:29 • 来自相关话题

目前用在单片机嵌入式上位机编程的开发工具有很多,让很多刚入门的工程师们无所适从。那么用来编写单片机嵌入式上位机的工具有那几款呢?
(1)LabVIEW:是NI推出的,和C和BASIC开发环境类似,但是LabVIEW与其他计算机语言有很大区别,其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。特点是:采用了通用的硬件,可以通过改变软件在计算机上实现多种仪器的功能。被公认为测试之王。
(2)VB:是由Microsoft公司开发的结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。

(3)VS:它是微软提供的一个工具集,由各种各样的工具组成。VS可以支持C/C++、VB、JAVA、C#编程。然了一次只能支持一种编程方式。在VS安装完成,第一次运行的时候会让你选择常用语言,如果你选择C/C++,那么他就成了能够进行C/C++编程的平台也许就是你所说的VC了。如果不想用C/C++的话,只需要修改一下他的初始化设置,选择别的编程语言,就成为了另一种的语言的编程环境了。所以总的来说它是一个集成平台。

(4)VC:是微软的C++开发工具,有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++有便利的除错工具,特别是包含了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架,开发速度比较快。

(5)Delphi:是一个集成开发环境(IDE),使用的核心是由传统Pascal语言发展而来的Object Pascal,以图形用户界面为开发环境,透过IDE、VCL工具与编译器,配合连结数据库的功能,构成一个以面向对象程序设计为中心的应用程序开发工具。似乎很多人都觉得Delphi已经没落了、过时了,好多人都没听过Delphi。但我不这么认为。“真正的程序员用c,聪明的程序员用Delphi”这句话是对Delphi最经典、最实在的描述。

(6)C#:是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。 应该是最近几年应用比较多的,为什么?因为太简单,很多功能拖个控件就搞定;

(7)JAVA:具有卓越的通用性、高效性、平台移植性和安全性。关于JAVA小编就不多说了,小编本身对其也不熟悉。留待各位大侠点评。

上面讲到的几种开发工具可谓各有千秋,上面只是做了一个列举和简要说明,并加了一些个人粗浅的看法。你们觉得那一款更好用呢?它的优点在哪里?未来会否会出现大一统的格局,有一款或几款工具能成为绝对的主导?你觉得谁会胜出?为什么?

转自:http://www.eefocus.com/embedded/335314 查看全部
目前用在单片机嵌入式上位机编程的开发工具有很多,让很多刚入门的工程师们无所适从。那么用来编写单片机嵌入式上位机的工具有那几款呢?
(1)LabVIEW:是NI推出的,和C和BASIC开发环境类似,但是LabVIEW与其他计算机语言有很大区别,其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。特点是:采用了通用的硬件,可以通过改变软件在计算机上实现多种仪器的功能。被公认为测试之王。
(2)VB:是由Microsoft公司开发的结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。它源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。

(3)VS:它是微软提供的一个工具集,由各种各样的工具组成。VS可以支持C/C++、VB、JAVA、C#编程。然了一次只能支持一种编程方式。在VS安装完成,第一次运行的时候会让你选择常用语言,如果你选择C/C++,那么他就成了能够进行C/C++编程的平台也许就是你所说的VC了。如果不想用C/C++的话,只需要修改一下他的初始化设置,选择别的编程语言,就成为了另一种的语言的编程环境了。所以总的来说它是一个集成平台。

(4)VC:是微软的C++开发工具,有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++有便利的除错工具,特别是包含了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架,开发速度比较快。

(5)Delphi:是一个集成开发环境(IDE),使用的核心是由传统Pascal语言发展而来的Object Pascal,以图形用户界面为开发环境,透过IDE、VCL工具与编译器,配合连结数据库的功能,构成一个以面向对象程序设计为中心的应用程序开发工具。似乎很多人都觉得Delphi已经没落了、过时了,好多人都没听过Delphi。但我不这么认为。“真正的程序员用c,聪明的程序员用Delphi”这句话是对Delphi最经典、最实在的描述。

(6)C#:是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。 应该是最近几年应用比较多的,为什么?因为太简单,很多功能拖个控件就搞定;

(7)JAVA:具有卓越的通用性、高效性、平台移植性和安全性。关于JAVA小编就不多说了,小编本身对其也不熟悉。留待各位大侠点评。

上面讲到的几种开发工具可谓各有千秋,上面只是做了一个列举和简要说明,并加了一些个人粗浅的看法。你们觉得那一款更好用呢?它的优点在哪里?未来会否会出现大一统的格局,有一款或几款工具能成为绝对的主导?你觉得谁会胜出?为什么?

转自:http://www.eefocus.com/embedded/335314

USART的另类应用协议:DMX512协议

经验分享admin 发表了文章 • 2 个评论 • 3492 次浏览 • 2015-01-20 21:19 • 来自相关话题

DMX512 协议是美国剧场技术协会( United States Institute for Theater Technology, USITT) 制定的数字多路复用协议, 其制定的初衷是为了使舞台、剧场等地所使用的众多的调光器和控制器能相互兼容。虽然它不是一个行业或国家标准, 但是由于它的简单性和实用性, 自从出台以来, 得到了世界各地生产商和使用者普遍承认,这个协议在LED控制方面应用很广泛,利用STM32 USART可以高速传输的特性,我们很容易用STM32来实现DMX512协议。
(1)数据的格式及传输
DMX512 协议规定数据以数据包的形式通过异步通讯的方式进行传输。每个数据包由若干数据帧组成, 每帧数据包括1 位低电平起始位、8 位数据位和2 位高电平停止位。DMX 协议要求数据传输的波特率为250kb/s, 亦即每位的传输时间为4us, 每帧数据的传输时间为44us, 它支持多达512 帧数据传输, 每帧数据与相应的控制支路相对应。数据包的传送要符合一定的格式和时序要求。为了使接收器能够分辨出第一帧数据, 每一个数据包以一个不短于88us 的低电平信号为起始信号, 即所谓的“Break”信号, 接收器接收到“Break”信号就准备接受随后而来的数据帧; 紧接着“Break”信号之后是不短于8us 的高电平信号M. a. b ( Mark after Break) ; 之后就是数据帧。在DMX512 协议中, M. a. b 之后的第一帧数据被称
为“Star-t code”, 在协议中规定其为零, 但在实际应用中可以由生产厂家自己确定其具体的值, 以传递特殊消息。“Star-t code”标明其后面的数据是8 位控制信号数据帧。数据帧之间可以有时间间隔, 也可以没有; 同样, 数据包之间可以有时间间隔, 也可以没有。DMX512 协议规定“Break”信号、M. a. b 信号的最短时间, 并规定“Break”信号、M. a. b 信号、
数据帧之间及数据包之间的时间间隔的最大值不得超过1s, 否则做出错处理, 但是DMX512 协议并未对出错处理做任何规定。为了严格实现DMX512 数据的时序要求,“Break”和M. a. b信号我们可以用定时器来实现。
具体的UART配置如下:
USART_InitStructure.USART_BaudRate = 250000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_2;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
发送DMX512信号过程如下,先把UART的TX脚配置为普通的GPIO并输出低电平,然后启动定时器计时88us, 时器到后把TX脚置为高电平并计时8us, 时器到了后在配为UART模式用DMA方式把数据发出。
DMX512信号的接收是个难点,一般直接配为UART接收就行,不需要在UART模式和GPIO模式间切换,但需要在接收过程中检查接收到“Break”信号时的状态是有帧错误出现,并且接收数据全为零,这样的话可以确认已经收到“Break”信号,随后数据正常DMA接收就行了。
下面这个是做出来的效果。。
有兴趣的可以百度搜下资料 查看全部
DMX512 协议是美国剧场技术协会( United States Institute for Theater Technology, USITT) 制定的数字多路复用协议, 其制定的初衷是为了使舞台、剧场等地所使用的众多的调光器和控制器能相互兼容。虽然它不是一个行业或国家标准, 但是由于它的简单性和实用性, 自从出台以来, 得到了世界各地生产商和使用者普遍承认,这个协议在LED控制方面应用很广泛,利用STM32 USART可以高速传输的特性,我们很容易用STM32来实现DMX512协议。
(1)数据的格式及传输
DMX512 协议规定数据以数据包的形式通过异步通讯的方式进行传输。每个数据包由若干数据帧组成, 每帧数据包括1 位低电平起始位、8 位数据位和2 位高电平停止位。DMX 协议要求数据传输的波特率为250kb/s, 亦即每位的传输时间为4us, 每帧数据的传输时间为44us, 它支持多达512 帧数据传输, 每帧数据与相应的控制支路相对应。数据包的传送要符合一定的格式和时序要求。为了使接收器能够分辨出第一帧数据, 每一个数据包以一个不短于88us 的低电平信号为起始信号, 即所谓的“Break”信号, 接收器接收到“Break”信号就准备接受随后而来的数据帧; 紧接着“Break”信号之后是不短于8us 的高电平信号M. a. b ( Mark after Break) ; 之后就是数据帧。在DMX512 协议中, M. a. b 之后的第一帧数据被称
为“Star-t code”, 在协议中规定其为零, 但在实际应用中可以由生产厂家自己确定其具体的值, 以传递特殊消息。“Star-t code”标明其后面的数据是8 位控制信号数据帧。数据帧之间可以有时间间隔, 也可以没有; 同样, 数据包之间可以有时间间隔, 也可以没有。DMX512 协议规定“Break”信号、M. a. b 信号的最短时间, 并规定“Break”信号、M. a. b 信号、
数据帧之间及数据包之间的时间间隔的最大值不得超过1s, 否则做出错处理, 但是DMX512 协议并未对出错处理做任何规定。为了严格实现DMX512 数据的时序要求,“Break”和M. a. b信号我们可以用定时器来实现。
具体的UART配置如下:
USART_InitStructure.USART_BaudRate = 250000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_2;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
发送DMX512信号过程如下,先把UART的TX脚配置为普通的GPIO并输出低电平,然后启动定时器计时88us, 时器到后把TX脚置为高电平并计时8us, 时器到了后在配为UART模式用DMA方式把数据发出。
DMX512信号的接收是个难点,一般直接配为UART接收就行,不需要在UART模式和GPIO模式间切换,但需要在接收过程中检查接收到“Break”信号时的状态是有帧错误出现,并且接收数据全为零,这样的话可以确认已经收到“Break”信号,随后数据正常DMA接收就行了。
下面这个是做出来的效果。。
有兴趣的可以百度搜下资料

关于i2c板间通信的实验和理解

回复

软件教程admin 回复了问题 • 3 人关注 • 5 个回复 • 5753 次浏览 • 2015-01-20 11:48 • 来自相关话题

(转)STM32串口驱动(拼音检索测试通过)(环形队列+内存动态分配+DMA,写的不错,借鉴下

其他分享popdes 发表了文章 • 1 个评论 • 2184 次浏览 • 2015-01-18 20:30 • 来自相关话题

下面摘录一段:
在设计串口驱动的过程中,要遵循的两条准则是:
1 :尽量的减少程序运行的时间。
2 :尽量的减少程序所占用的内存。
譬如,下面的一段程序:
程序段 1-1


/[i] 指针是指向 ptr ,需要发送 count个数据[/i]/
void USART1WriteDataToBuffer( * ptr , u8 count )
{
/[i] 判断数据是否发送完毕 [/i]/
while ( count-- )
{
/[i] 发送数据 [/i]/
USART1SendByte ( *ptr+);
/[i] 等待这个数据发送完毕,然后进入下一个数据的发送过程[/i]/
while(USART_GetFlagStatus(USART1,USART_FLAG_TC);
}
/[i] 数据发送完毕,返回 [/i]/
}

很明显 , 这段程序在实际应用中将会产生灾难性的后果,首先,当发送数据送到寄存器
启动发送以后 , CPU 就一直在等待这个数据发送完成,然后进入下一步数据的发送,这样,
直到所有要发送的数据完成, CPU 才能做其他的事情,相对于CPU内核运行的速度而言,
串口外设的运行速度是非常快的 , 让一个速度非常快的设备去等待相对运行很慢的设备,程序的
效率是非常低下的。
所以必须采用中断的方式发送数据。

算了打字累,具体的自己去【资源下载】本站网盘里下载看吧。 查看全部
下面摘录一段:
在设计串口驱动的过程中,要遵循的两条准则是:
1 :尽量的减少程序运行的时间。
2 :尽量的减少程序所占用的内存。
譬如,下面的一段程序:
程序段 1-1


/[i] 指针是指向 ptr ,需要发送 count个数据[/i]/
void USART1WriteDataToBuffer( * ptr , u8 count )
{
/[i] 判断数据是否发送完毕 [/i]/
while ( count-- )
{
/[i] 发送数据 [/i]/
USART1SendByte ( *ptr+);
/[i] 等待这个数据发送完毕,然后进入下一个数据的发送过程[/i]/
while(USART_GetFlagStatus(USART1,USART_FLAG_TC);
}
/[i] 数据发送完毕,返回 [/i]/
}

很明显 , 这段程序在实际应用中将会产生灾难性的后果,首先,当发送数据送到寄存器
启动发送以后 , CPU 就一直在等待这个数据发送完成,然后进入下一步数据的发送,这样,
直到所有要发送的数据完成, CPU 才能做其他的事情,相对于CPU内核运行的速度而言,
串口外设的运行速度是非常快的 , 让一个速度非常快的设备去等待相对运行很慢的设备,程序的
效率是非常低下的。
所以必须采用中断的方式发送数据。

算了打字累,具体的自己去【资源下载】本站网盘里下载看吧。

(转)STM32 HID Keyboard LEDs 键盘灯的操作

经验分享admin 发表了文章 • 3 个评论 • 9433 次浏览 • 2015-01-14 16:40 • 来自相关话题

转自国外一篇博客(纯英文),记录万一以后用到呢 O(∩_∩)O~
This writing is only foucs on the process basing on the ST32F4 HAL 1.10 driver (now is 1.30), not including any knowledge of USB protocol explaining.

There are some software you have to prepare at fist:
STM32CubeF4, MDK or EWARM, USB HID Tools

1.Use STM32CubeF4 gernerates the code at first. (Please reference the STM32CubeF4 manual)
2.Open the project with MDK
3.Open “usbd_hid.c”
4.change the like below:



...
static uint8_t USBD_HID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum);
...

USBD_ClassTypeDef USBD_HID =
{
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]/
USBD_HID_DataOut, /[i]DataOut[/i]/
NULL, /[i]SOF [/i]/
NULL,
NULL,
USBD_HID_GetCfgDesc,
USBD_HID_GetCfgDesc,
USBD_HID_GetCfgDesc,
USBD_HID_GetDeviceQualifierDesc,
};

__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
0x09, /[i] bLength: Configuration Descriptor size [/i]/
USB_DESC_TYPE_CONFIGURATION, /[i] bDescriptorType: Configuration [/i]/
USB_HID_CONFIG_DESC_SIZ,
/[i] wTotalLength: Bytes returned [/i]/
0x00,
0x01, /[i]bNumInterfaces: 1 interface[/i]/
0x01, /[i]bConfigurationValue: Configuration value[/i]/
0x00, /*iConfiguration: Index of string descriptor describing
the configuration*/
0xE0, /[i]bmAttributes: bus powered and Support Remote Wake-up [/i]/
0x32, /[i]MaxPower 100 mA: this current is used for detecting Vbus[/i]/

/[b][i][b][/i][i][b][/i][i][b][/i] Descriptor of Joystick Mouse interface [/b][/b][/b][/b]********/
/[i] 09 [/i]/
0x09, /[i]bLength: Interface Descriptor size[/i]/
USB_DESC_TYPE_INTERFACE,/[i]bDescriptorType: Interface descriptor type[/i]/
0x00, /[i]bInterfaceNumber: Number of Interface[/i]/
0x00, /[i]bAlternateSetting: Alternate setting[/i]/
0x02, /[i]bNumEndpoints[/i]/
0x03, /[i]bInterfaceClass: HID[/i]/
0x01, /[i]bInterfaceSubClass : 1=BOOT, 0=no boot[/i]/
0x01, /[i]nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse[/i]/
0, /[i]iInterface: Index of string descriptor[/i]/
/[i][b][/i][i][b][/i][i][b][/i][i][b][/i][i][b][/i] Descriptor of Joystick Mouse HID [/b][/b][/b][/b][/b]**********/
/[i] 18 [/i]/
0x09, /[i]bLength: HID Descriptor size[/i]/
HID_DESCRIPTOR_TYPE, /[i]bDescriptorType: HID[/i]/
0x11, /[i]bcdHID: HID Class Spec release number[/i]/
0x01,
0x21, /[i]bCountryCode: Hardware target country[/i]/
0x01, /[i]bNumDescriptors: Number of HID class descriptors to follow[/i]/
0x22, /[i]bDescriptorType[/i]/
HID_MOUSE_REPORT_DESC_SIZE,/[i]wItemLength: Total length of Report descriptor[/i]/
0x00,
/[i][b][/i][i][b][/i][i][b][/i][i][b][/i][i][b][/i] Descriptor of Mouse endpoint [/b][/b][/b][/b][/b]**********/
/[i] 27 [/i]/
0x07, /[i]bLength: Endpoint Descriptor size[/i]/
USB_DESC_TYPE_ENDPOINT, /[i]bDescriptorType:[/i]/

HID_EPIN_ADDR, /[i]bEndpointAddress: Endpoint Address (IN)[/i]/
0x03, /[i]bmAttributes: Interrupt endpoint[/i]/
HID_EPIN_SIZE, /[i]wMaxPacketSize: 8 Byte max [/i]/
0x00,
0x0A, /[i]bInterval: Polling Interval (10 ms)[/i]/

/[i] 34 [/i]/
0x07, /[i]bLength: Endpoint Descriptor size[/i]/
USB_DESC_TYPE_ENDPOINT, /[i]bDescriptorType:[/i]/

HID_EPOUT_ADDR, /[i]bEndpointAddress: Endpoint Address (OUT)[/i]/
0x03, /[i]bmAttributes: Interrupt endpoint[/i]/
HID_EPOUT_SIZE, /[i]wMaxPacketSize: 1 Byte max [/i]/
0x00,
0x0A, /[i]bInterval: Polling Interval (10 ms)[/i]/
/[i] 41 [/i]/
} ;

...

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END ={
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE_PAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x06, // REPORT_COUNT (6)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x03, // USAGE_MAXIMUM (Scroll Lock)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x03, // REPORT_COUNT (3)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x75, 0x05, // REPORT_SIZE (5)
0x95, 0x01, // REPORT_COUNT (1)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
0xc0 // END_COLLECTION
};

...

static uint8_t rx_buf;

static uint8_t USBD_HID_Init (USBD_HandleTypeDef *pdev,
uint8_t cfgidx)
{
uint8_t ret = 0;

/[i] Open EP IN [/i]/
USBD_LL_OpenEP(pdev,
HID_EPIN_ADDR,
USBD_EP_TYPE_INTR,
HID_EPIN_SIZE);

/[i] Open EP OUT [/i]/
USBD_LL_OpenEP(pdev, HID_EPOUT_ADDR, USBD_EP_TYPE_INTR, HID_EPOUT_SIZE);

pdev->pClassData = USBD_malloc(sizeof (USBD_HID_HandleTypeDef));

//set EP_OUT 1 prepared to received the data
USBD_LL_PrepareReceive(pdev, HID_EPOUT_ADDR, &rx_buf, 1);



if(pdev->pClassData == NULL)
{
ret = 1;
}
else
{
((USBD_HID_HandleTypeDef *)pdev->pClassData)->state = HID_IDLE;
}
return ret;
}

...

static uint8_t USBD_HID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum){

HAL_PCD_EP_Receive(hUsbDeviceFS.pData, HID_EPOUT_ADDR, &rx_buf, 1);

if (rx_buf & 0x01){
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);
}
else{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET);
}

if (rx_buf & 0x02){
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
}
else{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
}

if (rx_buf & 0x04){
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
}
else{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
}
return USBD_OK;
}



5.now update the usbd_hid.h


#define HID_EPIN_ADDR 0x81
//#define HID_EPIN_SIZE 0x04
#define HID_EPIN_SIZE 0x08

//define the OUT Endpoint
#define HID_EPOUT_ADDR 0x01
#define HID_EPOUT_SIZE 0x01

//#define USB_HID_CONFIG_DESC_SIZ 34
#define USB_HID_CONFIG_DESC_SIZ 41
#define USB_HID_DESC_SIZ 9
//#define HID_MOUSE_REPORT_DESC_SIZE 74
#define HID_MOUSE_REPORT_DESC_SIZE 65

#define HID_DESCRIPTOR_TYPE 0x21
#define HID_REPORT_DESC 0x22


Now let us take a look how it works:

Add a callback process at first.


...
static uint8_t USBD_HID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum);
...
USBD_ClassTypeDef USBD_HID =
{
...

/[i]When the data out (from host) callback this process DataOut[/i]/
USBD_HID_DataOut,
...
};


Open the OUT Endpoint when initializing the USB and prepare to receive the data.
Lots of people miss the “USBD_LL_PrepareReceive(…);”, so there is no callback trigger.


static uint8_t USBD_HID_Init (USBD_HandleTypeDef *pdev,
uint8_t cfgidx)
{
...
USBD_LL_OpenEP(pdev, HID_EPOUT_ADDR, USBD_EP_TYPE_INTR, HID_EPOUT_SIZE);

//set EP_OUT 1 prepared to received the data
USBD_LL_PrepareReceive(pdev, HID_EPOUT_ADDR, &rx_buf, 1);
...
}


And following thing is dealing with the callback process ^_^

本文转自:http://eemodule.com/?p=86 查看全部
转自国外一篇博客(纯英文),记录万一以后用到呢 O(∩_∩)O~
This writing is only foucs on the process basing on the ST32F4 HAL 1.10 driver (now is 1.30), not including any knowledge of USB protocol explaining.

There are some software you have to prepare at fist:
STM32CubeF4, MDK or EWARM, USB HID Tools

1.Use STM32CubeF4 gernerates the code at first. (Please reference the STM32CubeF4 manual)
2.Open the project with MDK
3.Open “usbd_hid.c”
4.change the like below:



...
static uint8_t USBD_HID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum);
...

USBD_ClassTypeDef USBD_HID =
{
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]/
USBD_HID_DataOut, /[i]DataOut[/i]/
NULL, /[i]SOF [/i]/
NULL,
NULL,
USBD_HID_GetCfgDesc,
USBD_HID_GetCfgDesc,
USBD_HID_GetCfgDesc,
USBD_HID_GetDeviceQualifierDesc,
};

__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
0x09, /[i] bLength: Configuration Descriptor size [/i]/
USB_DESC_TYPE_CONFIGURATION, /[i] bDescriptorType: Configuration [/i]/
USB_HID_CONFIG_DESC_SIZ,
/[i] wTotalLength: Bytes returned [/i]/
0x00,
0x01, /[i]bNumInterfaces: 1 interface[/i]/
0x01, /[i]bConfigurationValue: Configuration value[/i]/
0x00, /*iConfiguration: Index of string descriptor describing
the configuration*/
0xE0, /[i]bmAttributes: bus powered and Support Remote Wake-up [/i]/
0x32, /[i]MaxPower 100 mA: this current is used for detecting Vbus[/i]/

/[b][i][b][/i][i][b][/i][i][b][/i] Descriptor of Joystick Mouse interface [/b][/b][/b][/b]********/
/[i] 09 [/i]/
0x09, /[i]bLength: Interface Descriptor size[/i]/
USB_DESC_TYPE_INTERFACE,/[i]bDescriptorType: Interface descriptor type[/i]/
0x00, /[i]bInterfaceNumber: Number of Interface[/i]/
0x00, /[i]bAlternateSetting: Alternate setting[/i]/
0x02, /[i]bNumEndpoints[/i]/
0x03, /[i]bInterfaceClass: HID[/i]/
0x01, /[i]bInterfaceSubClass : 1=BOOT, 0=no boot[/i]/
0x01, /[i]nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse[/i]/
0, /[i]iInterface: Index of string descriptor[/i]/
/[i][b][/i][i][b][/i][i][b][/i][i][b][/i][i][b][/i] Descriptor of Joystick Mouse HID [/b][/b][/b][/b][/b]**********/
/[i] 18 [/i]/
0x09, /[i]bLength: HID Descriptor size[/i]/
HID_DESCRIPTOR_TYPE, /[i]bDescriptorType: HID[/i]/
0x11, /[i]bcdHID: HID Class Spec release number[/i]/
0x01,
0x21, /[i]bCountryCode: Hardware target country[/i]/
0x01, /[i]bNumDescriptors: Number of HID class descriptors to follow[/i]/
0x22, /[i]bDescriptorType[/i]/
HID_MOUSE_REPORT_DESC_SIZE,/[i]wItemLength: Total length of Report descriptor[/i]/
0x00,
/[i][b][/i][i][b][/i][i][b][/i][i][b][/i][i][b][/i] Descriptor of Mouse endpoint [/b][/b][/b][/b][/b]**********/
/[i] 27 [/i]/
0x07, /[i]bLength: Endpoint Descriptor size[/i]/
USB_DESC_TYPE_ENDPOINT, /[i]bDescriptorType:[/i]/

HID_EPIN_ADDR, /[i]bEndpointAddress: Endpoint Address (IN)[/i]/
0x03, /[i]bmAttributes: Interrupt endpoint[/i]/
HID_EPIN_SIZE, /[i]wMaxPacketSize: 8 Byte max [/i]/
0x00,
0x0A, /[i]bInterval: Polling Interval (10 ms)[/i]/

/[i] 34 [/i]/
0x07, /[i]bLength: Endpoint Descriptor size[/i]/
USB_DESC_TYPE_ENDPOINT, /[i]bDescriptorType:[/i]/

HID_EPOUT_ADDR, /[i]bEndpointAddress: Endpoint Address (OUT)[/i]/
0x03, /[i]bmAttributes: Interrupt endpoint[/i]/
HID_EPOUT_SIZE, /[i]wMaxPacketSize: 1 Byte max [/i]/
0x00,
0x0A, /[i]bInterval: Polling Interval (10 ms)[/i]/
/[i] 41 [/i]/
} ;

...

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END ={
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE_PAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x01, // INPUT (Cnst,Ary,Abs)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x06, // REPORT_COUNT (6)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x03, // USAGE_MAXIMUM (Scroll Lock)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x03, // REPORT_COUNT (3)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x75, 0x05, // REPORT_SIZE (5)
0x95, 0x01, // REPORT_COUNT (1)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
0xc0 // END_COLLECTION
};

...

static uint8_t rx_buf;

static uint8_t USBD_HID_Init (USBD_HandleTypeDef *pdev,
uint8_t cfgidx)
{
uint8_t ret = 0;

/[i] Open EP IN [/i]/
USBD_LL_OpenEP(pdev,
HID_EPIN_ADDR,
USBD_EP_TYPE_INTR,
HID_EPIN_SIZE);

/[i] Open EP OUT [/i]/
USBD_LL_OpenEP(pdev, HID_EPOUT_ADDR, USBD_EP_TYPE_INTR, HID_EPOUT_SIZE);

pdev->pClassData = USBD_malloc(sizeof (USBD_HID_HandleTypeDef));

//set EP_OUT 1 prepared to received the data
USBD_LL_PrepareReceive(pdev, HID_EPOUT_ADDR, &rx_buf, 1);



if(pdev->pClassData == NULL)
{
ret = 1;
}
else
{
((USBD_HID_HandleTypeDef *)pdev->pClassData)->state = HID_IDLE;
}
return ret;
}

...

static uint8_t USBD_HID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum){

HAL_PCD_EP_Receive(hUsbDeviceFS.pData, HID_EPOUT_ADDR, &rx_buf, 1);

if (rx_buf & 0x01){
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);
}
else{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET);
}

if (rx_buf & 0x02){
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
}
else{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
}

if (rx_buf & 0x04){
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
}
else{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
}
return USBD_OK;
}



5.now update the usbd_hid.h


#define HID_EPIN_ADDR 0x81
//#define HID_EPIN_SIZE 0x04
#define HID_EPIN_SIZE 0x08

//define the OUT Endpoint
#define HID_EPOUT_ADDR 0x01
#define HID_EPOUT_SIZE 0x01

//#define USB_HID_CONFIG_DESC_SIZ 34
#define USB_HID_CONFIG_DESC_SIZ 41
#define USB_HID_DESC_SIZ 9
//#define HID_MOUSE_REPORT_DESC_SIZE 74
#define HID_MOUSE_REPORT_DESC_SIZE 65

#define HID_DESCRIPTOR_TYPE 0x21
#define HID_REPORT_DESC 0x22


Now let us take a look how it works:

Add a callback process at first.


...
static uint8_t USBD_HID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum);
...
USBD_ClassTypeDef USBD_HID =
{
...

/[i]When the data out (from host) callback this process DataOut[/i]/
USBD_HID_DataOut,
...
};


Open the OUT Endpoint when initializing the USB and prepare to receive the data.
Lots of people miss the “USBD_LL_PrepareReceive(…);”, so there is no callback trigger.


static uint8_t USBD_HID_Init (USBD_HandleTypeDef *pdev,
uint8_t cfgidx)
{
...
USBD_LL_OpenEP(pdev, HID_EPOUT_ADDR, USBD_EP_TYPE_INTR, HID_EPOUT_SIZE);

//set EP_OUT 1 prepared to received the data
USBD_LL_PrepareReceive(pdev, HID_EPOUT_ADDR, &rx_buf, 1);
...
}


And following thing is dealing with the callback process ^_^

本文转自:http://eemodule.com/?p=86

用Cube生成的代码,不会进入中断怎么办?

问题困惑admin 回复了问题 • 3 人关注 • 6 个回复 • 2252 次浏览 • 2015-01-13 20:47 • 来自相关话题

探讨下我对于modbus的一些理解,移植并不难,modbus的原理

回复

问题困惑admin 回复了问题 • 4 人关注 • 1 个回复 • 2675 次浏览 • 2015-01-13 17:24 • 来自相关话题

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

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

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

其他分享admin 发表了文章 • 1 个评论 • 1184 次浏览 • 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 个回复 • 3648 次浏览 • 2015-01-06 10:28 • 来自相关话题

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

回复

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