百度招商加盟推广,网站运营优化培训,wordpress分类标签插件,能免费做网站吗摘要#xff1a;你点亮过多少板子的LED灯呢#xff1f;有很多小伙伴留言说讲一下STM32、FPGA、Liunx他们之间有什么不同。不同点很多#xff0c;口说无凭#xff0c;今天就来点亮一下STM32、FPGA和Liunx板子的LED灯#xff0c;大家大致看一下点灯流程和点灯环境以及点灯流… 摘要你点亮过多少板子的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;//100MHzGPIO_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 25d24_999_999
)
(input wire sys_clk , //系统时钟50Mhzinput wire sys_rst_n , //全局复位output reg led_out //输出控制led灯
);reg [24:0] cnt; //经计算得需要25位宽的寄存器才够500ms
reg cnt_flag;//cnt:计数器计数,当计数到CNT_MAX的值时清零
always(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n 1b0)cnt 25b0;else if(cnt CNT_MAX)cnt cnt 1b1;elsecnt 25b0;
//cnt_flag:计数到最大值产生的标志信号
always(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n 1b0)cnt_flag 1b0;else if(cnt CNT_MAX - 1b1)cnt_flag 1b1;elsecnt_flag 1b0;
//led_out:输出控制一个LED灯,每当计数满标志信号有效时取反
always(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n 1b0)led_out 1b0;else if(cnt_flag 1b1)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 beginsys_clk 1b1;sys_rst_n 1b0;#20sys_rst_n 1b1;
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 (25d24 )
)
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
);
endmodule6、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.5GPIO_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个IOGPIO2有22个IOGPIO3有29个IO、GPIO4有29个IOGPIO5最少只有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设置为01015这样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 ab;
ab;
假设a地址为0X20b地址为0x30LDR R0, 0X30
LDR R1, [R0]
LDR R0, 0X20
STR 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, 0X10B0str 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.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-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推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~嵌入式Linux微信扫描二维码关注我的公众号