0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用C语言控制LED灯的实现

嵌入式开发爱好者 来源:嵌入式开发爱好者 作者:嵌入式开发爱好者 2022-11-30 09:58 次阅读

第一:C语言板控制LED灯简介

实际工作中很少会使用到汇编去编写嵌入式驱动,毕竟汇编太难,写出来也不好理解,大部分情况下都使用C语言去编写。只是在开始部分用汇编初始化一下C语言环境,比如初始化DDR、设置堆栈指针SP等。当这些工作都做完以后就可以进入C语言环境,也就是运行C语言代码,一般都是进入main函数。所以都是进入main函数,有两部分文件要做:

1、汇编文件

汇编文件只是用来完成C语言环境搭建的。

2、C语言文件

C语言文件就是完成我们的业务层代码的,其实就是我们实际要完成的功能。其实STM32也是这样的,只是我们在开发STM32的时候没有想到这一点,以STM32中启动文件startup_stm32f10x_hd.s这个汇编文件就是完成C语言环境搭建的,当然还有一些其他处理,比如中断向量表等。

第二:实验程序实现

在STM32中,启动文件startup_hd.s就是完成C语言环境搭建的,当然还有一些其他的处理。

 Stack_Size EQU 0x00000400
                 AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
 __initial_sp
;HeapConfiguration
;HeapSize(inBytes)<0x0-0xFFFFFFFF:8>
;


Heap_SizeEQU0x00000200


  AREAHEAP,NOINIT,READWRITE,ALIGN=3
  __heap_base
  Heap_MemSPACEHeap_Size
__heap_limit
//省略掉部分代码
Reset_Handler PROC
    EXPORT Reset_Handler [WEAK]
  IMPORT__main
   IMPORTSystemInit
   LDRR0,=SystemInit
   BLXR0
   LDRR0,=__main
BXR0
ENDP

代码分析:设置栈的大小,这里设置为0X400=1024字节。下面遇到的__initial_sp就是初始化SP指针。设置堆的大小,复位中断服务函数,STM32复位完成以后会执行中断服务函数。调用SystemInit()函数来完成其他初始化工作,会调用__main是库函数实现。

.global _start /* 全局标号 */
_start:
/* 进入 SVC 模式 */
mrsr0,cpsr
bicr0,r0,#0x1f/*将r0的低5位清零,也就是cpsr的M0~M4*/
orrr0,r0,#0x13/*r0或上0x13,表示使用SVC模式*/
msrcpsr,r0//将r0的数据写入到cpsr_c中
ldr sp, =0X80200000 /* 设置栈指针 */
bmain/*跳转到main函数*/

这里我们可以设置处理器运行于SVC模式下,处理器模式的设置是通过修改CPSR程序状态寄存器来完成的。上面编写的start.s文件中却没有初始化DDR3的代码,但是却将SVC模式下的SP指针设置到了DDR3的地址范围中,这不会出问题吗?肯定不会的,DDR3肯定还是要初始化的,DCD数据包含了DDR配置参数,内部的Boot ROM会读取DCD数据中的参数完成DDR初始化的。

第三:C语言实验控制程序

C语言部分有两个文件件 main.c 和 main.h,main.h 里面主要是定义的寄存器地址,在 main.h里面输入代码:

#ifndef __MAIN_H
#define __MAIN_H
//CCM相关寄存器地址
#define CCM_CCGR0 *((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)
#defineCCM_CCGR2*((volatileunsignedint*)0X020C4070)
#defineCCM_CCGR3*((volatileunsignedint*)0X020C4074)
#defineCCM_CCGR4*((volatileunsignedint*)0X020C4078)
#defineCCM_CCGR5*((volatileunsignedint*)0X020C407C)
#defineCCM_CCGR6*((volatileunsignedint*)0X020C4080)
//相关寄存器地址
#define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
//GPIO1相关寄存器地址
 #define GPIO1_DR *((volatile unsigned int *)0X0209C000)
 #define GPIO1_GDIR *((volatile unsigned int *)0X0209C004)
 #define GPIO1_PSR *((volatile unsigned int *)0X0209C008)
#defineGPIO1_ICR1*((volatileunsignedint*)0X0209C00C)
#defineGPIO1_ICR2*((volatileunsignedint*)0X0209C010)
#defineGPIO1_IMR*((volatileunsignedint*)0X0209C014)
#defineGPIO1_ISR*((volatileunsignedint*)0X0209C018)
#defineGPIO1_EDGE_SEL*((volatileunsignedint*)0X0209C01C)


#endif

在main.h中以宏定义的形式定义要使用到所有的寄存器,后面的数字就是其地址信息,比如CCM_CCGR0 寄存器的地址就是 0X020C4068,这个很简单,很好理解。main.c函数的具体实现。

#include"main.h"
//使能外设的所有时钟
void clk_enable(void)
{
CCM_CCGR0=0xffffffff;
CCM_CCGR1=0xffffffff;
CCM_CCGR2=0xffffffff;
CCM_CCGR3=0xffffffff;
CCM_CCGR4=0xffffffff;
CCM_CCGR5=0xffffffff;
CCM_CCGR6=0xffffffff;
}

//初始化LED对应的GPIO时钟
void led_init(void)
{
/* 1、初始化 IO 复用, 复用为 GPIO1_IO03 */
     SW_MUX_GPIO1_IO03 = 0x5;
     
//配置GPIO1_IO03属性
  SW_PAD_GPIO1_IO03 = 0X10B0;
  
//初始化GPIO,GPIO_IO03设置为输出
GPIO1_GDIR=0X0000008;

//设置GPIO1_IO03输出低电平,打开LED0
GPIO1_DR=0x0;
}

//打开对应的LED灯
void led_on(void)
{
  //将GPIO1_DR 的 bit3 清零 
  GPIO1_DR &= ~(1<<3);
}

//关闭LED灯
void led_off(void)
{
    GPIO1_DR |= (1<<3);
}

//短暂的延时函数
void delay_short(volatile unsigned int n)
{
while(--){}
}

//延时大约1ms的函数
void delay(volatile unsigned int n)
{
    while(n--)
    {
delay_short(0x7ff);
    }
}

int main(void)
{
    clk_enable(); /* 使能所有的时钟 */
    led_init();/*初始化led*/
    
    while(1)/*死循环*/
{
   led_off();/*关闭LED*/
   delay(500);/*延时大约500ms*/
  
   led_on();/*打开LED*/
   delay(500);/*延时大约500ms*/
}


    return0;
}

利用Makefile文件可以进行编译,将对应的可执行文件,放到开发板上,可以看到LED大概500ms闪烁一次。

总结:利用C语言实现底层驱动的控制,要注意可执行程序放的位置,以及如何链接编译等。

审核编辑:郭婷


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    242

    文章

    23281

    浏览量

    660990
  • Linux
    +关注

    关注

    87

    文章

    11306

    浏览量

    209570
  • 函数
    +关注

    关注

    3

    文章

    4332

    浏览量

    62640

原文标题:Linux系统中利用C语言控制LED灯的实现

文章出处:【微信号:嵌入式开发爱好者,微信公众号:嵌入式开发爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用C语言实现函数模板

      用C语言能不能实现一个通用的函数,既能完成整数的相加,又能完成浮点数的相加?
    的头像 发表于 11-09 11:38 394次阅读

    呼吸的概念和实现原理

    呼吸在日常生活中经常见到,如电子时钟,小夜灯等等,本文我们介绍下通过PWM波来控制LED实现呼吸
    的头像 发表于 10-24 14:50 1371次阅读
    呼吸<b class='flag-5'>灯</b>的概念和<b class='flag-5'>实现</b>原理

    霍尔开关在鱼缸LED中的应用

    水温。 你知道吗?霍尔开关在鱼缸LED中起着关键性作用,霍尔开关是如何应用于LED板中的呢? 在鱼缸LED
    的头像 发表于 10-09 09:59 234次阅读

    COB光源与LED珠的区别

    的发光二极管。 光输出: COB珠: 由于多个LED芯片集成在一个区域,COB珠通常提供更均匀的光输出,因为光源更为集中。 LED
    的头像 发表于 09-19 09:33 4624次阅读

    PLC编程语言C语言的区别

    在工业自动化和计算机编程领域中,PLC(可编程逻辑控制器)编程语言C语言各自扮演着重要的角色。尽管两者都是编程语言,但它们在多个方面存在显
    的头像 发表于 06-14 17:11 2845次阅读

    使用C语言实现的CRC计算单元的例子

    使用C语言实现的CRC计算单元的例子
    的头像 发表于 05-16 16:16 997次阅读

    光照LED控制蘑菇栽培

    ,蘑菇在卫生控制设施中生长,以防止有害细菌的影响。蘑菇属于真菌,不会进行光合作用,因为紫外线会抑制菌丝体的生长。栽培期间在光线照射有限的暗室中进行,在子实体发育生长阶段,常用荧光作为光源来控制光照。 尽管蘑菇不进行光合作用,但
    的头像 发表于 05-11 11:17 422次阅读

    请问STM32L4如何利用STM32CubeMX实现EXTI控制LED?

    STM32L4利用STM32CubeMX如何实现EXTI控制LED?
    发表于 04-09 08:07

    C语言实现Web参数传递

    电子发烧友网站提供《C语言实现Web参数传递.docx》资料免费下载
    发表于 03-24 09:14 2次下载

    LED条的分类

    为一体驱动板(板只有LED光源,就没有任何电子元器件)。②:精密电子元器件恒流驱动就是板+恒流IC+LED光源为一体。③:CV=恒压
    的头像 发表于 02-27 20:13 1650次阅读
    <b class='flag-5'>LED</b><b class='flag-5'>灯</b>条的分类

    全光谱和普通led的区别

    全光谱和普通led的区别  全光谱和普通LED是目前市场上常见的两种照明产品,它们在使用
    的头像 发表于 02-18 18:07 8465次阅读

    plc编程语言c语言的联系 c语言和PLC有什么区别

    PLC编程语言C语言的联系 PLC(可编程逻辑控制器)是一种针对自动化控制系统的特殊计算机。PLC编程
    的头像 发表于 02-05 14:21 4149次阅读

    led是什么意思有什么用

    LED的原理 LED的原理是通过电流通过半导体材料时,电流与电子结合释放出光能。这种光能是通过半导体材料内的能级差产生的。LED
    的头像 发表于 02-01 17:27 2542次阅读

    LED的优点和用途

    LED是一种能效高、寿命长的照明产品,具有许多优点,并且在各个领域有广泛的用途。下面将介绍LED的优点和用途。 一、LED
    的头像 发表于 01-15 14:42 3246次阅读

    LED闪光电路图分享

    ,由于LED闪光使用的是LED芯片,因此可以通过调整电流来控制闪光的亮度,从而实现更加精确的
    的头像 发表于 01-08 18:19 2635次阅读
    <b class='flag-5'>LED</b>闪光<b class='flag-5'>灯</b>电路图分享