史上最全的LED点灯程序,你都掌握了吗?

干货福利,第一时间送达!

摘要:你点亮过多少板子的LED灯呢?有很多小伙伴留言说讲一下STM32、FPGA、Liunx他们之间有什么不同。不同点很多,口说无凭,今天就来点亮一下STM32、FPGA和Liunx板子的LED灯,大家大致看一下点灯流程点灯环境以及点灯流程,就能大概的了解一下三者的区别,可以有选择的去学习!

一、使用STM32点亮LED灯

STM32从字面上来理解ST是意法半导体,M是Microelectronics的缩写,32 表示32位,合起来理解,STM32就是指ST公司开发的32位微控制器。在如今的32 位控制器当中,STM32可以说是最璀璨的新星,它受宠若娇,大受工程师和市场的青睐,无芯能出其右。首先使用STM32电亮一个led灯,大家现在回过头来看是不是非常的简单。

STM32初始化流程

1、使能指定GPIO的时钟。

2、初始化GPIO,比如输出功能、上拉、速度等等。

3、STM32有的IO可以作为其它外设引脚,也就是IO复用,如果要将IO作为其它外设引脚使用的话就需要设置 IO 的复用功能。

4、最后设置GPIO输出高电平或者低电平。

1、新建工程

2、代码编写

//LED IO初始化
void LED_Init(void)
{      
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
  //GPIOF9,F10初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO 
  GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
}

3、编译代码

4、配置下载器

烧录代码

二、使用FPGA点亮LED灯

FPGA(Field Programmable Gate Array,简称 FPGA),译文:现场可编程门阵列,一种主要以数字电路为主的集成芯片,于1985年由Xilinx创始人之一 Ross Freeman发明,属于可编程逻辑器件PLD(Programmable Logic Device)的一种。真正意义上的第一颗FPGA芯片XC2064为Xilinx所发明,这个时间差不多比著名的摩尔定律晚20年左右,但是FPGA一经发明,后续的发展速度之快,超出大多数人的想象。

计数器是在FPGA设计中最常用的一种时序逻辑电路,根据计数器的计数值我们可以精确的计算出FPGA内部各种信号之间的时间关系,每个信号何时拉高、何时拉低、拉高多久、拉低多久都可以由计数器实现精确的控制。而让计数器计数的是由外部晶振产生的时钟,所以可以比较精准的控制具体需要计数的时间。计数器一般都是从0开始计数,计数到我们需要的值或者计数满溢出后清零,并可以进行不断的循环。

本例我们让计数器计数1s时间间隔,来实现led灯每隔1s闪烁一次的效果。

LED灯硬件原理图

流水灯实验管脚分配

1、模块框图

模块框图

输入输出信号描述

2、RTL代码的编写

开始RTL代码的编写,RTL代码编写出的模块叫RTL模块(后文中也称功能模块、可综合模块)。之所以叫RTL代码是因为用Verilog HDL在Resistances Transistors Logic(寄存器传输级逻辑)来描述硬件电路,RTL代码能够综合出真实的电路以实现我们设计的功能,区别于不可综合的仿真代码。

`timescale  1ns/1ns//带标志信号的计数器module  counter#(    parameter   CNT_MAX = 25'd24_999_999)(    input   wire    sys_clk     ,   //系统时钟50Mhz    input   wire    sys_rst_n   ,   //全局复位    output  reg     led_out         //输出控制led灯);

reg     [24:0]  cnt;       //经计算得需要25位宽的寄存器才够500msreg             cnt_flag;

//cnt:计数器计数,当计数到CNT_MAX的值时清零always@(posedge sys_clk or negedge sys_rst_n)    if(sys_rst_n == 1'b0)        cnt <= 25'b0;    else    if(cnt < CNT_MAX)         cnt <= cnt + 1'b1;    else       cnt <= 25'b0;//cnt_flag:计数到最大值产生的标志信号always@(posedge sys_clk or negedge sys_rst_n)    if(sys_rst_n == 1'b0)        cnt_flag <= 1'b0;    else    if(cnt == CNT_MAX - 1'b1)        cnt_flag <= 1'b1;    else        cnt_flag <= 1'b0;//led_out:输出控制一个LED灯,每当计数满标志信号有效时取反always@(posedge sys_clk or negedge sys_rst_n)    if(sys_rst_n == 1'b0)        led_out <= 1'b0;    else    if(cnt_flag == 1'b1)        led_out <= ~led_out;endmodule

3、代码的分析和综合

4、 查看RTL视图

5、Testbench代码的编写

`timescale  1ns/1ns
module  tb_counter();

//wire  define
wire            led_out     ;

//reg   define
reg             sys_clk     ;
reg             sys_rst_n   ;

//初始化系统时钟、全局复位
initial begin
    sys_clk    = 1'b1;
    sys_rst_n <= 1'b0;
    #20
    sys_rst_n <= 1'b1;
end

//sys_clk:模拟系统时钟,每10ns电平翻转一次,周期为20ns,频率为50Mhz
always #10 sys_clk = ~sys_clk;

initial begin
    $timeformat(-9, 0, 'ns', 6);
    $monitor('@time %t: led_out=%b', $time, led_out);
end

//------------- counter_inst --------------
counter
#(
    .CNT_MAX    (25'd24     ) 
)
counter_inst
(
    .sys_clk    (sys_clk    ),  //input     sys_clk
    .sys_rst_n  (sys_rst_n  ),  //input     sys_rst_n

.led_out    (led_out    )   //output    led_out
);
endmodule

6、ModelSim仿真波形

7、上板验证

程序下载完毕后,会看到板卡LED0不断闪烁,时间间隔为1秒。

三、使用I.MX6ULL IO点亮LED

嵌入式linux学习者大体可以分为两类,一类是进阶用户,主要指已经有大量mcu工作经验的开发者, 他们希望进阶到更有难度,薪资更高的mpu开发中去。另一类则是学生用户,主要是刚开始接触嵌入式开发的大学生群体。

I.MX应用处理器包括I.MX8、I.MX7、I.MX6及I.MX28系列,被广泛应用于工业控制、汽车电子领域,久经市场考验。而且它的产品线非常丰富,用户熟悉其中一款产品后就能非常方便地迁移至不同的平台。

一般拿到一款全新的芯片,第一个要做的事情的就是驱动其GPIO,控制其GPIO输出高低电平,我们学习I.MX6U也一样的,先来学习一下I.MX6U的GPIO。在学习I.MX6U的GPIO之前,我们可以对比一下STM32的GPIO初始化(如果没有学过 STM32 就不用回顾了),我们以最常见的STM32F103为例来看一下STM32的GPIO初始化,示例代码如下:

void LED_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能 PB 端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PB5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度 GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化 GPIOB.5 GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高}

STM32初始化流程

1、使能指定GPIO的时钟。

2、初始化 GPIO,比如输出功能、上拉、速度等等。

3、STM32 有的 IO 可以作为其它外设引脚,也就是 IO 复用,如果要将 IO 作为其它外设引脚使用的话就需要设置 IO 的复用功能。

4、最后设置GPIO输出高电平或者低电平。

I.MX6U的GPIO一共有5组:GPIO1、GPIO2、GPIO3、GPIO4和GPIO5,其中GPIO1有32个IO,GPIO2有22个IO,GPIO3有29个IO、GPIO4有29个IO,GPIO5最少,只有12个IO,这样一共有124个GPIO

I.MX6ULL IO初始化流程

1、使能时钟,CCGR0—CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。为了简单,设置CCGR0~CCGR6这7个寄存器全部为0XFFFFFFFF,相当于使能所有外设时钟。

2、IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03bit3~0设置为0101=5,这样GPIO1_IO03就复用为GPIO

3、寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性。包括压摆率、速度、驱动能力、开漏、上下拉等。

4、配置GPIO功能,设置输入输出。设置GPIO1_DR寄存器bit3为1,也就是设置为输出模式。设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0表示输出低电平。

汇编由一条一条指令构成,指令就涉及到汇编指令。

Int a,b;
a=b;

假设a地址为0X20,b地址为0x30

LDR R0, =0X30LDR R1, [R0]LDR R0, =0X20STR R1, [R0]

我们在使用汇编编写驱动的时候最常用的就是LDRSTR这两个指令。

1、新建工程

新建工程文件夹

新建裸机驱动文件夹
新建LED灯文件夹

2、在VSCode中编写代码

ubuntu中我们使用的是VScode编辑器来写代码,跟在windows中新建项目一样,新建项目、保存工作区,然后编写代码。

3、编写代码

.global _start  /* 全局标号 */

_start:

/* 1、使能所有时钟 ldf如果用大写就全部用大写,如果小写就全部用小写*/
 ldr r0, =0X020C4068 //将寄存器CCGR0地址0X020C4068 存放到 寄存器R0 中
 ldr r1, =0XFFFFFFFF //把寄存器x地址0Xffffffff存放到 寄存器r1 中
 str r1, [r0]//把寄存器r1中的值(0XFFFFFFFF) 写入到寄存器r0里面的值作为地址的内存里面
 
 ldr r0, =0X020C406C/*将寄存器CCGR1地址(0X020C4068) 存放到 寄存器R0 中*/
 str r1, [r0]

ldr r0, =0X020C4070   /* CCGR2 */
 str r1, [r0]
 
 ldr r0, =0X020C4074   /* CCGR3 */
 str r1, [r0]
 
 ldr r0, =0X020C4078   /* CCGR4 */
 str r1, [r0]
 
 ldr r0, =0X020C407C   /* CCGR5 */
 str r1, [r0]
 
 ldr r0, =0X020C4080   /* CCGR6 */
 str r1, [r0]

/* 2、设置GPIO1_IO03复用为GPIO1_IO03 */
 ldr r0, =0X020E0068 /* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */
 ldr r1, =0X5  /* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */
 str r1,[r0]

/* 3、配置GPIO1_IO03的IO属性 
  *bit 16:0 HYS关闭
  *bit [15:14]: 00 默认下拉
     *bit [13]: 0 kepper功能
     *bit [12]: 1 pull/keeper使能
     *bit [11]: 0 关闭开路输出
     *bit [7:6]: 10 速度100Mhz
     *bit [5:3]: 110 R0/6驱动能力
     *bit [0]: 0 低转换率
     */
    ldr r0, =0X020E02F4 /*寄存器SW_PAD_GPIO1_IO03_BASE */
    ldr r1, =0X10B0
    str r1,[r0]

/* 4、设置GPIO1_IO03为输出 */
    ldr r0, =0X0209C004 /*寄存器GPIO1_GDIR */
    ldr r1, =0X0000008  
    str r1,[r0]

/* 5、打开LED0
  * 设置GPIO1_IO03输出低电平
  */
 ldr r0, =0X0209C000 /*寄存器GPIO1_DR */
   ldr r1, =0  
   str r1,[r0]

/*
 * 描述:loop死循环
 */
loop:
 b loop     
.global _start @全局标号
/**/

4、编译代码

使用如下三条命令来编译代码

arm-linux-gnueabihf-gcc -g -c leds.s -o led.oarm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elfarm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
编译、链接、格式转换

最终生成了led.o led.elf led.bin三个文件

5、烧写代码

STM32中代码烧写到内部FLASH。IMX6ULL支持SD卡、EMMC、NAND、nor、SPI flash等启动。裸机例程选择烧写到SD卡里面。在ubuntu下向SD卡烧写裸机bin文件。烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡绝对地址上。而且对于I.MX而言,不能直接烧写bin文件,比如先在bin文件前面添加头部。完成这个工作,需要使用正点原子提供的imxdownload软件。

利用FileZilla Client软件将imxdownload软件发送到工程目录下

烧写的三个命令

ls /dev/sd* -l
chmod 777 imxdownload 
./imxdownload led.bin /dev/sdb

Imxdownload使用方法,确定要烧写的SD卡文件,需要使用ls /dev/sd* -l命令来检测SD是哪一个文件,我的是/dev/sdb

插拔SD卡可以看到两个的区别

给予imxdownload可执行权限:Chmod 777 imxdownload

烧写:./imxdownload led.bin /dev/sdb

向SD卡烧写完成

Imxdownlaod会向led.bin添加一个头部,生成新的load.imx文件,这个load.imx文件就是最终烧写到SD卡里面去的。

这里要注意的是如果烧写的速度在几十MB/S左右的话,那么可能意味着烧写失败了。而且是因为SD卡没找到而导致烧写失败,这个问题只能重启 ubuntu解决。

之后就可以从读卡器中把SD拔下来,然后插入到开发板中,将拨码开关拔止SD卡模式,供电之后,蓝色LED亮,红色LED灭,两秒钟之后红色LED亮。

最后你觉得哪个板子点灯最简单呢?

End

推荐好文  点击蓝色字体即可跳转

【收藏】烂大街的ESP82666该咋玩

☞【鸡汤】一个普通人的大学四年
☞【干货】基于STM32的PS2遥控小车
☞【干货】手把手教你写一个安卓APP
☞【干货】手把手教你写单片机的指针
☞【干货】手把手教你写单片机的结构体
(0)

相关推荐

  • 从这些知识点入手,学单片机就简单多了

    自从CubeMX等图像配置软件的出现,同学们往往点几下鼠标就解决了单片机的配置问题.对于追求开发速度的业务场景下,使用快速配置软件是合理的,高效的,但对于学生的学习场景下,更为重要的是知其然并知其所以 ...

  • STM32的IO口的八种模式

    STM32的IO口可以由软件配置成如下8种模式: 1.输入浮空 2.输入上拉 3.输入下拉 4.模拟输入 5.开漏输出 6.推挽输出 7.推挽式复用功能 8.开漏复用功能 每组IO口包含7个寄存器. ...

  • 9.Cortex-A9LED汇编、C语言驱动编写

    https://m.toutiao.com/is/eYrknJp/ 0. 前言 一般我们购买一个开发板,厂家都会给出对应的电路图文件,我们可以通过搜索对应名称来查找到对应的外设.对于驱动工程师来说,我 ...

  • UC头条:STM32GPIO基本原理与寄存器配置(STM32篇)

    STM32F10X 引脚说明 STM32F103ZET6一共有7组IO口,每组IO口有16个IO,分别为GPIOA~GPIOG,每组分别为PA0到PA16,STM32F103RCT6一个有4组IO口, ...

  • STM32的8种GPIO输入输出模式深入详解

    输入模式 -输入浮空(GPIO_Mode_IN_FLOATING) -输入上拉(GPIO_Mode_IPU) -输入下拉(GPIO_Mode_IPD) -模拟输入(GPIO_Mode_AIN) 输出模 ...

  • 【Linux笔记】LED驱动程序

    前言 学STM32我们从点灯开始,学Linux驱动我们自然也要点个灯来玩玩,尽量在从这些基础例程中榨取知识,细抠.细抠,为之后更复杂的知识打好基础. 与硬件无关的LED驱动 回顾hello驱动程序,我 ...

  • STM32 GPIO模式汇总分析

    IO也叫GPIO,即通用输入输出端口,主要有一下几种模式: 1.浮空输入模式: 2.上拉输入: 3.下拉输入: 4.模拟输入: 5. 推挽输出: 6. 开漏输出: 7. 复用推挽输出: 8. 复用开漏 ...

  • [原创]NUCLEO-F410RB 测评第一周: 运行尝试

    我最近一段时间在使用STM32F0,所以算是接触并稍微了解了STM32系列.拿到NUCLEO-F410RB,板子外观几乎和自己的NUCLEO-F091RC是一样的.不过学习了一下手册,就知道核心的差别 ...

  • 史上最全的吸毒植物 · 新房旧房都可以放

    新房往往由于在装修过程中, 会遗留下很多的残余毒物, 这个时候我们会放些植物花草清除这些有害物质. 那么新装修的房子放什么植物好呢? 今天小编介绍一些可以除异味又可以防辐射的植物, 让我们一起来看看吧 ...

  • 史上最全中医妇科用药,药店人都收藏了!

    月经病 月经先期 1.气虚证:补脾益气.固冲调经-补中益气汤 2. 血热型 阳盛血热型:清热凉血调经-清经散 肝郁化热证:清肝解郁调经-丹栀逍遥散 阴虚血热型:养阴清热调经-两地汤   月经后期 1. ...

  • 史上最全飞花令,125句都是精华,值得收藏!

    ◆ ◆ ◆ 飞花令,得名于唐代诗人韩翃<寒食>中的名句"春城无处不飞花",是古人行酒令时的一种文字游戏,饱含诗词之趣. 飞花令属雅令,比较高雅,没有诗词基础的人根本玩不 ...

  • 史上最全,施工人员入场安全教育都做点啥?

    工程施工管理 公众号 1.施工人员入场安全教育流程 2.施工人员入场三级安全教育卡 3.律师告知函 4.入场安全教育 5.施工现场安全生产文明施工奖罚制度 6.工人安全生产职责 7.分包施工队伍负责人 ...

  • 史上最全郎世宁字画介绍,一次性都收藏全了!

    今天中国重新对世界敞开了大门,我们不要忘记利玛窦.郎世宁这一代先驱,对于他们历史性的功绩,以及基督敎文化,都应该有新的评价. 对美术不熟悉的人可能不太熟悉郎世宁,但他参与设计的圆明园西洋楼可谓无人不知 ...

  • 史上最全飞花令,125句都是精华!

    粗缯大布裹生涯,腹有诗书气自华. 春江花月夜 李炜(古筝演奏家) - 魔筝之缘断 飞花令,得名于唐代诗人韩翃<寒食>中的名句"春城无处不飞花",是古人行酒令时的一种文字 ...

  • 史上最全的公差配合动画,都在这里了

    /01 47个公差视频&动画 01.滚动轴承 

  • 史上最全的吸毒植物 · 新房旧房都要放

    健康 Noble Music Project - 水晶音乐御守 / 消灾‧解厄 新房往往由于在装修过程中, 会遗留下很多的残余毒物, 这个时候我们会放些植物花草清除这些有害物质, 那么新装修的房子放什 ...

  • 史上最全汉代玉介绍,一次性都收藏全了!

    刚卯是汉代特有的玉器,人们佩戴于身,以驱逐疫鬼.正如<说文>所曰;效改大刚卯以逐鬼险也.汉朝廷对不同等级的官员佩戴刚卯的废料还专门作了规定. 汉代玉器可分为人身上的玉饰和器物上的玉饰两大类 ...