![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STM32
文章平均质量分 53
尚久龙
这个作者很懒,什么都没留下…
展开
-
STM32手写超频到128M函数
按照上面的步骤操作后,系统时钟就按照我们的标准来设置了。其实这个操作没有什么太大的必要性,因为系统会自动为我们配置好的,研究这个过程是为了更深一步的了解STM32的工作步骤。学会了如何设置STM32的时钟频率,步骤比较详细,也很容易理解,就是视频教程不能跳着看,只能一节节的看,不然会知识不连贯,造成有些知识不理解,连续着看还是没有什么难度的。6:锁相环时钟配置:来源HSE1分频,倍频因子9倍(也可以改成自己想要的倍数,超频就改这里)3:设置AHB的时钟 1分频 72M。9:系统时钟选择锁相环时钟。原创 2024-05-25 20:48:11 · 483 阅读 · 0 评论 -
STM32手写寄存器的方式实现点亮LED灯
的老师讲的还是很到位的,能够学习到很多的细节之处,有时会感觉很啰嗦,但是不得不说确实很详细,只有这样对于真正的底层才能更清楚明白是怎么回事,原理很重要。写这篇博文的目的是记录我的练习过程中连续好几天犯得同一个错误,每次写都这样,而且找半天找不到哪里错了,必须拿着原来写的一行一行的对,才能发现问题,特此记录一下,下次再范同样的错误时就来看这篇文章吧!感觉这样就能快速的定位错误了。这个工程是很简单的,从0开始建立工程,自己手写寄存器映射,感觉对标准库的理解又前进了一大步。原创 2024-05-15 11:14:23 · 462 阅读 · 0 评论 -
STM32窗口看门狗的操作
上面的程序喂狗时间如果低于30ms和高于50毫秒,都会触发窗口看门狗复位,单片机都会自动重启,为了不叫单片机自动重启,请在合理的时间内进行喂狗操作。STM32的窗口看门狗的主要功能是,程序过早的喂狗还有太晚喂狗,都会触发单片机重启,就是有一个时间段,在这个时间段内喂狗才不会触发单片机重启。主要的步骤就是这么多了,其他的程序自己搞定,在程序中加入上面的四步就能实现窗口看门狗。T[5:0] - W[5:0] = 33 前面算的T[5:0] = 54。取整:(T[5:0] + 1) = 55。原创 2024-05-08 09:25:00 · 538 阅读 · 0 评论 -
STM32独立看门狗,实现单片机自动重启
今天学习了一下独立看门狗,看门狗的主要作用就是防止程序中有死循环或是不知道的bug,而造成在while循环中没有及时喂狗,程序就会控制单片机重启复位,从而不至于影响程序一直不能正常工作。为了验证是不是由看门狗引起的复位,特此调用rcc里面的检查独立看门狗的复位标志位,来显示不同的字符串,就可以看出来到底是手动复位还是看门狗复位了。第一步:开启LSI的时钟(打开看门狗会自动开LSI,所以这一步什么都不做)其实看门狗的应用也不是很复杂,主要分了4步,第一步还不用任何操作。原创 2024-05-01 07:59:28 · 711 阅读 · 0 评论 -
STM32进入待机模式,使用闹钟和WKUP唤醒单片机
第三:使用闹钟信号,唤醒待机模式 (闹钟到了就唤醒单片机,不需要其他设置,设置了 闹钟就可以了)可以开启WKUP(也是PWR的一个函数,这样PA0有上升信号也能 唤醒单片机)主要就是上面提到的三步,其他的程序还要自己来编写,需要闹钟或是WKUP功能时,选择性添加对应的代码就可以了。第二:进入待机模式 (调用PWR的一个函数就进入了待机模式)原创 2024-04-30 10:55:47 · 847 阅读 · 0 评论 -
STM32开启停止模式,用外部中断唤醒程序运行
今天学习了一下STM32的停止模式,停止模式下,所有外设的时钟和CPU的电源都会被关闭,所以会很省电,打破这种停止模式的方式就是外部中断可以唤醒停止模式。主要看要求,没有特别的要求,不怕费电可以不用,用了就是为了省电,特别是电池供电的情况下。好了,今天的学习到此结束!第二步:调用PWR的停止模式函数。第一步:开启PWR的时钟。原创 2024-04-29 20:41:01 · 652 阅读 · 0 评论 -
STM32进入睡眠模式的方法
今天学习了如何控制STM32进入睡眠模式,进入睡眠模式的好处就是省电,今天学习的只是浅度睡眠,通过中断就能唤醒。比如单片机在那一放,也许好几天好几个月都不用一次,整天的在那空跑while循环,是不是有很大的资源浪费啊,这个时候就要用到这个睡眠模式了,没有收到串口数据的时候,你就可以睡觉,等到收到串口数据后再醒来执行一段代码,执行完后,接着睡觉,再等着下次收到数据(也就是产生串口中断的时候),这样就感觉合理的利用了单片机的功能,其实要想实现这样的功能,很简单只需要一句:__WFI();原创 2024-04-28 05:43:40 · 509 阅读 · 2 评论 -
STM32修改主频的方法
如果想改成其他的主频,就自行更改就好了。更改主频的好处就是节省电量了,频率降低一半,耗电量也会降低一半的,有充足电源的时候不用考虑,如果是电池供电,那就很有必要了。如果有些地方一天24小时只采集一次数据,那就快慢无所谓了。大家都知道STM32F103C8T6的主频是72M,那怎么样才能在程序中获得这个主频的值呢?依据下方的方法把自己想要的主频的一行解开注释,把72M的一行注释掉,就这样更改了主频。如图找到主频的变量,然后显示这个变量就是显示主频了。按照上面的方法把文件的属性中的只读去掉,就可以了。原创 2024-04-27 18:18:11 · 857 阅读 · 0 评论 -
STM32读写RTC内部时钟外设,设置和显示时钟
第二步:启动RTC的时钟,使用RCC模块里的RCC_LSEConfig函数,开启LSE的时 钟。第六步:配置CNT的值(给RTC一个初始时间)需要闹钟的话,配置个闹钟;今天学习了STM32单片机的内部时钟外设,学会了更改内部时钟和提取时钟数值的操作,只要后备电池有电,该时钟就会一直走,时间不会复位,哪怕没有给单片机供电。第三步:把结构体中的时间存放到我们指定的全局变量数组中。第二步:把时间戳转换成时间,存放到结构体中。原创 2024-04-24 10:07:10 · 1503 阅读 · 3 评论 -
STM32读写备份寄存器BKP
这个BKP寄存器的意思就是在芯片的VB引脚上接个电池,就能保存其寄存器中的数据掉电不丢失。将其编译下载后就能显示这次的实验结果了:这个结果只要VB有电池供电,其他都断电,其DR中的数据也不会丢失。第二步:使用PWR的一个函数,使能对BKP和RTC的访问。读取数据:BKP也有个读取的函数。写入数据:BKP有个写入的函数。大体的步骤为:先初始化,然后写DR,再读DR。第一步:开启PWR和BKP的时钟。原创 2024-04-23 06:27:28 · 467 阅读 · 0 评论 -
STM32利用硬件I2C读取MPU6050陀螺仪数据
参 数:GyroX GyroY GyroZ 陀螺仪X、Y、Z轴的数据,使用输出参数的形式返回,范 围:-32768~32767。参 数:AccX AccY AccZ 加速度计X、Y、Z轴的数据,使用输出参数的形式返回,范 围:-32768~32767。配置完MPU6050的各个功能寄存器,剩下的就是读取陀螺仪的数据了。电源管理寄存器1,取消睡眠模式,选择时钟源为X轴陀螺仪。电源管理寄存器2,保持默认值0,所有轴均不待机。配置寄存器,配置DLPF。原创 2024-04-21 05:56:42 · 2278 阅读 · 1 评论 -
STM32实现硬件I2C通讯,读取MPU6050的ID号
最后就是读取MPU6050的ID号了,MPU6050的ID号存在MPU650的寄存器地址为0x75,读取这个地址中的值就是ID号了。第一步:打开GPIOB的时钟(因为I2C2的引脚10,11在GPIOB上)第九步:发送7位地址(方向:接收模式)最后一位是接收模式。第十三步: 等待EV7事件(接收完成)第三步:发送7位地址(方向:发送者)第三步:发送7位地址(方向:发送者)第四步:等待EV6事件(发送完成)第六步:等待EV8事件(正在发送)第四步:等待EV6事件(发送完成)第六步:等待EV8事件(发送完成)原创 2024-04-19 16:38:16 · 1014 阅读 · 1 评论 -
STM32利用软件I2C通讯读MPU6050的ID号
今天的读ID号是建立在上篇文章中有了底层的I2C通讯的6个基本时序来编写的。十:发送应答位(0:就是给从机应答(从机继续发数据) 1:就是不给从机应答(从机停止发数据))四:发送 指定寄存器地址(用于指定读写哪个寄存器)四:发送 指定寄存器地址(用于指定读哪个寄存器)七:发送 从机地址+读写位1(1:读 0:写)二:发送 从机地址+读写位(1:读 0:写)九:接收一个字节(此时,总线控制权交给从机)六:发送(要写入指定寄存器下的数据)二:发送 从机地址+读写位。原创 2024-04-14 06:03:09 · 805 阅读 · 0 评论 -
STM32完成软件I2C通讯
下面就是我写的六个时序的代码部分,可以结合着我画的图来理解,能很快的应用起来,刚开始的小伙伴估计不太会看这个时序图,我也是刚刚才有所感觉的,画的不好,理解的不够透彻,还望多多指正啊!四:接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)下面是main.c文件,测试基础的I2C代码的时序都有没有问题。原创 2024-04-12 17:13:17 · 507 阅读 · 0 评论 -
STM32的位操作(相当于51单片机的sbit)
经过一段时间的学习,今天发现STM32的单个端口都有一个32位的地址,这样就可以把这个地址给找出来,进行单个位的操作了,这也没有什么好说的,直接复制粘贴就好了,用到的时候过来复制直接使用就行了。暂时我是用不到这个方法的,也不是什么特别重要的方法,用别的方法也能达到同样的效果,不过感觉没有这样直接啊!上面这个代码是写到头文件里面的,使用的时候就是直接使用PAout(n)就好了,n写几就是第几个端口这个单独的位,0x0c是ODR寄存器的偏移地址。原创 2024-04-08 21:27:47 · 543 阅读 · 0 评论 -
STM32实现软件SPI对W25Q64内存芯片实现读写操作
这么简单的一个程序,我学习了一个星期左右,终于把所有的关节都打通了。为了使自己的记忆更为清晰,特意总结了一个思维导图,感觉自己即便是日后忘记了看一遍思维导图也就知道怎么写了。根据时序图会更好更快的理解程序的逻辑,一切都是要最后芯片的时序来编程,否则就不能和芯片通讯了。连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入。直接调用读取时序,无需使能,无需额外操作,没有页的限制,写入操作结束后,芯片进入忙状态,不响应新的读写操作。读取操作结束后不会进入忙状态,但不能在忙状态时读取。原创 2024-04-03 15:37:56 · 917 阅读 · 0 评论 -
STM32通过串口发送指令控制LED灯亮灭OLED并显示命令
接下来就不说废话了,自己看源代码吧!工程编译后下载到单片机就能实现串口控制LED灯的亮灭了。原创 2024-03-24 09:55:45 · 2826 阅读 · 1 评论 -
STM32利用标准库(中断方式接收)编写串口收发1个字节的数据
下午的实验是开启了串口中断,不用软件时刻的去盯着有没有收到数据了,硬件收到数据后触发中断,这个实验和上午的实验的差别在什么地方呢?好了,下面全部文件展示一下,不明白的仔细阅读代码吧?编译后下载到单片机中就能看到实验结果了。原创 2024-03-22 15:40:51 · 586 阅读 · 0 评论 -
STM32利用标准库实现串口接收数据
总共就更改了这些内容,就实现了单片机的串口发送+接收的功能,看起来还是很简单的吧!原创 2024-03-22 11:15:48 · 458 阅读 · 0 评论 -
STM32利用串口标准库发送字节,发送数组,发送字符串,发送数字,实现printf功能。
都是通过串口发送到电脑端的数据,废话不多说了,自己看上篇文章再看这篇,就差不多理解了,不理解就从头开始看吧,每节的代码敲10遍就理解了,我这都敲了5遍了才勉强记住,我们不是神,我们只是一个熟练工,塌下心来不停地敲代码,总有一天会明白的,坚持就是胜利。今日学习了野火的关于串口的教学视频,结果最后的printf函数怎么样都实现不了,结果还是看了江科大的视频才找到原因,特此记录一下过程,就差了这么一点,我找了3个早晨的问题,最后不得已才看了江科大的视频,才找到原因。原创 2024-03-22 10:30:34 · 2283 阅读 · 0 评论 -
STM32利用串口外设发送数据
/第三步:初始化USART(9600波特率、8位字长、无校验、1位停止位、无流控,只有发送模式)//第四步:发送开启USART,接收需要配置中断和NVIC。//第二步:GPIO初始化TX复用输出RX输入。//第一步:把USART和GPIO的时钟打开。原创 2024-03-21 10:51:43 · 590 阅读 · 0 评论 -
STM32利用ADC和DMA外设读取4路电压值Oled显示
今天早晨把昨天学习的内容又重新写了一遍,防止自己的记忆不够深刻,特此又写了这篇博文,从造成5点点起床到现在终于搞完了,有点小错误也修改过来了,下午再写一遍,差不多就记住了。下面就是今天早晨写的Addma.c文件:这些都是根据昨天整理的步骤来完成的,感觉现在自己的记忆力又有所提高了,这么多东西居然能记住了。Oled和Delay的代码和原来的一样,就不展示了,没有的自己去我以前的文章中找吧!都有发出过,之后编译后烧录到单片机内就能实现4路模拟电压的测量了。原创 2024-03-21 08:54:02 · 673 阅读 · 0 评论 -
STM32同时测量4路模拟电压,用DMA自动搬运到数组内,不用软件干预。
下午我做的实验室同时测量4路模拟信号,测量的结果通过ADC开启DMA触发,叫数据转运小帮手自动把数据搬走,放到数组内,就省去了,各种检测啊,恢复标志位啊,等等的麻烦操作,直接去读数组的值就好了,数据已经被更新了。好了,通过上面的一顿操作猛如虎,编译下载后就能看到自己想要的结果了,想要屏幕上的字不闪的那么快主函数中的循环内就加大点延时,不在乎就小点或是没有,我为了拍照拍全就加了200毫秒的延时,就能拍全了。5:/*ADC初始化*/(独立模式,数据右对齐,不使用外部触发,连续转换,扫描模式,通道数4)原创 2024-03-20 15:39:27 · 615 阅读 · 0 评论 -
STM32利用ADC同时同时测量4路模拟电压
这样编译后,下载到STM32单片机里面就能看到最终的效果了,当然如果你有红外传感器,光敏传感器或是热敏传感器之类的东西也可以直接接到模拟输入端口上来测得电压值,而判断应该干什么,是点灯啊,还是打开电动机啦,等等的一系列的操作吧,你就随意了。下面是Myadc.c的文件内容:今天写的没有带太多的注释,不明白的可以看昨天的文章。原创 2024-03-20 09:22:35 · 517 阅读 · 4 评论 -
STM32编写ADC功能,实现单路测量电压值(OLED显示)
是否启用间隔模式 void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);ADC获取双模式转换值,这个是双ADC模式读取转换结果 void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);第五步:打开ADC_CMD()开启ADC。原创 2024-03-19 20:21:11 · 2663 阅读 · 0 评论 -
STM32实验DMA数据搬运小助手
/获取中断标志位状态 void DMA_ClearITPendingBit(uint32_t DMAy_IT);第三步:调用DMA_CMD,通道使能(要在对应的外设调用XXX_DMACmd开启一下触发信号的输出,如果需要DMA的中断,就调用DMA_ITConfig,开启中断输出,再在NVIC里,配置中断通道,最后写中断函数就行了)void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);原创 2024-03-18 20:31:26 · 1092 阅读 · 0 评论 -
STM32输入捕获频率和占空比proteus仿真失败
也许我是仿真的缘故吧!如果能后面会更新的。这个程序最后的实验结果是读取到的CCR1和CCR2的值都是0,所以没有办法算出来频率和占空比。由于总是显示不了正确的频率和占空比,特意把两个数都显示在OLED上,结果都是0。第三步:配置时基单元,让CNT计数器在内部时钟的驱动下自增运行。第二步:GPIO初始化,把GPIO配置成输入模式(上拉输入)第六步:选择触发之后执行的操作执行Reset操作(一个函数)第五步:选择从模式的触发源(TI1FP1)(一个函数)第一步:RCC开启时钟,把GPIO和TIM的时钟打开。原创 2024-03-13 15:38:23 · 915 阅读 · 4 评论 -
STM32利用标准库编写同时输出4路PWM信号的程序(Proteus)仿真
这个是根据上午发的文章的基础上更改的,很简单,只是用了一个定时器,初始化了4个比较器而已,就可以单独的控制每一路PWM的占空比了,好了,把源文件展示一下,完事去接孩子放学。原创 2024-03-11 16:58:28 · 1273 阅读 · 3 评论 -
STM32利用标准库控制定时器3复用端口PB4输出PWM波形
这节也是接着上节来演示的,上节写的是TIM2的CH1输出PWM波形,这次来学习一下TIM3的端口复用方法来输出PWM,来看看端口引脚图:正常情况下TIM3的CH1通道的PWM输出引脚为PA6,现在我不想用这个端口输出了,我想换一个端口来输出,怎么办呢?那就得复用GPIO口了。其实这个弄能还是挺简单的,不过也得记录一下,不然用不了多久就忘记了:使能新的引脚,然后失能原来引脚上的默认功能。原创 2024-03-11 10:49:00 · 704 阅读 · 0 评论 -
STM32利用标准库的方式输出PWM(proteus仿真)
整个过程是用不到OLED的,我没有把初始化代码删掉,是为了如果想查看一些变量的值的话,用OLED显示出来,会很方便的。还有一个原因是这个工程代码是复制了OLED显示的工程而来,懒得删了,就留下了。程序中用到了延时两个延时文件要有,整个工程的代码文件我之前分享过,没有的可以去我之前的文章找下载链接,复制改名就ok了。第一步:RCC开启时钟,把我们要用 的TIM外设和GPIO外设的时钟打开。第四步:配置GPIO口,初始化为复 用推挽输出的配置。第五步:运行控制,启动计数器。第三步:配置输出比较单元。原创 2024-03-10 06:30:38 · 1691 阅读 · 8 评论 -
STM32使用标准库编写外部时钟控制oled显示计数(proteus仿真)按键中断控制led灯亮灭。
这节课的结果是在上节课的基础上更改的:电路图为:用一个开关来模拟外部时钟的高低电平的变化。其他的地方和原来是一样的,直接编译仿真就能运行了:如果有什么不明白的地方去看上一片文章吧!原创 2024-03-06 16:48:43 · 504 阅读 · 0 评论 -
STM32用标准库做定时器定时1秒更新OLED的计数值(Proteus仿真)
然后赋值我之前文章中提到的文件夹OLED屏幕显示:(没有的自己去那篇文章下载去)原创 2024-03-06 15:21:12 · 881 阅读 · 2 评论 -
STM32利用标准库编写PA0和PA4中断proteus仿真
首先先看看结果吧:昨天学习的是5--9或10--15引脚的中断,如果选择的是0到4口应该怎么办呢?链接:https://pan.baidu.com/s/1lN4LGbaKLTKQ2LMx8uzmBA?原创 2024-03-05 17:00:47 · 272 阅读 · 0 评论 -
STM32利用标准库编写中断控制oled计数(proteus仿真)
的基础上来完成的,主要是在Mycode文件夹里面新建了两个文件来创建中断的功能方式如下:结构很简单,就是count.c里面的东西有点多而已。先看先程序效果:每按动一次按钮OLED显示的值加1.这个按键的检测是用中断完成的。接下来就是编译后,导入proteus中就能看到效果了。原创 2024-03-04 16:50:08 · 757 阅读 · 0 评论 -
STM32利用标准库编写OLED显示的程序做Proteus仿真
其实测试OLED显示的功能很简单的,就几个函数,调用一下传个参数,就OK了,超级简单,看我的main函数的这几行代码,简单的要死了。下面就看看最终的程序效果吧:我感觉这个标准库写的显示程序比HAL库写的好用,最起码仿真不会卡死,记得用HAL库时模拟一次死机一次。这个标准库就没有这些问题了。起始这个工程很简单下载我的工程文件压缩包,解压后打开proteus工程和keil工程,直接就能修改或是测试了。链接:https://pan.baidu.com/s/1LKIgT688-lXgkrez4s0Sfw?原创 2024-03-03 17:29:57 · 933 阅读 · 0 评论 -
STM32用标准库编写按键控制LED灯的proteus仿真
链接:https://pan.baidu.com/s/1Nx5p3Tif6eHBIVkcPfsj9w?现在编译后把hex文件导入proteus中就能仿真了。原创 2024-03-03 11:57:03 · 1035 阅读 · 0 评论 -
STM32利用标准库编写程序proteus仿真流水灯
仿真后就会看到流水灯的效果了,但这是仿真STM32效果不太好,没有51时效果好,会出现不按程序走的可能,这些无伤大雅,只要确认自己写的程序没问题就好了!链接:https://pan.baidu.com/s/1Nx5p3Tif6eHBIVkcPfsj9w?原创 2024-03-02 06:27:14 · 442 阅读 · 0 评论 -
STM32利用标准库建立第一个工程
好了,第一个简单的stm32工程彻底建成,为了这么一个简单的工程付出了昨天一天的努力,才搞明白,今天又是一上午整理了这个教程,主要是为了自己记得更牢固,所以写出来,昨天在网上找了很久也没有找到,已经会了的前辈们都很懒啊!不乐意分享给更多人,我不这么想,只有会的人更多,这个行业才能前进啊!首先就是要有一个固件库,里面有我们建立第一个工程所需的所有文件,在没有搞明白之前我一直很头痛,这么多的东西怎么搞,现在好了都弄清楚了,我把这个固件库放到了我的百度网盘里面了,现在分享给大家,免费的赞给一波吧!原创 2024-03-01 10:32:13 · 569 阅读 · 0 评论 -
stm32用CubeMX库控制OLED显示数字,单个字符,字符串
下面就是修改main函数了,首先先要引用Oled.h库。原创 2024-02-27 09:05:49 · 1155 阅读 · 0 评论 -
stm32利用CubeMX实现外部中断触发数码管加减数
至此所有的代码都修改完成,生成hex文件导入到proteus中,就能模拟两个按键控制数码管加减数字了。至此整个过程还是很简单的,感觉比51单片机还要简单不少,好多代码根本就不用自己写!接下来就是生成keil工程文件,用keil打开。再新建一个desplay.c文件:下面是全部代码。新建一个desplay.h文件:下面是全部代码。加入desplay.c和button.c文件。再新建一个button.h文件:代码如下。再新建一个button.c文件:代码如下。原创 2024-02-24 20:05:24 · 1073 阅读 · 2 评论