STM32单片机

我们先普及一个概念,单片机(即Microcontroller Unit;MCU) 里面有什么。一个人最重要的是大脑,身体的各个部分都在大脑的指挥下工作。MCU跟人体很像,简单来说是由一个最重要的内核加其他外设组成,内核就相当于人的大脑,外设就如人体的各个功能器官。下面我们来简单介绍下51单片机和STM32单片机的结构。

1. 51系统结构

“51系统结构框图"
51系统结构框图

我们说的51一般是指51系列的单片机,型号有很多,常见的有STC89C51、AT89S51,其中国内用的最多的是STC89C51/2,下面我们就以STC89C51来讲解,并以51简称。

1)内核
  
51单片机由一个IP核和片上外设组成,IP核就是上图中的CPU,片上外设就是上图中的:时钟电路、SFR和RAM、ROM、定时/计数器、并行I/O口、串行I/O口、中断系统。IP核跟外设之间由系统总线连接,且是8bit的,速度有限。
  
51内核是上个世纪70年代Intel公司设计的,速度只有12M,外设是IC厂商(STC)在内核的基础上添加的,不同的IC厂商会在内核上添加不同的外设,从而设计出各具特色的单片机。这里Intel属于IP核厂商,STC属于IC厂商。我们后面要讲的STM32也一样,ARM属于IP核厂商,ARM给ST授权,ST公司在Cortex-M3内核的基础上设计出STM32单片机。

2)外设
  
我们在学习51的时候,关于内核部分接触的比较少,使用的最多的是片上外设,我们在编程的时候操作的也就是这些外设。

编程的时候操作的寄存器位于SFR和RAM这个部分,其中SFR(特殊功能寄存器)占有 128字节(实际上只用了 26 个字节,只有 26 个寄存器,其他都属于保留区),RAM占有 128 字节,我们在程序中定义的变量就是放在RAM中。其中SFR和RAM在地址上是重合的,都是在80~FF地址区间,但在物理区间上是分开的,所以51的RAM是有256个字节。
  
编写好的程序是烧写到ROM区。剩下的外设都是我们非常熟悉的IO口,串口、定时器、中断这几个外设。

2. STM32系统结构

“STM32系统结构框图"
STM32系统结构框图

1)内核

在系统结构上,STM32和51都属于单片机,都是由内核和片上外设组成。只是STM32使用的Cortex-M3内核比51复杂得多,优秀得多,支持的外设也比51多得多,同时总线宽度也上升到32bit,无论速度、功耗、外设都强于51。

从结构框图上看,对比51内核只有一种总线,取指和取数共用。Cortex-M3内部有若干个总线接口,以使CM3能同时取址和访内(访问内存),它们是:

指令存储区总线(两条)、系统总线、私有外设总线。有两条代码存储区总线负责对代码存储区(即FLASH外设)的访问,分别是I-Code总线和D-Code总线。

I-Code用于取指,D-Code用于查表等操作,它们按最佳执行速度进行优化。

系统总线(System)用于访问内存和外设,覆盖的区域包括SRAM,片上外设,片外RAM,片外扩展设备,以及系统级存储区的部分空间。

私有外设总线负责一部分私有外设的访问,主要就是访问调试组件。它们也在系统级存储区。

还有一个DMA总线,从字面上看,DMA是data memory access的意思,是一种连接内核和外设的桥梁,它可以访问外设、内存,传输不受CPU的控制,并且是双向通信。简而言之,这个家伙就是一个速度很快的且不受老大控制的数据搬运工,这个在51里面是没有的。

2)外设

从结构框图上看, STM32比51的外设多得多,51有的串口、定时器、IO口等外设 STM32 都有。STM32还多了很多特色外设:如FSMC、SDIO、SPI、I2C等,这些外设按照速度的不同,分别挂载到AHB、APB2、APB1这三条总线上。

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

围观 198

单片机简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口、并口等)和中断系统处于同一芯片的器件。

在个人电脑中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机将这些都集中在了一个芯片上。

一、51单片机

应用最广泛的8位单片机,当然也是初学者们最容易上手学习的单片机。

最早由Intel推出,由于其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“经典”,为以后的其它单片机的发展奠定了基础。

1、51单片机特性

51单片机之所以成为经典,成为易上手的单片机主要有以下特点:

从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。

不但能对片内某些特殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。

同时在片内RAM区间还特别开辟了一个双重功能的地址区间,使用极为灵活,这一功能无疑给使用者提供了极大的方便。

乘法和除法指令,这给编程也带来了便利,很多的八位单片机都不具备乘法功能,做乘法时还得编上一段子程序调用,十分不便。

2、51单片机缺点

  • AD、EEPROM等功能需要靠扩展,增加了硬件和软件负担。

  • 虽然I/O脚使用简单,但高电平时无输出能力,这也是51系列单片机的最大软肋。

  • 运行速度慢,特别是双数据指针,如能改进能给编程带来很大的便利。

  • 51保护能力很差,很容易烧坏芯片。

3、51单片机应用范围

目前在教学场合和对性能要求不高的场合大量被采用。

使用最多的器件:8051、80C51。

二、STM32单片机

由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。

其基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核;同时具有一流的外设,1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等。

在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度。

由于其简单的结构和易用的工具,再配合其强大的功能,在行业中赫赫有名。

01、STM32单片机特性

内核:ARM 32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周期乘法和硬件除法。
存储器:片上集成32-512KB的Flash存储器,6-64KB的SRAM存储器。

时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压,POR、PDR和可编程的电压探测器(PVD),4-16MHz的晶振,内嵌出厂前调校的8MHz RC振荡电路,内部40 kHz的RC振荡电路,用于CPU时钟的PLL,带校准用于RTC的32kHz的晶振。

调试模式:串行调试(SWD)和JTAG接口,最多高达112个的快速I/O端口、最多多达11个定时器、最多多达13个通信接口。

02、STM32常用的器件

使用最多的器件:STM32F103系列、STM32 L1系列、STM32W系列。

三、51和STM32的区别

51单片机是对所有兼容Intel8031指令系统的单片机的统称,这一系列的单片机的始祖是Intel的8031单片机。

后来随着flash ROM技术的发展,8031单片机取得了长足的进展成为了应用最广泛的8bit单片机之一,它的代表型号就是ATMEL公司的AT89系列。

STM32单片机则是ST(意法半导体)公司使用ARM公司的cortex-M3为核心生产的32bit系列的单片机。

它的内部资源(寄存器和外设功能)较8051、AVR和PIC都要多的多,基本上接近于计算机的CPU了,适用于手机、路由器等。

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

围观 922

51单片机——应用最广泛的8位单片机。

当然,也是初学者们最容易上手学习的单片机,最早由Intel推出,由于其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“经典”,为以后的其它单片机的发展奠定了基础。目前在教学场合和对性能要求不高的场合大量被采用。

特点:

51单片机之所以成为经典,成为易上手的单片机主要有以下特点:

从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。不但能对片内某些特殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。

同时在片内RAM区间还特别开辟了一个双重功能的地址区间,使用极为灵活,这一功能无疑给使用者提供了极大的方便。

乘法和除法指令,这给编程也带来了便利。很多的八位单片机都不具备乘法功能,做乘法时还得编上一段子程序调用,十分不便。

缺点:

51单片机虽然是经典但是缺点还是很明显的

AD、EEPROM等功能需要靠扩展,增加了硬件和软件负担。

虽然I/O脚使用简单,但高电平时无输出能力,这也是51系列单片机的最大软肋。

运行速度过慢,特别是双数据指针,如能改进能给编程带来很大的便利。

51保护能力很差,很容易烧坏芯片。

STM32单片机——一款性价比超高的系列单片机

由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名。

特点:

STM32单片机其强大的功能主要表现在:

内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周期乘法和硬件除法。

存储器:片上集成32-512KB的Flash存储器;6-64KB的SRAM存储器。

时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压;POR、PDR和可编程的电压探测器(PVD);4-16MHz的晶振;内嵌出厂前调校的8MHz RC振荡电路,内部40 kHz的RC振荡电路;用于CPU时钟的PLL;带校准用于RTC的32kHz的晶振。

调试模式:串行调试(SWD)和JTAG接口;最多高达112个的快速I/O端口、最多多达11个定时器、最多多达13个通信接口。

来源:张飞实战电子,转载此文目的在于传递更多信息,版权归原作者所有。

围观 2757

1、前言

CM4内核的处理和CM3一样,内部都包含了一个SysTick定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。这样可以用systick来实现延时定时功能,不用再占用系统定时器。systick也多用做系统的时钟节拍,如freeRTOS等OS,再启动调度器的时候,就会将systick配置成其系统时钟,给系统提供心跳。systick中有4个寄存器CTRL、LOAD、VAL、CALIB


2、systick配置注意事项

使用CubeMX配置生成的代码中,会自动生成一个 SystemClock_Config() 的函数,用于配置单片机时钟,其中就会配置systick

void SystemClock_Config()
{
    ...........
    LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK);
    LL_SetSystemCoreClock(32000000);
#ifndef SYSTICK_IRQ
    LL_Init1msTick(32000000); //使能systick但是不开启systick中断
#else
    SysTick_Config(SystemCoreClock / 1000);//使能systick同时开启systick中断
#endif
}

但是这里 需要注意的是,是不是需要开启 systick 中断!!!!

1、如果只是想用systick来作为延时用,程序不想被中断打断,就只需要使能systick而不用开启systick中断,调用 LL_Init1msTick 即可

void LL_Init1msTick(uint32_t HCLKFrequency)
    ---> LL_InitTick(HCLKFrequency, 1000U);
        ---> __STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)
            {
                  /* Configure the SysTick to have interrupt in 1ms time base */
                  SysTick->LOAD  = (uint32_t)((HCLKFrequency / Ticks) - 1UL);  /* set reload register */
                  SysTick->VAL   = 0UL;  /* Load the SysTick Counter Value */
                  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                                   SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */
            }

但是需要自己编写延时函数,不能使用HAL库提供的HAL_Delay()。原因如下:HAL_Delay的实现是依靠一个uwTickFreq变量,uwTickFreq是在HAL_IncTick中累加的,需要在 SysTick_Handler中断函数中周期调用,这样HAL_Delay才会有一个基准

__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}
__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;
 
  /* Add a period to guaranty minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }
 
  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}

自定义的us延时

void my_delay_us(uint32_t nus)
{		
	uint32_t temp;	
	uint32_t fac_us = SystemCoreClock/1000000;	  //为系统时钟的1/1000000  	
	SysTick->LOAD   = nus*fac_us; 			      //时间加载	  		 
	SysTick->VAL    = 0x00;        			      //清空计数器
	SysTick->CTRL  |= SysTick_CTRL_ENABLE_Msk ;	  //开始倒数	  
	do
	{
		temp = SysTick->CTRL;
	}
	while((temp & 0x01) &&! (temp&(1 << 16)));	 //等待时间到达   
	SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;	 //关闭计数器
	SysTick->VAL = 0X00;      					 //清空计数器	 
}

2、如果想用systick座系统的时钟节拍,需要开启systick中断,可以直接调用 SysTick_Config 来配置,也可以使用 HAL_Init 来配置,HAL_Init 配置最终也会调用 SysTick_Config 函数

 HAL_Init(void)
    ---> HAL_InitTick(uint32_t TickPriority)
        ---> SysTick_Config(uint32_t ticks)
            {
              if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
              {
                return (1UL);                                                   /* Reload value impossible */
              }
            
              SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
              NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
              SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
              SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                               SysTick_CTRL_TICKINT_Msk   |
                               SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
              return (0UL);                                                     /* Function successful */
            }

这样配置完成之后,还需要再systick的中断中调用 osSystickHandler 和 HAL_IncTick

void SysTick_Handler(void)
{
	osSystickHandler();//为OS提供系统时钟节拍
	HAL_IncTick();//为HAL库提供时钟基准
}

版权声明:本文为CSDN博主 hurryddd 的原创文章,
遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:
https://blog.csdn.net/m0_37845735/article/details/108439464

围观 1301

1、前言

单片机内部的FLASH除了存储固件以外,经常将其分成多个区域,用来存储一些参数或存储OTA升级的待更新的固件,这时就会涉及到单片机内部FLASH的编程和擦除操作,STM32不同系列的单片机内部FLASH特性和扇区大小都不太一样,如果不注意这些细节,那就等着爬坑吧

1、FLASH的分区以及扇区大小

FLASH擦除是按照扇区擦的,所以这个很重要,在工程中全局搜索 FLASH_PAGE_SIZE 宏就可以查看该芯片的页(扇区)大小,改宏在 stm32xxx_hal_flash.h中有定义

2、FLASH擦拭后的状态

F1和F4系列的芯片FLASH在擦除后会是0xFFFFFFFF,而L1系列的芯片FLASH在擦除后是0x00000000!!!!!

3、FLASH的编程速度

L1芯片内部FLASH编程速度比F1慢50倍!!!所以在使用L1芯片写入数据时相对于F1慢是正常的

2、STM32 F1、F4、L1系列内部FLASH分区及大小

1、STM32F1系列

对于F1系列的芯片大容量产品的FLASH主存储器每页大小为2K,如【下图】,而中容量和小容量的产品每页大小只有1K


2、STM32F4系列

分为2个Bank,每个Bank分为12个扇区,前4个扇区为16KB大小,第五个扇区是64KB大小,剩下的7个扇区都是128K大小


3、STM32L1系列

3、STM32 F1、F4、L1系列内部FLASH编程时间

信息参考对应芯片的数据手册的 Electrical characteristics 章节


1、STM32F1系列

可以看出F1系列内部FLASH页擦除时间最大为40ms,半字写入的时间为52.2us,比如按字写入1024字节数据,需要26.8ms,还是比较快的


2、STM32F4系列

可以看出F4系列内部不同扇区擦除时间也不一样的,字写入的时间为16us,比如按字写入1024字节数据,只需要4ms,非常快


3、STM32L1系列

可以看出L1系列内部FLASH页擦除和编程的时间都是3.28ms,比如按字写入1024字节数据,需要840ms,非常慢;但是擦除是比较快的


版权声明:本文为CSDN博主 hurryddd 的原创文章,
遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:
https://blog.csdn.net/m0_37845735/article/details/108439644

围观 694

基于STM32F103单片机的IAP实现(虽然该篇文章不会详细写出实现细节,但是会从一个全局的角度讲述,实际的实现细节只需根据datasheet即可完成)。

一、基础概念

什么是IAP?IAP即在应用中编程(In-Application Programming IAP),简单的说就像是一个用户自定义的升级程序。实际上,STM32单片机的程序烧写有多种方法,可以用JTAG,也可用串口通过ISP软件烧写新程序。

JTAG的方式需要专用的烧写工具,在产品布置到现场后,更新产品程序比较麻烦,而通过串口的ISP软件升级方法可以直接使用常见的串口线升级程序,十分方便,这种方法用的是ISP。ISP可以说是单片机默认的bootloader,

正常情况下,单片机系统启动后,会直接从用户程序执行,而升级程序时,单片机会进入bootloader,在ISP中一直运行。ISP虽然方便了升级,但是还是没法解决用户自定义和远程升级的问题。对于用户来说,有时候可能需要在单片机

flash不同地址烧写多个应用程序,用于根据不同条件启动不同应用程序;有时候,产品分布到全国各地,去所有现场升级程序明显不理智,解决方法是将升级程序放到服务器上,发送远程升级指令,设备进入IAP升级程序,从远程

获取升级应用程序,实现在线升级。

二、IAP实现

1. 硬件

STM32单片机的启动方式有三种,


单片机根据boot0和boot1的引脚来确定启动方式。主闪存存储器即为用户程序空间,IAP启动将会从这里开始,系统存储器是ISP启动,内置SRAM不讨论。正常情况下,boot0管脚接入低电平,单片机从应用程序开始执行;当使用ISP升级时,boot0为1,boot1为0,系统进入ISP程序,等待串口升级,升级完成后,需要断电,改变boot电平,重新启动,让单片机从应用程序执行。(所以ISP升级时,还需要关注有关boot脚的电平开关问题。)

IAP升级不需要改变任何管脚电平,因为它实际上就是一个应用程序,只是让单片机启动时先执行它,执行完后,跳转到真正的应用程序执行。

注意:单片机第一次烧写时,是需要通过JTAG或ISP烧写IAP的,如果打算用ISP,那最好留一个boot脚的硬件拨码开关用于首次ISP升级hex文件。

2. 软件

弄清楚硬件之后,就知道什么样的硬件boot对应什么样的启动方式。加入IAP之后,系统启动时会先执行IAP程序用于判断是否达到升级条件和执行什么样的升级配置,相应的逻辑类似于下图:


用户可以根据自己的需求来设计IAP程序,详细设计可以参考ST官方资料:

《使用STM32F10xxx的USART 实现在应用中编程》,而且官方也给出了例程,资料比较全面,实现起来也很简单。

最后,提醒注意一点的是,在IAP后面的应用程序都要在系统启动时重新定义中断向量表。

本文转自:https://www.cnblogs.com/Victor-Tian/p/5958851.html

围观 140
订阅 RSS - STM32单片机