STM32单片机开发-01 STM32介绍

这篇具有很好参考价值的文章主要介绍了STM32单片机开发-01 STM32介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过野火开发板学习单片机

1.STM32介绍

1.1 STM32分类

从内核上分有Cortex-M0、M3、M4 和M7
F1 代表了基础型,基于Cortex-M3 内核,主频为72MHZ
F4 代表了高性能,基于Cortex-M4 内核,主频180M。

1.2 STM32命名

stm32 单片机,软件设计,单片机,stm32,嵌入式硬件
stm32 单片机,软件设计,单片机,stm32,嵌入式硬件

1.3 参考手册和数据手册

  • 数据手册:用于芯片选型和设计原理图
  • 参考手册:用于编程时查阅

stm32 单片机,软件设计,单片机,stm32,嵌入式硬件

1.4 STM32架构

  • Icode总线
    – 该总线讲M3内核的指令总线与闪存指令接口向量,完成指令预取
  • 4个驱动单元
    • Dcode总线
      • M3内核的Dcode总线与闪存的数据接口相连(完成常量加载和调用)
    • 系统总线(S-bus)
      • M3内核的系统总线到总线矩阵,总线矩阵协调内核和DMA的访问
    • 通用DMA1总线
      • DMA的AHB主控接口与总线矩阵相联
    • 通用DMA2
    • 以太网DMA(部分设备)
  • 4个被动单元
    • 内部SRAM
    • 内部FLASH
    • FSMC(灵活的静态存储器控制器,可以扩展内存如SRAM NORFLASH)
    • AHB到APB的桥,连接APB设备
  • 总线矩阵
    • 协调内核系统总线和DMA主控总线之间的访问和仲裁。
    • AHB外设通过总线矩阵与系统总线相连,允许DMA访问。
  • AHB/APB桥
    • 两个桥在AHB和APB之间提供同步连接。
    • APB1操作速度限于36MHz
    • APB2操作于全速,最高72MHz

在使用外设前,必须设置寄存器RCC_AHBENR

stm32 单片机,软件设计,单片机,stm32,嵌入式硬件

1.5 存储器映射

  1. 所有的被控单元FLASH、RAM、FSMC、AHB到APB的桥(片上外设)共同排列在一个4GB的地址空间,通过他们的地址来操作他们。

  2. 存储器本身不具有地址,是由芯片厂家或用户分配的,这个过程叫做存储器映射。

  3. 给存储器再分配一个地址叫做存储器重映射。

  4. 数据以小端格式存放在存储器中(最低地址在最低字节,最高地址在最高字节)

  5. 可访问的存储器空间背分成8个主要块,每个512MB。
    stm32 单片机,软件设计,单片机,stm32,嵌入式硬件

    • Block0:用来设计成内部的FLASH

      • ZET6 和VET6的FLASH都是512k,属于大容量,RCT6是256k
      • 存储了ST出厂时烧写的bootloader(自举程序,用户无法修改,可以通过串口下载)
      • 用户程序放在FLASH,即0x0800 0000 开始的512k空间。
        stm32 单片机,软件设计,单片机,stm32,嵌入式硬件
    • Block1:用来设计成内部的RAM

      • ZET6和VET6都是64KB
      • 默认地址为0x20000000
        stm32 单片机,软件设计,单片机,stm32,嵌入式硬件
    • Block2:用来设计成片上的外设

      • 根据总线速度不同,分为AHB、APB1和APB2
        stm32 单片机,软件设计,单片机,stm32,嵌入式硬件
  6. 寄存器映射

    • 以block2为例,设计的是片上外设,他们以4个字节为一个单位,共32bit,每个单元对应不同的功能,控制这些单元时就可以驱动外设工作。
    • 找到每个单元的起始地址,通过指针操作,来访问这些单元。给这个内存单元取个别名就叫寄存器映射。
    • 如GPIOB端口输出寄存器为ODR(地址0x40010C0C),32bit的低16bit有效,对应着16个外部IO,写0/1 对应的IO则输出低、高电平。
    • 通过寄存器的方式来访问,更容易记忆,不容易出错
		1 // GPIOB 端口全部输出高电平
		2 *(unsigned int*)(0x4001 0C0C) = 0xFFFF;
		1 // GPIOB 端口全部输出高电平
		2 #define GPIOB_ODR (unsigned int*)(GPIOB_BASE+0x0C)
		3 * GPIOB_ODR = 0xFF;

为了方便操作,可以直接把指针操作* 也定义到寄存器别名里

		1 // GPIOB 端口全部输出高电平
		2 #define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C)
		3 GPIOB_ODR = 0xFF;
  1. 片上外设地址映射
    • 不同总线挂载不同外设
    • APB1 挂载低速外设
    • APB2和AHB挂载高速外设
    • 对应总线最低地址称为基地址,也是挂载在该总线上的首个外设地址。
    • GPIO属于告诉外设,挂载到APB2总线上。
      stm32 单片机,软件设计,单片机,stm32,嵌入式硬件
      stm32 单片机,软件设计,单片机,stm32,嵌入式硬件
    • GPIOB为例介绍寄存器地址列表,每个GPIO都有这些寄存器,每个占4个字节 32bit
      stm32 单片机,软件设计,单片机,stm32,嵌入式硬件
      • 每个GPIO都有两个配置寄存器(GPIOx_CRL、GPIOx_CRH)
      • 两个32位数据寄存器(GPIOx_IDR、GPIOx_ODR)
      • 一个32位置位/复位寄存器(GPIOx_BSRR)
      • 一个16位复位寄存器(GPIOx_BRR)
      • 一个32位锁定寄存器(GPIOx_LCKR)
    • 每个GPIO可由寄存器配置位多种模式
      • 输入浮空
      • 输入上拉
      • 输入下拉
      • 模拟输入
      • 开漏输出
      • 推挽式输出
      • 推挽式复用功能
      • 开漏复用功能
        stm32 单片机,软件设计,单片机,stm32,嵌入式硬件
      • 设置清楚寄存器
        stm32 单片机,软件设计,单片机,stm32,嵌入式硬件
  1. GPIOx中的x都是从A-E
  2. 地址偏移:是相对于这个外设的基地址的偏移即GPIOA的外设基地址偏移就是0x40010800 + 0x10
  3. 寄存器位表,描述了每个bit的名称和权限以及对应的操作。y的取值是0-15,即对应GPIOA.1脚
  4. 注意对BRy写1:是清除,即设置低电平,写0无效
  5. 对BSy写1:是设置,即设置为高电平,写0无效
  1. 封装总线和外设基地址
    • 为了方便理解和记忆,把总线基地址和外设基地址都以相应的宏定义
1 /* 外设基地址*/
2 #define PERIPH_BASE ((unsigned int)0x40000000)
3
4 /* 总线基地址*/
5 #define APB1PERIPH_BASE PERIPH_BASE
6 #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
7 #define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000)
8
9
10 /* GPIO 外设基地址*/
11 #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
12 #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
13 #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
14 #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
15 #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
16 #define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
17 #define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
18
19
20 /* 寄存器基地址,以GPIOB 为例*/
21 #define GPIOB_CRL (GPIOB_BASE+0x00)
22 #define GPIOB_CRH (GPIOB_BASE+0x04)
23 #define GPIOB_IDR (GPIOB_BASE+0x08)
24 #define GPIOB_ODR (GPIOB_BASE+0x0C)
25 #define GPIOB_BSRR (GPIOB_BASE+0x10)
26 #define GPIOB_BRR (GPIOB_BASE+0x14)
27 #define GPIOB_LCKR (GPIOB_BASE+0x18)
  1. 首先定义片上外设基地址PERIPH_BASE
  2. 接着在此基础上,加入个总线低地址偏移,得到APB1、APB2总线低基地址
  3. 在其上再加上外设地址的偏移,得到GPIOA-G的外设地址
  4. 最后在外设地址上假如各寄存器的地址偏移,得到特定寄存器的地址。
    有了具体的地址,就可以使用指针读写该寄存器了。
1 /* 控制GPIOB 引脚0 输出低电平(BSRR 寄存器的BR0 置1) */
2 *(unsigned int *)GPIOB_BSRR = (0x01<<(16+0));
3
4 /* 控制GPIOB 引脚0 输出高电平(BSRR 寄存器的BS0 置1) */
5 *(unsigned int *)GPIOB_BSRR = 0x01<<0;
6
7 unsigned int temp;
8 /* 读取GPIOB 端口所有引脚的电平(读IDR 寄存器) */
9 temp = *(unsigned int *)GPIOB_IDR;
  1. 该代码使用(Unsigned int *)把GPIOB_BSRR宏的数值强制转换成了地址
  2. 再取* 并赋值,是对改地址的写操作。
  3. 读寄存器也是用取指针操作,把寄存器中的数据取到变量里,从而获取外设的状态。
  1. 封装寄存器列表
    • 如果对每个地址都进行定义,会显得分繁琐,可以使用结果提对一组GPIO进行封装
1 typedef unsigned int uint32_t; /* 无符号32 位变量*/
2 typedef unsigned short int uint16_t; /* 无符号16 位变量*/
3
4 /* GPIO 寄存器列表*/
5 typedef struct {
	6 uint32_t CRL; /*GPIO 端口配置低寄存器地址偏移: 0x00 */
	7 uint32_t CRH; /*GPIO 端口配置高寄存器地址偏移: 0x04 */
	8 uint32_t IDR; /*GPIO 数据输入寄存器地址偏移: 0x08 */
	9 uint32_t ODR; /*GPIO 数据输出寄存器地址偏移: 0x0C */
	10 uint32_t BSRR; /*GPIO 位设置/清除寄存器地址偏移: 0x10 */
	11 uint32_t BRR; /*GPIO 端口位清除寄存器地址偏移: 0x14 */
	12 uint16_t LCKR; /*GPIO 端口配置锁定寄存器地址偏移: 0x18 */
13 } GPIO_TypeDef;
  1. 使用GPIO_TypeDef结构体,其中的7个成员变量名就是对应的寄存器名称。
  2. 利用了C语言结构体内变量的存储空间是连续的,32位变量占4个字节,16位占2个字节
  3. 假如这个结构体首地址位0x40010C00,那么第二个成员变量就是+0x04
  4. 这样GPIO外设定义的寄存器地址就可以一一对应了,可以通过结构体的形式访问寄存器
    stm32 单片机,软件设计,单片机,stm32,嵌入式硬件
1 GPIO_TypeDef * GPIOx; //定义一个GPIO_TypeDef 型结构体指针GPIOx
2 GPIOx = GPIOB_BASE; //把指针地址设置为宏GPIOB_BASE 地址
3 GPIOx->IDR = 0xFFFF;
4 GPIOx->ODR = 0xFFFF;
5
6
7 uint32_t temp;
8 temp = GPIOx->IDR; //读取GPIOB_IDR 寄存器的值到变量temp 中
  1. 先用 GPIO_TypeDef 类型定义一个结构体指针,并将其指向GPIOB_BASE
  2. 可以使用->ODR来读写寄存器。
1 /* 使用GPIO_TypeDef 把地址强制转换成指针*/
2 #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
3 #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
4 #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
5 #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
6 #define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
7 #define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
8 #define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
9 #define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)
10
11
12
13 /* 使用定义好的宏直接访问*/
14 /* 访问GPIOB 端口的寄存器*/
15 GPIOB->BSRR = 0xFFFF; //通过指针访问并修改GPIOB_BSRR 寄存器
16 GPIOB->CRL = 0xFFFF; //修改GPIOB_CRL 寄存器
17 GPIOB->ODR =0xFFFF; //修改GPIOB_ODR 寄存器
18
19 uint32_t temp;
20 temp = GPIOB->IDR; //读取GPIOB_IDR 寄存器的值到变量temp 中
21
22 /* 访问GPIOA 端口的寄存器*/
23 GPIOA->BSRR = 0xFFFF;
24 GPIOA->CRL = 0xFFFF;
25 GPIOA->ODR =0xFFFF;
26
27 uint32_t temp;
28 temp = GPIOA->IDR; //读取GPIOA_IDR 寄存器的值到变量temp 中
  1. 我们可以直接使用宏定义好各端口的首地址
  2. 使用时直接用该宏访问寄存器即可。
  3. 这部分的工作都已经由固件库帮我们完成了
  1. 寄存器操作
    • 寄存器操作主要是修改寄存器的某几位,且要保持其他值不变
    • 利用C语言的位操作

例:假设a变量代表寄存器,假设已有数值,需要将其清零,其他位保持不变文章来源地址https://www.toymoban.com/news/detail-812968.html

1 //定义一个变量a = 1001 1111 b (二进制数)
2 unsigned char a = 0x9f;
3
4 //对bit2 清零
5
6 a &= ~(1<<2);
7
8 //括号中的1 左移两位,(1<<2) 得二进制数:0000 0100 b
9 //按位取反,~(1<<2) 得1111 1011 b
10 //假如a 中原来的值为二进制数: a = 1001 1111 b
11 //所得的数与a 作”位与&”运算,a = (1001 1111 b)&(1111 1011 b),
12 //经过运算后,a 的值a=1001 1011 b
13 // a 的bit2 位被被零,而其它位不变。
1 //若把a 中的二进制位分成2 个一组
2 //即bit0、bit1 为第0 组,bit2、bit3 为第1 组,
3 // bit4、bit5 为第2 组,bit6、bit7 为第3 组
4 //要对第1 组的bit2、bit3 清零
5
6 a &= ~(3<<2*1);
7
8 //括号中的3 左移两位,(3<<2*1) 得二进制数:0000 1100 b
9 //按位取反,~(3<<2*1) 得1111 0011 b
10 //假如a 中原来的值为二进制数: a = 1001 1111 b
11 //所得的数与a 作”位与&”运算,a = (1001 1111 b)&(1111 0011 b),
12 //经过运算后,a 的值a=1001 0011 b
13 // a 的第1 组的bit2、bit3 被清零,而其它位不变。
14
15 //上述(~(3<<2*1)) 中的(1) 即为组编号; 如清零第3 组bit6、bit7 此处应为3
16 //括号中的(2) 为每组的位数,每组有2 个二进制位; 若分成4 个一组,此处即为4
17 //括号中的(3) 是组内所有位都为1 时的值; 若分成4 个一组,此处即为二进制数“1111 b”
18
19 //例如对第2 组bit4、bit5 清零
20 a &= ~(3<<2*2);
    • 对变量的某几位进行赋值
    • 在上边清零操作之后,可以方便的对某几位写入所需要的数值
1 //a = 1000 0011 b
2 //此时对清零后的第2 组bit4、bit5 设置成二进制数“01 b ”
3
4 a |= (1<<2*2);
5 //a = 1001 0011 b,成功设置了第2 组的值,其它组不变
    • 对某个位进行取反操作,可以直接使用取反命令
1 //a = 1001 0011 b
2 //把bit6 取反,其它位不变
3
4 a ^=(1<<6);
5 //a = 1101 0011 b

到了这里,关于STM32单片机开发-01 STM32介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32系列单片机介绍

        stm32是基于ARM® Cortex®  内核的 32位微控制器和微处理器。常见的内核有:     Cortex-M0,代表型号STM32F0、STM32L0;     Cortex-M0+,代表型号STM32C0(23年新推出,主要针对低成本);     Cortex-M3,代表型号STM32F1、STM32F2、STM32L1;     Cortex-M4,代表型号STM32F3(混合信号)、

    2024年02月06日
    浏览(56)
  • 单片机简介(STM32介绍)

        单片机是 单片微型计算机 的简称,Mcu是Microcontroller的简称,也就是嵌入式微控制器。采用集成电路技术将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、定时器/计时器、多种I/O口和中断系统等功能集成到一块硅片上。可以说单片机就是一个小而完善

    2024年02月16日
    浏览(41)
  • STM32单片机IAP介绍

    1、什么是IAP? 首先区分下两个概念:ISP和IAP:         ISP:In System Programming (在系统中编程),通过芯片专用的串行编程接口对其内部的程序存储器进行擦写。         IAP:In Application Programming( 在应用中编程),通过调用特定的bootloader程序,对程序存储器的指定段

    2024年02月16日
    浏览(43)
  • STM32单片机初学4-IIC通信(软件模拟)

    IIC ( Inter-Integrated Circuit )又称I2C(习惯读“I方C”),是 IIC Bus简称,中文名为 集成电路总线 ,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。适用于IC间的短距离数据传输。 最初的IIC通信速

    2024年02月05日
    浏览(75)
  • STM32+ESP-01s+EMQX实现单片机MQTT协议传输数据上云(二)STM32F103与ESP-01s的Usart通信,实现STM32连接上网上云

    单片机:STM32F103c8t6 WiFi模块:ESP8266-01s EMQX:自身服务器上搭载emq服务器或者借用emqx window 版本  USB TO TTL模块:CH340 因为CH340不能给ESP-01s供3.3V的电,所以测试时需要外加供电           本章中涉及到的技术原理主要为ESP01S wfi模块的AT指令通信,我在上一篇文章给大家提到了

    2024年02月16日
    浏览(56)
  • mac 可以进行单片机(stm32)的开发吗?

    当涉及到在Mac上进行单片机开发时,是完全可行的。以下是为什么Mac适合单片机开发的解释: 开发工具:针对STM32单片机,你可以使用多种开发工具。一个常用的选择是Segger Embedded Studio,它是一个功能强大的集成开发环境(IDE),适用于Mac平台。你可以在这个环境中编写、编

    2024年02月12日
    浏览(40)
  • GC9A01-TFT屏幕驱动(整理有stm32/51单片机/arduino等驱动代码)

           不久前我们收到用户反馈问题中,多次反馈各种不同型号的屏幕驱动不起来,从0开始编写代码花费大量时间,也有不少初次学习驱动屏幕代码编写经验过少等问题,为此我们决定以文章的形式发布到CSDN来分享相应的一些经验以及收集整理好的资料,希望可以帮助用

    2024年01月25日
    浏览(44)
  • 在STM32上实现一个数据采集和存储系统(单片机软件与硬件)

    1. 硬件选择: 选择合适的STM32系列微控制器,根据采集数据的要求选择处理器型号和性能。同时,根据需要考虑外设模块,如ADC、SPI、I2C等。 2. 连接传感器: 根据需要选择合适的传感器,并将传感器与STM32的相应引脚连接。注意检查引脚的电平和电流要求,确保接口匹配。

    2024年02月03日
    浏览(54)
  • K_A23_001 基于STM32等单片机AT指令驱动ESP-01/ESP-01S实现手机遥控点灯

    其他资料目录 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M ESP-01/ESP-01S模块 STC89C52RC驱动ESP-01/ESP-01S模块 实现手机遥控点灯 STM32F103C8T6(标准库) 晶振8M/系统时钟72M ESP-01/ESP-01S模块 STM32F103C8T6驱动ESP-01/ESP-01S模块 实现手机遥控点灯 ESP-01/ESP-01S模块 引脚

    2024年01月21日
    浏览(41)
  • 使用vscode + gcc进行 STM32 单片机开发(一)编译及调试

    众所周知,单片机MCU的开发通常是使用keil来进行的,但是keil作为一款有几十年历史的IDE,bug层出不穷,界面也越来越丑,加上使用盗版jlink,导致keil各种崩溃卡死。 故越来越多的单片机IDE也如雨后春笋般冒出,例如 st官方出版的st studio、rt-thread出版的rt-studio,至于好不好用

    2023年04月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包