STM32F103ZET6学习之存储器映射

本文为《零死角玩转 STM32F103—霸道》书籍的知识提取和整理,仅为学习之用。

存储器映射

  存储器本身不具有地址信息,它的地址由厂商或用户分配,给已经分配好地址的有特定功能的内存单元取别名的过程称为存储器映射,再分配一地址称为存储器重映射。
  在8个Block里面,3个块非常重要。Block0用来设计成内部FLASH,Block1用来设计成内部的RAM,Block2用来设计成片上的外设。
在这里插入图片描述

存储器Block0内部区域功能划分

  Block0主要设计片内的FLASH。
在这里插入图片描述

存储器Block1内部区域功能划分

 Block1主要设计片内的SRAM。
在这里插入图片描述

存储器Block2内部区域功能划分

 Block2主要设计片内的外设,根据外设的总线速度不同,Block被分为了APB和AHB两部分,其中APB又被分为APB1和APB2。
在这里插入图片描述

使用C语言进行寄存器简化使用操作(以GPIOB为例)

1.封装总线和外设基地址

/*外设基地址*/
#define PERIPH_BASE ((unsigned int) 0x40000000)
/*总线基地址*/
#define APB1PERIPH_BASE    PERIPH_BASE 
#define APB2PERIPH_BASE    (PERIPH_BASE + 0x00010000)
/*GPIO外设基地址*/
#define GPIOB_BASE  (APB2PERIPH_BASE + 0x0C00)
/*寄存器基地址,以GPIOB为例*/
#define GPIOB_CRL   (GPIOB_BASE + 0x00)
#define GPIOB_CRH   (GPIOB_BASE + 0x04)
#define GPIOB_IDR   (GPIOB_BASE + 0x08)
#define GPIOB_ODR   (GPIOB_BASE + 0x0C)
#define GPIOB_BSRR  (GPIOB_BASE + 0x10)
#define GPIOB_BRR   (GPIOB_BASE + 0x14)
#define GPIOB_LCKR  (GPIOB_BASE + 0x18)
/*对单个寄存器进行操作,如GPIOB_BSRR*/
*(unsigned int *)GPIOB_BSRR = (0x01<<(16+0));  /*将第0位输出低电平*/

2.封装寄存器列表
由于GPIOA~GPIOE都各有一组功能相同的寄存器,
只是地址不一样,可以将上述通过基地址用结构体整合起来。

/*使用结构体对GPIO寄存器组的封装*/
typedef unsigned       int uint32_t; /*无符号32位变量*/
typedef unsigned short int uint16_t; /*无符号16位变量*/
/*GPIO寄存器列表*/
typedef struct{         
/*因为C语言语法规定,结构体变量的存储空间是连续的,其中32位占4个字节,
  GPIO寄存器列表的个寄存器也是连续的,所以可以如下编写*/
    uint32_t CRL;
    uint32_t CRH;
    uint32_t IDR;
    uint32_t ODR;
    uint32_t BSRR;
    uint32_t BRR;
    uint32_t LCKR;
}GPIO_TypeDef;

3.通过结构体指针访问寄存器

GPIO_TypeDef * GPIOx;        /*定义一个GPIO_TypeDef型结构体GPIOx*/
GPIOx = GPIOB_BASE;          /*把指针地址设置为宏GPIOB_BASE地址*/
GPIOx->IDR = 0xFFFF;         /*设置GPIOB寄存器列表中的IDR寄存器*/
uint32_t temp = GPIOx->IDR; /*读取GPIOB寄存器列表中IDR寄存器的值*/
/*再合并结构体指针*/
#define GPIOB   ((GPIO_TypeDef *) GPIOB_BASE)
GPIOB->IDR = 0xFFFF;        /*设置GPIOB寄存器列表中的IDR寄存器*/
uint32_t temp = GPIOB->IDR; /*读取GPIOB寄存器列表中IDR寄存器的值*/

STM32学习文章汇总

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103ZET6是STMicroelectronics(意法半导体)推出的一款高性能的32位ARM Cortex-M3内核微控制器。DDS是指直接数字频率合成器(Direct Digital Synthesis),是一种通过数字方式生成高精度、高稳定度的频率信号的技术。 为了驱动STM32F103ZET6实现DDS功能,首先需要了解该芯片的硬件资源和寄存器配置。 在STM32F103ZET6中,主要用到的硬件资源包括定时器(Timers)和数字模拟转换器(DAC)。定时器用于产生时钟信号,DAC用于输出频率合成后的模拟信号。 首先,需要配置定时器,选择合适的时钟源和频率分频系数,以及定时器的工作模式和计数器值。然后,配置DAC,选择合适的引脚和输出模式,设置DAC的数据对齐方式和数据大小等参数。通过设置定时器和DAC的参数,可以实现相应的DDS功能。 接下来,需要编写相应的程序代码,通过控制寄存器设置生成的频率,可以通过修改周期寄存器(Period Register)或比较寄存器(Compare Register)的值来调整频率的输出。 在程序中,还需要根据具体的需求编写相应的控制逻辑,如选择不同的波形类型(正弦、方波、三角波等)、设置幅度和相位等参数。 最后,将程序烧录到STM32F103ZET6的Flash存储器中,通过调试工具或外设进行调试和测试,确保DDS功能正常。 需要注意的是,在编写程序代码时,需要熟悉STM32F103ZET6的寄存器映射和编程接口,可以参考STMicroelectronics提供的官方文档和开发工具。 综上所述,STM32F103ZET6的DDS驱动需要配置定时器和DAC,编写程序代码进行频率设置和控制逻辑编写,并进行调试和测试,以实现DDS功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值