STM32IO及定时器映射到地址

发布者:hzx312895379最新更新时间:2018-09-22 来源: eefocus关键字:STM32  定时器映射  地址 手机看文章 扫描二维码
随时随地手机看文章

意义:    有时候我们在操作多个STM32 IO 时,硬件设计未必有规律,比如输出引脚是:PB3,PC4,PC5,PD0,但是操作这些引脚具有共性,或者说我们想用 for(it i = 0; i < 4; i++) 像操作数组一样操作这些引脚,程序将变得非常简洁,这时候把 IO 映射到地址就可以实现该目的。

方法: 

1.//位带操作,实现51类似的GPIO控制功能

//具体实现思想,参考《CM3权威指南》第五章(87~92页),M4同M3类似,只是寄存器地址变了

//IO口操作宏定义

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 

//IO口地址映射

#define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014

#define GPIOB_ODR_Addr    (GPIOB_BASE+20) //0x40020414 

#define GPIOC_ODR_Addr    (GPIOC_BASE+20) //0x40020814 

#define GPIOD_ODR_Addr    (GPIOD_BASE+20) //0x40020C14 

#define GPIOE_ODR_Addr    (GPIOE_BASE+20) //0x40021014 

#define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414    

#define GPIOG_ODR_Addr    (GPIOG_BASE+20) //0x40021814   

#define GPIOH_ODR_Addr    (GPIOH_BASE+20) //0x40021C14    

#define GPIOI_ODR_Addr    (GPIOI_BASE+20) //0x40022014     

#define GPIOA_IDR_Addr    (GPIOA_BASE+16) //0x40020010 

#define GPIOB_IDR_Addr    (GPIOB_BASE+16) //0x40020410 

#define GPIOC_IDR_Addr    (GPIOC_BASE+16) //0x40020810 

#define GPIOD_IDR_Addr    (GPIOD_BASE+16) //0x40020C10 

#define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010 

#define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410 

#define GPIOG_IDR_Addr    (GPIOG_BASE+16) //0x40021810 

#define GPIOH_IDR_Addr    (GPIOH_BASE+16) //0x40021C10 

#define GPIOI_IDR_Addr    (GPIOI_BASE+16) //0x40022010 

 

2. 输出:u32  val = BITBAND(GPIOB_ODR_Addr, 3);   把val打印出来即可(输入是:GPIOB_IDR_Addr)

PB3,PC4,PC5,PD0依次对应:0x4240828c、0x42410290、0x42410294、0x42418280

3. 操作:

   uint32_t  PinTest[4] = {0x4240828c, 0x42410290, 0x42410294, 0x42418280};

   *((vu32 *)(PinTest[idx])) = 1;       *((vu32 *)(PinTest[idx])) = 0;

4. 输入操作类似

5. 定时器相关:

   u32 val =  (u32)&(TIM3->CCR3);     // TIM_Pluse

   u32 val =  (u32)&(TIM3->ARR);       // TIM_Period


关键字:STM32  定时器映射  地址 引用地址:STM32IO及定时器映射到地址

上一篇:STM32 24C02函数 I2C例程 非STM32库方式
下一篇:STM32的定时器(含中断)配置样例

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

gec210 i2c程序io模拟方式实现
开发环境:ubuntu arm-linux-gcc4.4.1 开发板: GEC210开发板 原理图 i2c芯片:FM24CL04 与cpu的连接,GPD1的0,1号引脚。0号引脚对应SDA功能,1号引脚对应SCL引脚 实现: io方式模拟i2c通信,没有使用i2c控制器 需要使用io引脚输出高低电平模拟i2c信号 或者需要改变为输入模式服务数据 //宏定义 #define GPD1DAT (*(volatile unsigned long*)0xe02000c4) #define GPD1CON (*(volatile unsigned long*)0xe02000c0) #def
[单片机]
STM32时钟配置及相关问题
Ⅰ、写在前面 最近有很多朋友问: 1.我的USART串口打印出来的数据是乱码? 2.我的TIM定时器延时或定时不准确? 常见可能原因: 1.晶振问题:外部晶振不起振、或频率与配置不匹配。 2.软件问题:分频、倍频、时钟源选择等。 总结来说,主要还在于软件的问题。因为即使没有外部晶振,也可以使用内部晶振。 其实,软件的问题是容易得到解决的,只要你了解了STM32时钟配置里面具体内容就知道了。 关于本文的详细内容请看下面章节 Ⅱ、本文要点 要了解时钟的配置,就需要知道它在哪里配置,也就是还需要了解软件执行的流程。 1.软件流程 说软件流程是让大家知道系统时钟配置的位置。不管是使用寄存器开发,还是使用库(标准库、
[单片机]
<font color='red'>STM32</font>时钟配置及相关问题
STM32之PWM波形输出配置总结
一. TIMER分类: STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。 定时器 计数器分辨率 计数器类型 预分频系数 产生DMA请求 捕获/比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 TIM4 TIM5 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 没有 TIM6 TI
[单片机]
<font color='red'>STM32</font>之PWM波形输出配置总结
HAL库的官方历程
需求: 我们以前用标准库的时候是一个压缩包,然后压缩包中有官方的历程,我们使用片上资源的时候会去参考查询,但是ST推出HAL库之后搭配的是STM32CubMX自动生成的,我们也需要参考官方历程,这时候就需要HAL库的官方历程。 路径: 1.打开STM32CubeMX,然后电机Help下的Updater Settings 2.找到如下路径: 3.然后顺着刚刚路径后面继续打开如下路径:STM32Cube_FW_G0_V1.2.0ProjectsNUCLEOG070RBExamplesPWRPWR_STANDBY
[单片机]
HAL库的官方历程
STM32用中断控制LED小灯的亮灭
STM32f103最小系统板 PC13 接一个LED小灯 首先配置LED灯 void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //初始化PC13为推挽式输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_
[单片机]
STM32产生异相方波
这几天一直在做蓝桥杯嵌入式开发历年的题目 在第七届决赛的模拟题中 有一个要求PA6和PA7产生两个异相并且频率可调的方波 后来我研究了一下STM32的Output comare mode, 因为要调节频率 所以选择了toggle 模式 使方波产生异相在中断中设置就行 先上手册的图 那 这是张老图了 在来看一下 官方StdLib3.5的OCToggle模式下的中断函数 void TIM1_BRK_TIM9_IRQHandler(void) { /* TIM9_CH1 toggling with frequency = 366.2 Hz */ if (TIM_GetITStatus(TIM9, TIM_IT_
[单片机]
<font color='red'>STM32</font>产生异相方波
STM32定时器学习笔记
TIMx是由16位计数器,预分频器,自动装载寄存器构成 计数器:16位(0-65535) 预分频器16位(寄存器控制的计数器) 预分频为1是每一个时间脉冲计数器加1,预分频为2每两个时间脉冲计1. 自动装载寄存器:每次溢出事件的自动装载设置的计数值。 深度剖析:、 计数器的范围(0-65535) 预分频器的范围(0-65535) 由于STM32F103最大支持的频率是72Mhz,所以设置的时候应该注意二者之间的,一般自动装载计数器设置较大若设置10000-1,将预分频书设置为72-1,可以实现1s的计时。可以理解为每72个时钟脉冲计数器加1,计数器加到10000-1的时候定时器产生一次溢出事件。
[单片机]
stc单片机IO口输入输出方式
个人感触: 我只想说,有些话,第一遍看根本不知道是什么意思或者记不得, 但是自己在项目中遇到这个问题困扰很久之后,再回来重新看到这句话,就会醍醐灌顶。 最近编PCA9306的驱动,遇到的问题就是片子只能读奇数地址,不能读偶数地址的寄存器,后来采用的办法是写完地址之后,SDIO强制拉高(因为9306的SPI数据线是SDIO双向的,只有1根) 当时不明白为什么,现在回头来看到这篇文章,终于懂了。 以下是转载的正文: 传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路。 灌电流方式:LED正极接VCC,负极接IO口。IO为高电平是LED两极电平相同,没有电
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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