STM32开发
文章平均质量分 58
airX嵌入式(微信公众号同名)
微信公众号 airX嵌入式 ,分享个人实际项目经验和理解
展开
-
基于stm32f103的LM6029-12864液晶屏开发(代码资源地址在最后)
《《《《《正文》》》》》《前言》本文主要介绍128x64点阵液晶屏的开发,本文是基于拓普微LM6029AC液晶模块显示屏开发的,兼容12864cog HFG12864-438液晶屏,驱动芯片为ST7565R ;通信串口采用4SPI;《液晶模块》首先来区别液晶模块和驱动芯片;驱动芯片:其实我在《数码管是如何亮起来的?跟液晶屏又有什么关系?》这篇文章提过,因为128x64的com口以及seg口过多,如果使用单片机IO口直接驱动太费IO资源,二来IO口驱动能力也未必够;因此设计..原创 2021-11-05 10:17:49 · 1949 阅读 · 0 评论 -
手把手教你开发基于单片机的wifi通信的物联网项目(远程灯控制)
《《《《《正文》》》》》《前言》本文主要介绍开发一个基于单片机的wifi通信远程灯控制的方法,单片机只需支持UART通信即可,以实现最简单的远程控制开关、远程控制亮度,配网后,只需手机联网就可控制联网设备;本文的wifi模块是基于涂鸦智能的wifi模块,主芯片使用STM32F103C8T6;wifi模块与主芯片使用最基本的UART串口实现通信;《WIFI模块申请》1、登入涂鸦智能loT平台;平台网址:https://www.tuya.com/cn/2、...原创 2021-05-17 13:41:25 · 4891 阅读 · 8 评论 -
定义结构体的4种方法
《《《《《正文》》》》》《方法一》先定义结构体类型,再定义结构体变量:structstudent{charno[20];//学号charname[20];//姓名charsex[5];//性别intage;//年龄};structstudentstu1,stu2;此时stu1,stu2为student结构体变量。《方法二》定义结构体类型的同时定义...原创 2021-05-17 13:19:57 · 1862 阅读 · 0 评论 -
STM32F103之脉冲宽度调制(PWM)模块开发(含呼吸灯实例源代码)
《《《《《正文》》》》》《加载库文件》《硬件设计》看手册可以知道:* TIM3 CH1(PWM1) -> PA6* TIM3 CH2(PWM2) -> PA7* TIM3 CH3(PWM3) -> PB0* TIM3 CH4(PWM4) -> PB1《软件设计》设计4路PWM控制的LED;1、初始化函数,这里需要注意的是下面这个配置项:TIM_...原创 2021-05-17 13:17:50 · 1338 阅读 · 0 评论 -
STM32F103之时基中断(TIM)模块开发
《《《《《正文》》》》》《前言》定时器在嵌入式中的作用是应该算得了是顶梁柱了,可以用出来产生PWM、可以原来输入捕捉、可以用来计时等等;今天我们来说说定时器的定时功能,就是用定时器产生一个系统的时基,使代码实现能够实现时间片的轮询;《加载库文件》1、按下图步骤加载TIM库文件《软件设计》时基的TIM模块编程流程图:一、中断配置void NvicConfig(void){ NVIC_InitTypeDef NVIC_InitSt...原创 2021-05-17 13:15:28 · 1253 阅读 · 4 评论 -
单片机中断的基本概念
《《《《《正文》》》》》《中断作用》 1、实现实时处理。 2、实现分时操作。 3、进行故障处理。 4、待机状态的唤醒。单片机嵌入式系统的应用中,为了减少电源的功耗,当系统不处理任何事物,处于待机状态时,可以让单片机工作在休眠的低功耗方式。通常,恢复到正常工作方式往往也是利用中断信号来唤醒。《中断处理过程》中断系统中,MCU正常情况下运行的程序称为主程序,把产生申请中断信号的单元和事件称为中断源,由中断源向MCU所发出的申请中断信号称为中断请求,MCU接受中断...原创 2021-05-17 13:13:32 · 2833 阅读 · 1 评论 -
软复位操作《Cortex®-M0+等内核通用》
《《《《《正文》》》》》软件复位就是用一系列指令来模仿硬件复位功能。现在arm越来越强大,就连苹果macbook都用上了arm架构,下面分享基于arm内核的软件复位的方法。只要基于Cortex®-M0+、Cortex®-M3等均可直接调用下面2个函数实现,至于函数名是否一样,需要自己判断,一般在core_cm3.h可以查找到。下面这个就是华大HC32F系列单片机的复位函数,在自己的内核头文件中。《方法》NVIC_SystemReset()函数用来复...原创 2021-05-17 13:12:02 · 3152 阅读 · 1 评论 -
STM32F103之systick延时(SYSTICK)模块开发
《《《《《正文》》》》》建议先看SYStick的原理请看:一文透析SYSTICK的寄存器下面做一个基于systick的延时模块开发:第一步:当然是时钟的选择,配置函数在misc.c中:/** * @brief Configures the SysTick clock source. * @param SysTick_CLKSource: specifies the SysTick clock source. * This parameter can be ...原创 2021-05-05 11:04:36 · 964 阅读 · 0 评论 -
一文透析SYSTICK的寄存器
《《《《《正文》》》》》《什么是systick?》这是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。它是集成在内核里,并不是外扩的功能模块,因此它具有很高的通用性;《systick的作用》在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。要...原创 2021-05-05 11:02:09 · 1082 阅读 · 0 评论 -
一文搞定数码管的软件开发(源代码获取见底部)
《《《《《正文》》》》》建议先看数码管的显示原理这篇文章:数码管是如何亮起来的?跟液晶屏又有什么关系?《硬件设计》4个Com ,8个seg,共阴极设计方案!seg0-seg7对应a、b。。。f、g、dp(小数点)。《软件设计》一、宏定义COM 和SEG的输出操作 //需用户配置///**************************************//此处调用GPIO控制函数头文件#include "gpio.h" ...原创 2021-04-30 15:15:12 · 975 阅读 · 1 评论 -
SPI的CPOL(时钟极性)、CPHA(时钟相位)的意义
《《《《《正文》》》》》为什么单独拿这个来说,是因为这个很重要,往往只要告诉你是SPI,以及这个2个参数,你就要知道怎么写通信代码了!这样才是一个合格的spi程序员。我们知道,SPI总线上的数据什么时候获取有效是根据CLK的变化沿来决定,但一次CLK变化沿是有2个时间点的,因此需要双方先规定选择哪个变化沿,包括CLK的起始电平,所以这个是非常重要的东西;SPI 的工作时序模式由 CPOL(Clock Polarity,时钟极性)和 CPHA(Clock Phase,时钟相位...原创 2021-04-28 09:54:44 · 4667 阅读 · 0 评论 -
5个函数搞定IO口模拟SPI通信
《《《《《正文》》》》》添加模块的第一件事当然是要知道支持什么通信,上面就是一个支持SPI的模块,手册中都会有时序图,包括一些参数的要求,这里只做SPI的编程思路,以下代码主要提供一个编程思路;拿到这个波形时序图就基本可以开始写了;确定CPOL=0、及CPHA=1;即CLK极性为低,第二个CLK时钟沿变化采样数据;《初始化IO函数》void BSP_SPI_Init(void){ Gpio_InitIO(SPI_NSS_GPIO,SPI_CS_PIN,...原创 2021-04-28 09:53:54 · 2632 阅读 · 0 评论 -
一文搞懂SPI的传输时序
《《《《《正文》》》》》《SPI概念》SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步通信总线,常用于短距离通讯,主要应用于 EEPROM、FLASH、实时时钟、AD 转换器、还有数字信号处理器和数字信号解码器之间。SPI 一般使用 4 根线通信(当然也有3根的,本质上没有区别,主要区别在于时序组合的意义不同),如下图所示: MOSI –主机输出 / 从机输入数据线(SPI Bus Master Output/Slave In...原创 2021-04-28 09:53:01 · 2548 阅读 · 0 评论 -
使用IO口模拟PWM设计呼吸灯
《《《《《正文》》》》》《硬件设计》控制灯的IO口接芯片即可;《软件架构》《软件设计》我的呼吸灯功能由2个函数实现,一个函数是IO模拟PWM产生波形;另一个函数是控制占空比的改变快慢及大小;他们之间用一个可更改的占空比变量联系;可更改的占空比变量:volatileuint16_tpwm_duty=0u;//占空比1、设计IO模拟PWM波形函数该函数需要被周期调用,这样是为了可以对时间进行精确的计时,从而实现对占空比的...原创 2021-04-26 11:13:09 · 2850 阅读 · 6 评论 -
关于PWM的一些事
《《《《《正文》》》》》《PWM概念》PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%,下图为占空比25%的波形;《实现PWM的方法》1、利用IO模拟产生PWM波形。这个就是利用软件中的时...原创 2021-04-26 11:11:53 · 824 阅读 · 0 评论 -
STM32F103调试串口(USART)模块开发(内含Printf重定向函数说明及模块代码资源)
《《《《《正文》》》》》《前言》基于UART的串口在实际项目中的应用相当广泛,包括wifi、can、lin等均可使用uart进行通信,方便且成本低;而uart串口功能不仅仅体现在产品使用功能上,在开发调试阶段更是一个必不可少的调试助手。今天就来构建一个基于uart的调试串口功能模块;开发需求:使用stm32f103的usart模块开发一个具有发送任意字符串的调试串口功能的模块;相关代码获取地址:https://pan.baidu.com/s/1zyrOF18W...原创 2021-04-17 21:27:45 · 2277 阅读 · 2 评论 -
STM32F103之指示灯(LED)模块开发(大结局献上流水灯视频)
《《《《《正文》》》》》《硬件设计》原理图:GPIO引脚 LED1 PA11 LED2 PA12 LED3 PB9 LED4 PB8 《加载GPIO库文件》1、按下图步骤加载GPIO库文件(环境搭建已经写过了,这里不多说明)2、这里多说几句,打开stm32f10x_gpio.h,看里面的全局函数。学点英语,看全局函数的命名你都能知道函数的作用了,这是一个使用库函数的技巧。《软件设计》...原创 2021-04-16 09:25:47 · 1234 阅读 · 0 评论 -
谈谈内部Flash模拟eeprom的一些问题
《《《《《正文》》》》》《FLASH的缺点》说到flash大家可能更加熟悉eeprom,典型的有24Cxx,eeprom的操作没有什么限制,想写就写,想读就读,不用擦除,数据都可以覆盖,而且支持字节操作,一般的擦写次数都达到了百万级别,下面是24Cxx的参数:而内部flash的操作限制就多了,写操作之前必须擦除操作,擦除操作也是有最小单位限制的;flash的擦写次数一般很少,而且因为是块擦除,擦除也很耗时间,例子参数如下图:《FLASH的操作规则》...原创 2021-04-14 17:33:59 · 1280 阅读 · 0 评论 -
分享3种bootload的思路方法
《《《《《正文》》》》》《前言》自己曾经的一个车上can总线的项目,因为是项目前期,客户也只是要几个demo件,于是我为了速战速决,做了个不带bootload的样件,没想到的是,客户要了300多的样件,当时发完货,我就知道完了,果不其然,几个月后,出现了一些需求的对接错误及更改,别人主机bootload在线就可以升级,我的没做bootload,于是我被派出去烧程序了!好在那次的工程车没有发往全国各种,不然真的全国飞去烧程序了!在实际项目开发中,因功能更改或bug修正等原...原创 2021-04-12 17:59:10 · 3211 阅读 · 0 评论 -
UART\串口\TTL\RS-232\RS-485的区别
《《《《《正文》》》》》《串口》串口是指物理上(硬件)的接口形式,就像USB接口,以及线下很流行的type-C接口,所以它是一个遵循某一类似通信协议的统称,UART、TTL、RS232、RS485都遵循同一类似的通信协议,就统称为串口。《UART》UART全称是通用异步收发器(Universal Asynchronous Receiver/Transmitter)。它是一个用于收发数据的集成逻辑电路,相当于一个电路模块,能嵌入在芯片里拥有自己的功能模块,所以UART是指一个能...原创 2021-04-05 11:50:15 · 888 阅读 · 0 评论 -
嵌入式C语言优化技巧
《《《《《正文》》》》》《变量类型》不同类型的数据生成的代码长度会不同,变量类型范围越小自然运行速度越快,占用的内存也会越小。所以能定义短类型的变量就不要定义长类型的变量,比如能用char定义就不要用int定义了;还有能不用float就不用float类型变量;当然这些前提是你的数据类型够用;再则变量的赋值不要超过变量的赋值,C编译器一般不报错,程序却能正常的运行,这个问题就很难查了。《避免使用标准库》虽然标准库能加快开发进度,但是因为标准库是考虑到用户所有可能情况所开发的代码...原创 2021-04-04 11:42:51 · 812 阅读 · 0 评论 -
联合体union能解决什么问题?
《《《《《正文》》》》》《结构体的不足》在C语言中,如果要你描述一辆车的属性,最快最简洁的方法就是构建结构体:struct car_info{char*logo;//品牌 long country; //国家intprice; //价格chartype;//类型};如上定义的结构体就可以很方便的描述一辆车的信息,而且多辆车的话只需新增一个car_info定义的变量而已,方便且简洁明了!如果后续还增加车的属性的话,只需在结构体...原创 2021-04-03 14:37:25 · 780 阅读 · 0 评论 -
嵌入式程序跑飞的几个原因
《《《《《正文》》》》》作为嵌入式程序员,我想程序跑飞应该不陌生吧?!尤其在前期开发调试阶段,程序九重天都能飞!而且跑飞很难查找原因,基于程序跑飞的原因复杂且五花八门,我也只能分享几个自己常常遇到的跑飞的原因,也当提供排查跑飞的思路方向!《看门狗时间太短》有些底层IDE配置生成的的工程可能默认看门狗开启,且时间很短,往往满足不了我们初始化阶段的时间或者while死循环的最长周期,导致复位。《带while的条件》如果在程序中while某个条件,比如外部状态、或者变量,...原创 2021-04-03 09:13:29 · 1346 阅读 · 3 评论 -
开漏输出和推挽输出的区别?
《《《《正文》》》》》《理解三极管的原理》如下图,以NPN三极管为例:它是一种电流控制型元器件,即基极B的输出输出电流可以实现对元器件的控制。所以可以进一步理解为基极B为控制端,集电极C为输入端,发射极E为输出端,这里的输入输出指电流方向!当控制端(基极B)有电流输入时,就会有电流从输入端(集电极C)流入,并且从输出端(发射极E)流出,这样就起到了电流控制元器件的效果!如下图(红色为电流方向):而PNP管正好相反,当有电流从控制端流出时,就会有电流从输入端流...原创 2021-04-01 13:09:53 · 2038 阅读 · 0 评论 -
嵌入式提高CPU利用率的编程方法(以按键消抖为实例)
《《《《《正文》》》》》最初,我在按键消抖软件策略上的实现方法是获取按键电平后,延时一段时间后,再去判断按键电平,如果2次电平相同就确定为消抖成功,最后的电平就可作为判断按键操作的依据。大致伪代码如下: void main(void) { Key_Init(); //底层初始化 while(1) { KeyIO_1 = GetKeyIO(); delay_ms(100); //延时50ms函数 K...原创 2021-03-30 20:14:31 · 981 阅读 · 0 评论 -
Keil.STM32F1xx_DFP.1.0.5.pack获取方法
链接:https://pan.baidu.com/s/130HpzbGCWMQ_f6mPbPomlw关注公众号,发送1234获取提取码!原创 2021-03-29 19:17:12 · 3599 阅读 · 7 评论 -
裸机系统用前后台系统还是轮询系统?
《《《《《正文》》》》》轮询系统==》就是在死循环里顺序的做各种事情!大概代码如下图1-1;这个适用于只需顺序执行事务且不需要外部事件来驱动事务的系统,比如仅仅实现LED翻转的系统,使用轮询系统来编程会很完美!图1-1intmain(void){ //硬件相关初始化 HardWareInit(); for (;;) { //处理事情1 Something1(); //处理事情2 ...原创 2021-03-29 11:09:50 · 889 阅读 · 0 评论 -
KIEl的kengen获取方法
链接:https://pan.baidu.com/s/1Y7BNfaUzojill_v8_OAT2A关注公众号,发送1234获取提取码!原创 2021-03-28 23:19:55 · 753 阅读 · 0 评论 -
Keil5.26获取方法
链接:https://pan.baidu.com/s/1vz6UjCqh4gR1-wJmsRNeeA关注公众号,发送1234获取提取码!原创 2021-03-28 23:01:22 · 872 阅读 · 0 评论 -
先学STM8,还是先学STM32?
《正文开始》声明:本人是偏软件的,所以以下给出的分享是偏软件的角度。只想看总结的话就跳到最后! 写这篇文章的灵感来自于因为最近全球芯片紧缺,公司很多产品的芯片都拿不到,没的办法,只能启用国产的,这就涉及到底层移植的工作,去年12月到现在,我一直在弄移植老产品到国产芯片上,目前还在移植,已经5个项目了,这个工作难就难在底层的配置,那跟今天的问题有什么关系?往下看!首先不管先学哪个,你最终的目的肯定不是仅仅局限于STM,而是往后市场上千万芯片中被你老板选中的那款芯片...原创 2021-03-28 17:28:31 · 986 阅读 · 0 评论 -
教你如何快速了解一款芯片的时钟系统
时钟在芯片运行中的地位如同心脏在人体中的地位。所以好代码的前提自然需要一个配置正确的时钟!时钟乱了,代码九重天都能飞上去!但是一款芯片的时钟系统是复杂的,我们需要时间去了解,尤其在涉及到带睡眠唤醒的产品,时钟在这个工程中的操作尤为重要,弄不好就醒不过来了!或者时钟错乱等都会发生。今天分享如何快速的了解一款芯片的时钟系统,那就是看时钟图!既然看图,就要对图符号要了解!下面来了解一下,以下并不是死规定,只是大部分适用;1、表示外部时钟...原创 2021-03-25 15:28:35 · 1077 阅读 · 0 评论 -
比特率和波特率的区别
(模块全代码获取方式,关注微信公号,发送switch)关注微信公众号 (airX嵌入式),获取更多项目经验!1.比特率 比特率(bitrate)又称传信率、信息传输速率(简称信息速率,informationrate)。其定义是:通信线路(或系统)单位时间(每秒)内传输的信息量,即每秒能传输的二进制位数,通常用Rb表示,其单位是比特/秒(bit/s或b/s,英文缩略语为bps)。 在二进制系统中,信息速率(比特率)与信号速率(波特率)相等,例如,当系统以每秒50个二进制符...原创 2021-03-24 13:25:20 · 942 阅读 · 0 评论 -
图文通透极其广泛的UART
(模块全代码获取方式,关注微信公号,发送switch)关注微信公众号 (airX嵌入式),获取更多项目经验!一、何为UART通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种串行、异步、全双工的通信协议,在嵌入式领域应用的非常广泛。Can、lin、嵌入式wifi模块等都可以使用uart进行通信。其实就是2根线,利用高低电平的时序一根收,一根发进行双向通信!当然地要接的!所以应该是3线!二、通信原理.原创 2021-03-24 13:22:16 · 958 阅读 · 0 评论 -
C编程中位操作的常见技巧(含个人项目经验)
最近思来想去,觉得需要技术沉淀,于是我注册了个微信公众号(airX嵌入式),这也是为我后续创业公司做准备,一来能分享记录我的开发项目,以及开源一切设计;二来能结识更多的同道中人!有机会可以合作创业!微信扫码关注我!(airX嵌入式)在C项目中,我们常常会遇到设置某个参数中的n位数值或者读取某个参数的n位数值,如果每次都口算出整个参数的值再使用与或算法那真的费时间,弄不好算错了那就更麻烦了!举个例子:假设寄存器A为32Bit长度寄存器,请将27位的值置位0?如果你傻傻的有下面这个做法.原创 2021-03-22 13:32:12 · 1010 阅读 · 0 评论 -
细说STM32的中断控制器(NVIC)那些事
1、什么是NVIC?来自《CM3技术参考手册》的官方资料回答:即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。说白了NVIC的功能就是中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等,它控制着STM32中断向量表中的中断相关功能!!外部中断信号从核外发出,信号最终要传递到NVIC(嵌套向量中断控制器)。NVIC跟内核紧密耦合,它控制着整个芯片中断的相关功能。上面的240个中断是CM3内核对外的外部中断原创 2021-03-22 10:06:42 · 2239 阅读 · 0 评论 -
【STM32烧写方法二】RS232-TTL(用于有些芯片的JTAG和SWD端口被禁止烧写的解决)
注意这种方法可以用于恢复芯片的SWD和JTAG被禁用!第二种方法:利用串口模块烧写程序,就是usart通信协议,只需要4根线,但STM32芯片上的脚需要操作一下!分别是BOOT0和B00T1!这种方法可以使有些芯片的JTAG和SWD被关闭的芯片可以重新开启!第一步:将芯片的BOOT0接入高电平(就接一个3.3v的电压),将BOOT1接地!第二步:将该烧写的模原创 2017-05-15 14:24:05 · 10526 阅读 · 0 评论 -
【STM32烧写方法一】ST-LINK烧写
首先烧写就是将你写好的程序下载到单片机的芯片里,这篇提供2中烧写方法! 第一种为ST-LINK烧写: STLink的JTAG接口在SWD模式下载时理论上需要4根数据线就okay了SWCLK,SWDIO,GND,VCC。 我们只需要上面的19、20 、7、9 脚即可!至于管口的确定你可以根据上电后的电压来判断! 将上面的口连接到STM32芯片上的对应口,再原创 2017-05-15 14:08:15 · 25668 阅读 · 0 评论 -
【库函数版本】基于STM32F103的MPU6050的原始数据读取程序详解
因为我的博客已经对I2C协议的详细过程已经做了一个例子!所以这个MPU6050的程序我将使用库函数完成!第一步:硬件连接:第二步:初始化I2C端口的函数:/***PB6/PB7 端口初始化****/static void I2C_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;RCC原创 2017-05-26 17:20:46 · 24694 阅读 · 14 评论 -
STM32寄存器操作端口模式SDA_OUT()/SDA_IN()
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3是不是看到懵了,其实不难,相信用寄存器写过stm8s的就明白了,其实这是利用寄存器配置端口模式,只是32为的寄存器太多!原创 2017-05-17 10:29:39 · 22175 阅读 · 5 评论 -
【STM32F103攻城笔记】内部晶振HSI倍频设置系统时钟
首先说明,因为STM32芯片的型号不同,所以对于不同芯片有不同频率的限制,比如某些时钟频率不能大于多少,这是根据手册来设置的!但改变频率的寄存器都一样,只是我们设置频率大小要受芯片的限制!下面我用的芯片型号是STM32F103VBT6!它就限制了内部晶振的倍频不能大于64MHz(但其实我实验出来是52MHz)!本文是利用内部晶振(HSI)来倍频,与外部晶振倍频区分开!第一步:打开syste原创 2017-06-02 17:47:56 · 19849 阅读 · 1 评论