完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
STM32通用I/O(GPIO)
从嵌入式开发实践中总结出来的教程,深入浅出地教大家怎样掌握STM32IO口的使用。所谓寄存器配置,其实就是通过直接操作寄存器相应的位,来实现某些特定功能,这种方法比较灵活,且操作简便,由于STM32寄存器太多,实际编程中,不建议牢记住这些寄存器,用到时再回来翻翻手册或者找度娘,看多了不然而然就记住了。此外本教程所讲到的IO配置方法也适用于库函数版本。 GPIO功能描述 GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似STM32 GPIOx Px1-Px15(例:GPIOA PA1,PA2),其接脚可以供开发者由程控自由使用,PIN脚依现实考量可作为通用输入与输出(INT/OUT),复用功能(AF),模拟配置(AIN)。 GPIO相关寄存器 1.GPIO端口模式寄存器GPIOx_MODER: 00输入(复位状态)01输出模式 10复用模式 11模拟模式 每两位配置一个IO端口模式(位31:0) 2.GPIO输出类型寄存器GPIOX_OTYPER: 0输出推挽 1输出开漏 每一位配置一个IO端口输出类型(位31:16保留 位15:0) 3.GPIO输出速度寄存器GPIOX_OSPEEDR: 00 2MHz 01 25MHz 10 50MHz 11 100MHz 每两位配置一个IO端口输出速率(位31:0) 4.GPIO上下拉寄存器GPIOX_PUPDR: 00无上下拉 01上拉 10下拉 11保留 每两位配置一个IO端口上下拉功能(位31:0) 5.GPIO输入寄存器GPIOX_IDR: 0保留复位值 1开启io口输入功能 每一位配置一个IO端口输入开关(位31:16保留 位15:0) 6.GPIOX_ODR输出寄存器: 0保留复位值 1开启io口输出功能 每一位配置一个IO端口输出开关(位31:16保留 位15:0) 7.GPIOX_BSRR置位复位寄存器: 位31:16(0不对ODRX寄存器复位 1对ODRX寄存器复 位) 位15:0(0不对ODRX寄存器置位 1对ODRX寄存器置 位) 每一位配置一个IO端口置复位(位31:16复位 位15:0置位) 8.GPIOX_LCKR配置锁定寄存器: 位31:17保留复位值 ;位16:锁定键 0端口配置锁定键未 激活 1端口配置已激活 ; 位15:0端口x锁定位(0端口配置未锁定 1端口配置 已锁定) 每一位配置一个IO端口是否锁定(位15:0) 9.GPIOX_AFR复用功能低位寄存器: AF0:MCO/SWD/SWCLK/RTC AF1:TIM1/TIM2 AF2:TIM3-TIM5 AF3:TIM8-TIM11 AF4:I2C1~I2C3 AF5:SPI1/SPI2 AF6:SPI3 AF7:USART1~3 AF8:USART4~6 AF9;CAN1/CAN2/TIM12-TIM14 AF10:USB_OTG/USB_HS AF11:ETH AF12:FSMC/SDIO/OTG/HS AF13:DCIM AF14: AF15:EVENTOUT IO口位7:0操作GPIOx_AFR[0]寄存器 IO口位15:8操作GPIOx_AFR[1]寄存器 每四位配置一个复用功能I/O AF0~AF7:分别对应一个16位数0000-0111 AF8~AF15:分别对应一个16位数1000-1111 10.操作以上这些寄存器只是配置了IO的功能,要想IO端口能 正常工作,还要开启对应GPIO时钟。 时钟外设寄存器:AHB1ENR(0~8位表示IO口GPIOA- GPIOI时钟使能)0:禁止 1使能** 操作寄存器初始化代码 **直接操作相关寄存器,相对应的位写入值,达到改变IO口功能的目的。例如:设置IO口PA0功能为推挽输出,上拉,速率100M,高电平** 1 // An highlighted block **方法1** void GPIOA_PA0_Init(void)//初始化 { RCC->AHB1ENR|=1<<0;//使能PORTA时钟 GPIOA->MODER&=~(0X00000001);//对应位清零 GPIOA->MODER|=0X00000001;//配置为输出模式 //GPIOA->MODER|=1<<0; GPIOA->OTYPER&=~(0X0001);//对应位清零 GPIOA->OTYPER&=0XFFFE;配置为推完功能 //GPIOA->OTYPER&=~(1<<0); GPIOA->OSPEEDR&=~(0X00000003);//对应位清零 GPIOA->OSPEEDR|=(0X00000003);//配置速率为100MHz //GPIOA->OSPEEDR|=3<<0; GPIOA->PUPDR&=~(0X00000001);//对应位清零 GPIOA->PUPDR|=0X00000001;//配置为上拉 //GPIOA->PUPDR|=1<<0; GPIOA->ODR&=~(0X0001);//清零 GPIOA->ODR|=1<<0;//输出高电平 /*或者操作BSRR寄存器 GPIOA->BSRRL|=1<<0;//输出高电平*/ } **方法2** //如果使用正点原子开发板,会有相应的IO口配置封装函数,直接调用即可 //x:GPIOA~GPIOI //a:PIN0~PIN15 //b:GPIO_MODE_IN输入/GPIO_MODE_OUT输出/GPIO_MODE_AF复用/GPIO_MODE_AIN模拟 //c:GPIO_OTYPE_PP推挽/GPIO_OTYPE_OD开漏 //d:GPIO_SPEED_2M/GPIO_SPEED_25M/GPIO_SPEED_50M/GPIO_SPEED_100M 速率/单位:MHz //e:GPIO_PUPD_PU上拉/GPIO_PUPD_PD下拉 //PIN_Num:0-15(PIN0~PIN15) //AF_Num:0~15(AF0~AF15) void GPIOA_PA0_Init(void)//初始化 { RCC->AHB1ENR|=1<<0;//使能PORTA时钟 GPIO_Set(x,a,b,c,d,e); //例:GPIO_Set(GPIOA,PIN0,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PA0推挽输出,上拉,100MHz GPIOA->ODR&=~(0X0001);//清零 GPIOA->ODR|=1<<0;//输出高电平 /*或者操作BSRR寄存器 GPIOA->BSRRL|=1<<0;//输出高电平*/ /*****复用*****/ //GPIO_AF_Set(x,PIN_Num,AF_Num); //例:GPIO_AF_Set(GPIOB,9,2);PB9,AF2 **注意:复用io口时,要根据数据手册找到你要使用到的外设,然后再找到其对应的IO口引脚**** } 附: 操作寄存器需要掌握C语言位带运算,学习链接:http://c.biancheng.net/view/2038.html 以上教程是针对刚上手STM32的小白,大佬就别来踢馆啦!觉得写得不好请勿喷哈! |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2332浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 20:26 , Processed in 1.298880 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号