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

回复

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

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

其他分享popdes 发表了文章 • 1 个评论 • 1624 次浏览 • 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 个评论 • 7733 次浏览 • 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 回复了问题 • 2 人关注 • 6 个回复 • 1625 次浏览 • 2015-01-13 20:47 • 来自相关话题

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

回复

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

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

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

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

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

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

回复

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

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

经验分享admin 发表了文章 • 2 个评论 • 1565 次浏览 • 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 个回复 • 3198 次浏览 • 2014-12-31 17:17 • 来自相关话题

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

回复

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

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

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

滴答时钟计时修改systick记录

回复

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

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

经验分享admin 发表了文章 • 0 个评论 • 4705 次浏览 • 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



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