简单粗暴,直击核心。
目录
一、寄存器编程
(以点亮LED为例)
<依据STM32中文参考手册>
1.使能IO口时钟
(以GPIOC为例)
/* 使能IO口时钟,C组 */
//设置-第四位;
RCC->APB2ENR |= 1 << ( 4 ); //不影响其它位;
2.初始化IO口
(以PC13为推挽输出例)
/* 配置IO口模式,PC13推挽高速 */
//清除-20、21、22、23.
GPIOC->CRH &= 0xFF0FFFFF;//1111 1111 0000 1111 1111 1111 1111 1111 ;
//赋值。
GPIOC->CRH |= 0x00300000;//0011 = 3;
3.设置高低电平
(以PC13为例)
(PC13设置为高电平)
/* 输出高电平,关闭 */
GPIOC->ODR |= 1 << (13);//0010 0000 0000 0000
//设置
(PC13设置为低电平)
/* 输出低电平,开启 */
GPIOC->ODR &= ~( 1 << (13) );
//清除
二、完整代码
main.h
#ifndef __MAIN_H
#define __MAIN_H
#include "stm32f10x.h"//顶层1头文件;
#include "led.h"
#endif
main.c
#include "main.h"
int main( void )
{
LED_Init();
/* 输出高电平,关闭 */
GPIOC->ODR |= 1 << (13);//0010 0000 0000 0000
//设置
/* 输出低电平,开启 */
GPIOC->ODR &= ~( 1 << (13) );
//清除
return 0;
}
led.h
#ifndef __LED_H
#define __LED_H
//函数声明;
void LED_Init(void);//led初始化;
#endif
led.c
#include "led.h"//引用头文件;
#include "main.h"
void LED_Init(void)//led初始化
{
/* 使能IO口时钟,C组 */
//设置-第四位;
RCC->APB2ENR |= 1 << ( 4 ); //不影响其它位;
/* 配置IO口模式,PC13推挽高速 */
//清除-20、21、22、23.
GPIOC->CRH &= 0xFF0FFFFF;//1111 1111 0000 1111 1111 1111 1111 1111 ;
//赋值。
GPIOC->CRH |= 0x00300000;//0011 = 3;
/* 输出高低平,初始为灭 */
GPIOC->ODR |= 1 << (13);//0010 0000 0000 0000
}
三、拓展
(即:BSRR、BRR寄存器的应用)
1.BSRR寄存器(低16位作为设置使用)
//设置位
GPIOC->BSRR = 0x2000;
2.BRR寄存器(低16位作为清除使用)
//清除位
GPIOC->BRR = 0x2000;
总结
(寄存器-编程-方法)
1.当0对其它位无影响时,使用此方法(直接赋值)
(清除/设置)
//设置位
GPIOC->BSRR = 0x2000;
//清除位
GPIOC->BRR = 0x2000;
2..当0对其它位有影响时,使用此方法【修改单个位】
(清除/设置)
/* 输出高电平,关闭 */
GPIOC->ODR |= 1 << (13);//0010 0000 0000 0000
//设置
/* 输出低电平,开启 */
GPIOC->ODR &= ~( 1 << (13) );
//清除
3..当0对其它位有影响时,使用此方法【修改多个位】
(清除/设置)
/* 配置IO口模式,PC13推挽高速 */
//清除-20、21、22、23.
GPIOC->CRH &= 0xFF0FFFFF;//1111 1111 0000 1111 1111 1111 1111 1111 ;
//设置。
GPIOC->CRH |= 0x00300000;//0011 = 3;