首页
壁纸
关于
站点统计
推荐
思维导图
deepseek
短巷与雨
Search
1
archliunx关闭自动休眠
4 阅读
2
搭建高效写作环境:Typora+PicGo+缤纷云图床小白完整指南
4 阅读
3
Qt安装配置教程(小白适用)
3 阅读
4
Snipaste:一款非常好用的截图神器
3 阅读
5
STM32—Keil工程模板创建详细教程
3 阅读
默认分类
工具分享
文章转载
Linux笔记
AI工具
环境搭建
问题排错
登录
Search
Linkify
累计撰写
21
篇文章
累计收到
1
条评论
首页
栏目
默认分类
工具分享
文章转载
Linux笔记
AI工具
环境搭建
问题排错
页面
壁纸
关于
站点统计
推荐
思维导图
deepseek
短巷与雨
搜索到
6
篇与
的结果
2025-09-08
主流单片机STM32F103介绍
1 什么是STM32?•STM32是ST(意法半导体)公司基于ARM Cortex-M内核开发的32位微控制器•STM32常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等•STM32功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器ARM:ARM既指ARM公司,也指ARM处理器内核ARM公司是全球领先的半导体知识产权(IP)提供商,全世界超过95%的智能手机和平板电脑都采用ARM架构ARM公司设计ARM内核,半导体厂商完善内核周边电路并生产芯片Cortex:Cortex 是 ARM 的全新一代处理器内核,它在本质上是 ARM V7 架构的实现,它完全有别于ARM的其他内核,是全新开发的。按照3类 典型的嵌入式系统应用,即高性能、微控制器、实时类,它又分成 3 个 系 列 , 即 Cortex-A 、 Cortex-M 、 Cortex-R 。 而 STM32 就 属 于Cortex-M系列。2 STM32F103(主流系列STM32F1)命名规则片上资源/外设系统结构引脚定义表编辑图 上图自:Using low cost STM32F103C8T6 boards with mbed. | Mbed上图自:Getting Started with STM32F103C8T6 Blue Pill | Program with Arduino IDE (electronicshub.org)启动配置最小系统电路
2025年09月08日
3 阅读
0 评论
0 点赞
2025-09-08
树莓派系统固件烧录教程
一、烧录工具准备硬件准备:16G及以上TF卡和读卡器,TF卡建议高速卡(卡的读写速度直接影响树莓派的运行速度)。软件准备:(下面二方法选其一即可)方法1:raspberry官方烧录工具Raspberry Pi Imager 方法2:SD卡格式化工具:SD Card Formatter、烧录工具(二选一即可):Etcher/Win32 Disk Imager(下面用Win32 Disk Imager作演示)二、镜像烧录(下面二方法选其一即可)方法一:使用官网烧录工具烧录1、下载并安装烧录工具:Raspberry Pi Imager2、选择设备对应型号3、选择操作系统这里也可选择第三方系统以及本地下载好的系统4、选择SD卡5、开启ssh、WiFi点击next会弹出提醒编辑界面,可点击编辑开启ssh、WiFi等编辑完后点击保存,然后点击烧录等待烧录完成即可方法二:使用三方烧录工具烧录1、下载系统镜像树莓派官网的下载地址:https://www.raspberrypi.com/software/operating-systems/也可在其他第三方官网平台下载其他系统镜像。2、格式化SD卡打开下载并安装好的SD卡格式化工具:SD Card Formatter,选择插入的SD卡点击格式化。3、烧录系统打开安装好的烧录工具(二选一即可):Etcher/Win32 Disk Imager(下面用Win32 Disk Imager作演示Etchert同理)选择已经下载到本地的系统镜像,再选择插入的SD卡然后点击写入等待烧录完成即可
2025年09月08日
3 阅读
0 评论
0 点赞
2025-09-08
STM32驱动DS18B20温度传感器例程(OLED显示)
效果展示:DS18B20温度显示效果 第一部分:DS18B20温度模块驱动代码头文件(DS18B20.h)#ifndef __DS18B20_H__ #define __DS18B20_H__ #include"stm32f10x.h" #define SkipROM 0xCC //跳过ROM #define SearchROM 0xF0 //搜索ROM #define ReadROM 0x33 //读ROM #define MatchROM 0x55 //匹配ROM #define AlarmROM 0xEC //告警ROM #define StartConvert 0x44 //开始温度转换,在温度转换期间总线上输出0,转换结束后输出1 #define ReadScratchpad 0xBE //读暂存器的9个字节 #define WriteScratchpad 0x4E //写暂存器的温度告警TH和TL #define CopyScratchpad 0x48 //将暂存器的温度告警复制到EEPROM,在复制期间总线上输出0,复制完后输出1 #define RecallEEPROM 0xB8 //将EEPROM的温度告警复制到暂存器中,复制期间输出0,复制完成后输出1 #define ReadPower 0xB4 //读电源的供电方式:0为寄生电源供电;1为外部电源供电 void ds18b20_init(void); unsigned short ds18b20_read(void); #endif第二部分:DS18B20温度模块驱动代文件(DS18B20.c)#include "ds18b20.h" #define EnableINT() #define DisableINT() #define DS_PORT GPIOA #define DS_DQIO GPIO_Pin_1 #define DS_RCC_PORT RCC_APB2Periph_GPIOA #define DS_PRECISION 0x7f //精度配置寄存器 1f=9位; 3f=10位; 5f=11位; 7f=12位; #define DS_AlarmTH 0x64 #define DS_AlarmTL 0x8a #define DS_CONVERT_TICK 1000 #define ResetDQ() GPIO_ResetBits(DS_PORT,DS_DQIO) #define SetDQ() GPIO_SetBits(DS_PORT,DS_DQIO) #define GetDQ() GPIO_ReadInputDataBit(DS_PORT,DS_DQIO) static unsigned char TempX_TAB[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; void Delay_us(u32 Nus) { SysTick->LOAD=Nus*9; //时间加载 SysTick->CTRL|=0x01; //开始倒数 while(!(SysTick->CTRL&(1<<16))); //等待时间到达 SysTick->CTRL=0X00000000; //关闭计数器 SysTick->VAL=0X00000000; //清空计数器 } unsigned char ResetDS18B20(void) { unsigned char resport; SetDQ(); Delay_us(50); ResetDQ(); Delay_us(500); //500us (该时间的时间范围可以从480到960微秒) SetDQ(); Delay_us(40); //40us //resport = GetDQ(); while(GetDQ()); Delay_us(500); //500us SetDQ(); return resport; } void DS18B20WriteByte(unsigned char Dat) { unsigned char i; for(i=8;i>0;i--) { ResetDQ(); //在15u内送数到数据线上,DS18B20在15-60u读数 Delay_us(5); //5us if(Dat & 0x01) SetDQ(); else ResetDQ(); Delay_us(65); //65us SetDQ(); Delay_us(2); //连续两位间应大于1us Dat >>= 1; } } unsigned char DS18B20ReadByte(void) { unsigned char i,Dat; SetDQ(); Delay_us(5); for(i=8;i>0;i--) { Dat >>= 1; ResetDQ(); //从读时序开始到采样信号线必须在15u内,且采样尽量安排在15u的最后 Delay_us(5); //5us SetDQ(); Delay_us(5); //5us if(GetDQ()) Dat|=0x80; else Dat&=0x7f; Delay_us(65); //65us SetDQ(); } return Dat; } void ReadRom(unsigned char *Read_Addr) { unsigned char i; DS18B20WriteByte(ReadROM); for(i=8;i>0;i--) { *Read_Addr=DS18B20ReadByte(); Read_Addr++; } } void DS18B20Init(unsigned char Precision,unsigned char AlarmTH,unsigned char AlarmTL) { DisableINT(); ResetDS18B20(); DS18B20WriteByte(SkipROM); DS18B20WriteByte(WriteScratchpad); DS18B20WriteByte(AlarmTL); DS18B20WriteByte(AlarmTH); DS18B20WriteByte(Precision); ResetDS18B20(); DS18B20WriteByte(SkipROM); DS18B20WriteByte(CopyScratchpad); EnableINT(); while(!GetDQ()); //等待复制完成 /////////// } void DS18B20StartConvert(void) { DisableINT(); ResetDS18B20(); DS18B20WriteByte(SkipROM); DS18B20WriteByte(StartConvert); EnableINT(); } void DS18B20_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(DS_RCC_PORT, ENABLE); GPIO_InitStructure.GPIO_Pin = DS_DQIO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //2M时钟速度 GPIO_Init(DS_PORT, &GPIO_InitStructure); } void ds18b20_init(void) { DS18B20_Configuration(); DS18B20Init(DS_PRECISION, DS_AlarmTH, DS_AlarmTL); DS18B20StartConvert(); } unsigned short ds18b20_read(void) { unsigned char TemperatureL,TemperatureH; unsigned int Temperature; DisableINT(); ResetDS18B20(); DS18B20WriteByte(SkipROM); DS18B20WriteByte(ReadScratchpad); TemperatureL=DS18B20ReadByte(); TemperatureH=DS18B20ReadByte(); ResetDS18B20(); EnableINT(); if(TemperatureH & 0x80) { TemperatureH=(~TemperatureH) | 0x08; TemperatureL=~TemperatureL+1; if(TemperatureL==0) TemperatureH+=1; } TemperatureH=(TemperatureH<<4)+((TemperatureL&0xf0)>>4); TemperatureL=TempX_TAB[TemperatureL&0x0f]; //bit0-bit7为小数位,bit8-bit14为整数位,bit15为正负位 Temperature=TemperatureH; Temperature=(Temperature<<8) | TemperatureL; DS18B20StartConvert(); return Temperature; //返回16位数据 bit0-bit7为小数位,bit8-bit14为整数位,bit15为正负位 }经过测试,通讯正常,温度读取正确。。 注意程序的读取函数,返回值的说明喔。 我之前没仔细分析,把返回值乘以0.0625....结果不对。后来发现,返回的值,已经是温度的16进制形式。假如 返回值为 0x1504 那么温度即 21.4。 0x15=16+5=21 0x04=4 21.4 ℃。程序调用方法:int main(void) { unsigned int value; ds18b20_init(); while(1) { value = ds18b20_read(); } } B站视频展示:https://www.bilibili.com/video/BV1nN41187n3/?vd_source=544771c3a0efd4ea1dba16527ea8cd52源码获取:公众号后台发送:STM32-DS18B20例程
2025年09月08日
3 阅读
0 评论
0 点赞
2025-09-08
STM32—Keil工程模板创建详细教程
1 建立工程文件夹,Keil中新建工程2 选择芯片型号3 工程文件夹里建立Start、Library、User文件夹,复制固件库里面的必要文件到工程文件夹固件库网盘:https://pan.baidu.com/s/1yr6qu0WujwCGcmYUyJU1kg?pwd=vqzz 提取码: vqzz 其作用分别是: (1)Start—用于管理MDK开发环境下与具体芯片相对应的启动代码及CM3管理CMSIS内核的驱动程序代码和配置时钟代码; (2)Library—用于管理STM32外设的相关驱动程序代码; (3)User—用于管理自行开发的程序代码;4 工程里对应建立Start、Library、User同名称的分组,然后将文件夹内的文件添加到工程分组里5 工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹Include Paths:设置为编译过程中文件包含要查找的路径 (Include Paths),单击该选项右侧的按钮,即可设置要包含的路 径。注意:必须把工程模板涉及的所有文件所在的文件夹作为路径设 置进来。编6 工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER因: 则: 该宏定义符号表示要使用固件库,在固件库开发模式下,该符号必须设置;7 工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run即可
2025年09月08日
3 阅读
0 评论
0 点赞
2025-09-08
OLED取模详细指南(中文&图片)
一、中文取模我们用的OLED液晶屏是由12864个发光点阵组成,即分辨率是12864。 ASCII码可以68、88、816像素,汉字一般显示像素为16*16。 一般为了显示效果理想,英文和数字常选用816像素显示。推荐使用比较好用的取模软件:PCtoLCD20021.打开取模软件PCtoLCD2002,将模式设置为字符模式:2.选项设置:3.中文取模演示(以宋体,16*16点阵为例)二、图片取模因为我们用的OLED液晶屏是由128*64个发光点阵组成,即分辨率是128*64。则我们用的图片分辨率(像素)最大为128 * 64且需要格式是bmp的图片。1.将图片格式转换为bmp 格式且设置分辨率不能超过128*64我用win10自带的画图软件为例演示:这里的像素也可以设置为别的,但最大是128*64保存为bmp图片文件,选择单色位图2.打开取模软件PCtoLCD2002,导入刚才生成的bmp图片这里模式会自动改为图片模式(没改自己改下):3.选项设置:4.图片取模演示
2025年09月08日
1 阅读
0 评论
0 点赞
1
2