寄存器配置有先后顺序

来源:互联网 发布:淘宝9块9包邮专区 编辑:程序博客网 时间:2024/04/29 04:49

这两天研究c++写stm32程序,最先就从类开始,写了一些空的框架,一编译竟然通过了。


然后就开始写内容,不想用库,就捣鼓寄存器来实现控制led灯。


我是红牛开发板,用PF6控制,于是乎查资料写了如下初始代码


GPIOF->CRL = (2<<24)|(0<<26);
RCC->APB2ENR = RCC_APB2ENR_IOPFEN;


然后定义一个对象并调用On()方法(自己写的类的公共方法),代码是

GPIOF->ODR &=~(1<<6);//(低电平亮)

编译下载,结果让我失望呀。睡觉,第二天再来。



第二天继续,在网上找操作寄存器控制io口的例子,找到一个

RCC->APB2ENR|=1<<3; 
GPIOB->CRL&=0XFF0FFFFF; 
GPIOB->CRL|=0X00300000; 
GPIOB->ODR&=~(1<<5);    
 


编译没错,下板子上测试,用示波器看PB5果然有变化。

于是将我的代码改为

GPIOF->CRL &=0XF0FFFFFF; 
GPIOF->CRL
  |= 0X0300000;
RCC->APB2ENR = RCC_APB2ENR_IOPFEN;


在试,还是不对,这就纳闷了,这时我怀疑是

RCC->APB2ENR = RCC_APB2ENR_IOPFEN;

的问题,就将正确的

RCC->APB2ENR|=1<<3; 

改为

RCC->APB2ENR = RCC_APB2ENR_IOPBEN;

也是对的这是我就邪恶了,我把

GPIOB->CRL&=0XFF0FFFFF; 
GPIOB->CRL|=0X00300000; 
GPIOB->ODR&=~(1<<5);  

里面的B全部改为F。用示波器看PF5,有变化。然后改为

GPIOF->CRL &=0XF00FFFFF; 
GPIOF->CR
L   |= 0X0330000;
 

GPIOF->ODR&=~(1<<6);

哈哈,灯亮了。这时对比一下原先的代码,就发现顺序问题,然后再验证,果然这个问题




原创粉丝点击