和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() { } 在keil使用模块化编程 模块化编程好处: 1) 方便管理代码 2) 方便别人阅读代码 keil模块化编程是遵循标准C 在.h文件里面做宏定义或者函数声明或者是变量声明 在.c里面实现变量的定义和函数体的实现 作业:实现一个功能:按下up键LED1亮,再按up键LED1灭
|