STM32---点亮LED灯

一:编译第一个程序

int main()  //主函数
{
    
}

void SystemInit()  //在执行主函数前,会被调用。不进行实现。在启动文件中被调用
{
    
}
; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP
启动文件:复位程序部分汇编代码

二:LED灯原理图

注意:其中PB0是绿灯

三:LED点亮--代码实现

(一)第一步:点亮LED灯PB0引脚绿灯,必须设置端口输出数据寄存器,使得其对应的引脚输出低电平,产生电压差。点亮绿灯

*(unsigned int*)(0x40010c0c) &= ~(1<<0);    

(二)第二步: 需要设置端口低寄存器,设置低八位0-7,设置为通用推挽输出模式,最大速度设置为10MHZ

*(unsigned int*)(0x40010c00) |= (1<<0);

开漏和推挽区别在于:
开漏:输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。
推挽输出:可以输出高,低电平,连接数字器件。
开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。
推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止
引入一句话:“复用输出当前的引脚功能功能有外设控制,并不由通用IO控制,因此你要通过操作GPIO来驱动LED的话,肯定是用通用的

  

速度可以随便选择

(三)第三步:设置外设GPIOB端口的时钟开启

*(unsigned int*)(0x40021018) |= (1<<3);

(四)全部代码

int main()
{
    *(unsigned int*)(0x40021018) |= (1<<3);
    
    *(unsigned int*)(0x40010c00) |= (1<<0);
    
    *(unsigned int*)(0x40010c0c) &= ~(1<<0);    
    
}

void SystemInit()
{
    
}

(五)实现状态

猜你喜欢

转载自www.cnblogs.com/ssyfj/p/11520223.html