一、100ASK_IMX6ULL嵌入式裸板学习_LED实验(中)

该博客分析了一个基于C语言的LED控制程序,包括启动汇编代码、头文件定义、主函数及LED控制函数。程序实现了初始化LED、切换LED状态及延时功能,并详细解释了如何配置GPIO寄存器将LED引脚设置为输出模式。
摘要由CSDN通过智能技术生成

以C语言方式驱动(例程与代码分析)

韦东山的例程:

start.s部分:
.text
.global  _start    @全局标号
_start: 				

//设置栈
   ldr  sp,=0x80200000      @设置SP指针,则栈大小为0x200000

   bl clean_bss              @清除BSS段
   
   bl main                  @跳转到C语言的main函数

halt:
   b  halt                 @一个循环

/* 清除BSS段,就是在链接地址处将bss段清零 */
clean_bss:

   ldr r1, =__bss_start            //bss起始地址,r1的值作为内存地址
   ldr r2, =__bss_end              //bss结束地址
   mov r3, #0                      
clean:
   str r3, [r1]                    //将r3中的值放入r1所指向的内存地址 
   add r1, r1, #4                  //然后r1加上4
   cmp r1, r2
   bne clean
   
   mov pc, lr
led.h部分:
#ifndef   __LED_H__
#define   __LED_H__

/**********************************************************************
* 函数名称: led_init
* 功能描述: 初始化LED引脚,就是把它设置为输出引脚
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
***********************************************************************/
void led_init(void);                  //定义LED初始化函数led_init(void)

/**********************************************************************
* 函数名称: led_ctl
* 功能描述: 设置LED状态
* 输入参数: 
*     on : 1-LED点亮, 0-LED熄灭
* 输出参数: 无
* 返 回 值: 无
***********************************************************************/
void led_ctl(int on);                  //定义LED点亮函数

#endif
main.c部分:
#include "led.h"

void delay(volatile unsigned int d)
{
   while(d--);
}


int  main()
{
   led_init();                  //LED初始化

   while(1)
   {
   	led_ctl(1);          //点亮LED
   	delay(1000000);
   	led_ctl(0);          //熄灭LED
   	delay(1000000);
   }
   				
   return 0;
}
led.c部分:
#include "led.h"

static volatile unsigned int *CCM_CCGR1                              ;
static volatile unsigned int *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3;
static volatile unsigned int *GPIO5_GDIR                             ;
static volatile unsigned int *GPIO5_DR                               ;

/**********************************************************************
* 函数名称: led_init
* 功能描述: 初始化LED引脚,就是把它设置为输出引脚
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
***********************************************************************/
void led_init(void)
{
   unsigned int val;
   
   CCM_CCGR1                               = (volatile unsigned int *)(0x20C406C);        //这一步是多余的操作,但是由于[31:30]是保留位,赋值0b11也不会造成什么影响
   IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = (volatile unsigned int *)(0x2290014);
   GPIO5_GDIR                              = (volatile unsigned int *)(0x020AC000 + 0x4);
   GPIO5_DR                                = (volatile unsigned int *)(0x020AC000);

-------------------------------------------------------------------------------------------------------------------------------------------------------------------
   /* GPIO5_IO03 */
   /* a. 使能GPIO5
    * set CCM to enable GPIO5
    * CCM_CCGR1[CG15] 0x20C406C
    * bit[31:30] = 0b11
    */
   *CCM_CCGR1 |= (3<<30);                                                                 //这一步是多余的操作,但是由于[31:30]是保留位,赋值0b11也不会造成什么影响
-------------------------------------------------------------------------------------------------------------------------------------------------------------------

   /* b. 设置GPIO5_IO03用于GPIO
    * set IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3
    *      to configure GPIO5_IO03 as GPIO
    * IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3  0x2290014
    * bit[3:0] = 0b0101 alt5
    */
   val = *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3;
   val &= ~(0xf);
   val |= (5);
   *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = val;
   
   
   /* c. 设置GPIO5_IO03作为output引脚
    * set GPIO5_GDIR to configure GPIO5_IO03 as output
    * GPIO5_GDIR  0x020AC000 + 0x4
    * bit[3] = 0b1
    */
   *GPIO5_GDIR |= (1<<3);

}

/**********************************************************************
* 函数名称: led_ctl
* 功能描述: 设置LED状态
* 输入参数: 
*     on : 1-LED点亮, 0-LED熄灭
* 输出参数: 无
* 返 回 值: 无
***********************************************************************/
void led_ctl(int on)
{
   if (on) /* on: output 0*/
   {
   	/* d. 设置GPIO5_DR输出低电平
   	 * set GPIO5_DR to configure GPIO5_IO03 output 0
   	 * GPIO5_DR 0x020AC000 + 0
   	 * bit[3] = 0b0
   	 */
   	*GPIO5_DR &= ~(1<<3);                //置零操作,点亮LED
   }
   else  /* off: output 1*/
   {
   	/* e. 设置GPIO5_IO3输出高电平
   	 * set GPIO5_DR to configure GPIO5_IO03 output 1
   	 * GPIO5_DR 0x020AC000 + 0
   	 * bit[3] = 0b1
   	 */ 
   	*GPIO5_DR |= (1<<3);                  //置1操作,关闭LED
   }
}

小结(分析)

  在led.c代码部分,static volatile unsigned int定义了所要使用的寄存器的指针变量,其中:static:为静态局部变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

OrangeQG

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

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

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

打赏作者

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

抵扣说明:

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

余额充值