linux驱动开发 ST库 裸机 设备树 点灯的区别

1.STM32 控制LED灯

STM32入门之点亮LED灯(以STM32F103为例)_水水爱污污的博客-CSDN博客_stm32点亮一个led程序

1.1硬件连接图:

 1.2 代码实现

#include "led.h"

//LED 初始化程序
void led_init(void)
{ 
  GPIO_InitTypeDef  GPIO_LED; //定义GPIO结构体变量
  	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB端口的时钟
  	
  GPIO_LED.GPIO_Pin = GPIO_Pin_0;		  //LED端口配置
  GPIO_LED.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
  GPIO_LED.GPIO_Speed = GPIO_Speed_2MHz;  //IO口速度为2MHz
  GPIO_Init(GPIOB, &GPIO_LED);			  //根据设定参数初始化GPIOB0
  
  GPIO_SetBits(GPIOB,GPIO_Pin_0);	//GPIOB0输出高电平,初始化LED灭
}
 

1.3代码底层实现原理

从ST标准库中找到GPIO有关的头文件:stm32f10x_gpio.h,找到了这个叫GPIO_Init的函数。

在这里插入图片描述

入口参数有GPIOx(端口号)和一个GPIO的结构体,因此在led_init()里我们先定义一个结构体变量:

 GPIO_InitTypeDef  GPIO_LED; //定义GPIO结构体变量

在这里插入图片描述

 结构体有三个成员变量,分别是:引脚号、引脚输出速度、引脚模式。

那我们怎么知道应该填入的参数是什么样子的呢,可以通过看GPIO_Init函数的本体,如图:

在这里插入图片描述

可以看到在GPIO_Init函数内部通过框框里的三个函数来验证输入参数的合法性,通过一次跳转①②③可以查看我们需要输入的参数的规范,如下为配置的LED引脚:

  GPIO_LED.GPIO_Pin = GPIO_Pin_0;			     //LED端口配置
  GPIO_LED.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
  GPIO_LED.GPIO_Speed = GPIO_Speed_2MHz;		 //IO口速度为2MHz

 以上的函数配置我们都没有直接对我们说的GPIO的寄存器进行操作,这是因为ST标准库已经对寄存器进行了封装,我们调用的函数其实最底层完成的工作就是的对寄存器进行读写操作,接下来我们看一下我们在初始化引脚的时候对究竟对什么寄存器进行了什么操作。
  我们来看GPIO_Init(GPIOB, &GPIO_LED);究竟做了什么事情

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
  uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
  uint32_t tmpreg = 0x00, pinmask = 0x00;
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));  
  
/*---------------------------- GPIO Mode Configuration -----------------------*/
  currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
  if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
  { 
    /* Check the parameters */
    assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
    /* Output mode */
    currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
  }
/*---------------------------- GPIO CRL Configuration ------------------------*/
  /* Configure the eight low port pins */
  if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
  {
    tmpreg = GPIOx->CRL;
    for (pinpos = 0x00; pinpos < 0x08; pinpos++)
    {
      pos = ((uint32_t)0x01) << pinpos;
      /* Get the port pins position */
      currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
      if (currentpin == pos)
      {
        pos = pinpos << 2;
        /* Clear the corresp
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值