- 博客(46)
- 收藏
- 关注
原创 TF/SD卡开发驱动(SPI)
对于SD卡的SPI模式在上电同步后应该马上进行CM0复位进入SPI模式,SDIO模式这步非必要,复位时序在正常情况下都是要求四线都是高电平,这也是为什么外接上拉电阻的原因,如果CS交给硬件管理,那么只会在发送数据的时候拉低CS,完成马上拉高CS,所以不符合这里的时序,还有一个问题就是MOSI在空闲时必须保持高电平,这点非常重要,就算外接上拉电阻复用后也会被拉下来,因为是输出,默认是输出低电平的,所以在发送时钟脉冲的时候MOSI初始为输入IO口就好了,在需要发送数据之前在复用到SPI上。
2024-07-16 15:31:56 1767
原创 ESP32-IDF 中PSRAM初始化失败解决
很久之前买了一块ESP32-S3的板子,为了学习ESP32同时做一些物联网的项目,具体型号是ESP32-S3-N8R8。内部封装了高达8M的PSRAM和外部8M的falsh,带有内存映射功能的硬件SPI接管,可用说是性能非常高且内存和存储是非常够用了。
2024-05-27 14:13:07 2098
原创 双线IO通信协议
(包含源码以及框架)当你开发的模块够多的时候会发现往往很多集成度很高的模块都是需要通信的,而且通信协议不只是传统的UART,SPI,IIC这些,很多协议都是那种厂商自定义的,比如用DHT11单总线用时序来分辨,还有一些模块是IO的高低加延时判断组成数据0或者数据1这种,总之MCU通信的本质也就是判断IO口电平的高低来给出数据,然后进行的数据处理(时基和时序),所以我在想自己能不能定义一个通信来实现呢,所以就有了以下通信方式。暂定为单工通信,stm32f103作为主机发送,SWM341作为从机接收数据。
2024-05-08 11:03:57 1184
原创 9.USB OTG应用
对于USB OTG来说,基于以下特性。1.内部可控信号线的上下拉电阻,当硬件外设使能时会自动根据配置进行上下拉处理,无需外部电路。2.大多数情况都是作为设备进行工作。3.实现功能的复杂程序取决于芯片的技术依赖环境。所以只要我们在前面的学习中,理解了USB协议,熟悉了设备开发,就可以发现本质,不论是USB OTG还是USBD,只要找到中断处理函数,对应的事务处理和请求处理,就可以掌握整个枚举和通信的过程,以达到优化和修改的目的,实现预想的情景。
2024-05-08 10:39:54 995
原创 8.USB:WINUSB设备(通用串行总线设备)
经过前面的学习,从USB理论到实践,从工程实例一步步的证实,应该对于USB来说有一定的认识了,到了这里wimusb并没有想象中的神秘,它也只是一个设备类。为了能够在windows下快速建立一个唯一寻址的免驱串行通信设备,微软制定了一个特别厂商类设备,为winusb设备,它的类代码为0xFF特定厂商类)。到这里我们的WINUSB就结束了,值得注意的是除了枚举设时实例路径要变化外等相关注意外,还需要知道VID和PID对于设备来说的意义,以及设备的GUID。
2024-05-07 17:15:29 2190
原创 6. USB:CDC_ACM设备(虚拟串口)
文章以实现cdc_acm设备为demo进行了虚拟串口的测试,并通过demo解析了整个驱动框架的核心,以及中断处理和请求处理。整个中断的设计是非常合理的,以及请求的处理,但是设备类下的文件实现需要用户自己实现,也可以基于demo进行修改。比如描述符和设备类功能接口下函数。以及通信框架。cdc_acm的框架相对其他的设备类来说比较复杂,但是可以从这个设备类入手,方便我们后续在此基础上改写为HID键盘设备和WINUSB通用串行总线设备。
2024-05-06 17:10:13 4243
原创 5.USB工程实例
实例工程为基于KEIL MDK下的GD32F103C8T6工程,移植了官方的标准外设库和USBD(USB设备驱动)库,并完成了CDC_ACM、HID、WINUSB设备类的驱动和应用。
2024-05-06 13:43:00 1263 3
原创 4.虚拟串口
之前买过一个stm32f103c8t6的最小核心板,10块钱出头,就是非常经典的那款,非常耐用,直到现在我还有在用着,但是这款板子有一个问题就是没有串口,准确来说就是没直接的USB转串口的电路,可能是成本的问题 所以它并不能用PC直接调试 所以我也没过多的去探究-商家甚至发了引脚的复用图给我-所以我连原理图都没看-而且在我开发查阅资料的时候也看到有人提过没有串口 所以我就一直默认这个板子是没有直接调试的方法的-我后来调试都是外接了一个串口转USB模块。
2024-04-30 17:45:27 992
原创 3.嵌入式中USB应用实例
当然,我们在开发的时候可能留意过,一般USB的外设库它不和其他外设一起,原因因为它的实现相对复杂一点,一般是和设备类实例一起存放。而且开发USB外设一般也不需要我们从头写驱动(这个过程需要的时间比较久,而且是一定需要仪器调试),厂商在做这个硬件的外设的时候肯定要测试性能,所以都会有写好的驱动进行公开,不管是从学习角度还是快速开发来说我们都需要去移植厂商提供的USB库或中间件,到这可能有人会觉得直接移植就完事了,为什么不直接教移植呢?
2024-04-30 16:36:29 1346
原创 2.USB体系
到这里,我们从物理层到数据链路层解析完成,我们的设备已经是合法的设备,并且成功建立了连接。枚举非常关键,往往大多数问题出现在枚举过程,一般枚举成功了基本后面不会有什么问题了,接下来我们将从设备实例验证我们的理论,通过开发板,配置硬件外设USB,配置软件来完成枚举过程。
2024-04-30 14:05:43 964
原创 1.认识USB协议
USB通信协议本质上就是在搭建好的通信物理层上,一层又一层的规定,根据应用特性扩展的复杂规定,其复杂程序已经出过不少书籍。但是对我们而言,很多东西有规律可循,而且我们也不需要关心这么多。在USB协议中一层又一层数据包中包含的数据数据包,就是真正意义上发送的数据,但是当主机解开USB协议(正确找到接收到数据数据包中的数据字段)拿到真正的数据后,它怎么知道这个数据是拿来干嘛的?它怎么知道这个数据该怎么用,所以又引出了子协议的概念,也就是设备类的概念。这个我们在下一章再说。
2024-04-29 17:48:05 1575
原创 关于USB开发的前言(学前必看)
本专栏下的情景只属于于嵌入式开发中的USB硬件控制器在主机或设备下的工作,因为术业有专业,和专门写USB协议的老哥自然是比不了,但是他们写的往往是应用层或者是和嵌入式情景不相关的开发。
2024-04-29 14:37:29 473
原创 17.IIC原理及应用
极低的电流消耗抗高噪声干扰电源电压范围宽工作的温度范围广在 IIC 总线中 唯一出现的是被定义为起始 S 和停止 P 条件 见下图的情况,也就是起始信号和停止信号标准模式100kbit/s:5 - 6us快速模式400kbit/s:2 - 3us。
2024-04-29 10:00:55 669
原创 16.SPI原理及应用
串口:异步串行全双工SPI:同步串行全双工(同步串行半双工)SPI(Serial Peripheral interface):是由Motorola(摩托罗拉)公司开发的串行外围设备接口,是一种高速的,全双工,同步的通信总线。主要应用在 EEPROM,FLASH(存储),模块通信(LCD、OLED显示控制芯片),实时时钟,AD转换器,还有数字信号处理器和数字信号解码器等器件。速度可达Mhz为单位 25Mhz左右W25Q64 FLASH存储芯片 W25Qxx xx存储空间总大小。
2024-04-29 09:46:41 1349
原创 15.标准外设库使用
较新的一种外设库,为了兼容多种OS和上层应用框架设计而设计,结构分层比较明显,相对SPL来说,层次比较多。直到现在几乎都是在维护这种库。1.库的文件量比较庞大,我们可以在原先的工程文件下新建一个LIB文件夹存放库的SRC和INC。其中每个点C以及对应的点H文件都表示一种外设的全部封装函数功能,全部都要添加到虚拟设备数。最为常见的也是最早的外设库,执行效率高,框架整洁易懂,维护日期较早。下载驱动 串口驱动 --- CP2102(这个因板子而异)2.库文件有了,接下来需要找到库的支持文件。
2024-04-29 09:39:08 200
原创 14.WWDG&DMA
使用它之前需要设置,只要告诉它一共有多少个数据(数据大小),从哪里搬到哪里(传输方向),一次搬多少个(传输多少个数据),让后开启它即可,这个数据搬运的过程就完全不需要CPU参与。:每一个不同的外设功能都对应一个通道,如果需要知道具体哪个外设功能对应哪一个通道,需要去查找DMA的通道功能映射表 ----- 中文参考手册 9.3.3通道选择。DMA2:支持三种传输方向(外设到存储器、存储器到外设、存储器到存储器)DMA1:支持两种传输方向(外设到存储器、存储器到外设)
2024-04-29 09:25:50 422
原创 13.IWDG
写入键值 5555h 可使能对 IWDG_PR 和 IWDG_RLR 寄存器的访问(请参见第 18.3.2 节)必须每隔一段时间便通过软件对这些位写入键值 AAAAh,否则当计数器计数到 0 时,看门狗。位 15:0 KEY[15:0]:键值 (Key value)(只写位,读为 0000h)写入键值 CCCCh 可启动看门狗(选中硬件看门狗选项的情况除外)配置关键字寄存器,使能预分频器和重载值寄存器的访问。IWDG->KR寄存器。配置预分频数和重载值。
2024-04-29 09:23:00 303
原创 12.ADC模数转换
通常为8,10,12,16位等。绝对精度:对于A/D,指的是对应于一个给定量,A/D转换器的误差,其误差大小由实际模拟量输入值与理论值之差来度量。配置ADC,12bit分辨率,不采样通道(默认一组,就是不分组),数据对齐,ADC预分频设置,0-36Mhz。设置各通道采样周期,设置转换组转换多少通道,设置通道转换排号,例如第一次转换的通道是12通道。使能对应的ADCx,一共有1、2、3,每一个ADC下的通道都有对应的IO口,具体查数据手册。连续不扫描:通道转换完一次之后会紧接着第二次转换,但只转换一个通道。
2024-04-29 09:19:26 339
原创 11.输入捕获,中断
监控外部输入信号的脉冲宽度,一个脉冲的有效时间监控外部输入信号的周期和占空比------PWM波捕获电平时间 --- 捕获按键时长驱动超声波模块。
2024-04-28 09:15:34 765
原创 9.基本定时器
基本定时器( TIM6 和 TIM7)的特性包括: 重装载值(ARR) 分频系数/分频数(PSC)介于 1 和 65536 之间(注意:寄存器填入值从0开始,范围0 - 65535) 2分频:2 - 1。● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数(PSC)就比如STM32F103系列,只有4个定时器,3个通用定时器,1个高级定时器。基本定时器的个数,不同芯片的定时器数量不一定一样,有些芯片没有基本定时器。ARR重装载值,PSC分频数设置,计数值设置。
2024-04-28 09:04:30 234
原创 8.SysTick定时器
因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。选择时钟源,复位值是默认外部时钟,置1为内核时钟168Mhz,外部时钟进入要通过8分频,所以是21Mhz。RTC---1s定时期----实时时钟。看门狗---产生复位。
2024-04-28 08:53:32 407
原创 7.EXIT外部中断
源(16+7)0–15:IO管脚有关7:芯片内部外设中断触发通道(RTC唤醒中断、RTC闹钟、RTC入。作用:检测GPIO口电平变化,EXTI控制器(单独一个)可以产生中断信号给到NVIC控制器23个中断。打开EXTI外部中断时钟SYSCFGRST,将中断线映射到IO口(重点)事件:不需要CPU参与(外设和外设之间发生的)---IO口开启定时器。也可以用边沿触发实现,就不用获取按键状态,前提是下降沿触发打开。配置要映射的IO口,打开端口时钟,设置为输入模式,外部中断:需要CPU参与---中断服务函数。
2024-04-28 08:50:00 322
原创 6.NVIC中断配置(ST的精简ARM中断体系)
触发条件为串口接收数据,且只有接收中断触发后空闲中断才触发一次,特别注意的是串口助手的发送新行,会将数据补上\r\n,注意辨别。//标志位RXNE 标志也可以通过向该位写入零来清零,接收数据机器置1。if((USART1->SR) & (1<<4))//表示触发了接收中断且接收完了数据。//读取数据放到数组。if((USART1->SR & (1<<5)))//表示接收到了数据。为了对具有大量中断的系统加强优先级控制, NVIC 支持优先级分组机制。第二步:往PRI_N写入值,确定占先级别值和次级级别值。
2024-04-27 09:01:33 569
原创 5.USART应用操作
位 7 TXE:发送数据寄存器为空 (Transmit data register empty) --- 主要读取判断数据是否可以发送。判断数据是否可以发送,可以发送此位为1,不可以发送此位为0。位 13 UE: USART 使能 (USART enable)状态寄存器(USART_SR) --- 标志位(读取判断状态)位 13:12 STOP:停止位 (STOP bit)0: 1 起始位, 8 数据位, n 停止位。1: 1 起始位, 9 数据位, n 停止位。该位由软件置 1 和清零。
2024-04-27 08:55:14 286
原创 4.串口通信
波特率:控制两个器件之间的数据传输速率,波特率越大数据传输速率就快 MCU -à PC通信 波特率设置为9600/115200256000(也是可以的,不建议用)GPIOA->AFR[1] |= 7<<8;//USART1_RX 复用到PA10。USART_DR为数据寄存器,包括数据接收和发送两个寄存器,是数据所在地。USART_CR1对着配,使能以及过采样的倍数,最后串口使能。硬件分析,先对原理图进行分析可以复用的IO口,确认IO口。
2024-04-27 08:51:02 460
原创 3.输入操作
看原理图 -> 蜂鸣器如何驱动有源蜂鸣器: 内置震荡源 有源蜂鸣器只需要给电平就能够驱动(简单)无源蜂鸣器:无内置震荡源 外接一个震荡源才能驱动(复杂)硬件分析:代码流程:BEEP --- PE0 --- 通用推挽模式打开时钟(GPIOE)初始化PE0给高电平。
2024-04-27 08:48:12 402
原创 2.配置GPIO
打开端口时钟使能,频率为168Mhz先进行IO口模式清零设置IO口模式为通用输出模式配置IO口模式为通用推挽输出模式设置输出速度,一般为50Mhz对输出数据寄存器进行写操作可以直接改变输出的电平高低。
2024-04-26 09:08:30 329 1
原创 1.初识M4
内核以外就是外设,片内外设就是片上外设,同一种意思不同说法,片外外设是值集成电路外围的设备,也就是我们嵌入式开发板上外接的设备。假设:数据为:unsigned char data=11111111(0b);long:在32位的系统下是4字节,在64位的系统下是8字节。需求将低四位数据变为0,不改变高四位数据。基本类型,构造类型,指针类型,空类型。清0操作:data&~(15)double:8字节,64位。float:4字节,32位。置位操作:data
2024-04-26 09:02:57 379 1
原创 STM32F103硬件I2C优化解析-附源码(标准库)
在IIC的硬件配置中并没有找到选择主从模式的原因是这个,默认从模式,但是发送起始信号的时候会自动切换,比较方便,等于双模式stm32硬件iicBUG在于总线挂死以及事件处理(比如初始化硬件IIC后双线被拉低以及在通信过程中出现死锁,时钟或数据线被锁住,以及挂死,时钟或数据线被一直拉低,无法释放),比较麻烦,所以硬件外设自身问题比较多,默认为从模式,当发起起始信号的时候转为主模式,主模式停止后马上转从模式,这是stm32硬件IIC的特性,所有事件在数据手册上有。
2024-04-25 17:14:48 2048 1
原创 (十四).条件编译
至此,c语言基础的学习就已经结束了,一共14篇总结笔记,记录于我在入门嵌入式的时候学习的C语言过程中的感悟。在嵌入式的C语言应用中,有部分会跟我们学习的C语言有出入,这是非常正常的,因为我们在学习C语言的时候,程序是运行在电脑上的,而在嵌入式中,一般都是运行在单片机上,所以需要考虑内存以及环境问题,这就涉及到非常多的嵌入式C相关的规范。
2024-04-24 09:20:58 520
原创 (十三).链表
追加操作:a a+ --- 如果文件存在打开,不存在创建文件打开 会找到文件末尾添加新内容 "a" "a+"写操作:w w+ --- 如果文件存在,打开,如果文件不存创建文件打开 会将原有的内容清空掉 "w" "w+"../../ --- 上一级目录的上一级目录 ./../../day11/课堂笔记/day11.txt。2、申请空间 --- 动态申请 --- 用指针指向它。动态申请空间 --- 挂载到链表。
2024-04-24 09:10:52 616
原创 (十一).结构体
结构体类型的定义只要在使用之前就可以,如果是在全局定义,可以在所有函数内部都能够使用,如果函数内部定义的那就只能在函数内部使用。第二种方式:直接在定义结构体数据类型的时候,直接起别名 ---- ******建议使用******结构体数组初始化 -- 初始化里面的结构体 --- 成员顺序,不能跳跃赋值。每一个成员距离结构体变量的首地址必须是这个成员所占字节数的整数倍。声明结构体数据类型的时候 所占字节数小的成员尽量放在前面。如果成员是数组,那么看数组中数据的类型。成员的排布是按照申明的顺序进行排布。
2024-04-24 08:55:27 383
原创 (十).构造数据类型的指针
malloc会返回一个空间的首地址,void *,后面使用空间的时候需要强转地址。void (*f)(float b, int a, char *m)为 指向函数的指针。void (*f)(float b, int a, char *m)为 指向函数的指针。这是一个返回类型为int *,形参为函数指针的指针函数,且指针*mm指向该函数。// 改变的指针空间,让指针指向地址为0的区域。定义一个函数,传入两个字符串,返回较大的那个字符串的地址。指针指向的空间被销毁的时候,要将指针指向NULL。
2024-04-23 14:09:56 932
原创 (九).指针
学习了指针的基本概念以及扩展,对于指针的初始化定义和地址偏移需要理解,特别需要注意的是定义指针的类型时,也就是指针指向对象的类型是决定通过指针地址开始数几位字节的关键。
2024-04-23 13:52:07 516
原创 (八)。修饰符和内存
你没有将变量定义成寄存器变量,现在有寄存器空闲,CPU检测到程序需要对变量进行频繁的读写操作,会将变量自动转换成寄存区变量。寄存器数量是有限的,如果用户在定义寄存器变量,寄存器已经被占用完了,这个变量也会被当做是普通变量。--- 全局声明// 自动识别全局或者局部变量,放到对应的存储区域。--- 多文件操作 -- 项目。const 关键字 -- 用来修饰的变量,变量值不能被修改。变量的定义和声明形式不好区分,变量的声明需要加extern.-- test函数里面写的。1.任意两个整数合并。
2024-04-23 09:31:20 570
原创 (七).函数
函数声明在编译阶段单文件函数定义的时候需要注意功能函数是否在主函数后面,如果在后面的话需要在头文件后面作声明处理,在做项目的时候,往往有着多个文件,在库文件中声明,主函数文件中直接调用库函数参数传递有两种形式:值传递:实参将数值传递个形参,实参和形参就没有关系了,对于形参的操作不会影响实参。地址传递:实参将地址值传递个形参,在函数内容通过解地址可以获取外部空间,可以操作外部空间。
2024-04-23 09:15:41 405
GD32F103C8T6工程文件
2024-05-07
WINUSB数据上位机
2024-04-30
USB2.0协议中文版和HID用法表(最新)
2024-04-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人