找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8325|回复: 6
打印 上一主题 下一主题
收起左侧

STM32 如何定义IO?就像51单片机中的sbit那样

[复制链接]
跳转到指定楼层
楼主
ID:417092 发表于 2019-1-15 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:277550 发表于 2019-1-15 23:31 | 只看该作者
两个不同的系统,知识不可以直接“拿来用”

#define LED1 PB4
#define LED2 PC4
#define LED3 PC7
#define LED4 PC5

void Init_LED(void){
    /*LED 配置为推挽输出*/
    PD_DDR |= 0X04;   //PD2输出模式,0为输入模式
    PD_CR1 |= 0X04;   //PD2模拟开漏输出
    PD_CR2 &= 0XFB;   //PD2输出速度最大为2MHZ,CR1/CR2悬浮输入

    PC_DDR |= 0XC8;
    PC_CR1 |= 0XC8;
    PC_CR2 &= 0X27;

回复

使用道具 举报

板凳
ID:142059 发表于 2019-1-15 23:56 | 只看该作者
看我发的帖有
回复

使用道具 举报

地板
ID:142059 发表于 2019-1-15 23:59 | 只看该作者
//举例:       PA0_OUT;   //PA0配置成推挽输出模式
              PA0=1;     //PA0输出1
              ...
              PA0=0;     //PA0输出0
              当需要PA0改为输入时,需要在使用前配置成输入
                                                        PA0_IN;    //PA0配置成上下拉输入
                                                        PA0=1;     //PA0配置成上拉输入(PA0=0配置成下拉输入)
                                                        if(PA0in==0) PA11=1;  //读取PA0的电平状态
                                                        当PA0作为输入使用完毕,PA0口又继续上面的输出工作,则重新再配置一次
                                                        PA0_OUT;   //恢复PA0为输出
                                                        PA0=0;     //PA0输出0
                                                       
                                                        PA_OUT;    //PA(16个IO口)配置成推挽输出模式
                                                        PA=0xFF00; //高8位输出1,低8位输出0
                                                        PA_IN;     //PA(16个IO口)配置成上下拉输入
                                                        PA=0xFFFF; //PA(16个IO口)配置成上拉输入
                                                        PB0_OUT;   //PB0配置成推挽输出模式
                                                        if(PAin==0xFFFF)  PB0=1;   //如果PA16个IO都等于1,则PB0置1

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr (GPIOA_BASE+0x0C) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+0x0C) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+0x0C) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+0x0C) //0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE+0x0C) //0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE+0x0C) //0x40011808
#define GPIOG_ODR_Addr (GPIOG_BASE+0x0C) //0x40011808
#define GPIOA_IDR_Addr (GPIOA_BASE+0x08) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+0x08) //0x40010C08  
#define GPIOC_IDR_Addr (GPIOC_BASE+0x08) //0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE+0x08) //0x40011408
#define GPIOE_IDR_Addr (GPIOE_BASE+0x08) //0x40011808
#define GPIOF_IDR_Addr (GPIOF_BASE+0x08) //0x40011808
#define GPIOG_IDR_Addr (GPIOG_BASE+0x08) //0x40011808
//-----------------------------------------------------

/*--------------------------------------------------------------------------------*/
#define PA0_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFFF0; GPIOA->CRL|=0x00000003
#define PA1_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFF0F; GPIOA->CRL|=0x00000030
#define PA2_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFF0FF; GPIOA->CRL|=0x00000300
#define PA3_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFF0FFF; GPIOA->CRL|=0x00003000
#define PA4_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFF0FFFF; GPIOA->CRL|=0x00030000
#define PA5_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFF0FFFFF; GPIOA->CRL|=0x00300000
#define PA6_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xF0FFFFFF; GPIOA->CRL|=0x03000000
#define PA7_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRL&=0x0FFFFFFF; GPIOA->CRL|=0x30000000
#define PA8_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFFF0; GPIOA->CRH|=0x00000003
#define PA9_OUT  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFF0F; GPIOA->CRH|=0x00000030
#define PA10_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFF0FF; GPIOA->CRH|=0x00000300
#define PA11_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFF0FFF; GPIOA->CRH|=0x00003000
#define PA12_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFF0FFFF; GPIOA->CRH|=0x00030000
#define PA13_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFF0FFFFF; GPIOA->CRH|=0x00300000
#define PA14_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xF0FFFFFF; GPIOA->CRH|=0x03000000
#define PA15_OUT RCC->APB2ENR|=1<<2;GPIOA->CRH&=0x0FFFFFFF; GPIOA->CRH|=0x30000000
#define PA0_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFFF0; GPIOA->CRL|=0x00000008
#define PA1_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFFF0F; GPIOA->CRL|=0x00000080
#define PA2_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFFF0FF; GPIOA->CRL|=0x00000800
#define PA3_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFFF0FFF; GPIOA->CRL|=0x00008000
#define PA4_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFFF0FFFF; GPIOA->CRL|=0x00080000
#define PA5_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xFF0FFFFF; GPIOA->CRL|=0x00800000
#define PA6_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0xF0FFFFFF; GPIOA->CRL|=0x08000000
#define PA7_IN   RCC->APB2ENR|=1<<2;GPIOA->CRL&=0x0FFFFFFF; GPIOA->CRL|=0x80000000
#define PA8_IN   RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFFF0; GPIOA->CRH|=0x00000008
#define PA9_IN   RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFFF0F; GPIOA->CRH|=0x00000080
#define PA10_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFFF0FF; GPIOA->CRH|=0x00000800
#define PA11_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFFF0FFF; GPIOA->CRH|=0x00008000
#define PA12_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFFF0FFFF; GPIOA->CRH|=0x00080000
#define PA13_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xFF0FFFFF; GPIOA->CRH|=0x00800000
#define PA14_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0xF0FFFFFF; GPIOA->CRH|=0x08000000
#define PA15_IN  RCC->APB2ENR|=1<<2;GPIOA->CRH&=0x0FFFFFFF; GPIOA->CRH|=0x80000000
//-----------------------------------------------------
#define PB0_OUT  RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFFFFFF0; GPIOB->CRL|=0x00000003
#define PB1_OUT  RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFFFFF0F; GPIOB->CRL|=0x00000030
#define PB2_OUT  RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFFFF0FF; GPIOB->CRL|=0x00000300
#define PB3_OUT  RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFFF0FFF; GPIOB->CRL|=0x00003000
#define PB4_OUT  RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFF0FFFF; GPIOB->CRL|=0x00030000
#define PB5_OUT  RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFF0FFFFF; GPIOB->CRL|=0x00300000
#define PB6_OUT  RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xF0FFFFFF; GPIOB->CRL|=0x03000000
#define PB7_OUT  RCC->APB2ENR|=1<<3;GPIOB->CRL&=0x0FFFFFFF; GPIOB->CRL|=0x30000000
#define PB8_OUT  RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFFFFFFF0; GPIOB->CRH|=0x00000003
#define PB9_OUT  RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFFFFFF0F; GPIOB->CRH|=0x00000030
#define PB10_OUT RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFFFFF0FF; GPIOB->CRH|=0x00000300
#define PB11_OUT RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFFFF0FFF; GPIOB->CRH|=0x00003000
#define PB12_OUT RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFFF0FFFF; GPIOB->CRH|=0x00030000
#define PB13_OUT RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFF0FFFFF; GPIOB->CRH|=0x00300000
#define PB14_OUT RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xF0FFFFFF; GPIOB->CRH|=0x03000000
#define PB15_OUT RCC->APB2ENR|=1<<3;GPIOB->CRH&=0x0FFFFFFF; GPIOB->CRH|=0x30000000
#define PB0_IN   RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFFFFFF0; GPIOB->CRL|=0x00000008
#define PB1_IN   RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFFFFF0F; GPIOB->CRL|=0x00000080
#define PB2_IN   RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFFFF0FF; GPIOB->CRL|=0x00000800
#define PB3_IN   RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFFF0FFF; GPIOB->CRL|=0x00008000
#define PB4_IN   RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFFF0FFFF; GPIOB->CRL|=0x00080000
#define PB5_IN   RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xFF0FFFFF; GPIOB->CRL|=0x00800000
#define PB6_IN   RCC->APB2ENR|=1<<3;GPIOB->CRL&=0xF0FFFFFF; GPIOB->CRL|=0x08000000
#define PB7_IN   RCC->APB2ENR|=1<<3;GPIOB->CRL&=0x0FFFFFFF; GPIOB->CRL|=0x80000000
#define PB8_IN   RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFFFFFFF0; GPIOB->CRH|=0x00000008
#define PB9_IN   RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFFFFFF0F; GPIOB->CRH|=0x00000080
#define PB10_IN  RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFFFFF0FF; GPIOB->CRH|=0x00000800
#define PB11_IN  RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFFFF0FFF; GPIOB->CRH|=0x00008000
#define PB12_IN  RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFFF0FFFF; GPIOB->CRH|=0x00080000
#define PB13_IN  RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xFF0FFFFF; GPIOB->CRH|=0x00800000
#define PB14_IN  RCC->APB2ENR|=1<<3;GPIOB->CRH&=0xF0FFFFFF; GPIOB->CRH|=0x08000000
#define PB15_IN  RCC->APB2ENR|=1<<3;GPIOB->CRH&=0x0FFFFFFF; GPIOB->CRH|=0x80000000


#define PA0    BIT_ADDR(GPIOA_ODR_Addr, 0) //输出
#define PA1    BIT_ADDR(GPIOA_ODR_Addr, 1) //输出
#define PA2    BIT_ADDR(GPIOA_ODR_Addr, 2) //输出
#define PA3    BIT_ADDR(GPIOA_ODR_Addr, 3) //输出
#define PA4    BIT_ADDR(GPIOA_ODR_Addr, 4) //输出
#define PA5    BIT_ADDR(GPIOA_ODR_Addr, 5) //输出
#define PA6    BIT_ADDR(GPIOA_ODR_Addr, 6) //输出
#define PA7    BIT_ADDR(GPIOA_ODR_Addr, 7) //输出
#define PA8    BIT_ADDR(GPIOA_ODR_Addr, 8) //输出
#define PA9    BIT_ADDR(GPIOA_ODR_Addr, 9) //输出
#define PA10   BIT_ADDR(GPIOA_ODR_Addr, 10) //输出
#define PA11   BIT_ADDR(GPIOA_ODR_Addr, 11) //输出
#define PA12   BIT_ADDR(GPIOA_ODR_Addr, 12) //输出
#define PA13   BIT_ADDR(GPIOA_ODR_Addr, 13) //输出
#define PA14   BIT_ADDR(GPIOA_ODR_Addr, 14) //输出
#define PA15   BIT_ADDR(GPIOA_ODR_Addr, 15) //输出
#define PA0in  BIT_ADDR(GPIOA_IDR_Addr, 0) //输入
#define PA1in  BIT_ADDR(GPIOA_IDR_Addr, 1) //输入
#define PA2in  BIT_ADDR(GPIOA_IDR_Addr, 2) //输入
#define PA3in  BIT_ADDR(GPIOA_IDR_Addr, 3) //输入
#define PA4in  BIT_ADDR(GPIOA_IDR_Addr, 4) //输入
#define PA5in  BIT_ADDR(GPIOA_IDR_Addr, 5) //输入
#define PA6in  BIT_ADDR(GPIOA_IDR_Addr, 6) //输入
#define PA7in  BIT_ADDR(GPIOA_IDR_Addr, 7) //输入
#define PA8in  BIT_ADDR(GPIOA_IDR_Addr, 8) //输入
#define PA9in  BIT_ADDR(GPIOA_IDR_Addr, 9) //输入
#define PA10in BIT_ADDR(GPIOA_IDR_Addr, 10) //输入
#define PA11in BIT_ADDR(GPIOA_IDR_Addr, 11) //输入
#define PA12in BIT_ADDR(GPIOA_IDR_Addr, 12) //输入
#define PA13in BIT_ADDR(GPIOA_IDR_Addr, 13) //输入
#define PA14in BIT_ADDR(GPIOA_IDR_Addr, 14) //输入
#define PA15in BIT_ADDR(GPIOA_IDR_Addr, 15) //输入
//-------------
#define PB0    BIT_ADDR(GPIOB_ODR_Addr, 0) //输出
#define PB1    BIT_ADDR(GPIOB_ODR_Addr, 1) //输出
#define PB2    BIT_ADDR(GPIOB_ODR_Addr, 2) //输出
#define PB3    BIT_ADDR(GPIOB_ODR_Addr, 3) //输出
#define PB4    BIT_ADDR(GPIOB_ODR_Addr, 4) //输出
#define PB5    BIT_ADDR(GPIOB_ODR_Addr, 5) //输出
#define PB6    BIT_ADDR(GPIOB_ODR_Addr, 6) //输出
#define PB7    BIT_ADDR(GPIOB_ODR_Addr, 7) //输出
#define PB8    BIT_ADDR(GPIOB_ODR_Addr, 8) //输出
#define PB9    BIT_ADDR(GPIOB_ODR_Addr, 9) //输出
#define PB10   BIT_ADDR(GPIOB_ODR_Addr, 10) //输出
#define PB11   BIT_ADDR(GPIOB_ODR_Addr, 11) //输出
#define PB12   BIT_ADDR(GPIOB_ODR_Addr, 12) //输出
#define PB13   BIT_ADDR(GPIOB_ODR_Addr, 13) //输出
#define PB14   BIT_ADDR(GPIOB_ODR_Addr, 14) //输出
#define PB15   BIT_ADDR(GPIOB_ODR_Addr, 15) //输出
#define PB0in  BIT_ADDR(GPIOB_IDR_Addr, 0) //输入
#define PB1in  BIT_ADDR(GPIOB_IDR_Addr, 1) //输入
#define PB2in  BIT_ADDR(GPIOB_IDR_Addr, 2) //输入
#define PB3in  BIT_ADDR(GPIOB_IDR_Addr, 3) //输入
#define PB4in  BIT_ADDR(GPIOB_IDR_Addr, 4) //输入
#define PB5in  BIT_ADDR(GPIOB_IDR_Addr, 5) //输入
#define PB6in  BIT_ADDR(GPIOB_IDR_Addr, 6) //输入
#define PB7in  BIT_ADDR(GPIOB_IDR_Addr, 7) //输入
#define PB8in  BIT_ADDR(GPIOB_IDR_Addr, 8) //输入
#define PB9in  BIT_ADDR(GPIOB_IDR_Addr, 9) //输入
#define PB10in BIT_ADDR(GPIOB_IDR_Addr, 10) //输入
#define PB11in BIT_ADDR(GPIOB_IDR_Addr, 11) //输入
#define PB12in BIT_ADDR(GPIOB_IDR_Addr, 12) //输入
#define PB13in BIT_ADDR(GPIOB_IDR_Addr, 13) //输入
#define PB14in BIT_ADDR(GPIOB_IDR_Addr, 14) //输入
#define PB15in BIT_ADDR(GPIOB_IDR_Addr, 15) //输入

#define PA   MEM_ADDR(GPIOA_ODR_Addr)          //PA  16个IO口同时动作
#define PB   MEM_ADDR(GPIOB_ODR_Addr)
#define PAin MEM_ADDR(GPIOA_IDR_Addr)
#define PBin MEM_ADDR(GPIOB_IDR_Addr)

想要完整的去下我的那个stm32多任务+仿51的那个
回复

使用道具 举报

5#
ID:123289 发表于 2019-1-16 08:05 | 只看该作者
为何不查一下手册呢?
回复

使用道具 举报

6#
ID:449525 发表于 2019-1-16 08:44 | 只看该作者
先要io口初始化,这个比51多一步,用库函数的程序
类似这样
#define LED_ON               GPIO_SetBits(PA_port,GPIO_Pin)       
例程代码很多的
回复

使用道具 举报

7#
ID:466753 发表于 2019-1-16 19:43 | 只看该作者
#define KEY0        PEin(4) //将PE4口定义为KEY0,这个就是端口位定义的代码,但是每一个端口都是需要配置的,不论是时钟还是输入输出模式亦或者是速率以及上下拉模式,都是需要配置。去看STM32寄存器开发手册吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表