stm32之重映射与地址映射

发布者:美好的人生最新更新时间:2017-09-06 来源: eefocus关键字:stm32  重映射  地址映射 手机看文章 扫描二维码
随时随地手机看文章

重映射

stm32中对于一些端口的外设已经被其他引脚所使用,这是就需要用端口重映射来解决了,很方便。

以USART1为例 
这里写图片描述

重映射的步骤为:

  1. 打开重映射时钟和USART重映射后的I/O口引脚时钟, 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

  2. I/O口重映射开启. 
    GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

  3. 配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置.

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOB,&GPIO_InitStructure);12345678

这样就可以了,很简单。

地址映射

对于地址映射是在查重映射时发现的,感觉ST的库很机智,就记录下来。

首先看一下M3 存储器映射

这里写图片描述

我们的操作就在这512MB的地址进行。

在LED灯的程序中,存在宏定义:

#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)#define PERIPH_BASE ((uint32_t)0x40000000)123

分析:

  • PERIPH_BASE 外设基地址:因为stm32是32位的,宏展开为0x40000000并转化为 uint32_t

  • APB2PERIPH_BASE 总线基地址:宏展开为PERIPH_BASE加上偏移地址 0x10000

当然存在下面的宏定义:

 #define APB1PERIPH_BASE PERIPH_BASE
 #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
 #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
 #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
 #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)12345

而对于寄存器中

这里写图片描述

地址为: GPIOC_BASE +0x04

我想可能会存在 
#define GPIOC_CRH (GPIOC_BASE + 0x04)

但ST库采用了更加巧妙的方法:

stm32f10x.h中:

 #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
 #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
 #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)123

而GPIO_TypeDef 的定义:

 typedef struct
 {
 __IO uint32_t CRL;
 __IO uint32_t CRH;
 __IO uint32_t IDR;
 __IO uint32_t ODR;
 __IO uint32_t BSRR;
 __IO uint32_t BRR;
 __IO uint32_t LCKR;
 } GPIO_TypeDef;12345678910

通过结构体非常机智的定义了。

引用一张图来说明:

这里写图片描述

这样当我们想进行地址映射时,只需要这样定义:

 GPIO_TypeDef * GPIOx; //定义一个 GPIO_TypeDef 型结构体指针 GPIOx
 GPIOx = GPIOA; //把指针地址设置为宏 GPIOA 地址
 GPIOx->CRL = 0xffffffff; //通过指针访问并修改 GPIOA_CRL 寄存器123

非常方便,巧妙。


关键字:stm32  重映射  地址映射 引用地址:stm32之重映射与地址映射

上一篇:简谈stm32的地址映射
下一篇:STM32-库开发-地址映射

推荐阅读最新更新时间:2024-03-16 15:36

STM32 对内部FLASH读写接口函数
因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序。 原理:先要把整页FLASH的内容搬到RAM中,然后在RAM中改动,然后擦除整页FLASH,再把改动后的内容写入原Flash页。下面程序调试通过。 /******************************************************************************* * Function Name : I2C_EE_BufferRead * Description : Reads a block of data from the
[单片机]
STM32学习笔记-RCC
调试芯片:STM32F103CBT6 外部晶振:4MHz 初次学习ST须知: STM芯片的所有片上外设都需要手动设置时钟 概念: 三种不同的时钟源可被用来驱动系统时钟(SYSCLK): HSI振荡器时钟:由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差。(所以通常不用与提供SYSCLK) HSE振荡器时钟:高速外部时钟信号,由HSE外部晶体/陶瓷谐振器(较常用)或者HSE用户外部时钟两种方式产生 PLL时钟:时钟源输入,内部PLL可以用来倍频HSI RC的输出时
[单片机]
STM32进阶-串口及蓝牙通信 控制开发板硬件详细步骤-USART1/2
处理器与外部通信概述 串行通信 -传输原理:数据按位顺序传输。 -优点:占用引脚资源少 -缺点:速度相对较慢 并行通信 -传输原理:数据各个位同时传输。 -优点:速度快 -缺点:占用引脚资源多 串口作为 MCU 的重要外部接口,基本上所有的 MCU 都会带有串口。而STM32F407ZET6 最多可提供 6 路串口。 通信按传输方向以下几种方式: a.单工: 数据传输只支持数据在一个方向上传输(收音机、遥控器) b.半双工: 允许数据在两个方向上传输,但是,在某一时刻,只允许数 据在一个方向上传输,它实际上是一种切换方向的单工通信;(对讲机) c.全双工: 允许数据同时在两个方向上传输,因此,全双工通信是两个
[单片机]
<font color='red'>STM32</font>进阶-串口及蓝牙通信 控制开发板硬件详细步骤-USART1/2
STM32时钟系统概述
STM32时钟框图如下: 重要的时钟: 1、HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率) 精度较差 2、HSE:高速外部时钟信号 精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟 3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时钟使用 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。   ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。   ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。   ③、LSI是低速内部时钟,RC振荡
[单片机]
<font color='red'>STM32</font>时钟系统概述
为什么STM32的Flash地址要设置到0x08000000
我们言简意赅的普及下这个知识点,争取让大家不伤脑细胞 一、背景知识: M3,M4内核芯片上电复位后,要固定从0x0000 0000地址读取中断向量表,获取复位中断服务程序的入口地址后,进入复位中断服务程序,其中0x0000 0000是栈顶地址,0x0000 0004存的是复位中断服务程序地址。 ARM官方回复: Documentation – Arm Developer 二、引出问题: 既然ARM规定了M3,M4内核要从地址0x0000 0000读取中断向量表,而STM32设置Flash地址到0x0800 0000怎么办? STM32支持了个内存重映射功能,将地址0x0800 0000开始的内容重映射
[单片机]
为什么<font color='red'>STM32</font>的Flash<font color='red'>地址</font>要设置到0x08000000
读取stm32 产品的唯一身份的寄存器
读取stm32 产品的唯一身份的寄存器 voidGet_ChipID(void) { uint32_t temp0,temp1,temp2; temp0 = *(__IO uint32_t*)(0x1FFF7A10); temp1 = *(__IO uint32_t*)(0x1FFF7A14); temp2 = *(__IO uint32_t*)(0x1FFF7A18); // temp0=(*( uint32_t *)0x1FFF7A10); //产品唯一身份标识寄存器(96位) // temp1=(*( uint32_t *)0x1FFF7A14); // temp2=(*( ui
[单片机]
STM32之timer1产生PWM(互补通道)
一、简介 本文介绍STM32系列如何使用timer1的第TIM1_CH2N通道(PB14)产生PWM。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK 三、版权声明 四、实验前提 1、在进行本文步骤前,请先阅读以下博文: 1)《STM32之timer3产生PWM》:http://blog.csdn.net/feilusia/article/details/53634882 2、在进行本文步骤前,请先实现以下博文: 暂无 五、基础知识 1、什么是
[单片机]
<font color='red'>STM32</font>之timer1产生PWM(互补通道)
uclinux下stm32开发环境搭建
  什么是uclinux   uclinux表示micro-control linux.即“微控制器领域中的Linux系统”,是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit)的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。由于没有MMU,其多任务的实现需要一定技巧。   uClinux是嵌入式Linux领域非常重要的分支,已成功应用于路由器、机顶盒、PDA等领域,与标准Linux在内存管理方面有着本质的区别。   uCLinux是一种优秀的嵌入式Linux版本,是micro-Controll
[单片机]
uclinux下<font color='red'>stm32</font>开发环境搭建
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved