打印
[STM32F4]

基于STM32F4单片机的GPIO外设使用问题

[复制链接]
260|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
诸葛MM|  楼主 | 2024-11-25 22:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
如何实现GPIO的位操作和寄存器操作?
如何使用GPIO中断?如何配置中断优先级?

使用特权

评论回复
沙发
yzzly| | 2024-11-26 14:29 | 只看该作者
本帖最后由 yzzly 于 2024-11-26 14:40 编辑

#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+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
//-----------------------------------------------------
#define PA0Out                                BIT_ADDR(GPIOA_ODR_Addr, 0) //Êä³ö
#define PA1Out                                 BIT_ADDR(GPIOA_ODR_Addr, 1) //Êä³ö
#define PA2Out                                 BIT_ADDR(GPIOA_ODR_Addr, 2) //Êä³ö
#define PA3Out                                  BIT_ADDR(GPIOA_ODR_Addr, 3) //Êä³ö
#define PA4Out                                BIT_ADDR(GPIOA_ODR_Addr, 4) //Êä³ö
#define PA5Out                           BIT_ADDR(GPIOA_ODR_Addr, 5) //Êä³ö
#define PA6Out                                BIT_ADDR(GPIOA_ODR_Addr, 6) //Êä³ö
#define PA7Out                          BIT_ADDR(GPIOA_ODR_Addr, 7) //Êä³ö
#define PA8Out                         BIT_ADDR(GPIOA_ODR_Addr, 8) //Êä³ö
#define PA9Out                          BIT_ADDR(GPIOA_ODR_Addr, 9) //Êä³ö
#define PA10Out                         BIT_ADDR(GPIOA_ODR_Addr, 10)//Êä³ö
#define PA11Out                          BIT_ADDR(GPIOA_ODR_Addr, 11)//Êä³ö
#define PA12Out                           BIT_ADDR(GPIOA_ODR_Addr, 12)//Êä³ö
#define PA13Out                          BIT_ADDR(GPIOA_ODR_Addr, 13)//Êä³ö
#define PA14Out                           BIT_ADDR(GPIOA_ODR_Addr, 14)//Êä³ö
#define PA15Out                            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 UABFt                      PA0In
#define DYFT                      PA1In
#define TXD2                      PA2Out
#define RXD2                     PA3In
#define RadioD3                 PA4In
#define NULL1                   PA5Out                                                                                                //1
#define CON7606               PA6Out
#define RadioVT                 PA7In
#define Lamp2                   PA8Out                                                                                                //2
#define TXD1                     PA9Out
#define RXD1                     PA10In
#define Close                     PA11Out
#define Open                     PA12Out
#define TMS                      PA13Out
#define TCK                      PA14Out
#define OverCurrentLed     PA15Out
以上为位操作的定义,至于寄存器操作,只要对寄存器名直接读写就可以。

使用特权

评论回复
板凳
失物招領| | 2024-12-23 21:51 | 只看该作者
还用寄存器操作啊?是为了速度快吗?

使用特权

评论回复
地板
捧一束彼岸花| | 2024-12-23 22:09 | 只看该作者
你参考STM32F103的,其实他们都基本上差不多的

使用特权

评论回复
5
她已醉| | 2024-12-24 02:00 | 只看该作者
其实你都用F4了,感觉速度应该不在乎了吧,应该会很快的啊

使用特权

评论回复
6
将爱藏于深海| | 2024-12-24 03:00 | 只看该作者
建议还是使用固件库或者是HAL试试吧

7594067696b7596b84.png (723 Bytes )

7594067696b7596b84.png

使用特权

评论回复
7
春日负喧| | 2024-12-24 03:00 | 只看该作者
这种寄存器的话得自己对比手册才行,不然很难弄

5980767696bce679a2.png (575 Bytes )

5980767696bce679a2.png

使用特权

评论回复
8
将爱藏于深海| | 2024-12-24 04:00 | 只看该作者
建议还是使用固件库或者是HAL试试吧

使用特权

评论回复
9
温室雏菊| | 2024-12-24 05:00 | 只看该作者
直接用库函数呗,库函数也是用寄存器封装的呀

364367696d8d08811.png (724 Bytes )

364367696d8d08811.png

使用特权

评论回复
10
故意相遇| | 2024-12-24 06:00 | 只看该作者
不太会,现在寄存器都很少操作了,基本都是HAL

使用特权

评论回复
11
白马过平川| | 2024-12-24 07:00 | 只看该作者
操作中断的话还得直接使用数据手册对照着,去搞寄存器的

使用特权

评论回复
12
风凉| | 2024-12-24 08:00 | 只看该作者
为啥不选择使用HAL来搞呢

使用特权

评论回复
13
西洲| | 2024-12-24 09:00 | 只看该作者
这种寄存器的话不方便移植和编码啊,而且容易出错的

4867567696e9d041a1.png (491 Bytes )

4867567696e9d041a1.png

使用特权

评论回复
14
捧一束彼岸花| | 2024-12-24 10:00 | 只看该作者
你参考STM32F103的,其实他们都基本上差不多的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

24

帖子

0

粉丝