点亮STM32、FPGA和Liunx板子的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/1nsmodule  tb_counter();//wire  definewire            led_out     ;//reg   definereg             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,频率为50mhzalways #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_io03的bit3~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] 我们在使用汇编编写驱动的时候最常用的就是ldr和str这两个指令。
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* -lchmod 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亮。
最后,你觉得哪个板子点灯最简单呢?
原文标题:史上最全的led点灯程序!
文章出处:【微信公众号:凡亿pcb】欢迎添加关注!文章转载请注明出处。

iphone8什么时候上市?iphone8最新消息:苹果iphone8:全面屏设计+竖向摄像头+闪光灯设计+Touch ID没取消,攒钱!
iphone8什么时候上市?iphone8样张曝光,屏幕更大体积更小,就这颜值你会买吗?
焊接机器人焊接飞溅多该如何处理?
中芯国际第一代先进技术良率达业界量产水平
三星QLED电视机接受预订:起售价17175元人民币
点亮STM32、FPGA和Liunx板子的LED灯
赋能工业4.0,向日葵远程协助远程协助提升售后效率
基于第二代Intel至强可扩展处理器的OTII边缘服务器正式发布
华为Mate 40线上订购比火车票还难抢
8TB固态硬盘版本Mac Pro上架 相较4TB选配价格基本翻倍
Diodes公司宣布推出两款控制器
华培动力拉开战略发展的序幕,收购盛迈克布局汽车智能化
华为通过强化AI实践教育培养更多人才 大力推动人工智能的全面发展
百度度秘总经理景鲲:DuerOS要做AI时代的安卓
5G技术对于智慧城市的建设是扮演怎样的角色
创基usb hub集线器诞生了可以以一敌八
黄永和:禁售传统燃油车将为加速我国汽车电动化进程带来很大机遇
vivo Y16配备联发科Helio G70芯片在印度发布
或门符号
陕西航晶微电子有限公司召开产品设计定型鉴定会