STM32学习笔记(三) —— GPIO点亮LED
1.GPIO简介
GPIO,全称是General-purpose input/output(通用输入输出)。在单片机中是表示能被控制的引脚,能检测输入信号的高低电平,也能输出高低电平控制外部设备。STM32F103RCT6一共有64个引脚,其中有51个GPIO,其他引脚分别是电源、地、一个复位引脚以及一个BOOT引脚。这51个GPIO被分为不同的组,比如PAx、PBx、PCx等,每组一般是16个GPIO。又因为单片机功能很强大,集成了很多外设(比如UART、I2C、SPI等),但引脚有限,所以一般每个GPIO能复用成好几种功能,对于哪个引脚可以用作哪些功能可以通过查阅数据手册得知。比如PC3引脚,它是第11脚,引脚名称是PC3,可以作为GPIO(PC3),也可以用作ADC的输入引脚

2.GPIO 结构

图中所示是GPIO基本的内部控制框图,总体分为输入与输出两部分。每个GPIO端口都可以用对应的寄存器来控制其状态。
3.GPIO 模式
输入浮空,输入引脚内部不进行上下拉
输入上拉,输入引脚内部上拉
输入下拉,输入引脚内部下拉
模拟输入,一般用于模拟量输入,比如ADC输入
开漏输出,引脚只能输出电平,不能输出高电平,可以用于线与功能
推挽输出,既能输出高电平也能输出低电平
推挽复用功能,引脚被其他外设接管(比如UART),能输出高低电平
开漏复用功能,引脚被其他外设接管(比如I2C),只能输出低电平
4.GPIO 寄存器
GPIO寄存器就是来控制GPIO的功能及行为的,可以将GPIO配置成上述列出的各种模式,让GPIO检测输入的信号或者控制其输出高电平或者低电平等
每个GPIO有以下几种寄存器
| 两个32位配置寄存器 | GPIOx_CRL and GPIOx_CRH |
|---|---|
| 两个32位数据寄存器 | GPIOx_IDR and GPIOx_ODR |
| 一个32位置位/复位寄存器 | GPIOx_BSRR |
| 一个16位复位寄存器 | GPIOx_BRR |
| 一个32位锁定寄存器 | GPIOx_LCKR |
4.1 GPIOx_CRL and GPIOx_CRH寄存器
GPIOx_CRH寄存器与GPIOx_CRL寄存器类似,只不过GPIOx_CRL寄存器用于控制每组GPIO的0-7个引脚,GPIOx_CRH寄存器用于控制每组GPIO的8-15个引脚,这里重点分析GPIOx_CRL寄存器

上图是参考手册中的GPIOx_CRL寄存器描述。可以看到这32个位都是由CNFy[1:0] - MODEy[1:0]重复组成(其中,y = 0,1,2…7)。每一对CNFy - MODEy(占4个位)用来配置一个GPIO,CNF0 - MODE0用来控制GPIO0,CNF1 - MODE1用来控制GPIO1,依次类推。所以GPIOx_CRL(共32个位)可以控制GPIO0 - 7这8个引脚,GPIOx_CRH用来控制GPIO8 - 15这8个引脚。GPIO属于哪一组由GPIOx_CRL/H中的x指定(x = A,B,C…)。
MODEy[1:0]用于选择GPIO是输入模式还是输出模式,如果是输出模式可以指定输出的最大速率
CNFy[1:0]用于选择GPIO的工作模式(输入浮空、输入上拉、输入下拉…)
比如配置PC5引脚为推挽输出,输出速率2MHz:
1° PC5属于C组引脚,应该选择GPIOC_CRL或者GPIOC_CRH寄存器
2° PC5是C组第5个引脚,每组0-7这8个引脚用GPIOx_CRL寄存器配置,每组8-15这8个引脚用GPIOx_CRH寄存器配置,应该选择GPIOC_CRL寄存器
3° 配置GPIOC_CRL寄存器中的第20 -23位(CNF5 - MODE5)
/*
0x03是十六进制
换成二进制是11,用32位来表示就是11前面加30个0
0000 0000 0000 0000 0000 0000 0000 0011
左移20位得到
0000 0011 0000 0000 0000 0000 0000 0000
按位取反得到
1111 1100 1111 1111 1111 1111 1111 1111,两个0的位置对应的就是第20 - 21位,也就是MODE5[1:0]
将上面的值与原来的值进行按位与操作就会将MODE5[1:0]清零
*/
GPIOC->CRL &= ~((uint32_t)0x03 << 20); //将 MODE5[1:0] 清0
/*
同理,将0x02 << 20位后再与原来的值按位或就可以将MODE5[1:0]配置为10
GPIOC_CRL寄存器一共有32个位,上述这样赋值的好处是不会干扰其他位的值,只对需要修改的位进行修改
*/
GPIOC->CRL |= ((uint32_t)0x02 << 20); //将 MODE5[1:0] 配置为10 输出模式,最大速率2MHz
GPIOC->CRL &= ~((uint32_t)0x03 << 22); //将 CNF5[1:0] 清0
/* 上一步已经清0,如果还要配置为0,这一步可以不要 */
GPIOC->CRL |= ((uint32_t)0x00 << 22); //将 CNF5[1:0] 配置为00 通用推挽输出模式
4.2 GPIOx_IDR and GPIOx_ODR寄存器
GPIOx_IDR寄存器与GPIOx_ODR寄存器类似,只不过GPIOx_IDR寄存器用于读取GPIO口电平状态且各寄存器位只能读不能写(也不需要写),GPIOx_ODR用于控制GPIO口输出电平状态

从GPIOx_ODR寄存器描述中可以看到, 32位寄存器的高16位是保留的,低16位用于控制GPIO口的电平输出。每一个ODRy用于控制一个GPIO,ODR0用于控制GPIO0,ODR1用于控制GPIO1,依次类推。所以GPIOx_ODR的低16位就足以控制一组GPIO,GPIO属于哪一组由GPIOx_ODR中的x指定(x = A,B,C…)。
ODRy置1对应的GPIO会输出1(高电平),ODRy清0对应的GPIO会输出0(低电平)
比如配置PC5引脚输出0(低电平)/1(高电平):
1° PC5属于C组引脚,应该选择GPIOC_ODR寄存器
2° 配置GPIOC_ODR寄存器中的第5位(ODR5)
/* PC5引脚输出0(低电平) */
GPIOC->ODR &= ~((uint16_t)0x01 << 5); //将ODR5清0/* PC5引脚输出1(高电平) */
GPIOC->ODR |= ((uint16_t)0x01 << 5); //将ODR5置1
4.3 GPIOx_BSRR寄存器

在GPIOx_BSRR寄存器中,有两种类型的控制位,一种是BRy(高16位),一种是BSy(低16位),最终都是用于控制GPIOx_ODR寄存器。每一个BRy/BSy用于控制一个对应的ODRy位,BR0/BS0用于控制ODR0,BR1/BS1用于控制ODR1,依次类推。而GPIOx_ODR寄存器最终是控制GPIO输出电平状态的,所以可以等效认为BRy/BSy控制的是GPIO输出电平状态,BR0/BS0用于控制GPIO0,BR1/BS1用于控制GPIO1,依次类推。
BRy:写0不会对GPIO输出电平产生影响,置1使对应的GPIO输出低电平
BSy:写0不会对GPIO输出电平产生影响, 置1使对应的GPIO输出高电平
比如配置PC5引脚输出0(低电平)/1(高电平):
1° PC5属于C组引脚,应该选择GPIOC_BSRR寄存器
2° 要输出低电平应该选择BRy位,PC5是C组的第5个引脚,应该选择BR5位;要输出高电平应该选择BSy位,PC5应该选择BS5位
3° 配置GPIOC_BSRR寄存器中的第21位(BR5)/第5位(BS5)
/* PC5引脚输出0(低电平) */
/* 0x01 << 5是定位到第5个GPIO,再左移16是定位到BRy位,因为BRy位是GPIOx_BSRR寄存器的高16位 */
GPIOC->BSRR = (((uint32_t)0x01 << 5) << 16);/* PC5引脚输出1(高电平) */
GPIOC->BSRR = ((uint32_t)0x01 << 5);
4.4 GPIOx_BRR寄存器


GPIOx_BRR寄存器也是用于控制GPIOx_ODR寄存器,与GPIOx_BSRR寄存器中的BRy位功能相同,这里也可以认为是直接控制GPIO输出电平状态的,只能让对应的GPIO输出低电平
比如配置PC5引脚输出0(低电平):
1° PC5属于C组引脚,应该选择GPIOC_BRR寄存器
2° 配置GPIOC_BRR寄存器中的第5位(BR5)
/* PC5引脚输出0(低电平) */
GPIOC->BRR = ((uint16_t)0x01 << 5);
4.5 GPIOx_LCKR寄存器

GPIOx_LCKR寄存器可以锁定GPIOx_CRL与GPIOx_CRH寄存器的配置,一旦对相应的GPIO被锁定后,在下次系统复位之前将不能再更改对应的GPIOx_CRL与GPIOx_CRH寄存器。
锁键写入序列:
对LCKK位 写1 -> 写0 -> 写1 -> 读0 -> 读1,并且在进行写入序列时不能更改LCK[15:0]位的值
最后一个读1可以省略,但可以用来确认锁键已被激活
比如要锁定PC5的配置寄存器(GPIOC_CRL and GPIOC_CRH):
uint32_t xReturn = 0x00;
/* 0x01 << 16 是对LCKK位写1,0x01 << 5 是对LCK5位置1(对PC5的配置寄存器进行锁定) */
GPIOC->LCKR = ((uint16_t)0x01 << 16 | (uint16_t)0x01 << 5);
/* 对LCKK位写1,同时LCK5位的值不变 */
GPIOC->LCKR = ((uint16_t)0x01 <<5);
/* 对LCKK位写1,同时LCK5位的值不变 */
GPIOC->LCKR = ((uint16_t)0x01 << 16 | (uint16_t)0x01 << 5);
/* 读0 */
xReturn = GPIOC->LCKR;
/* 读1 */
xReturn = GPIOC->LCKR;if(xReturn & ((uint16_t)0x01 << 16)) {printf("PC5 has been locked\r\n");
}
当PC5的配置寄存器被锁定后,在下次系统复位之前都不能再更改。如果需要继续锁定其他GPIO,可针对对应的GPIO再次重复上述写序列。
上述对GPIO寄存器进行了一个比较完整的分析,对于其他外设,也同样是操作对应的外设寄存器来实现相应的功能,至于每个外设的寄存器描述可以查阅参考手册。由于STM32寄存器比较多,我们在实际应用时一般很少使用寄存器编程,更多的是使用库编程,后续我们采用HAL库编程的方式进行功能验证
5.硬件连接

我们开发板上将LED引脚接在单片机的PB1引脚上。当PB1输出高电平时,LED不亮;当PB1输出低电平时,LED点亮。开发板完整的原理图可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取
6.寄存器软件编程
1° 这里的PB1引脚是当作普通引脚来使用,所以不能配置成开漏复用或者推挽复用,又要求PB1能输出高低电平,所以要配置成通用推挽输出模式,这里要求的速率不高,可以配置成最大输出速率2MHz就可以。(那为什么不能配置成输入模式呢,因为输入模式下的引脚状态是由外部决定的,内部可以去读取外部引脚状态。我们这里要求PB1引脚既要有高电平也要有低电平,即使外部能让PB1引脚在高低电平之间转换,也不一定是单片机内部程序可控的,所以不能用输入模式。)
2° 在while循环中将LED点亮500ms再熄灭500ms,依次循环。500ms延时可以使用HAL_Delay(500)来实现。
在编程之前,我们还要知道要使用某一个外设功能时,要先打开外设的时钟,时钟的开启在参考手册中RCC(复位和时钟控制)那一章,通过查阅手册可以发现GPIOB的时钟使能位在RCC_APB2ENR寄存器中的第3位


将RCC_APB2ENR寄存器中的第3位置1就可以开启GPIOC的时钟,其他外设时钟的开启也是类似的。
开启GPIOC时钟代码:
RCC_APB2ENR |= ((uint16_t)0x01 << 3); //开启GPIOB时钟
在上一节调试串口的基础上增加以下代码:
/* 在while循环之前添加以下初始化代码 */
RCC->APB2ENR |= ((uint16_t)0x01 << 3 ); //开启GPIOB时钟
/* 配置PB1为通用推挽输出模式,输出速率设置为2MHz */
GPIOB->CRL &= ~((uint32_t)0x03 << 4); //将 MODE1[1:0] 清0
GPIOB->CRL |= ((uint32_t)0x02 << 4); //将 MODE1[1:0] 配置为10 输出模式,最大速率2MHz
GPIOB->CRL &= ~((uint32_t)0x03 << 6); //将 CNF1[1:0] 清0
GPIOB->CRL |= ((uint32_t)0x00 << 6); //将 CNF1[1:0] 配置为00 通用推挽输出模式/* PB1引脚输出1(高电平),默认熄灭LED */
GPIOB->BSRR = ((uint32_t)0x01 << 1); //这里也可以使用ODR寄存器/* while循环中控制LED亮灭代码 */
while(1)
{/* PB1引脚输出0(低电平)点亮LED */GPIOB->BSRR = (((uint32_t)0x01 << 1) << 16); //这里也可以使用BRR寄存器、ODR寄存器/* 延时 */HAL_Delay(500);/* PB1引脚输出1(高电平)熄灭LED */GPIOB->BSRR = ((uint32_t)0x01 << 1); //这里也可以使用ODR寄存器/* 延时 */HAL_Delay(500);
}
将程序下载到开发板,发现LED会以500ms的间隔不停闪烁。
上述我们使用的是寄存器来实现LED亮灭的功能的,下面我们使用STM32CubeMX来配置HAL库实现LED亮灭功能。
7.HAL库软件编程
使用STM32CubeMX打开工程文件

按下图所示找到PB1引脚,点击后在弹出的选项中选择GPIO_Output

按下图配置PB1引脚

生成代码后,可以发现在gpio.c文件中已经配置好了PB1引脚:
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable *//* 开启GPIO时钟 */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/* 开启GPIOB时钟 */__HAL_RCC_GPIOB_CLK_ENABLE();/* 这里将PB1引脚默认输出高电平 *//*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);/*Configure GPIO pin : PtPin *//* 这里是PB1引脚,我们给他定义了一个标签LED,所以他显示LED_Pin */GPIO_InitStruct.Pin = LED_Pin; //在main.h中有定义:#define LED_Pin GPIO_PIN_1/* 推挽输出模式 */GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;/* 无上下拉 */GPIO_InitStruct.Pull = GPIO_NOPULL;/* 输出速率选择 */GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;/* 调用HAL_GPIO_Init对PC5进行初始化 */HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct); //在main.h中有定义:#define LED_GPIO_Port GPIOB
}
以上就是STM32CubeMX对PB1引脚做的初始化配置,并且会在main函数中调用初始化配置函数MX_GPIO_Init()。对于如何使用这个引脚是由我们自己实现的,不过有相关的库函数可供我们调用,这些函数可以在对应外设的头文件中查找。比如GPIO相关的接口函数可以在stm32f1xx_hal_gpio.h中找到

我们上述初始化PC5引脚时调用的就是HAL_GPIO_Init函数,如果需要让PC5引脚输出高低电平可以调用
HAL_GPIO_WritePin函数。在对应外设的源文件中可以找到相关函数,函数定义上方有注释说明函数各个参数的含义。比如在stm32f1xx_hal_gpio.c中的HAL_GPIO_WritePin函数

第一个参数是指定哪一组GPIO,我们使用PB1,是B组,就是GPIOB;
第二个参数是指定哪一个引脚,我们使用PB1是C组第1个引脚,就是GPIO_PIN_1;
第三个参数是指要在引脚上输出的电平状态,GPIO_PIN_RESET是输出低电平,GPIO_PIN_SET是输出高电平。
那我们要让LED灯亮灭时就可以调用HAL_GPIO_WritePin函数,我们在while函数中编程:
/* while循环中控制LED亮灭代码 */
while(1)
{/* PB1引脚输出0(低电平)点亮LED */HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);/* 延时 */HAL_Delay(500);/* PB1引脚输出1(高电平)熄灭LED */HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);/* 延时 */HAL_Delay(500);
}
将程序下载到开发板后,发现LED会以500ms的间隔不停闪烁。
本例程代码可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取
以上是通过开发板进行实际验证的,下面使用软件仿真,
我们首先进入调试界面( 前面章节有提到,所以本篇以及后续章节都不再重复提及 ),按下图所示打开逻辑分析仪

点击 Setup…

添加PB1端口

选择显示类型为Bit

点击Close就可以在逻辑分析仪中看到我们添加的PB1端口

点击全速运行后,就可以看到PB1的波形,每隔500ms翻转一次状态( 高低电平 )

注:逻辑分析仪中每一隔代表的时间间隔,可以通过,先将鼠标光标移到波形区域,使用鼠标中的滚轮滚动调节
相关文章:
STM32学习笔记(三) —— GPIO点亮LED
1.GPIO简介 GPIO,全称是General-purpose input/output(通用输入输出)。在单片机中是表示能被控制的引脚,能检测输入信号的高低电平,也能输出高低电平控制外部设备。STM32F103RCT6一共有64个引脚,其中有51个…...
gRPC使用详解
起源特点主要优缺点应用场景组成部分使用方法SpringBoot集成gRPCVert.x集成gRPCNacos集成gRPC监控gRPC调用过程Java使用示例 起源 gRPC的起源可以追溯到2015年,当时谷歌发布了一款开源RPC框架,名为gRPC。gRPC的设计初衷是为了提供一种标准化、可通用和跨…...
海康威视有插件、无插件播放;webrtc直播;西瓜视频播放器;mpegts.js直播;flvjs直播
Notes 视频播放的几种方式 一、Video mp4链接直接播放 二、海康威视3.3插件版直播、云台控制,资源下载地址 index.html引入hk文件中的js文件双击HCWebSDKPlugin.exe安装插件前端参照文件夹hkCamera中的示例代码 三、海康威视3.2无插件版直播,资源下…...
测试工作(新入职)感悟
背景:我之前在小规模传统公司,工作强度一般,早九晚六,偶尔加班。现在就职的是大型同行业互联网公司,工作强度大,早九晚九,目前已经入职两个礼拜。 基于这个背景,新工作对我是比较有…...
hivesql的基础知识点
目录 一、各数据类型的基础知识点 1.1 数值类型 整数 小数 float double(常用) decimal(针对高精度) 1.2 日期类型 date datetime timestamp time year 1.3 字符串类型 char varchar / varchar2 blob /text tinyblob / tinytext mediumblob / mediumtext lon…...
Linux下的线程操作
一、多线程的创建于退出 1. pthread_create(线程的创建) pthread_create 是 POSIX 线程库中的函数,用于创建一个新的线程。 函数原型如下: int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void…...
机器学习 | 如何利用集成学习提高机器学习的性能?
目录 初识集成学习 Bagging与随机森林 Otto Group Product(实操) Boosting集成原理 初识集成学习 集成学习(Ensemble Learning)是一种通过组合多个基本模型来提高预测准确性和泛化能力的机器学习方法。它通过将多个模型的预测结果进行整合或投票来做…...
[Python] 什么是PCA降维技术以及scikit-learn中PCA类使用案例(图文教程,含详细代码)
什么是维度? 对于Numpy中数组来说,维度就是功能shape返回的结果,shape中返回了几个数字,就是几维。索引以外的数据,不分行列的叫一维(此时shape返回唯一的维度上的数据个数),有行列…...
npm 淘宝镜像正式到期,更新使用成功
npm 淘宝镜像原网址:https://registry.npm.taobao.org/ npm 淘宝镜像更新后网址:https://registry.npmmirror.com 过程: 部署 nuxt docker 容器的时候,报以下错: npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CE…...
python_蓝桥杯刷题记录_笔记_全AC代码_入门2
前言 现在正式进入蓝桥杯的刷题啦,用python来做算法题,因为我之前其实都是用C来做题的,但是今年的话我打算换python来试试,很明显因为也才这学期接触python 加上之前C做题也比较菜,所以我打算用python重新来做题&#…...
备战蓝桥杯---数据结构与STL应用(入门4)
本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题 话不多说,直接看题: 下面为分析: 很显然,我们在整体上以s[i]为基准,先把士兵按s[i]排好。然后,我们先求s[i]大的开始,即规定选人数…...
2023_12蓝桥杯STEMA 考试 Scratch 中级试卷解析
2023蓝桥杯STEMA 考试 Scratch 中级试卷(12 月)解析 由于没有原始文件,这里使用的角色和背景和实际题目会有所差异,已经尽量还原原题,以下代码仅供参考。吐槽一句:蓝桥杯越来越变态了!\(`Δ’)/\(`Δ’)/\(`Δ’)/孩子学习速度永远也赶不上内卷的速度。 一、选择…...
从编程中理解:大脑中的杏仁核
编程和神经科学在某种程度上可以相互借鉴,尤其是在模拟大脑功能时。让我们以Unity游戏引擎中的C#代码为例,结合金庸武侠小说中的人物形象来构建一个类比故事,探讨如何通过编程模拟大脑中杏仁核的作用。 假设在一款名为“脑海江湖”的Unity游戏中,主角张无忌(代指玩家角色…...
Maven dependency中的scope
Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中,scope的默认值是compile。 scope的分类 compile(默认) 含义: compile 是默认值,如果没有指定 scope 值,该元素…...
代码随想录算法训练营DAY11 | 栈与队列 (2)
一、LeetCode 20 有效的括号 题目链接:20.有效的括号https://leetcode.cn/problems/valid-parentheses/ 思路:遇到左括号直接进栈;遇到右括号判断站顶是否有匹配的括号,没有就返回flase,有就将栈顶元素出栈࿱…...
【Spring实战】33 Spring Boot3 集成 Nacos 配置中心
文章目录 1. 配置中心定义2. 解决哪些问题3. 常用的配置中心4. 使用示例1)没引入 Nacos 配置中心2)引入依赖3)配置Nacos连接信息4)在 Nacos 上配置属性5)在 Spring Boot 中使用配置6)启动服务&验证7&am…...
ElementUI安装与使用指南
Element官网-安装指南 提醒一下:下面实例讲解是在Mac系统演示的; 一、开发环境配置 电脑需要先安装好node.js和vue2或者vue3 安装Node.js Node.js 中文网 安装node.js命令:brew install node node.js安装完后,输入࿱…...
Opencv——图片卷积
图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二…...
项目安全-----加密算法实现
目录 对称加密算法 AES (ECB模式) AES(CBC 模式)。 非对称加密 对称加密算法 对称加密算法,是使用相同的密钥进行加密和解密。使用对称加密算法来加密双方的通信的话,双方需要先约定一个密钥,加密方才能加密&#…...
只用一台服务器部署上线(宝塔面板) 前后端+数据库
所需材料 工具:安装宝塔面板服务器至少一台、域名一个 前端:生成dist文件(前端运行build命令) 后端:生成jar包(maven运行package命令) 准备: 打开宝塔面板,点击进入软…...
cgm-remote-monitor开发者API:构建第三方血糖应用的技术细节
cgm-remote-monitor开发者API:构建第三方血糖应用的技术细节 【免费下载链接】cgm-remote-monitor nightscout web monitor 项目地址: https://gitcode.com/gh_mirrors/cg/cgm-remote-monitor 想要为糖尿病患者开发创新的血糖监控应用?cgm-remote…...
OpenClaw(小龙虾)Windows 11 一键部署教程|2026 最新版|零代码・免配置・解压即用
适用系统:Windows 11 专业版 / 家庭版 / 正式版(全版本兼容) 项目介绍:OpenClaw 是 GitHub 星标 28W 的开源本地 AI 智能体,可自动操控电脑、整理文件、浏览器自动化、办公自动化,被国内用户称为小龙虾&am…...
从标注到训练:手把手教你用Labelme制作YOLOv8-Pose可用的关键点数据集
从标注到训练:手把手教你用Labelme制作YOLOv8-Pose可用的关键点数据集 在计算机视觉领域,关键点检测技术正逐渐成为研究热点。无论是人体姿态估计、面部表情识别还是工业质检中的零件定位,准确的关键点检测都是实现这些应用的基础。然而&…...
On the Spectral Geometry of Cognitive Manifolds and the Emergence of Physical Laws
On the Spectral Geometry of Cognitive Manifolds and the Emergence of Physical Laws (A Noncommutative Framework for Free Will, Physical Constants, and Arithmetical Obstructions)作者:方见华 单位:世毫九实验室摘要&am…...
LeetCode Hot Code——合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。示例 1:输入:intervals [[1,3],[…...
我需要开发出一个检测手机移动的算法来
1 用GPS2 运动传感器3 其他传感器就是真正能100%不会误报,而且精度达到:只要移动距离超过1米就要报警的那种。挂在树上面即使手机不停在转动也不会误报后来发现:只需要一个位移检测算法就可以了。...
AUTOSAR Ethernet Stack深度解析,手把手实现SOME/IP序列化、DDS桥接与时间同步校准
第一章:AUTOSAR以太网协议栈架构概览AUTOSAR以太网协议栈是面向汽车电子域控制器与中央计算平台的关键通信基础设施,其设计严格遵循AUTOSAR Classic Platform规范(R21-11及后续版本),在保持与传统CAN/LIN协议栈统一配置…...
保姆级教程:在Ubuntu 22.04上从源码编译安装Micro XRCE-DDS Agent(附虚拟机环境配置)
从零构建嵌入式通信桥梁:Ubuntu 22.04源码编译Micro XRCE-DDS Agent全指南 当AURIX Tricore这类嵌入式设备需要与复杂系统对话时,XRCE-DDS就像一位专业翻译官。想象一下,你的开发板是个只会说方言的本地向导,而云端服务是个讲标准…...
bilibili-parse:让B站视频解析变得简单高效的PHP工具
bilibili-parse:让B站视频解析变得简单高效的PHP工具 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 价值定位:为什么选择bilibili-parse 当你需要在自己的项目中集成B站视频…...
【AI】Datadog
Datadog是当前全球范围内最主流的商业可观测性平台,是一个将监控、安全与AI分析深度整合的SaaS服务。 作为业界公认的领军者,其核心价值在于提供了一个 “大一统”的中央控制台,帮助企业技术团队全面洞察其整个技术栈的运行状况。在AI快速发展…...
