STM32

STM32是STMicroelectronics(意法半导体)推出的一系列基于ARM Cortex-M内核的32位微控制器(MCU)产品。这些微控制器提供了广泛的产品系列,覆盖了多种不同的性能和功能需求,适用于各种应用领域,包括工业控制、汽车电子、消费类电子、医疗设备等。

STM32系列微控制器以其高性能、低功耗、丰富的外设接口和灵活的开发工具而闻名。它们通常具有丰富的存储器、多种通信接口(如UART、SPI、I2C、CAN等)、模拟数字转换器(ADC)、定时器、PWM输出等功能,以满足不同应用场景下的需求。

STM32微控制器通常使用标准的ARM Cortex-M内核,包括Cortex-M0、M0+、M3、M4和M7等,这些内核具有不同的性能和功耗特性,可根据具体应用的需求进行选择。此外,STM32系列还提供了多种封装和引脚配置,以满足不同尺寸和集成度的要求。

STMicroelectronics为STM32系列提供了丰富的开发工具和支持资源,包括基于ARM开发环境的集成开发环境(IDE)、调试器、评估板和参考设计等。这些工具和资源有助于开发人员快速开发和部署他们的应用,并提供了全面的技术支持和文档资料,帮助用户充分发挥STM32微控制器的性能和功能优势。

队列的概念

在此之前,我们来回顾一下队列的基本概念:

队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队)。

队列的特点

“STM32进阶之串口环形缓冲区实现"

“STM32进阶之串口环形缓冲区实现"

类似售票排队窗口,先到的人看到能先买到票,然后先走,后来的人只能后买到票

队列的常见两种形式

“STM32进阶之串口环形缓冲区实现"

普通队列

“STM32进阶之串口环形缓冲区实现"

在计算机中,每个信息都是存储在存储单元中的,比喻一下吧,上图的一些小正方形格子就是一个个存储单元,你可以理解为常见的数组,存放我们一个个的信息。

当有大量数据的时候,我们不能存储所有的数据,那么计算机处理数据的时候,只能先处理先来的,那么处理完后呢,就会把数据释放掉,再处理下一个。那么,已经处理的数据的内存就会被浪费掉。因为后来的数据只能往后排队,如过要将剩余的数据都往前移动一次,那么效率就会低下了,肯定不现实,所以,环形队列就出现了。

环形队列

“STM32进阶之串口环形缓冲区实现"

它的队列就是一个环,它避免了普通队列的缺点,就是有点难理解而已,其实它就是一个队列,一样有队列头,队列尾,一样是先进先出(FIFO)。我们采用顺时针的方式来对队列进行排序。

队列头 (Head) :允许进行删除的一端称为队首。

队列尾 (Tail) :允许进行插入的一端称为队尾。

环形队列的实现:在计算机中,也是没有环形的内存的,只不过是我们将顺序的内存处理过,让某一段内存形成环形,使他们首尾相连,简单来说,这其实就是一个数组,只不过有两个指针,一个指向列队头,一个指向列队尾。指向列队头的指针(Head)是缓冲区可读的数据,指向列队尾的指针(Tail)是缓冲区可写的数据,通过移动这两个指针(Head) &(Tail)即可对缓冲区的数据进行读写操作了,直到缓冲区已满(头尾相接),将数据处理完,可以释放掉数据,又可以进行存储新的数据了。

实现的原理:初始化的时候,列队头与列队尾都指向0,当有数据存储的时候,数据存储在‘0’的地址空间,列队尾指向下一个可以存储数据的地方‘1’,再有数据来的时候,存储数据到地址‘1’,然后队列尾指向下一个地址‘2’。当数据要进行处理的时候,肯定是先处理‘0’空间的数据,也就是列队头的数据,处理完了数据,‘0’地址空间的数据进行释放掉,列队头指向下一个可以处理数据的地址‘1’。从而实现整个环形缓冲区的数据读写。

“STM32进阶之串口环形缓冲区实现"

看图,队列头就是指向已经存储的数据,并且这个数据是待处理的。下一个CPU处理的数据就是1;而队列尾则指向可以进行写数据的地址。当1处理了,就会把1释放掉。并且把队列头指向2。当写入了一个数据6,那么队列尾的指针就会指向下一个可以写的地址。

“STM32进阶之串口环形缓冲区实现"

如果你懂了环形队列,那就一步步用代码实现吧:

从队列到串口缓冲区的实现

串口环形缓冲区收发:在很多入门级教程中,我们知道的串口收发都是:接收一个数据,触发中断,然后把数据发回来。这种处理方式是没有缓冲的,当数量太大的时候,亦或者当数据接收太快的时候,我们来不及处理已经收到的数据,那么,当再次收到数据的时候,就会将之前还未处理的数据覆盖掉。那么就会出现丢包的现象了,对我们的程序是一个致命的创伤。

那么如何避免这种情况的发生呢,很显然,上面说的一些队列的特性很容易帮我们实现我们需要的情况。将接受的数据缓存一下,让处理的速度有些许缓冲,使得处理的速度赶得上接收的速度,上面又已经分析了普通队列与环形队列的优劣了,那么我们肯定是用环形队列来进行实现了。下面就是代码的实现:

①定义一个结构体:

1typedef struct
2{
3    u16 Head;          
4    u16 Tail;
5    u16 Lenght;
6    u8 Ring_Buff[RINGBUFF_LEN];
7}RingBuff_t;
8RingBuff_t ringBuff;//创建一个ringBuff的缓冲区

②初始化结构体相关信息:使得我们的环形缓冲区是头尾相连的,并且里面没有数据,也就是空的队列。

 1/**
 2* @brief  RingBuff_Init
 3* @param  void
 4* @return void
 5* @author 杰杰
 6* @date   2018
 7* @version v1.0
 8* @note   初始化环形缓冲区
 9*/
10void RingBuff_Init(void)
11{
12   //初始化相关信息
13   ringBuff.Head = 0;
14   ringBuff.Tail = 0;
15   ringBuff.Lenght = 0;
16}

初始化效果如下:

“STM32进阶之串口环形缓冲区实现"

写入环形缓冲区的代码实现:

 1/**
 2* @brief  Write_RingBuff
 3* @param  u8 data
 4* @return FLASE:环形缓冲区已满,写入失败;TRUE:写入成功
 5* @author 杰杰
 6* @date   2018
 7* @version v1.0
 8* @note   往环形缓冲区写入u8类型的数据
 9*/
10u8 Write_RingBuff(u8 data)
11{
12   if(ringBuff.Lenght >= RINGBUFF_LEN) //判断缓冲区是否已满
13    {
14      return FLASE;
15    }
16    ringBuff.Ring_Buff[ringBuff.Tail]=data;
17//    ringBuff.Tail++;
18    ringBuff.Tail = (ringBuff.Tail+1)%RINGBUFF_LEN;//防止越界非法访问
19    ringBuff.Lenght++;
20    return TRUE;
21}

读取缓冲区的数据的代码实现:

 1/**
 2* @brief  Read_RingBuff
 3* @param  u8 *rData,用于保存读取的数据
 4* @return FLASE:环形缓冲区没有数据,读取失败;TRUE:读取成功
 5* @author 杰杰
 6* @date   2018
 7* @version v1.0
 8* @note   从环形缓冲区读取一个u8类型的数据
 9*/
10u8 Read_RingBuff(u8 *rData)
11{
12   if(ringBuff.Lenght == 0)//判断非空
13    {
14       return FLASE;
15    }
16   *rData = ringBuff.Ring_Buff[ringBuff.Head];//先进先出FIFO,从缓冲区头出
17//   ringBuff.Head++;
18   ringBuff.Head = (ringBuff.Head+1)%RINGBUFF_LEN;//防止越界非法访问
19   ringBuff.Lenght--;
20   return TRUE;
21}

对于读写操作需要注意的地方有两个:

1:判断队列是否为空或者满,如果空的话,是不允许读取数据的,返回FLASE。如果是满的话,也是不允许写入数据的,避免将已有数据覆盖掉。那么如果处理的速度赶不上接收的速度,可以适当增大缓冲区的大小,用空间换取时间。

2:防止指针越界非法访问,程序有说明,需要使用者对整个缓冲区的大小进行把握。

那么在串口接收函数中:

1void USART1_IRQHandler(void)  
2{
3   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
4                   {
5           USART_ClearITPendingBit(USART1,USART_IT_RXNE);       //清楚标志位
6           Write_RingBuff(USART_ReceiveData(USART1));      //读取接收到的数据
7       }
8}

测试效果

“STM32进阶之串口环形缓冲区实现"

测试数据没有发生丢包现象

补充

对于现在的阶段,杰杰我本人写代码也慢慢学会规范了。所有的代码片段均使用了可读性很强的,还有可移植性也很强的。我使用了宏定义来决定是否开启环形缓冲区的方式来收发数据,移植到大家的代码并不会有其他副作用,只需要开启宏定义即可使用了。

 1#define USER_RINGBUFF  1  //使用环形缓冲区形式接收数据
 2#if  USER_RINGBUFF
 3/**如果使用环形缓冲形式接收串口数据***/
 4#define  RINGBUFF_LEN          200     //定义最大接收字节数 200
 5#define  FLASE   1
 6#define  TRUE    0
 7void RingBuff_Init(void);
 8u8 Write_RingBuff(u8 data);
 9u8 Read_RingBuff(u8 *rData);
10#endif

当然,我们完全可以用空闲中断与DMA传输,效率更高,但是某些单片机没有空闲中断与DMA,那么这种环形缓冲区的作用就很大了,并且移植简便。同时大家也可以参考下下面这篇Gokit3.0 STM32源代码分析,会对这个机制理解更深。

说明:文章部分截图来源慕课网james_yuan老师的课程
来源:
硬件攻城狮
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 264

01、正点原子157开发板介绍

STM32MP1是ST推出的首款Cortex-A系列MPU,整个MP1系列分为三大类:MP151、MP153和MP57,其中MP157是家族中最为强大的一款芯片。其中STM32MP157DAA3是整个MP1的旗舰级芯片,采用异构多核架构,包含两个800M的Cortex-A7内核、一个209M的M4内核,带有一个3D GPU,支持OpenGL ES 2.0,RGB接口屏幕最高支持1366*768 60fps。

STM32MP1系列完美的继承了STM32F7/H7的相关外设资源,可以看做是一个换核版的STM32H7,因此如果会STM32单片机的话就会很容易切换到STM32MP1的开发,这也是行业对于STM32MP1如此期待的主要原因。Cortex-A7可以跑Linux,完成复杂的应用软件开发,M4内核可以运行FreeRTOS系统,完成实时应用的开发。对于学习者而言,可以通过MP1一块板子来完成Linux和单片机的学习。

正点原子STM32MP157开发板采用底板+核心板的形式。STM32MP157核心板资源图,如下所示:

“▲图1.1.1
▲图1.1.1 核心板资源图

STM32MP157核心板的外形尺寸为60mm*45mm大小,非常小巧,并且采用了贴片板对板连接器,使得其可以很方便的应用在各种项目上。

正点原子STM32MP157核心板板载资源如下:

  • CPU:STM32MP157DAA1,双核A7+单核M4,A7主频800MHz,M4主频209MH,LFBGA448封装。

  • 外扩DDR3L:2片16为DDR3,总容量为1GB(2×512MB),位宽32位(2×16)。

  • EMMC:8GB字节。

  • 两个2*50的防反插BTB座,共引出144个GPIO以及35个其他功能引脚。

STM32MP157开发板底板资源图如下所示:

“▲图1.1.2
▲图1.1.2 MP157全功能开发板介绍

可以看出,STM32MP157开发板底板资源十分丰富,把STM32MP157的内部资源发挥到了极致,基本上STM32MP157内部所有的资源都可以在此开发板上验证,同时扩充丰富的接口和功能模块,开发板的外形尺寸为181mm*125mm大小。

正点原子STM32MP157开发板底板板载资源如下:

  • 1个核心板接口,支持STM32MP157核心板

  • 1个电源指示灯(蓝色)

  • 2个状态指示灯(红色和绿色,用户可以使用)

  • 1个六轴(陀螺仪+加速度)传感器芯片,ICM20608

  • 1个高性能音频编解码芯片,CS42L51

  • 1路CAN FD接口,采用MCP2526FDT芯片

  • 1路485接口,采用SP3485芯片

  • 1路RS232串口(母)接口,采用SP3232芯片

  • 1路RS232串口(公)接口,采用SP3232芯片

  • 1个ATK模块接口,支持正点原子蓝牙/GPS/MPU6050/手势识别等模块

  • 1个光环境传感器(光照、距离、红外三合一)

  • 1个摄像头模块接口

  • 1个OLED模块接口

  • 1个USB串口,可用于代码调试,Type-C接口类型

  • 1个USB OTG接口,用于USB从机通信,Type-C接口类型

  • 6个USB HOST接口,用连接USB设备

  • 1个有源蜂鸣器

  • 1个RS232/RS485选择接口

  • 1个RS232/ATK模块选择接口

  • 1个串口选择接口

  • 1个TF卡接口

  • 1个10M/100M/1000M以太网接口(RJ45)

  • 1个录音头(MIC/咪头)

  • 1路耳机接口,支持4段式耳机

  • 1个小扬声器(在板子背面)

  • 1组5V电源供应/接入口

  • 1组3.3V电源供应/接入口

  • 1个直流电源输入接口(输入电压范围:DC6~16V)

  • 1个启动模式选择配置接口

  • 1个RTC后备电池座,并带电池

  • 1个复位按钮,可用于复位MPU和LCD

  • 3个功能按钮

  • 1个电源开关,控制整个板的电源 

  • 1个Mini PCIE 4G模块接口

  • 1个Nano SIM卡接口

  • 1个SDIO WIFI&BT模块,板载

  • 1个WIFI&BT天线接口,板载

  • 1个HDMI接口

  • 1个JTAG调试接口,可以调试M4内核

  • 1个SPDIF光纤音频接收接口

  • 1个SPDIF光纤音频发送接口

  • 1个可调电位器,用于ADC测试

  • 1个4P的圆孔排座,可以接DHT11或DS18B20温湿度传感器

  • 1个2×22P,2.54mm间距的排针,引出44个IO,用户可自行使用

“STM32

02、文档教程资料

正点原子10年嵌入式教育经验,对于嵌入式文档教程有着极高的要求,教程编写以及视频录制讲师多则7,8年教育经历,少则4,5年,均参与正点原子多款开发板的教程编写以及视频录制。STM32MP157开发板是集正点原子10年教育经验的大作。

STM32MP157采用Cortex-M4加A7的双核异构架构,既可以通过STM32MP157学习STM32单片机,又可以学习嵌入式Linux,一板两用!极大的方便了学习者。针对STM32MP157开发板,既要编写Cortex-M4裸机教程,又要编写嵌入式Linux教程。截止目前为止,正点原子已经编写完成6份详尽的开发教程以及10份开发笔记。

丰富的教程以及开发笔记

目前已经发布了6份,总计5440多页,并且还在不断的更新中!教程资料如下:

“STM32

另外还有10份其他开发笔记,如下图:

“STM32

这些教程从开发板拿到手以后如何测试,一直到linux驱动开发、应用开发,堪称保姆级教程。真正手把手教你学嵌入式,从环境搭建,ubuntu入门,到嵌入式linux驱动开发,完善、详细的教程,降低学习难度。

03、例程源码

出厂系统全部开源

正点原子开发板全部开源,TF-A、uboot、kernel、QT综合界面,全部免费开源!方便大家学习、开发。

“STM32

Cortex-M4裸机例程

针对STM32MP157的M4内核,我们提供了传统的MDK+HAL库版例程,也提供了CubeIDE+HAL库的例程。

MDK+HAL库一共有46个实验,基本涵盖了MP1的M4内核所有的外设实验。

“STM32

针对CubeIDE+HAL一共提供了36个实验:

“STM32

FreeRTOS例程

针对MP1的M4内核,提供了23个FreeRTOS例程:

“STM32

linux驱动例程

目前提供了35个linux驱动例程,还在更新中:

“STM32

嵌入式Linux C应用开发例程

针对嵌入式Linux应用开发,我们提供了19个应用开发例程:

“STM32

QT开发例程

正点原子MP157开发板出厂有精美的UI界面,为QT编写,界面全部开源,提供了EGL和FB两个版本,方便大家学习使用。

“STM32

egl和fb只是针对不同的根文件系统,UI界面是完全一样的。正点原子每个QT APP都是独立的例程,大家可以根据实际需求查看,学习对应的APP:

“STM32

04、资料下载链接

正点原子STM32MP157开发板所有资料均免费开源,下载地址为:

http://www.openedv.com/docs/boards/arm-linux/zdyzmp157.html

来源:STM32
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 992

STM32F103默认最高主频为72M,其主频可以达到80M吗? 假如达到80M,程序能正常运行吗?

关于MCU主频

首先,还是简单介绍一下MCU主频。一般我们讲的电脑CPU主频,对于MCU来说,其实道理一样,都是指的CPU内核工作的时钟频率。

对于STM8、STM32来说,MCU的主频由硬件(晶振)和软件编程决定。

在STM32中,MCU主频一般是通过倍频来实现的。比如:72M,等于8M时钟,9倍频(8 x 9 = 72)。

在STM8、32中,我们说的主频时钟和外设时钟,其实是两种不同时钟。

查看MCU「参考手册」STM8的CLK时钟控制章节,STM32的RCC复位和时钟控制章节的时钟树一目了然。

STM8主频时钟

在STM8「参考手册」Clock control(CLK)时钟控制章节,详细描述了STM8时钟相关的内容。

从时钟树可以清晰看的出STM8时钟大概有哪些内容。比如STM8S的时钟树:

“STM32可以超频吗?"

从时钟树可以看的出,可以得出一些重要信息,如:

  • 内部高速晶振HSI默认16M,外部晶振可选择1 - 24M。
  • STM8主频只能分频,不能倍频
  • 外设时钟是由主频时钟而来,可单独开启。
  • 时钟频率可选择多种方式输出(CCO)。

STM8主频可以大于16M吗? 这个问题是之前有朋友问过的问题。

当然,答案肯定是可以。为了提高MCU效率,很多人就是将主频进行提高来达到目的。

但是,这里需要注意一个问题:当超过16M主频时钟时,Flash /data EEPROM访问必须配置为1等待状态。

这个在STM8「参考手册」中有明确说明:

For clock frequencies above 16 MHz, Flash /data EEPROM access must be configured for 1 wait state. This is enabled by the device option byte. Refer to the datasheet option bytesection.

STM32主频时钟

STM32主频时钟同样也是由硬件(晶振)和软件编程决定。

“(STM32F1时钟树)"
(STM32F1时钟树)

STM32的时钟可以上面时钟树看得出来,相对STM8要复杂的多。以上还只是STM32F1的,像F4,F7的还更复杂。

从时钟树可以看得出,STM32外部晶振频率是一个范围值,一般硬件就要求在这个范围以内。

STM32一个显著的特点就是增加了倍频这个功能。如果没有倍频功能,我们使用的72M、168M这么高的频率,就需要直接使用上百兆的晶振。

这么能实现吗? 原理上来说,可以实现。但对MCU来说是一个不小的考验。具体原因可能就要问相关的资深工程师了。

1、STM32倍频

STM32的倍频可通过配置对应寄存器(也就是编程)来实现。但一般不建议自己直接通过配置寄存器来实现,参考官网提供例程代码即可。

标准外设库例程:在执行main函数之前,系统就会调用SystemInit函数进行初始化系统时钟(含主频)。

如果外部晶振和例程不一样,修改对应的几个参数即可。比如倍频值,HSI值等。这个阅读一下代码就能明白。

HAL库:可通过STM32CubeMX工具直接配置时钟,简单方便,时钟树勾选一目了然。

“STM32可以超频吗?"

2、主频能超过最大值吗?

如开篇所说,STM32F1主频能超过最大的72M吗?答案是可以的。

但是,超过最大主频,有可能存在潜在的风险。比如:时序紊乱,程序跑飞等。

超频工作需要考虑实际情况和环境因素。比如干扰特别大的环境,一般不建议超频。

我是亲自经历过的,之前公司产品为了提高效率,将主频超过一定值,还是能正常运行,而且投产了的。但是,应用环境相对比较好,而且产品有电源控制(接断电复位)。

3、超频死机

如果MCU主频超过太多,就会导致程序跑飞,出现死机现象,只能通过工具重新固件。

这个时候直接下载,可能会出现错误,则可借助复位引脚来实现重新下载固件(按住复位引脚,点击下载,释放按键)。

说了这些,主要想强调,只要没有特殊要求,建议参考官网硬件和软件。

来源:嵌入式专栏(作者 | strongerHuang)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 120

今天来说说STM32固件版权的问题:

1Q:STM32固件是否包含ST版权资料?

1A:是。STM32固件包含固件库(标准库、HAL库等)、芯片数据手册、参考手册、应用笔记文档等。

2Q:非ST微处理器上使用STM32固件?

2A:除非拥有特许证书许可,STM32固件只能配合ST微处理器使用。

3Q:我是否能在非ST微处理器上使用改写过的STM32固件?

3A:除非拥有特许证书许可,改写过的STM32固件只能配合ST微处理器使用。

4Q:我能改写并以我个人的自有版权再传播STM32固件吗?

4A:除非拥有特许证书许可,经改写的STM32固件的再传播必须取得符合许可条件的适用版权声明。

5Q:如果我传播或者使用侵犯了ST版权的第三方固件,我要对侵权负责吗?

5A:是的,任何人使用或者再销售侵犯ST版权的第三方代码,也要对侵权负责。

6Q:如果我从Github上下载STM32固件,我可以按自己的意愿自由使用吗?

6A:不可以。所有STM32固件的使用,都要遵守许可证书的特殊条款和条件的规定,无论来源。

7Q:我是否能在非ST 微处理器上使用STM32工具?

7A:STM32工具只能配合ST微处理器执行使用。

来源地址:www.stmcu.org.cn/module/forum/thread-622353-1-1.html

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 24

在STM32参考手册中,都有Reset and Clock Control(RCC)复位和时钟控制的章节。

在这一章节就可以看到有两类寄存器:

  • peripheral reset register(RSTR)外设复位寄存器。
  • peripheral clock enable register(ENR)外设时钟使能寄存器。

我们拿STM32F1参考手册为例,可以看到如下图寄存器:

“STM32失能时钟和复位外设的区别"

一种是控制外设时钟的寄存器,一种是复位外设的寄存器。

外设时钟使能和失能

我们都知道,配置STM32外设,会先开启对应的时钟(也就是使能外设时钟)。

比如使能USART1时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

失能USART1时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);

前面分享过一篇文章《STM32为什么要先开启外设时钟?》,里面有说:为什么我们要先开启STM32外设时钟。

从时钟使能和失能来说,这里再简单总结一下:使能外设时钟,我们就可以操作(读写)对应的外设;失能外设时钟,则我们无法操作对应的外设。

所以说,我们要操作外设,就必须要先开启(使能)其外设时钟。

复位外设

复位外设相信大部分朋友都能理解,如果使用寄存器开发过的朋友,更应该明白。

简单来说,复位外设就是恢复外设所有寄存器为上电默认值,也可以说复位了我们的配置。

可能有些地方你会也会发现xx外设配置之前有“重新初始化”外设的操作,如:

USART_DeInit(USART1);
DMA_DeInit(DMA1_Channel1);

这重新初始化代码里面,其实就是调用了复位外设代码。

失能外设时钟和复位外设区别

上面说了失能外设时钟,我们就不能操作外设了。那么复位外设,我们还能操作外设吗?外设的时钟也会被复位吗?

可能许多人没有深入分析过,我这里简单总结一下:

1、外设时钟未使能(失能状态),不能配置(读写)外设;

2、复位外设,会复位外设的所有寄存器,但外设时钟不会被复位;

3、外设时钟使能,复位外设,再清除复位外设,可以继续配置(读写)外设。如USART1重新初始化:

RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);

USART_Init(USART1, &USART_InitStructure);

4、复位外设,但不清除复位外设,则不能继续配置(读写)外设。

RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);

USART_Init(USART1, &USART_InitStructure);

在STM32的库函数中,外设复位和清除都是成对的,所以,我们用库开发的好处,就是相对不容易犯一些错误。

因为还有很多朋友使用寄存器开发,有很多细节问题可能没有深入研究过,就不知道问题到底处在哪里。

所以,建议用寄存器开发的朋友转向使用(SPL、HAL或CLL)库开发。如果你非要一步一步理解底层,建议使用SPL标准外设库。

来源:嵌入式专栏(作者 | strongerHuang)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 113

页面

订阅 RSS - STM32