2018/4/12
STM32
1.说在前面:
1.对于stm32最初的认识是基于库函数的,调用一堆库函数来使得问题得到解答,但是深究库函数,最终还是对寄存器的配置
2.寄存器:就是用来存储数据的,事实上,对stm32的控制就是对32位寄存器的修改;
2.GPIO口寄存器的介绍
注:一组io口是由7个寄存器进行配置,所以
1.GPIOx_CRL:控制寄存器,控制寄存器的低16位
2.GPIOx_CRH:控制寄存器,控制寄存器的高16位
3.GPIOx_IDR:输入寄存器;(通过位选设置高低电平)
4.GPIO_ODR:输出寄存器;(通过位选设置高低电平)
5.GPIO_BSRR:端口位设置和清除寄存器
6.GPIO_BRR:端口位清除寄存器
7.GPIO_LCKR:端口位配置锁存器(不常用)
这几种寄存器的配置在前面的笔记中有着详细的介绍,这里就不赘述
https://blog.csdn.net/lzinner/article/details/79736138
3.点灯实验介绍
1.点灯就是实现IO口的高低电平的转换
过程:
1.实现io口时钟使能
RCC->APB2ENR|=1<<2;//
RCC->APB2ENR|=1<<5;//
2.实现io口的简单创建(init)(1.配置io口使能,2.配置io口输出的高低电平)
//GPIOA8
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;
GPIOA->ODR|=1<<8;
//GPIOD2
GPIOD->CRL&=0xFFFFF0FF;
GPIOD->CRL|=0X00000300;
GPIOD->ODR|=1<<2;
3.主函数记得配置系统时钟
#include"stm32f10x.h"
#include"delay.h"
#include"led.h"
int main()
{
delay_init(72);//È·¶¨ÏµÍ³Ê±ÖÓΪ72mhz
LED_init();
while(1)
{
GPIOA->ODR=1<<8;
GPIOD->ODR=1<<2;
delay_ms(500);
GPIOA->ODR=~(1<<8);
GPIOD->ODR=~(1<<2);
delay_ms(500);
}
}
4.关于一些问题
1.&=
一般对某个寄存器进行刷新的时候使用该方法,
GPIOA->CRH&=0XFFFFFFF0;//将GPIOA相应位置进行初始化
2.|=
一般用于针对寄存器的某一位或者某几位进行初始化
GPIOA->CRH|=0X00000003;