嵌入式-stm32学习:位带操作

发布者:古泉痴迷者最新更新时间:2019-06-21 来源: eefocus关键字:stm32  位带操作  GPIO 手机看文章 扫描二维码
随时随地手机看文章

// GPIO 位操作

#include "stm32f4xx.h"


// 这里只定义了GPIO ODR和IDR这两个寄存器的位带别名区地址,其他寄存器没有定义


//SRAM 位带区:     0X2000 0000~0X200F 0000

//SRAM 位带别名区:    0X2200 0000~0X23FF FFFF


//外设位带区:        0X4000 0000~0X400F FFFF

//外设位带别名区:      0X4200 0000~0X43FF FFFF


// 把“位带地址+位序号”转换成别名地址的宏

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x000FFFFF)<<5)+(bitnum<<2)) 


// 把一个地址转换成一个指针

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))


// 把位带别名区地址转换成指针

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 



// GPIO ODR 和 IDR 寄存器地址映射 

#define GPIOA_ODR_Addr    (GPIOA_BASE+20) 

#define GPIOB_ODR_Addr    (GPIOB_BASE+20)   

#define GPIOC_ODR_Addr    (GPIOC_BASE+20)  

#define GPIOD_ODR_Addr    (GPIOD_BASE+20) 

#define GPIOE_ODR_Addr    (GPIOE_BASE+20) 

#define GPIOF_ODR_Addr    (GPIOF_BASE+20)      

#define GPIOG_ODR_Addr    (GPIOG_BASE+20)

#define GPIOH_ODR_Addr    (GPIOH_BASE+20)      

#define GPIOI_ODR_Addr    (GPIOI_BASE+20)

#define GPIOJ_ODR_Addr    (GPIOJ_BASE+20)      

#define GPIOK_ODR_Addr    (GPIOK_BASE+20)


#define GPIOA_IDR_Addr    (GPIOA_BASE+16)  

#define GPIOB_IDR_Addr    (GPIOB_BASE+16)  

#define GPIOC_IDR_Addr    (GPIOC_BASE+16)   

#define GPIOD_IDR_Addr    (GPIOD_BASE+16)  

#define GPIOE_IDR_Addr    (GPIOE_BASE+16)    

#define GPIOF_IDR_Addr    (GPIOF_BASE+16)    

#define GPIOG_IDR_Addr    (GPIOG_BASE+16)  

#define GPIOH_IDR_Addr    (GPIOH_BASE+16)

#define GPIOI_IDR_Addr    (GPIOI_BASE+16)

#define GPIOJ_IDR_Addr    (GPIOJ_BASE+16)

#define GPIOK_IDR_Addr    (GPIOK_BASE+16)



// 单独操作GPIO的某一个IO口,(n=0,...15)

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 

#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入


#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  

#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  


#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  

#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  


#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  

#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  


#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  

#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  


#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  

#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  


#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  

#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  


#define PHout(n)   BIT_ADDR(GPIOH_ODR_Addr,n)   

#define PHin(n)    BIT_ADDR(GPIOH_IDR_Addr,n)  


#define PIout(n)   BIT_ADDR(GPIOI_ODR_Addr,n)  

#define PIin(n)    BIT_ADDR(GPIOI_IDR_Addr,n)  


#define PJout(n)   BIT_ADDR(GPIOJ_ODR_Addr,n)  

#define PJin(n)    BIT_ADDR(GPIOJ_IDR_Addr,n)  


#define PKout(n)   BIT_ADDR(GPIOK_ODR_Addr,n)  

#define PKin(n)    BIT_ADDR(GPIOK_IDR_Addr,n)  


void LED_GPIO_Config(void);

void SOFT_Delay(__IO uint32_t nCount);



int main(void)

{

    /* LED 端口初始化 */

    LED_GPIO_Config();


    while (1)

    {

        // PH10 = 0,点亮LED

        PHout(10)= 0;       

        SOFT_Delay(0x0FFFFF);


        // PH10 = 1,熄灭LED       

        PHout(10)= 1;

        SOFT_Delay(0x0FFFFF);       

    }


}


/*

 * 初始化LED用到的IO口

 * /

void LED_GPIO_Config(void)

{       

        GPIO_InitTypeDef GPIO_InitStructure;


        RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOH, ENABLE); 


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  


        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;


    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;


      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;


        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 


        GPIO_Init(GPIOH, &GPIO_InitStructure);        


        GPIO_SetBits(GPIOH, GPIO_Pin_10);           

}


// 简单的延时函数

void SOFT_Delay(__IO uint32_t nCount)   

{

    for(; nCount != 0; nCount--);

}


/*********************************************END OF FILE**********************/



关键字:stm32  位带操作  GPIO 引用地址:嵌入式-stm32学习:位带操作

上一篇:嵌入式stm32学习:外部中断
下一篇:嵌入式-stm32学习:按键检测

推荐阅读最新更新时间:2024-11-05 16:31

集成电机驱动方案(STM32+DRV8841)
以前的博客中介绍过一款分立元器件实现的H桥的博文,现在提供一个更简单的单芯片方案。 驱动电路主要由一款DRV8841芯片组成,它是一个集成的电机驱动解决方案,内置两个功率NMOS H桥,可通过PWM驱动两个直流电机,或者一个步进电机。它还集成了电流感知、调节电路与保护装置,支持过热、过电流与欠压保护,并且自带最大3.75us的死区。电机电压支持8.2V到45V,最大电流为2.5A。 主要的原理图如下 我使用的控制芯片是STM32F405RGT6,引脚连接关系如下 网络标号 引脚 功能 备注 MAP PC6 桥A输入1 MAOP的控制端,内部下拉,与单片机T8C1连接(Timer8的通道1)。 MAN PC7 桥A输入
[单片机]
集成电机驱动方案(STM32+DRV8841)
stm32模拟输出PPM信号
PPM信号周期为20ms,分成10分代表10个通道信号,也就是2ms代表一个信号。 0.5ms代表一个通道信号的开始,所以0.5ms-2ms为通道范围控制。 LED p1('A',8); //IO口初始化,这里就不介绍了,推挽输出 u16 count=0; u16 pwm_count=1000; //总计数 周期20ms,20us进次 u16 pwm1=25; //0.5ms u16 pwm2=30; u16 pwm3=40; u16 pwm4=50; u16 pwm5=75; u16 pwm6=75; u16 pwm7=75; u16 pwm8=75; //2ms //u16 pwm9
[单片机]
利用Proteus仿真STM32实现按键控制LED灯设计
Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DSPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译器。 这篇文章介绍Proteus的下载,安装,建立工程,完成仿真运行。 下载地址: https://pan.baidu.
[单片机]
利用Proteus仿真<font color='red'>STM32</font>实现按键控制LED灯设计
STM32F103--(二) GPIO实践
硬件检测的工作很快完成了。接下来是开始调试一些程序了,对于调试一个新的MCU来说,最简单的也是最重要的自然是能够控制GPIO了。 为了对MCU有个直观的了解,这里给出模块框图 1、GPIO模式的相关介绍: STM32的所有GPIO都可以设置成8中模式,主要的设置可以参考固件库的typedefine /* Configuration Mode enumeration --------------------------------------------*/ typedef enum { GPIO_Mode_AIN = 0x0,//AD输入模式 GPIO_Mode_IN_FLOATING = 0x04,//普通输
[单片机]
STM32 uCOS_II 实践 之 消息对列
首先消息队列类似与计数信号量,可以对异步事件进行保存,但是计数信号量保存的是状态量,他只是在一个变量里进行状态触发数目的累加,而消息队列可以把发送来的数据进行保存,同时消息队列同消息邮箱有相同的属性,它本身并不传送数据,只是传递内存中已有数据的地址值即数据指针,这就带来了一个关键特性就是被传递的每一个数据都是要有独立地址的,不然没有被处理的数据就会被新数据给覆盖掉,造成了数据的丢失。 对于消息队列,需要创建一个队列,这个队列有先入先出的特性即FIFO,所以一旦数据被使用在队列里这个数据就不再出现了,他最终会被新的数据覆盖掉。 如上面介绍,消息队列里所有的数据都以数据指针的形式在一个列表里排队,这个指针的形式可以是多样的,可以是一个
[单片机]
STM32自带的CRC32软件计算
看了很多朋友贴出了CRC的计算代码,还是不明白CRC怎么算,这不重要了,可用就行。在此帖上码表和查表法,代码经过验证,和STM32的CRC结果一致,以后要用到CRC32时就到此贴来找。 uint32 Crc32Table = { 0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9,0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005, 0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61,0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD, 0x4C11DB70,0x48D0C6C7,0x459
[单片机]
STM32定时器的编码器模式
/pre pre name= code class= objc /pre pre name= code class= objc /********************************************************************************** * @file: stm32定时器的编码器模式 * @date: 2015.8.2 * @author: shenhuixiang * @version: 1.0.0 **********************************************************************************
[单片机]
基于CORTEX的STM32的三相电能表方案
背景   电能表是用来测量电能的仪表,又称电度表,火表,电能表,千瓦小时表,指测量各种电学量的仪表。基于ARM的方案已经出现,但是适合应用的ARM7 TDMI在性能上不尽人意,同时外设资源不足;而更高端的ARM9系统的复杂程度很高,成本也较高。所以要研究一种廉价的,满足客户需求的电能表,来填补这个空缺。   一、关于CORTEX-M3与STM32   最新一代ARM v7内核,命名为Cortex,同ARM7/9/10/11相比在架构上有了革命性突破。它采用高效的哈佛结构三级流水线,达到1.25DMIPS/MHz,在功耗上更是达到0.06mW/MHz。Cortex-M3使用Thumb-2指令集,自动16/32位混合排列。单周
[工业控制]
基于CORTEX的<font color='red'>STM32</font>的三相电能表方案
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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