
硬件
文章平均质量分 57
CodeForCoffee
https://github.com/nikolajohn
展开
-
HAL库中的函数指针
函数指针:即指向函数的指针变量因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数正如用指针变量可指向整型变量、字符型、数组一样,这里的指针变量是指向函数C语言在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的函数指针有两个用途:调用函数和做函数的参数我们首先定义了一个函数指针pfun ,这个函数指针的返回值为voidvoid (*p原创 2022-03-26 21:29:26 · 1302 阅读 · 1 评论 -
STMCube UART与ADC配置
DMA的中断服务函数可以通过以下方式寻找可以看到,其调用了HAL_DMA_IRQHandler函数这里的XferCpltCallback是一个函数指针,我们看一下他的定义这个函数指针成员到底指向了什么,你直接去追是追不到的,在DMA启动之后会为这个成员赋值。实际上,这个赋值的操作是在HAL_ADC_Start_DMA函数中完成的这个ADC_DMAConvCplt就是ADC DMA的回调函数这个ADC_DMAConvCpl...原创 2022-03-26 20:57:43 · 1453 阅读 · 1 评论 -
MOSFET原理与应用
MOSFET金属氧化物半导体场效应晶体管在一块纯净的Si中,两个肩膀的区域进行N型掺杂,剩下的其他区域进行P型掺杂。红色的为耗尽层/PN结此时,无论正反,都是无法导通的构建电场如下:施加电场后,形成新的耗尽层此时相当于2个N区被连起来了这个区域就是所谓的N沟道也就是说,当我们施加正向偏压,形成电场,当电压高于阈值电压时,N沟道可以导通,当电压低于阈值电压时,N沟道不能导通。三电极如下:NMOS:高于截止电压导通,低于截止电压截...原创 2022-03-09 15:36:14 · 3060 阅读 · 0 评论 -
STM32Cube下载与使用(二)
目录STM32 HAL库所在的层次STM32CUBEMAX固件包Keil配置时的注意点STM32CUBEMAX选择固件包存放的位置STM32CUBEMAX下载指定的固件包STM32CUBEMAX生成代码时的库选择(HAL或LL)STM32CUBEMAX生成代码时的配置选择参考STM32CUBEMAX生成函数的位置调节STM32 HAL库的使用方法STM32 HAL库所在的层次STM32的HAL库所处的位置标准库与HAL库所处的位置对于STM32原创 2022-03-06 21:54:14 · 2060 阅读 · 0 评论 -
STM32Cube下载与使用(三)
意法半导体ST与ARM的关系ST公司购买ARM公司的内核,在此基础上添加各种外设,组成STM32芯片也就是说,在内核之上,所有的外设都是ST公司添加上去的ST内核通过总线矩阵与外设连接嵌入式C语言中对于地址的操作此时指针pointer是指向寄存器的地址0x4002800按照这样我们可以完成对地址的访问这些基于指针的地址操作是非常常见的,基于寄存器的编程就是通过指针完成的进一步地,考虑到定义变量会消耗内存,如果我们大量地定义地址变量,将会消耗大量的内存空间因此可原创 2022-03-06 12:35:55 · 1138 阅读 · 0 评论 -
从ST官网下载STM32的Altium库
以STM32L432KB为例STM32L432KB - Ultra-low-power with FPU Arm Cortex-M4 MCU 80 MHz with 128 Kbytes of Flash memory, USB - STMicroelectronics https://www.st.com/content/st_com/en/products/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus/stm32-u...原创 2022-03-06 10:59:50 · 1547 阅读 · 0 评论 -
片外ADC调试记录
ADC为AD7172DAC ADC模块的接线如下:STM32F103C8T6最小系统板 DACADC模块 3V3 3V3 GND GND PB12 CS_N PB13 SCLK PB15 DIN PB14 DOUT PA12 SYNC GND or ADC_REF AIN0 GND AIN1 BLE模块接线如下:STM32F103C8T6最小系统板 BLE PA9 RX PA1原创 2022-02-14 21:34:05 · 606 阅读 · 0 评论 -
STM32Cube下载与使用(一)
STM32CUBEMX使用原创 2022-02-11 21:29:58 · 1059 阅读 · 0 评论 -
Altium PCB文件中放置测量尺
快捷键PDL如果是垂直的,就PDL+Space原创 2022-02-10 21:27:58 · 913 阅读 · 0 评论 -
BLE调试记录20220210
以下BLE调试基于主从模式Windows 10 ---USB转TTL---主机 从机---STM32F103主机为DX2003主从一体,从机为BT11从机接线方式均为VCC,GND,TX,RX的4线方式首先要知道从机的MAC地址,可以通过AT+LADDR进行查看然后操作主机,主机是主从一体的,因此需要配置为MASTER模式,对应的AT指令为AT+MASTER=1配置完成后,主机会自动搜索当前的信号,并输出到USB转TTL,当我们看到从机的NAME或MAC地址出现时,输入AT+SCAN原创 2022-02-10 17:56:11 · 457 阅读 · 0 评论 -
常见的Altium操作
Outline 宽度: 10 mil或快捷键TVB先选中,复制,切换到Top Solder,快捷键EA,粘贴到当前层即可原创 2022-02-03 16:40:17 · 705 阅读 · 0 评论 -
STM32的DMA操作
DMA概述Direct Memory Access直接存储器访问DMA传输将数据从一个地址空间复制到另一个地址空间由CPU初始化这个DMA传输动作,动作本身由DMA控制器完成DMA传输通过硬件为RAM和IO设备之间开辟一条直接传输数据的通道,提高了CPU的运行效率STM32中的DMASTM32最多有2个DMA控制器,其中大容量产品有2个DMA控制器,小容量产品只有1个DMA1有7个通道,DMA2有5个通道每个通道专门用来管理来自于一个或多个外设对存储器访问的请求还有一原创 2022-02-01 20:48:08 · 8439 阅读 · 0 评论 -
STM32实现SPI通信2
目录SPI_InitTypeDef配置过程1. 初始化IO口,时钟2. 初始化SPI模块3. 使能SPI4. SPI读写函数使用STM32的SPI模块操作FLASH初始化读写AD5666SPI_InitTypeDef配置过程1. 初始化IO口,时钟2. 初始化SPI模块3. 使能SPI注意:主机通过向SPI串行寄存器写入一个字节来发起一次传输4. SPI读写函数具体流程如下:注意,发送和接收都是对SPI...原创 2022-02-01 17:43:49 · 1873 阅读 · 1 评论 -
STM32实现SPI通信1
SPISerial Peripheral Interface串行外围设备接口是一种告诉,全双工,同步的通信总线MISO MOSI SCL CSSPI的结构框图8个时钟周期,主机和从机移位寄存器中的数据完全交换硬件上通过4根线连接 主机和从机都有一个串行移位寄存器,主机通过向自己的SPI串行寄存器写入一个字节来发起一次传输 串行寄存器通过MOSI将主机数据传输给从机,同时从机也将自己的串行移位寄存器数据通过MISO传给主机,两个串行移位寄存器中的内容进行交换 外设的读原创 2022-02-01 14:47:58 · 4302 阅读 · 2 评论 -
STM32实现软件I2C通信
目录I2C协议1. 空闲状态2. 开始信号3. 停止信号4. 应答信号ACK5. 数据的有效性6. 数据传输I2C的实现IIC_InitII2_STARTIIC_StopIIC_Wait_AckIIC_AckIIC_NAckIIC_Send_ByteIIC_Read_Byte通过I2C操作24C02初始化写一个字节读一个字节写入读出多个地址I2C,两线式串行总线,可发送和接收数据SCL和SDA都必...原创 2022-01-31 14:43:10 · 5241 阅读 · 3 评论 -
STM32的DAC
STM32自带的DAC框图DAC的引脚注意:一旦使能DACx通道,相应的GPIO引脚(PA4或者PA5)就会自动与DAC的模拟输出相连 (DAC_OUTx)。为了避免寄生的干扰和额外的功耗,引脚PA4或者PA5在之前应当设置成模拟输入(AIN)DAC转换过程不能直接对DAC_DORx寄存器写入数据任何输出到DAC通道x的数据都必须写入DAC_DHRx寄存器如果没有选中硬件触发,存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx,如果选中硬原创 2022-01-29 19:28:47 · 1313 阅读 · 0 评论 -
STM32F1系列的ADC配置
ADC引脚注入通道与规则通道1. 注入通道相当于中断,最多4个通道,注入通道和它的转换顺序在ADC_JSQR寄存器中选择,注入通道转化的总数应写入ADC_JSQR寄存器的最低两位注入通道的转换结果保存在下图中的注入通道寄存器(4*16位)转换结束后产生标志位,能够产生相应的中断2. 规则通道相当于正常运行的程序,最多16个通道,规则通道和它的转化顺序在ADC_SQRx寄存器中进行选择,规则通道转换的总数应写入ADC_SQR1寄存器的最低4位中规则通道的转换结果保存在下图中原创 2022-01-29 16:41:31 · 5739 阅读 · 0 评论 -
STM32的PWM输出
概述先比较,再控制输出产生一个由ARR寄存器控制频率,由CCR寄存器控制占空比的信号可用的引脚配置过程1. 使能定时器3,IO口2. 初始化IO口为复用输出功能3. 重映射配置,将PB5作为定时器PWM的输出引脚,开启AFIO时钟4. 设置使能,模式,极性TIM_OC1Init定义结构体定义5. 设置比较值6. 使能预装载寄存器7. 使能定时器8. 可以通过改变比较值CCRx,从...原创 2022-01-28 20:21:29 · 721 阅读 · 0 评论 -
STM32的定时器2 定时器中断
目录定时器的时钟选择选择时钟源定时器的寄存器当前值寄存器CNT预分频寄存器PSC自动重装载寄存器ARR控制寄存器CR1中断使能寄存器DIER定时器操作步骤1. 使能定时器时钟2. 定时器参数初始化3. 定时器中断使能4. 使能定时器5. 状态标志位的获取与清除6. 完成中断服务函数定时器的时钟选择内部时钟CK_INT 外部时钟模式1:外部输入脚TIx 外部时钟模式2:外部触发输入ETR 内部触发输入ITRx:使用一个定时器作为另.原创 2022-01-28 19:25:32 · 3188 阅读 · 0 评论 -
STM32的定时器1 概述
目录定时器的分类定时器的区别通用定时器TIM2~TIM5的特点计数器模式向上计数向下计数中央对齐模式定时器的框图定时器的时钟来源时基单元输入捕获输出比较STM32F10系列总共最多有8个定时器定时器的分类16 bit General Purpose Timer 16 bit Advanced Control Timer 16 bit Basic定时器的区别定时器的种类 位数 计数器模式 产生DMA请求 捕获/比较通原创 2022-01-28 17:56:50 · 5658 阅读 · 0 评论 -
STM32的外部中断
STM32的每个IO都可以作为外部中断的输入STM32的中断控制器支持19个外部中断或事件请求线0~15:对应外部IO口的输入中断线16:连接到PVD输出线17:连接到RTC闹钟事件线18:连接到USB唤醒事件每个外部中断线可以:独立地配置触发方式,上升沿,下降沿或双边沿触发 触发或屏蔽 拥有专用的状态位外部中断的配置1. 初始化IO口为输入2. 开启IO口的时钟,复用时钟,注意使能AFIO时钟3. 将IO口和中断线进行映射,例如PA0映射到EXIT0中断线原创 2022-01-28 16:42:40 · 4024 阅读 · 1 评论 -
STM32的串口中断详解
中断配置使能接收中断中断服务函数1. 中断服务函数名称查找2. 中断服务函数3. 可以选择的串口中断类型此处定义其他文件中的声明extern u8 USART_RX_BUF[USART_REC_LEN]最大接收字节数extern u16 USART_RX_STA接收状态标记extern u16 USART_RX_STA bit15 bit14 bit13~0 接收完成标志 接收到0x0D标...原创 2022-01-28 16:08:42 · 16000 阅读 · 1 评论 -
STM32的串口
通信方式1. 并行通信数据的各个位同时传输2. 串行通信数据按位顺序传输数据传送方式:单工,半双工(不支持两个方向同时传输),全双工串行通信1. 同步通信带有时钟信号的就是同步通信SPI I2C2. 异步通信必须双方约定波特率UART 单总线常见的串行通信接口通信标准 引脚说明 通信方式 通信方向 UART TXD:发送,RXD:接收,GND:公共地 异步 全双工 单总线 DQ:发送/接收 异步原创 2022-01-27 22:33:16 · 4549 阅读 · 0 评论 -
STM32的中断优先级管理NVIC
Cortex M3内核支持256个中断,其中包含:16个内核中断 240个外部中断并且具有256级可编程中断设置STM32F1并没有使用Cortex M3的全部STM32有84个中断,其中包括:16个内核中断 68个外部中断(可屏蔽中断)STM32F103系列只有60个可屏蔽中断中断优先级分组首先,对STM32中断进行分组(在系统初始化时就分好组),组0~4.同时,对每个中断设置一个抢占优先级和一个响应优先级值分组配置是在寄存器SCB->AIRCR中进行配置组原创 2022-01-27 21:40:29 · 1778 阅读 · 0 评论 -
STM32的端口复用
STM32有很多内置的外设,这些外设的外部引脚都是与GPIO复用的,也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用时,此即复用复用配置前可以查看Datasheet端口复用的配置过程1. 首先,GPIO端口时钟使能2. 接下来,复用外设使能时钟3. 然后,根据要求初始化IO口为对应的模式...原创 2022-01-27 20:40:32 · 580 阅读 · 0 评论 -
STM32中的Systick定时器
目录概述Systick的寄存器CTRLLOADVALCALIB相关函数内核级别的SysTick_Config一种实现方法另一种实现方法delay_init函数delay_us函数概述Systick是一个定时器,Cortex M3,M4的芯片中都有Systick定时器通常用于实现延时函数,节约MCU资源Systick定时器就是系统滴答定时器,是一个24位的倒计时定时器,计到0为止从RELOAD寄存器中自动装载定时初始值只要不把它在Sy原创 2022-01-27 20:14:51 · 1598 阅读 · 0 评论 -
STM32的时钟配置
5个时钟源HSI,HSE,LSI,LSE,PLLHSE为高速外部时钟,频率范围4~16 MHzPLL的时钟源可以为:HSE/2 HSE HSI/2倍频系数为2~16倍STM32可以选择一个时钟信号输出到MCO脚,即PA8上,可以选择位PLL输出的二分频,HSI,HSE或系统时钟注意:任何一个外设之前,都必须使能其对应的时钟/** * @brief Reset and Clock Control */typedef struct{ __IO uint..原创 2022-01-27 17:57:48 · 2401 阅读 · 1 评论 -
嵌入式C语言的寄存器地址映射
对于微处理器,一切的底层配置,最终都是配置寄存器库函数的本质就是对寄存器的封装映射文件:stm32f10x.h根据Datasheet,STM32F1系列的GPIO共有7个寄存器,对应的结构体定义如下:/** * @brief General Purpose I/O */typedef struct{ __IO uint32_t CRL; __IO uint32_t CRH; __IO uint32_t IDR; __IO uint32_t ODR;原创 2022-01-27 14:47:38 · 3032 阅读 · 2 评论 -
嵌入式C语言入门操作
位操作6种位操作运算符位操作 数值操作位操作即按位进行运算操作GPIO->CRL &= 0xFFFFFF0F上面这句代码的意思是将GPIO的CRL寄存器的对应位清0看到&=操作,就要马上想到这是一个清0操作,那么具体是将哪些位清0呢?再去看后面的十六进制数中的那些位是为0的GPIOA->CRL |= 0x00000040上面这句话的意思是将GPIO的CRL寄存器的对应位置1看到|=操作,就要马上想到这是一个置1操作,那么具体是将哪些原创 2022-01-27 14:17:57 · 2401 阅读 · 0 评论 -
ATK BLE 01低功耗蓝牙配对调试经验
首先看好哪个是主机,哪个是从机,两个模块都通过USB转TTL与电脑相连。主机的指示灯闪烁快,从机的指示灯闪烁慢。首先配置主机查看主机的IP我们首先点击扫描波特率然后点击MAC地址可以看到,主机的MAC地址为B9AC4A4F3C0F如果这个时候主机还不是主机模式,那就点击主机模式接下来配置从机首先扫描波特率查看MAC地址可以看到,MAC地址为B9AC4A3FEBDA设置为从模块配对再次打开主机,这里设置一下主机输入AT原创 2022-01-25 21:17:05 · 6591 阅读 · 10 评论 -
STM32F103RCT6的GPIO
概述STM32F103RCT6共4组IO口16*3+3 = 51个IO口GPIOA0 ~ A15GPIOB0 ~ B15GPIOC0 ~ C15GPIOD0 ~ D2IO口的基本结构4种输入模式输入浮空输入上拉上图中上面打叉的部分开关闭合,上拉电阻约为30至50k输入下拉与上类似模拟输入4种输出模式开漏输出开漏复用功能推挽式输出推挽式复用功能3种最大翻转速度2MHz10MHz50MHz每组IO口包原创 2022-01-23 21:05:30 · 3777 阅读 · 1 评论 -
Keil添加头文件.h文件
如下图操作即可原创 2022-01-23 19:54:48 · 9335 阅读 · 0 评论 -
Keil设置编译生成的文件放置的目录
如下图所示操作即可原创 2022-01-23 19:51:12 · 7360 阅读 · 2 评论 -
STM32F103RCT6芯片架构
也可以直接从源代码看,例如,我要看APB2桥出来了哪些外设也就是上图这些原创 2022-01-23 19:23:20 · 2989 阅读 · 0 评论 -
嵌入式C语言静态非静态全局局部变量辨析
栈区 用于存放局部变量也就是说,任何函数里面,我们定义的变量,不加任何修饰,那么这些变量都是保持在栈区里的 静态全局区 未初始化的静态全局区静态变量(static修饰的变量)或全局变量(在主函数外,不属于任何函数的变量),未经过初始化,则存在此区初始化的静态全局区全局变量,静态变量,赋过初值的,存放在此区 代码区 存放代码 文字常量区 存放常量普通的全局变量在函数外部定义的变量,只要是在main函数外,包括其他子函数外的变量,就是全局变量作用..原创 2022-01-22 23:05:16 · 639 阅读 · 0 评论 -
嵌入式C语言的函数声明
目录几种函数的类型函数的声明概念为什么要声明声明的方法什么时候需要声明如何声明什么时候需要声明如何声明几种函数的类型有参函数int fun(int a, float b){}无参函数int fun(void){}int fun(){}带返回值的函数在定义函数时,必须带有返回值类型,在函数体内,必须有return,若没有返回值类型,则默认返回int不带返回值,就是voidvoid fun(){}返回值类型 函数原创 2022-01-22 22:17:45 · 626 阅读 · 0 评论 -
嵌入式C语言 字符型数组
定义定义方式1一个字符一个字符地定义char c1 = {'c','k',' ','l'}定义方式2字符串赋值注意:使用字符串赋值方式要比一个一个字符逐一赋值多1个字节,用于存放字符串结束标志'\0'char c2[] = "ck l";我们在定义和初始化字符串数组时经常会这样写:char ch[32] = "";这是一种局部初始化,因为字符串默认有一个'\0',所以第一个字符就是'\0',没有初始化的位置也是'\0',这样可以清除字符数组中的垃圾字符,让每一个原创 2022-01-22 20:10:00 · 292 阅读 · 0 评论 -
嵌入式C语言 数组基础概念
数组的概念数组是若干个相同类型的变量在内存中有序存储的集合如果是不同类型,则无法通过数组进行存储数组在内存中会开辟一块连续的空间,因此数组元素个数不能无限大,否则会造成内存溢出例如:int a[10]; // 定义了一个整形的数组a,a是数组的名字,数组中有10个元素,每个元素的类型都是int类型,而且在内存中连续存储这十个元素分别是a[0],a[1],... ,a[9]a[0] 至 a[9] 在内存中连续地存储特殊的数组指针数组本质是一个数组,数组的元素是指针结原创 2022-01-22 19:59:01 · 726 阅读 · 0 评论 -
嵌入式C语言goto语句
goto语句用于在一个函数里面实现代码的跳转#include <stdio.h>int main (int argc, char *argv[]){ printf ("1\n"); goto NEXT; printf ("2\n"); printf ("3\n");NEXT: printf ("4\n"); return 0;}使用goto实现循环int i = 1;int sum = 0;JOOP:su原创 2022-01-22 19:34:34 · 260 阅读 · 0 评论 -
嵌入式C语言循环控制语句
for循环for (表达式1;表达式2;表达式3){循环体;}执行顺序:执行表达式1执行表达式2如果表达式2成立,则执行循环体,执行完毕后,再执行表达式3,再执行表达式2...直到表达式2不成立为止,循环结束while循环while(条件表达式){循环体;}执行顺序:首先判断while后面的表达式,如果表达式成立,执行循环体,执行完循环体接着再次执行条件表达式。如果表达式为真,则继续执行语句块,直到条件表达式为假,循环结束例如:...原创 2022-01-22 19:28:12 · 709 阅读 · 0 评论