学习笔记 GOIO相关寄存器
和GPIO相关的寄存器
1) RCC->APB2ENR ------使能端口时钟,写1开启时钟
2) GPIOx->CRL------端口的低配置寄存器(配置低8个引脚的属性)
3) GPIOx->CRH------端口的高配置寄存器(配置高8个引脚的属性)
4) GPIOx->ODR------端口数据输出寄存器(写1输出高电平,写0输出低电平)
端口位设置/清除寄存器(GPIOx_BSRR) (x=A..G)
寄存器32位,低16位控制ODR寄存器的值(BSRR低16位写1把ODR寄存器的位变为1,写0不影响ODR寄存器)
总结:GPIOx_BSRR寄存器,低16位,写1引脚输出高电平,写0不改变引脚的电平
GPIOx_BSRR寄存器,高16位,写1引脚输出低电平,写0不改变引脚的电平(不使用)
例子:PB5输出高电平
GPIOB->ODR |= (1<<5); (1<<5) 读GPIOB->ODR 再100000|GPIOB->ODR 最后写入GPIOB->ODR
GPIOB_BSRR |= (1<<5);---> GPIOB_BSRR = (1<<5); (1<<5) 写入GPIOB->ODR
端口位清除寄存器(GPIOx_BRR) (x=A..G)
寄存器32位,低16位控制ODR寄存器的值(BRR低16位写1把ODR寄存器的位变为0,写0不影响ODR寄存器)
例子:PB5输出低平
GPIOB->ODR &= ~1<<5); (1<<5) 按位取反 读GPIOB->ODR 再xxxxx&GPIOB->ODR 最后写入GPIOB->ODR
GPIOB_BRR |= (1<<5);---> GPIOB_BSRR = (1<<5); (1<<5) 写入GPIOB->ODR
端口输入数据寄存器(GPIOx_IDR) (x=A..E)
我们一般只有在端口是输入状态的时候操作这个寄存器,对它进行读操作,读取IO口的状态
为什么要有输出/输入寄存器?
输出寄存器:单片机通过它向外输出电平
输入寄存器:单片机读取别人给它的电平
什么情况我们会把引脚配置为输入状态?
我们要读取引脚外部的电平情况,必须配置为输入状态
按键的实验
对于按键,单片机能控制它闭合吗?不能
单片机只能读取按键的IO口的电平情况,判断按键的状态
输入状态,必须要考虑引脚没有信号输入的电平
如:KEY_UP,它接有一个上拉电阻,按键不按是高电平;按键按下去是低电平
因为外部已经接有上拉电阻,所以呢IO口配置为:浮空输入
我们要使用按键,也要对按键的IO口进行配置,把它配置为:浮空输入
void key_init()
{
}
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3EA.tmp.jpg
在keil使用模块化编程
模块化编程好处:
1) 方便管理代码
2) 方便别人阅读代码
keil模块化编程是遵循标准C
在.h文件里面做宏定义或者函数声明或者是变量声明
在.c里面实现变量的定义和函数体的实现
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3EB.tmp.jpg
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3FC.tmp.jpg
作业:实现一个功能:按下up键LED1亮,再按up键LED1灭
111111111111111111111111
习惯不错 有助于 理解 记忆
666666666666666622222222222222222
顶一个。