关键词:
STM32笔记
STM32笔记
ADC
ADC(Analog-Digital Converter) 模拟-数字转换器
ADC可以将引脚上连续变化的电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
12为逐次逼近型ADC,1us转换时间
输入电压范围03.3V,转换结果范围:04095
18个输入通道,可测量16个外部和2个内部信号源(内部温度传感器和内部供电检测)
规则组合注入组两个转换单元
模拟看门狗自动检测输入电压范围
TIM定时器
TIM(定时器)
定时器可以对输入的时钟进行计数,并在计数值打到设定值时触发中断
不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发等多种功能
定时器模式:向上计数、向下计数、中央对齐模式
定时中断基本结构
代码配置
void TIM_DeInit(TIM_TypeDef* TIMx);
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);// 配置时基单元
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);// 运行控制使能
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);// 使能中断输出控制
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);// 选择内部时钟
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);// 选择ITRx其它定时器的时钟
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);// 选择TIX
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);// 选择ETR1通道 TIM_ExtTRGPolarity:极性 ExtTRGFilter:滤波
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);// 单独用来配置ETR引脚的 极性、滤波器等参数
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);// 修改预分频值
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); // 改变计数器模式
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); // 计数器预装功能使能失能
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter); // 设置当前计数器的值
PWM
OC(Output Compare)输出比较
输出比较可以通过比较CNT与CCR寄存器值得关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
每个高级定时器和通用定时器都拥有4个输出比较通道
高级定时器的前三个通道额外拥有死区生成和互补输出的功能
PWM初始化
-
RCC开启时钟
// 配置输出比较模块(重要) void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); // 配置强制输出模式 void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); // 配置预装值(了解) void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); // 配置快速使能(了解) void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); // 在功能手册,外部事件清楚REF信号有介绍(了解) void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); // 单独设置输出极性 void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); // 单独设置修改输出使能参数 void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN); // 选择输出比较模式,单独更改输出比较模式 void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode); // 单独更改CCR寄存器值得函数(重要),运行时更改占空比要用到 void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3); void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
-
配置时基单元
// 配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频,分频滤波用
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 定时器模式:向上,向下,三种中央对齐
// 这里对72M进行7200分频,得到的是10K的计数频率,在10K的频率计10000个数即为1ms
TIM_TimeBaseInitStruct.TIM_Period = 100 - 1; // ARR自动重装器的值
TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1; // PSC预分频器的值
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; // 重复计数器的值,高级定时器用到
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
- 配置输出比较单元
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 输出比较模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //
TIM_OCInitStructure.TIM_Pulse = 50; // CCR
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
- 配置GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);
-
运行控制
-
RCC开启时钟
定时器的基准时钟和整个外设的工作时钟就都会打开
-
选择时基单元
-
配置时基单元
包含预分频器、自动重装器、计数器
-
配置输出中断控制,允许更新中断输出到NVIC
-
配置NVIC
-
运行控制
EXTI外部中断
中断:在主程序运行过程中,出现了特定的中断出发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又回到原来被暂停的位置继续运行
中断优先级:有多个中断源同时申请中断时,CPU根据中断的轻重缓急进行裁决,优先相应更加紧急的中断源
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回(及把中断程序二次中断)
stm32中断
- 68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设
- 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。
NVIC基本结构
NVIC(嵌套中断向量控制器),在STM32中用来统一分配和管理中断的,NVIC是一个内核外设,CPU的小助手。
- NVIC存在意义,解决了哪些问题
如果把所有的中断都接到CPU上,CPU就需要引出很多线进行适配,并且如果许多中断同事申请,或者中断产生了拥堵,CPU也会很难处理(CPU主要运算)
EXIT简介
EXIT(外部中断)
EXTI可以检测指定GPIO口的电平,当其指定的GPIO产生电平变化,EXTI立即想NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU知性EXTI对应的中断程序
支持的出发方式:上升沿、下降沿、双边沿、软件触发
支持的GPIO口:所有,但是相同的PIN不能同时触发中断(PA0\\PB0\\PC0不能同时触发)原因是在GPIO接入EXTI前有一个AFIO(中断引脚选择)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lSyB68m7-1650965283161)(C:\\Users\\deda_cqf\\AppData\\Roaming\\Typora\\typora-user-images\\image-20220426171629905.png)]
通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
触发响应方式:中断响应、事件响应(若触发事件、则中断响应不会通向CPU,而是通向其它外设,用于触发其它外设的操作,例如ADC转换)
代码配置
-
配置RCC
-
配置GPIO
选择端口为输入模式
-
配置AFIO
选择使用的gpio,连接到后面的Exti
-
配置EXTI
选择边沿触发方式,选择触发响应方式(触发响应,中断响应)
-
配置NVIC
选择合适的优先级
// 配置时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
// 配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
// 配置AFIO,中断引脚选择
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
// 配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
// 配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStructure);
GPIO输出
GPIO(general purpose input output)通用输入输出
引脚电平:0V ~ 3.3V,部分引脚可容忍5V
输出模式下可控制端口输出高低电平,控制LED、蜂鸣器、模拟通信协议输出时序等
输入模式下可读取端口的额高低电平活电压,用于按键读取、外界模块电平信号输入、ADC电压猜忌、模拟通信协议接收数据等
单独操作输出数据寄存器的某一位的方法
- &=和|=操作,比较麻烦效率不高
- 操作位设置\\清除寄存器,
- 读写"位带"区域,在stm32中,专门分配的一段地址区域,这段地址区域映射了RAM和外设寄存器的所有的位,操作相应的地址就相当于操作某一位
GPIO8种模式
(1) 浮空输入 GPIO_Mode_IN_FLOATING
(2) 带上拉输入 GPIO_Mode_IPU
(3) 带下拉输入 GPIO_Mode_IPD
(4) 模拟输入 GPIO_Mode_AIN
(5) 开漏输出 GPIO_Mode_Out_OD
(6) 开漏复用输出 GPIO_Mode_AF_OD
(7) 推挽输出 GPIO_Mode_Out_PP
(8) 推挽复用输出 GPIO_Mode_AF_PP
代码操作
- 使用RCC开启GPIO的时钟
- 使用GPIO_Init函数初始化GPIO
- 使用输入输出函数控制GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
RCC常用函数
// 外设使能或失能
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
GPIO常用函数
// GPIO复位
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
// GPIO初始化
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
typedef struct
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
GPIO_InitTypeDef;
推挽开漏
推挽输出高低电平均有驱动能力
开漏高电平相当于高阻态,没有驱动能力,低电平有驱动能力
stm32学习笔记(代码片段)
STM32笔记GPIO输出GPIO(generalpurposeinputoutput)通用输入输出引脚电平:0V~3.3V,部分引脚可容忍5V输出模式下可控制端口输出高低电平,控制LED、蜂鸣器、模拟通信协议输出时序等输入模式下可读取端口的额高低电... 查看详情
stm32学习笔记(14)——adc初步应用(代码片段)
STM32学习笔记(14)——ADC初步应用一、ADC中断实验1.adc.h2.adc.c3.stm32f10x_it.c4.main.c二、ADC_DMA实验1.ADC_DMA单通道实验(1)adc.h(2)adc.c2.ADC_DMA多通道实验(1)ADC通道数、规则通道的配置修改& 查看详情
stm32学习笔记-第一天(代码片段)
学习:https://www.bilibili.com/video/BV1th411z7sn?p=2&vd_source=ff12b4ce9397e4d3f4c56f5b76f88c7eP2.stm32基本认识Tim定时器与EXTI中断很常用,I2C和SPI两个通信协议也很常用,GPIO通用io口超级常用stm32C8t6没有后面四 查看详情
stm32学习笔记-第一天(代码片段)
学习:https://www.bilibili.com/video/BV1th411z7sn?p=2&vd_source=ff12b4ce9397e4d3f4c56f5b76f88c7eP2.stm32基本认识Tim定时器与EXTI中断很常用,I2C和SPI两个通信协议也很常用,GPIO通用io口超级常用stm32C8t6没有后面四 查看详情
stm32学习笔记(16)——(spi续)读写串行flash(代码片段)
STM32学习笔记(16)——(SPI续)读写串行Flash一、Flash的基本知识1.Flash概要2.Flash的存储方式与读写特性二、Flash芯片介绍:W25Q641.引脚说明2.状态寄存器(STATUSREGISTER)BUSY位3.命令(INSTRUCTIONS) 查看详情
k210学习笔记k210与stm32串口通信相关(代码片段)
文章目录前言一、STM32串口中断接收K210板子发送的ASCII码整数转换为多位整形数据二、MAIXBIT(K210)与STM32串口通讯2.1实现MAIXBIT与XCOM之间的通讯2.2MAIXBIT与STM32串口通讯三、K210——UART串口通信四、K210+串口通信(实测有用)... 查看详情
k210学习笔记k210与stm32进行串口通信,k210发stm收(代码片段)
...面我们讲了STM32给K210发数据,大家可以看看这篇。K210学习笔记(二)K210与STM32进行串口通信,K210收,STM32发那么今天我们来讲一下K210给STM32发数据。硬件平台: 查看详情
stm32f407+stemwin学习笔记之stemwin移植(代码片段)
原文链接:http://www.cnblogs.com/NickQ/p/8748011.html 环境:keil5.20 STM32F407ZGT6 LCD(320*240) STemwin:STemWin_Library_V1.1.2准备:STemWIn在裸机上的移植,需要准备STemwin的库( STemwin:STemWin_Library_ 查看详情
k210学习笔记k210与stm32进行串口通信,k210收,stm32发(代码片段)
...博客,终于搞通了,大家感兴趣也可以看看。K210学习笔记(一)K210与STM32串口通信相关接线,STM32的串口引脚比较固定,而K210就牛比了,任意映射,懒人福音。 查看详情
stm32学习笔记①:环境配置及室内温湿度检测(代码片段)
文章目录前言一、项目简介1.项目名称2.项目设计思路3.项目准备软硬件二、项目实施1.BSP工程项目创建2.BSP工程开发3.硬件接线三、项目效果总结前言这是初次接触STM32单片机,作为第一个项目,在此做下笔记一、项目简介... 查看详情
stm32cubemx学习笔记——adc接口使用(代码片段)
一、ADC简介ADC(Analog-to-DigitalConverter),即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。STM32f103系列有3个ADC,精度为12位,每个ADC... 查看详情
stm32学习笔记-定时器pwm与输入捕获(代码片段)
STM32学习笔记-定时器、PWM与输入捕获1.定时器的时钟APB1和APB2上挂的外设如图所示:定时器不是直接来自于APB1和APB2,而是来自于输入为APB1或APB2的一个倍频器。 当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频... 查看详情
stm32野火教程学习笔记(代码片段)
...制器。它是控制人的必修课之一。STM32的编程方法我们在学习51单片机的时候,通常是通过编写程序直接对其输入输出(i/o)口进行操作。而STM32单片机更加高级,它有更复杂的底层。因此我们对STM32单片机的编程... 查看详情
stm32学习笔记二基于stm32f103c8t6和stm32cubemx实现uart串口通信数据收发(代码片段)
系列文章目录一、基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁二、基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发三、实战小例程基于STM32F103C8T6最小系统板和STM32CubeMX驱动WS2812B光立方四、基于STM32F103C8T6最小系统板... 查看详情
stm32cubemx学习笔记(45)——usb接口使用(hid鼠标)(代码片段)
一、USB简介USB(UniversalSerialBUS)通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康... 查看详情
stm32cubemx学习笔记(44)——usb接口使用(hid按键)(代码片段)
一、USB简介USB(UniversalSerialBUS)通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康... 查看详情
stm32cubemx学习笔记(45)——usb接口使用(hid鼠标)(代码片段)
一、USB简介USB(UniversalSerialBUS)通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康... 查看详情
stm32cubemx学习笔记(44)——usb接口使用(hid按键)(代码片段)
一、USB简介USB(UniversalSerialBUS)通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。USB接口支持设备的即插即用和热插拔功能。USB是在1994年底由英特尔、康... 查看详情