STM32F042G HAL库读取96bit UID(唯一ID) VCP输出

代码记录:

/* USER CODE BEGIN WHILE */
char *buff = "\n"; //换行符
char *buff1 = "UID = "; //特定字符

char UID0[8] = ""; //UID缓存
char UID1[8] = "";
char UID2[8] = "";

while (1)
{
 if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_SET) //检测按键是否按下
 {
 HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); //亮灯提示

 sprintf(UID0, "%08X", HAL_GetUIDw0()); //获取ID转成16进制存到UID缓存
 sprintf(UID1, "%08X", HAL_GetUIDw1());
 sprintf(UID2, "%08X", HAL_GetUIDw2());

 while (CDC_Transmit_FS((uint8_t*)buff1, 6)); //输出特定字符
 while (CDC_Transmit_FS((uint8_t*)UID0, sizeof(UID0))); //输出UID
 while (CDC_Transmit_FS((uint8_t*)UID1, sizeof(UID1)));
 while (CDC_Transmit_FS((uint8_t*)UID2, sizeof(UID2)));
 while (CDC_Transmit_FS((uint8_t*)buff, 1)); //换行
 while (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_SET); //等待松开按键
 }
 HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); //灭灯
 /* USER CODE END WHILE */
}

centos7 安装 nginx 最新版

使用编辑器编辑(新建)nginx.repo文件

vi /etc/yum.repos.d/nginx.repo

在编辑器中输入以下内容

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

保存,退出,更新

yum update

安装

yum install -y nginx

设置开机运行并启动

systemctl enable nginx.service
systemctl start nginx.service

 

USB-CDC(VCP虚拟串口)传输

用STM32cubeMX软件配置好USB设备为CDC设备,生成并打开工程。此功能方便用来作为程序的调试输出到电脑查看。

描述:

USB接口CDC传输做VCP虚拟串口设备

CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)

  • Buf: 传输的数据指针
  • Len: 传输数据的长度

CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)

  • Buf: 接收的数据指针,不需处理
  • Len: 接收数据的长度,需要处理

示例

打开usbd_cdc_if.c文件,修改传输数据长度为64,添加接收数据长度变量DataLen。

/* USER CODE BEGIN PRIVATE_DEFINES */
/* Define size for the receive and transmit buffer over CDC */
/* It's up to user to redefine and/or remove those define */
#define APP_RX_DATA_SIZE 64  //修改接收数据长度
#define APP_TX_DATA_SIZE 64  //修改发送数据长度
/* USER CODE END PRIVATE_DEFINES */
/**
 * @}
 */

/** @defgroup USBD_CDC_Private_Macros
 * @{
 */ 
/* USER CODE BEGIN PRIVATE_MACRO */
/* USER CODE END PRIVATE_MACRO */

/**
 * @}
 */ 
 
/** @defgroup USBD_CDC_Private_Variables
 * @{
 */
/* Create buffer for reception and transmission */
/* It's up to user to redefine and/or remove those define */
/* Received Data over USB are stored in this buffer */
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];

/* Send Data over USB CDC are stored in this buffer */
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];

/* USER CODE BEGIN PRIVATE_VARIABLES */
uint8_t DataLen; //定义接收数据长度变量
/* USER CODE END PRIVATE_VARIABLES */

修改CDC_Receive_FS ()函数,添加接收数据长度的赋值

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
 /* USER CODE BEGIN 6 */
 USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
 USBD_CDC_ReceivePacket(&hUsbDeviceFS);
 DataLen = *Len; //添加接收数据长度的赋值,只添加这一句,其它别改!!!
 return (USBD_OK);
 /* USER CODE END 6 */ 
}

修改main.c文件,先声明外部变量

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
extern uint8_t UserRxBufferFS[]; //声明数据接收外部变量
extern uint8_t DataLen; //声明接收数据长度外部变量
/* USER CODE END PV */

开启使用到的外设初始化

 /* Initialize all configured peripherals */
 MX_GPIO_Init(); //初始化GPIO
// MX_I2C1_Init();
// MX_USART2_UART_Init();
 MX_USB_DEVICE_Init(); //初始化USB
// MX_ADC_Init();
// MX_TIM2_Init();
// MX_SPI1_Init();
// MX_WWDG_Init();
// MX_IWDG_Init();
// MX_RTC_Init();
// MX_USART1_UART_Init();

编辑主循环函数,当按下按键时,发送I love eefrog!到电脑串口,当接收到电脑串口数据时,返回接收到的数据,接收数据长度应小于64.

/* Infinite loop */
/* USER CODE BEGIN WHILE */
uint8_t MyTxData[15] = "I love eefrog!\n"; //定义字符串
while (1)
{
 if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0) //检测按键
 {
   while(CDC_Transmit_FS(MyTxData, 15)); //发送字符串到电脑
   HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //闪灯
   HAL_Delay(20);
   HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
   while(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0); //等待松开按键
 }
 if(DataLen > 0) //判断是否接收到数据
 {
   while(CDC_Transmit_FS(UserRxBufferFS, DataLen));//把接收到的数据发送回去
   DataLen = 0; //清除数据长度标记
 }
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

STM32F042F6P6-USB设备开发最小系统之键盘开发

最常见的USB设备要数鼠标和键盘了,STM32F042F6P6这块小板(这里可购买:购买链接)的鼠标示例已经写了,现在来写下模拟键盘的示例.

不多说,开始配置,打开STM32CubeMX,选择STM32F042F6P6芯片,开启pin脚映射,打开USB设备,选择USB设备为HID,设置按键和LED对应引脚的输入输出模式:

配置按键和LED引脚的状态及备注名:

可以在此修改USB设备名称、厂家、PID\VID等:

配置工程输出参数,然后生成并打开工程:

按图中所示打开usbd_hid.c文件,找到HID_MOUSE_ReportDesc数组定义处(默认生产HID设备为Mouse,这里数组名不影响,只要里面的描述符是键盘的就行),修改成如下数据:

 0x05, 0x01, // USAGE_PAGE (Generic Desktop) //63
 0x09, 0x06, // USAGE (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)
 0x95, 0x01, // REPORT_COUNT (1)
 0x75, 0x08, // REPORT_SIZE (8)
 0x81, 0x03, // INPUT (Cnst,Var,Abs)
 0x95, 0x05, // REPORT_COUNT (5)
 0x75, 0x01, // REPORT_SIZE (1)
 0x05, 0x08, // USAGE_PAGE (LEDs)
 0x19, 0x01, // USAGE_MINIMUM (Num Lock)
 0x29, 0x05, // USAGE_MAXIMUM (Kana)
 0x91, 0x02, // OUTPUT (Data,Var,Abs)
 0x95, 0x01, // REPORT_COUNT (1)
 0x75, 0x03, // REPORT_SIZE (3)
 0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
 0x95, 0x06, // REPORT_COUNT (6)
 0x75, 0x08, // REPORT_SIZE (8)
 0x15, 0x00, // LOGICAL_MINIMUM (0)
 0x25, 0x65, // LOGICAL_MAXIMUM (101)
 0x05, 0x07, // USAGE_PAGE (Keyboard)
 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
 0x81, 0x00, // INPUT (Data,Ary,Abs)
 0xc0, // END_COLLECTION

再打开usbd_hid.h文件,修改HID_MOUSE_REPORT_DESC_SIZE的值为63.

编译工程,下载到板子上,插上USB线连接到电脑上,是不是识别出为键盘设备了呢?

继续修改main.c文件,添加头文件

#include "usbd_hid.h"

添加一个数组变量,用于传输键盘参数的,byte0是传控制键;byte1是保留键,不用改;byte3~byte7都可以存放传输的按键值

 /*
 * buffer[0] - bit0: Left CTRL
 *           -bit1: Left SHIFT
 *           -bit2: Left ALT
 *           -bit3: Left GUI
 *           -bit4: Right CTRL
 *           -bit5: Right SHIFT
 *           -bit6: Right ALT
 *           -bit7: Right GUI 
 * buffer[1] - Padding = Always 0x00
 * buffer[2] - Key 1
 * buffer[3] - Key 2
 * buffer[4] - Key 3
 * buffer[5] - Key 4
 * buffer[6] - Key 5
 * buffer[7] - Key 6
 */
 uint8_t buffer[9] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

添加按键检测及传输键值到电脑的代码:

 if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == 0)
 {
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
 
  buffer[0] = 0x02; //shift
  buffer[2] = 0x04; // a
  USBD_HID_SendReport(&hUsbDeviceFS, buffer, 8); //send
  HAL_Delay(15); //delay
 
  buffer[0] = 0x00;
  buffer[2] = 0x00;
  USBD_HID_SendReport(&hUsbDeviceFS, buffer, 8);
  HAL_Delay(15);
 
  while(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == 0)
  HAL_Delay(15);
 }
 else
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

对应键值可和此文件中的HID Usage ID对应,是16进制(如字符‘a’对应键值为0x04),pdf文件在附件中有:

再编译文件下载到板子上,试试按下按键时是不是在电脑上就输入了一个大写的‘A’呢?

键值对照表(可能需要科学上网才能看到):

工程文件(可能需要科学上网才能看到):

STM32F042F6P6-USB设备开发最小系统之ADC+CDC(虚拟串口)输出

本蛙技术较菜,功能使用教程一个一个慢慢来,尽量用最简单的方式实现想要的功能(说白了就是多用别人做好写好的库),这次教程是将STM32用CDC方式虚拟一个串口(虚拟串口在电脑串口监视器里选的波特率啥的都是不影响的),然后通过串口向电脑传数据,可以做一些调试的参数输出。用的是STM32F042F6P6最小系统,购买地址:淘宝链接

话不多说,还是用STM32CubeMX来配置工程,在SYS中选择引脚复用,打开USB功能

选择USB设备类型为虚拟串口

会自动配置的时钟

按键和LED配置,之前的鼠标示例中有介绍

设置输出工程参数

生成代码及打开工程

main.c中添加头文件

#include "usbd_cdc_if.h"

添加data字符串,添加CDC发送语句和延时

 uint8_t data[14] = "I love STM32!\n";
 while(CDC_Transmit_FS(data, 14)); //发送data中的数据
 HAL_Delay(500); // 延时500ms

编译并下载到单片机上,插入USB到电脑上,首次使用会自动安装驱动,若安装失败请自行在互联网上搜索STM32虚拟串口驱动,查看设备管理器,会出现一个串口设备

打开电脑上的串口监视器,选择之前对应的串口号,会收到程序中定义的字符串数据

下面添加如下ADC采样的代码,并将ADC采样值通过虚拟串口发送到电脑上,代码修改如下

 /* USER CODE BEGIN 2 */
 uint8_t data[6] = "ADC = "; 
 
 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 /* USER CODE END WHILE */
 
 /* USER CODE BEGIN 3 */
 uint16_t val;
 uint8_t ADC_data[6] = " ";
 uint16_t x;
 uint8_t temp = 0;

 if (HAL_ADC_Start(&hadc) != HAL_OK)
 {
 /* Start Conversation Error */
 Error_Handler();
 }
 if (HAL_ADC_PollForConversion(&hadc, 10) != HAL_OK)
 {
 /* End Of Conversion flag not set on time */
 Error_Handler();
 }
 val = HAL_ADC_GetValue(&hadc); //ADC取值赋给val
 for(x = 10000; x > 0; x = x / 10) //将ADC值转成字符存到ADC_data中
 if((val / x) >= 1)
 {
 ADC_data[temp] = ((val / x) % 10 + '0');
 temp++;
 }
 }
 if(temp == 0)
 {
 ADC_data[temp] = '0';
 temp++;
 }
 ADC_data[temp] = '\n'; //换行符
 while(CDC_Transmit_FS(data, 6)); //发送data中的数据
 HAL_Delay(12); // 延时12ms
 while(CDC_Transmit_FS(ADC_data, temp + 1)); //发送ADC_data的数据
 HAL_Delay(300); // 延时300ms
 }
 /* USER CODE END 3 */

打开电脑串口监视器即可看到从单片机PA0口检测到的ADC值,范围0~4095。

工程文件(可能需要科学上网才能看到):