- 博客(98)
- 收藏
- 关注
原创 STM32 定时器产生定周期方法
输入到计数器的时钟为 72 000 000 /(7199 +1) = 1 000HZ。计数器溢出时长生Update中断频率: 10000HZ /(9999+1) =1HZ。计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写。自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。位计数器和与其相关的自动装载寄存器。时传送到影子寄存器。的设置,预装载寄存器的内容被立即或在。详细描述每一种配置下更新事件的产生。寄存器中的自动装载预装载使能位。
2025-02-18 20:38:19
364
原创 STM32 看门狗
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,
2025-02-18 17:43:14
3607
原创 STM32 低功耗模式
当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。通过进入不同的低功耗模式,STM32可以在不同的应用场景下实现最佳的能耗管理。待机模式:CPU停止、外设停止、时钟停止、SRAM也停止,寄存器停止、只有备份寄存器保存。指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压。和可用的唤醒源等条件,选定一个最佳的低功耗模式。
2025-02-17 22:11:48
1356
原创 STM32 PWM脉冲宽度调制介绍
在STM32中,预分频器(Prescaler)用于对输入时钟信号进行分频,从而降低定时器计数器的计数频率。具体来说,当定时器的预分频器寄存器(TIMx_PSC)中的值为N时,输入时钟信号要经过N + 1个时钟周期,定时器计数器才会加1。因此,为了确保在计数到最后一个值时产生中断,需要将设定的值减1,这样计数器就可以在达到这个减1后的值时产生中断。如果我们想要产生定周期为100HZ的PWM,我们可以设置为TIMx预分频后的频率/(Init中的3表示的时TIMx定时器中的Channel3的意思。
2025-02-17 02:37:56
960
原创 STM32 外部中断和NVIC嵌套中断向量控制器
中断线是STM32微控制器中用于检测外部或内部事件(如定时器溢出、按键输入、串口数据到达等)的信号线。当这些事件发生时,中断线会向中断控制器发送中断请求,中断控制器根据优先级管理机制决定是否响应该请求。如果响应,则会暂停当前执行的程序,转而执行相应的中断服务程序(ISR),处理完中断后再返回到原来的程序继续执行12。
2025-02-16 17:45:40
1211
原创 STM32 如何使用DMA和获取ADC
DMA是一种计算机技术,允许某些硬件子系统直接访问系统内存,而不需要中央处理器(CPU)的介入,从而减轻CPU的负担。因此只需将JS_X和JS_Y的端口设置位模拟量输入端,然后由STM32单片机的ADC块处理。ADC是根据用户动作或者环境变化会造成传感器等设备的电压值发生变化,再通过STM32的ADC块实现采样、保持、量化、编码将模拟量转换成数据量。而按下的操作显然是普通的Port Key, 因此只用将JS_D设置位上拉输入,然后通过读取该端口的状态,来判断是否摇杆被按下。
2025-02-15 03:44:09
813
原创 STM32 ADC介绍(硬件原理篇)
在数字系统的广泛应用中,用数字系统处理模拟量的情况十分普遍,因此引入了模拟信号和数字信号的接口问题。为了解决这一问题,首先利用模数转换电路把模拟信号转成数字信号。(数字信号经过处理之后,也可以通过数模转换电路将模拟信号转换回模拟信号)。单片机开发当中,ADC是经常要到的外设。通过本篇文章对ADC硬件部分进行原理说明。
2025-02-14 22:46:29
1003
原创 STM 32 IO模拟两线串行接口
我们在单片机开发过程中,经常需要通过IO口来模拟通信接口(I2C、两线串行接口).通过本篇文章,IO模拟两线串行接口,举一反三,来达到模拟其他通信接口的能力。(发光二极管显示器)驱动控制专用电路。2)DIN 先拉低,SCLK再拉低,表示数据开始发送。3)在SCLK 为低电平的时候,DIN信号才可以改变。5)当8位数据传完之后,SCLK和DIN都保持为低。6)SCLK为高,DIN由低变高说明传输数据结束。1)空闲的时候,DIN和SCLK 都为高。4)DIN 写入数据之后,SCLK要拉高。
2025-02-12 22:29:42
221
原创 STM32 RCC功能说明 复位和时钟控制RCC
开发板是使用8M的HSE晶振再进行8倍频作为系统时钟源。配置系统时钟(即MCU主频)和三个总线时钟的时候,需要根据stm32数据手册中的时钟树来进行配置。HSE的频率为8MHZ,通过PLLMUL 八倍倍频之后就可以达到SYSCLK 70MHZ的意图!在本篇文章会对stm32(STM32F103C8T6)的时钟系统进行配置。2)CPU和各种总线(AHB、APB1、APB2)的频率。APB1(PCLK1)的时钟频率是72/2=36MHZ。实现箭头部分,属于分配主频(SYSCLK)1)设置单片机的时钟输入源。
2025-02-12 17:01:18
512
原创 STM32 RTC 实时时钟说明
STM32单片机内部集成了一个40KHZ的RC振荡器,内部RC振荡器会会因为温度产生漂移,精度不够高,因此使用32.768HZ的LSE作为RTC的时钟源。RTC备用电池,在单片机主电源断开的时候,给RTC时钟供电,也可以用于保存备用存储器中的数据(计时器的时间值,以及用户临时存放的数据),备用寄存器 20字节保存用户数据。通过使能或失能PWR的时钟,可以控制电源管理功能的工作状态,进而影响整个系统的功耗管理。实时时钟具有一组连续运行的计数器,可以通过适当的软件提供日历时钟功能,还具有闹钟中断和。
2025-02-12 15:45:55
1482
原创 STM32_USART通用同步/异步收发器
推挽输出模式的工作原理基于两个互补的晶体管(通常是MOSFET或双极型晶体管)来控制输出电平。当输出信号为高电平时,一个晶体管导通,将输出端拉向高电平;当输出信号为低电平时,另一个晶体管导通,将输出端拉向低电平。在这种模式下,引脚在输出低电平时形成低阻抗,输出高电平时形成高阻抗,可以驱动外部电路。这种模式下,引脚对外表现为高阻抗,可以检测到微弱的信号变化。需要注意的是,在初始化USART时,即使没有发送任何数据,标志也会被设置,因为此时发送数据寄存器是空的12。中写入下一个要发送的数据。
2025-02-11 22:00:48
863
原创 STM32 如何将printf函数和串口函数重定向
是一个预处理指令,用于告诉编译器不要使用半主机(semihosting)功能。半主机是一种调试功能,主要用于嵌入式系统中与调试器进行通信,例如在开发板上显示调试信息、读写文件等。然而,使用半主机功能可能会增加代码的大小和复杂性,因此不适用于生产环境。,从而减少调试代码对可执行文件大小的影响。这有助于优化生产代码,去除调试相关的功能并减小代码的体积。1)介绍了清除TC标志的方法,包括读SR寄存器并写入DR寄存器或直接赋值0。2)复位时,USART_SR寄存器的值为0x00C0,其中TC位在位6,
2025-02-11 21:13:05
393
原创 Linux驱动开发 2 Linux应用程序和驱动程序的接口
学习笔记驱动程序有很多,LED KEY CAMERA 的驱动程序接口都是标准的:open read writeopen read write 会通过swi指令来触发异常。内核的swi异常处理函数中,根据文件信息找到相应(比如led )的驱动程序文件和驱动程序怎么建立联系?(open - led_open)先不讲。图2_1Linux的驱动程序可以使用MCU的驱动程序的经验你的应用程序必须使用open read write驱动必须提供类似led_open led_rea...
2022-05-10 00:04:11
492
原创 Linux系统编程 101 kill 函数和kill命令
信号的产生终端按键产生的信号Ctrl + c -> 2) SIGINT(终止/中断) INT -InterruptCtrl + z -> 20)SIGSTP(暂停/停止) T - TerminalCtrl + \ -> 3) SIGQUIT(退出) 硬件异常产生信号除0操作 -> 8) SIGFPE(浮点数异常) 非法访问内存 -> 11)SIGSEGV(段错误)总线错误 -> 7) SIGBUS$cat k...
2022-05-02 14:08:34
844
原创 Linux系统编程 100 信号四要素和常规信号一览
信号的编号可以使用kill -l 命令查看当前系统可使用的信号有哪些$kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTER...
2022-05-01 17:18:26
582
原创 Linux驱动开发 1 单片机和linux程序的分层
Linux驱动开发快速入门学习学习笔记单片机和linux程序的分层main(){ //初始化所有的外围设备 flash接口 和 系统时钟 //这些硬件初始化,很多硬件厂商都帮你做好了。 //不关心 while(1) { 。。。 //我们要做的事情:根据业务逻辑去操作硬件。 //通过HAL 库或者直接通过寄存器去控制寄存器。 }}库函数GPIO_ReadPin(GPIO_TypeDef...
2022-02-18 01:15:53
536
原创 Linux系统编程 99 信号屏蔽字和未决信号集
学习笔记阻塞信号集(信号屏蔽字)概念将某些信号加入集合,对他们设置屏蔽,当屏蔽某个信号后,再收到该信号,该信号的处理将推后(解除屏蔽后)未决信号集概念1.信号产生,未决信号集中描述该信号的位立刻翻转为1,表信号处于未决状态。当信号被处理对应位翻转回0.这一时刻往往非常短暂。2.信号产生后由于某些原因(主要是阻塞)不能递达,这类信号的集合称之为未决信号集,在屏蔽解除前,信号一直处于未决状态。阻塞信号集和未决信号集都在PCB中截图1未决信号集和信号屏蔽字的本质都是位...
2022-02-17 23:42:35
1003
原创 Linux系统编程 98 信号的相关的概念
学习笔记与信号相关的事件和状态产生的信号:1.按键产生ctrl + c 终止ctrl+z 挂起,暂停,跑到后台,通过fg恢复前台来ctrl+\ 终止例子:$cathellohello^C$2.系统调用产生kill raise abort后面再解释3.软件条件产生如定时器alarmsleep函数就是这个case4.硬件异常产生非法访问内存,除0(浮点数例外),内存对齐出错(总线错误)。5.命令产生kill命令递达:递送并且到...
2022-02-02 16:48:16
1397
原创 Linux系统编程 97 信号的概念和机制
学习笔记信号的概念信号在我们的生活中随处可见,如:古代战争中的摔杯为号;现代战争中的信号弹;体育比赛使用的信号枪...共性:1. 简单2.不能携带大量信息3.满足某个特设条件才发送信号是信息的载体,linux/unix环境下,古老、经典的通信方式,现在依然是主要的通信手段。unix早期就提供了信号机制,但是不可靠,信号可能会丢失。Berkeley和AT&T,都对信号模型做了更改,增加了可靠信号机制,但是彼此不兼容。POSIX.1对可靠信号例程进行了标准化。信号的机制:重
2022-02-02 16:10:42
1272
原创 Linux系统编程 87 文件用于进程间通信
学习笔记文件完成进程间通信下面代码不需要你会写$cat fileforprocesscommuncation.c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<errno.h>#include<sys/wait.h>#include<fcntl.h>//O_RDWRvoid sys_er
2022-01-17 23:18:44
270
原创 通过两点经纬度确认精度
vs c++ 下开发的程序:#include"math.h"#include"stdio.h"#include"stdlib.h"#define PI 3.1415926#define EARTH_RADIUS 6378.137double radian(double d){ return d*PI/180.0;}int main(int argc, char *argv[]){ double longitudeA =atof(argv[1]); double lat.
2022-01-17 10:03:26
388
原创 Linux系统编程 80 进程间的通信方式
学习笔记在linux环境下,进程地址空间相互独立的,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问。要交换数据,必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区把数据拷贝走,内核提供的这种机制称为进程间的通信。IPC(interprocesscommunication).进程地址空间是独立的。父进程和子进程之间搭建桥梁。这个桥梁就是进程间通信IPC进程间通信的原理:0g-
2022-01-16 21:46:48
413
原创 Linux系统编程 85 兄弟进程通信
学习笔记使用创建n个子进程的模型,创建兄弟进程,使用循环因子i标示。注意管道的读写行为。兄:ls弟:wc -l父:等待子进程回收$cat brothercommunication.c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<errno.h>#include<sys/wait.h>void s
2022-01-16 21:24:58
606
原创 Linux系统编程 81 管道的性质
学习笔记管道的概念:管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据的传递。调用pipe系统函数即可创建一个管道。我们使用mkfifo f1fifo是队列,而管道实为环形队列。$mkfifo fl$lltotal 28drwxrwxr-x 7 ubuntu ubuntu 4096 1月 16 20:39 ./drwxr-xr-x 15 ubuntu ubuntu 4096 1月 14 23:06 ../drwxrwxr-x 2 ubuntu ub...
2022-01-16 20:42:41
561
原创 Linux系统编程 82 管道的基本用法
学习笔记pipe函数用于创建并打开管道管道有两个口。#include <unistd.h>int pipe(int pipefd[2]);参数1:pipefd[0] :读端pipefd[1] :写端返回值:成功:0失败:-1 errno管道的写端: 是指进程写到管的的端口管道的读端: 是指进程从管道读取的的端口管道的读写端个人感觉是站在进程角度来描述。父进程创建管道的时候,相当于打开一个读端,一个写端父进程创建子进程的时候,父子进程共享文件描述符。子
2022-01-14 23:14:12
610
原创 Linux系统编程 84 父子进程通信
学习笔记$lsmakefile mypipe mypipe.c$ls |wc -l3父进程实现ls子进程实现wc -l利用wc指令我们可以计算文件的Byte数、字数、或是列数.dup2execpipels 原来输出到屏幕,现在要把它输出到管道的写端 dup2(fd[1],STDOUT_FILENO);??dup2不是很熟,需要在学习下!wc -l 将结果写到屏幕$wc -lnihaldfsdfsdfsdfwef4可以看出来:$wc -l 命令 ..
2022-01-14 22:35:11
548
原创 Linux系统编程 83 管道读写行为
学习笔记APUE这本书内容读管道1.管道中有数据,read返回实际读到的字节数2.管道没有数据:1)判断管道的写端是否被全部关闭,全部关闭,read返回为02)管道的写端没有全部被关闭,read阻塞等待。(不久的将来,可能有数据传达,此时会让出cpu)写管道1.管道读端全部被关闭,进程异常终止(也可以使用捕捉SIGPIPE信号,使进程不终止)2.管道读端没有全部被关闭:1)管道已满,write阻塞2)管道未满,write将数据写入,并返回实际写入的字节数。程序: 父进程一上来就跑
2022-01-14 20:58:16
517
原创 makefile
常用的makefile文件src=$(wildcard ./*.c) target=$(patsubst %.c,%,$(src)) myArgs= -Wall -gAll:${target}%:%.c gcc $< -o $@ $(myArgs)clean: -rm -rf $(target) a.out .PHONY: clean All
2022-01-14 20:27:16
120
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人