重映射
stm32中对于一些端口的外设已经被其他引脚所使用,这是就需要用端口重映射来解决了,很方便。
以USART1为例
重映射的步骤为:
打开重映射时钟和USART重映射后的I/O口引脚时钟,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
I/O口重映射开启.
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
配制重映射引脚, 这里只需配置重映射后的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
分析:
当然存在下面的宏定义:
#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之重映射与地址映射
推荐阅读最新更新时间: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.全双工: 允许数据同时在两个方向上传输,因此,全双工通信是两个
[单片机]
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振荡
[单片机]
为什么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开始的内容重映射
[单片机]
读取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、什么是
[单片机]
uclinux下stm32开发环境搭建
什么是uclinux uclinux表示micro-control linux.即“微控制器领域中的Linux系统”,是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit)的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。由于没有MMU,其多任务的实现需要一定技巧。 uClinux是嵌入式Linux领域非常重要的分支,已成功应用于路由器、机顶盒、PDA等领域,与标准Linux在内存管理方面有着本质的区别。 uCLinux是一种优秀的嵌入式Linux版本,是micro-Controll
[单片机]