微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32F103ZET6点亮第一个LED灯程序,遇到问题,请求支援。

STM32F103ZET6点亮第一个LED灯程序,遇到问题,请求支援。

时间:10-02 整理:3721RD 点击:
GPIOE 第5脚接LED负极通过限流电阻到3.3V
程序如下。只配置了RCC 和输出模式,灯竟然亮了。为什么呢?并没有给IO口RESET呀!
#include "stm32f10x.h"
int main()
{               
        RCC->APB2ENR|=1<<6;    //RCC_APB2ENR_GPIOE
   GPIOE->CRL|=(1<<20);   // GPIOE_CEL        10MHZ PUSH-PULL  OUTPUT
        while(1);               
}
并且试了一下,上面两条程序少一条都不能点亮。这是为什么呢?请高人指点一下。

你这个现象跟相关寄存器的复位值有关系
首先是你的现有代码:
1        RCC->APB2ENR|=1<<6;    //RCC_APB2ENR_GPIOE
2   GPIOE->CRL|=(1<<20);   // GPIOE_CEL        10MHZ PUSH-PULL  OUTPUT
第一行打开时钟,第二行是将GPIOE->CRL寄存器的第二十位置为1,我们看一下GPIOE->CRL寄存器的内容,如下图:


关键来了,GPIOE->CRL寄存器的复位值为0x44444444,意思就是在默认情况下GPIOE->CRL的第23位为0,第22位为1,第21位为0,第20位为0.
然后你的第二行代码又将第20位置为1,这是查看寄存器下方的说明可以知道,你当然已经将该IO口配置为通用开漏输出模式,并且输出频率为最大速度10MHz。
然后是数据输出寄存器GPIOE-ODR
通过文档可知这个寄存器的默认值为0x00000000,也就是默认输出低电平,在结合你目前的电路,小灯自然就会亮了~~~

这个不用先上操作系统么?系统启动起来以后才可运行相关程序啊?如果是51芯片是不是要先编译成对应的芯片能识别的.hex文件啊?

有上拉吧

明白了,但是还有一事不明我按野火的寄存器点亮LED灯视频写如下代码LED死活不亮,请指点一下,错在哪里了
int main(void)
{
        *(unsigned int*)0x40010C00|=3<<20; //GPIOB_CRL
       
        *(unsigned int*)0x40021018|=((1)<<3); //RCC_APB2ENR_GPIOB
       
        while(1);
}

竟然两条代码 颠倒顺序就可以点亮,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top