在stm32 odr中,如何读取ODR寄存器中的IO端口状态,程序怎么写?

&&&&&&&&&&&&&
在输出模式下:ODR是数据输出寄存器,但是在 输入模式下,同时也用来配置上拉下拉设置。在Alientek的源码中的按键输入实验中有如下一段初始化代码:void KEY_Init(void){& &&& RCC-&APB2ENR|=1&&2;&&&& //使能PORTA时钟&& &GPIOA-&CRL&=0XFFFFFFF0;//PA0设置成输入&& & &&& &GPIOA-&CRL|=0X;&&&& &GPIOA-&CRH&=0X0F0FFFFF;//PA13,15设置成输入&& & &&& &GPIOA-&CRH|=0X;&& &&& &&& &&& && &&& &GPIOA-&ODR|=1&&13;&& &&& //PA13上拉,PA0默认下拉&& &GPIOA-&ODR|=1&&15;&& &&& //PA15上拉}经常有用户问道,为什么端口设置为输入,然后还要对输出寄存器进行写操作, GPIOA-&ODR|=1&&15;&& &&& //PA15上拉在中文数据手册里面的确没有看到说明,下面是英文手册里面的(从网上找的):&&& 即在将端口设置为上拉/下拉输入的状况下,是由将GPIOx-&ODR相应位设置为0或1来设置为下拉输入还是上拉输入的。0000(0)模拟输入,通常可用在AD采样&0100(4)浮空输入,如果有外部的上拉或下拉,则可以用这个&1000(8)上/下拉输入,使能内部上/下拉结构,使端口在空闲情况下置为某种电平,具体是某种电平就由GPIOx-&ODR来决定。置1则高电平,置0则低电平。在库函数中,是这么实现的 在void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
// 通过写 ODR设置 上拉下拉输入模式
&&&&&&&&/* Reset the corresponding ODR bit */
&&&&&&&&if(GPIO_InitStruct-&GPIO_Mode == GPIO_Mode_IPD)
&&&&&&&&&&GPIOx-&BRR =(((u32)0x01)&& pinpos);&&&&//写 ODR相应位 = 0
&&&&&&&&/*Set the corresponding ODR bit */
&&&&&&&&if(GPIO_InitStruct-&GPIO_Mode == GPIO_Mode_IPU)
&&&&&&&&&&GPIOx-&BSRR =(((u32)0x01)&& pinpos);//写 ODR相应位 = 1
阅读(...) 评论() &stm32的GPIO学习笔记_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
stm32的GPIO学习笔记
上传于||文档简介
&&s​t​m2​的​G​P​I​O​学​习​笔​记
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢STM32_IO及时钟寄存器_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
STM32_IO及时钟寄存器
上传于||暂无简介
大小:12.68KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢stm32试题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢单片机(7)
stm32(6)
c语言(5)
1、STM32 的每个 IO 端口都有 7 个寄存器来控制
(1)配置模式的 2 个 32 位的端口 配置寄存器 CRL 和 CRH
(2)2 个 32 位的数据寄存器 IDR 和 ODR
(3)1 个 32 位的置位/复位寄存器 BSRR
(4)一个 16 位的复位寄存器 BRR
(5)1 个 32 位的锁存寄存器 LCKR。
2、每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的高八位和低八位,如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CRH寄存器,两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)一个是只读作输入数据寄存器,一个是只写作输出寄存器,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。常用的IO端口寄存器只有四个:CRH,CRL,IDR,ODR。
3、另外,STM32的每个端口使用前都要将其时钟使能,STM32的GPIO的时钟统一挂接在APB2上,具体的使能寄存器为RCC_APB2ENR,该寄存器的第2位到第8位分别控制GPIOx(x=A,B,C,D,E,F,G)端口的时钟使能,当外设时钟没有启用时,程序不能读出外设寄存器的数值,如打开PORTA时钟:
RCC-&APB2ENR|=1&&2;
//使能PORTA时钟
使能外设时钟后,GPIOA的十六位就可以按照设定的状态工作了,之后就是具体设置哪一位了以第八位为例即高位的首位,在GPIOx_CRH寄存器中进行设置,GPIOA的每一位都有该寄存器的四位来设定相应的参数,这四位中的高两位(CNF0,CNF1)设置GPIO的输入输出模式,低两位(MODE0,MODE1)是设置GPIO的输出频率,具体可以参考STM32参考手册。
GPIOA-&CRH&=0XFFFFFFF0; //清掉PA8原来的设置,同时屏蔽其它端口,不影响其它端口的设置
GPIOA-&CRH|=0X;//PA8 推挽输出
十六进制中的3 换成二进制 00 11 前两位00表示推挽输出,11代表输出频率50Mhz,若CRH|=0x4,表示模拟输入模式(ADC用),0x3表示推挽输出模式(作输出口用,50M速率),0x8表示上/下拉输入模式(做输入口用),0xB表示复用输出(使用IO口的第二功能,50M速率)。
这是对一位的操作,当然也可以多位操作,因为STM32对GPIO操作必须是32位全字操作,设置完成后GPIOA的第8位就可以使用了之后给GPIOA-&ODR=0x xxxx xxxx送数据就行了
首先介绍一下基本的GPIO相关的寄存器:
(一)GPIOX_CRL 低8位端口配置寄存器
这个寄存器主要是对配置管脚是输入还是输出:
其中1)MODEy[1:0]主要是配置是输入端口还是输出端口的。配置为输出得时候还可以配置输出的管脚速度等级。
2)CNFy[1:0] 主要是两种形式,在端口配置输入的时候,即MODEy[1:0]位00(输入),用来配置输入的模式,主要是模拟输入,浮空输入,上拉模式和下拉模式。
3)CNFy[1:0]在端口配置为输出的时候,用来控制输入的模式。具体看手册吧。
总得来说,就是MODEy[1:0] 先配置管脚是输入还是输出,是输入就继续配置CNFy[1:0]来配置输出管脚的连接模式。要是输出的话,就继续配置MODEy[1:0]的管脚速度速度等级,之后再配置管脚的连接模式。上拉,下拉,推免,开漏等等。具体运用的时候看看手册就明白了。
(二)GPIOX_CRH 高8位端口配置寄存器
和GPIOX_CRH 完全一样,只是端口换成高8位了。
(三)GPIOX_ODR 端口输出数据寄存器
一个GPIOA端口就16位,自然的32位的GPIOX_ODR 就只有低16位有效了,想输出什么就给这个寄存器赋值就OK了。
或者用GPIOA-&ODR |=(1&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6236次
排名:千里之外
原创:22篇
(4)(5)(4)(2)(2)(4)(4)

我要回帖

更多关于 stm32 io寄存器 的文章

 

随机推荐