* 优化编译脚本,加快编译速度。
* 优化代码生成,大幅减小wasm文件体积。
* 增加模拟器外壳。
AWTK支持越来越丰富了。
串口3的时钟应该是开了,工程里面根据id作为偏移量开启时钟的。
void sunxi_usart_init(sunxi_usart_t *usart)
{
uint32_t addr;
uint32_t val;
/* Config usart TXD and RXD pins */
sunxi_gpio_init(usart->gpio_tx.pin, usart->gpio_tx.mux);
sunxi_gpio_init(usart->gpio_rx.pin, usart->gpio_rx.mux);
/* Open the clock gate for usart */
addr = T113_CCU_BASE + CCU_USART_BGR_REG;
val = read32(addr);
val |= 1 << usart->id;
write32(addr, val);
/* Deassert USART reset */
addr = T113_CCU_BASE + CCU_USART_BGR_REG;
val = read32(addr);
val |= 1 << (16 + usart->id);
write32(addr, val);
/* Config USART to 115200-8-1-0 */
addr = usart->base;
write32(addr + 0x04, 0x0);
write32(addr + 0x08, 0xf7);
write32(addr + 0x10, 0x0);
val = read32(addr + 0x0c);
val |= (1 << 7);
write32(addr + 0x0c, val);
write32(addr + 0x00, 0xd & 0xff);
write32(addr + 0x04, (0xd >> 8) & 0xff);
val = read32(addr + 0x0c);
val &= ~(1 << 7);
write32(addr + 0x0c, val);
val = read32(addr + 0x0c);
val &= ~0x1f;
val |= (0x3 << 0) | (0 << 2) | (0x0 << 3);
write32(addr + 0x0c, val);
}
时钟相关代码应该是这几行。
/* Open the clock gate for usart */
addr = T113_CCU_BASE + CCU_USART_BGR_REG;
val = read32(addr);
val |= 1 << usart->id;
write32(addr, val);
/* Deassert USART reset */
addr = T113_CCU_BASE + CCU_USART_BGR_REG;
val = read32(addr);
val |= 1 << (16 + usart->id);
write32(addr, val);
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/allwinner_t113
remotes/origin/aozima_dev
remotes/origin/aozima_test
remotes/origin/aozima_test1
remotes/origin/gitee_fix
remotes/origin/gitee_master
remotes/origin/gitee_master_dev
remotes/origin/github_EDI-Systems_pr1339
remotes/origin/lts-v3.1.x
remotes/origin/master
remotes/origin/stable-v1.2.x
remotes/origin/stable-v2.0.x
remotes/origin/stable-v2.1.x
remotes/origin/stable-v3.0.x
$ git checkout -b allwinner_t113 origin/allwinner_t113
Updating files: 100% (26292/26292), done.
Switched to a new branch 'allwinner_t113'
branch 'allwinner_t113' set up to track 'origin/allwinner_t113'.
这个地址是分时使用的。
配置DLAB前,和配置之后,访问的寄存器不一样。
之前rt-thread有支持t113的,现在不支持了,各位知道原因吗?
在gitee能找到 rt-thread-allwinner_t113 这个项目的
楼主能出一个配置adb的教程吗,配置了usb后不知道咋操作了,传不了文件
参考这一篇,可以用串口直接传文件
https://whycan.com/t_4266.html
请教一下大佬,这个最后一步烧入bin文件到单板上怎么烧入的,有没有详细步骤。
教程在晕哥这个链接
编译、安装Windows版本sunxi-fel步骤 (32M spi flash补丁,支持W25Q256/MX25L256)
https://whycan.com/t_444.html#p1130
牛13!
@LinjieGuo
我这边调试f1c100s+rtthread的时候,使用sunxi-fel将boot刷到flash的时候,boot程序多次没更新到spi flash中,后来晕哥说sunxi-fel不检测flash的存在。请问你这边用sunxi-fel刷新boot或者app又发现这种现象不?
没有出现你的情况,你可以参考这篇帖子,里面留了文件。
看到一份官网开发文档https://doc.zh-jieli.com/AC79/zh-cn/master/index.html,然后在淘宝和b站都有看到官方在普及芯片。芯片性价比真是无敌呀
2023/01/04,淘宝看到,样品售价,11元/片,还不错。
我买了个饭盒,收件地址,广东广州番禺8天没到,然后。。。
快递到了广州,提示:由于派件员忙,派送时间可能增加。
结果,物流居然直接退回去了。。。
I bought a lunch box. The delivery address was Panyu, Guangzhou, Guangdong. I hadn't been there for 8 days, and then...
When the express arrived in Guangzhou, it was suggested that the delivery time might increase due to the busy dispatchers.
As a result, the logistics actually returned directly...
楼主可能是不知道怎么上传文件到whycan,
我刚好是CSDN会员,帮楼主把文件挪过来啦。(狗头保命)
另外,工程本身很小,git文件夹五十多MB,我删掉了。。。
whycan下载:F1C100S_FreeRTOS_no_git.zip
外站免费下载:F1C100S_FreeRTOS_no_git.rar(可能会失效)
虽然我没搞过C#,但很明显 textBox_debug应该要像textBox_recv那样AppendText时要区分HEX和ASCII
嗯嗯,你说的这一点也是对的。
不过问题不是出在这个地方,问题是:数据内容接收到了,但是出现读取到的长度却不一致的情况。
后来在@周正的指导下,解决这个问题。
(1)使用ReadExisting()这个方法从串口接收中取数据,适用于字符串,可能不太适合面向字节流的数据。
(2)所以,接收代码修改为:
//串口接收事件
private void ReceiveData(object sender, SerialDataReceivedEventArgs e)
{
byte[] datas = new byte[serialPort1.BytesToRead];
int len = serialPort1.Read(datas, 0, datas.Length);
//数据写入环形缓冲区
recv_lp.write_data(datas, len);
show_recv_data(datas, len);
/*
string content = serialPort1.ReadExisting(); //从串口中读取输入流,返回string
ShowData(content);
*/
}
private void show_recv_data(byte[] data, int len)
{
//更新接收数据计数
recv_cntr += (UInt32)len;
lab_recv_cntr.Text = recv_cntr.ToString();
if (rbtn_recv_hex.Checked)
{//按HEX模式 展示接收到的内容
for (int i = 0; i < len; i++)
{
textBox_recv.AppendText(string.Format("{0:X2} ", data[i]));
}
}
else
{//按ASCII模式 展示接收到的内容
string str = System.Text.Encoding.Default.GetString(data);
textBox_recv.AppendText(str);
}
}
3、测试
工程跑起来后,插入CH340G,将TX RX短接,
(1)设置为ascii模式,收发一切正常。
(2)设置为HEX模式,发送0x01、0x02 、0x99等不带字母的十六进制数,正常。
但是发送0xA0,这样带字母的十六进制数,就会出现以下情况。
(为了调试方便,我加入了日志打印区。在发生接收事件时,做2件事情,①在接收区显示收到的数据,②在日志区显示收到了多长的数据)
[1]第一次发送0xA0,触发了接收事件,①显示区没有任何显示;②数据长度是0
[2]第二次发送0xA0,触发了接收事件,①显示区显示了2个A0;②数据长度是1
结果是,数据长度对不上。。。请问有没有大神懂这是什么原因呢?
附上工程:uart_tool_base_v001_20221128.zip
外链免费下载:uart_tool_base_v001_20221128.zip
嵌入式产品一般出场前要经过参数设定、参数校准、终端号设置等操作,单片机上面没有太多的设置接口,一般而言,只有一个串口可以使用,我尝试使用VS2019+WinForm,C#开发开发一款串口调试工具,用于配置产品的参数。
1、建立好工厂后,布局,给控件命名
2、编写代码
2.1 实现端口号扫描
private void ReflashPortToComboBox(SerialPort serialPort, ComboBox comboBox)
{
if (!serialPort.IsOpen)
{//串口处于关闭状态
comboBox.Items.Clear();
string[] str = SerialPort.GetPortNames();
if (str == null)
{
MessageBox.Show("本机没有串口!", "Error");
return;
}
//添加串口
foreach (string s in str)
{
comboBox.Items.Add(s);
Console.WriteLine(s);
}
}
else
{
MessageBox.Show("串口处于打开状态下,不能刷新串口列表", "Error");
}
}
2.2 打开串口按钮代码
private void btn_open_com_Click(object sender, EventArgs e)
{
Int32 ibaudrate = Convert.ToInt32(cb_select_baudrate.SelectedItem.ToString());
serialPort1.PortName = cb_select_com.SelectedItem.ToString();
serialPort1.BaudRate = ibaudrate;
serialPort1.Parity = (System.IO.Ports.Parity)Enum.Parse(typeof(System.IO.Ports.Parity), cb_select_check_bit.Text);
serialPort1.StopBits = (System.IO.Ports.StopBits)Enum.Parse(typeof(System.IO.Ports.StopBits), cb_select_stop_bit.Text);
serialPort1.DataBits = Convert.ToInt16(cb_select_data_bits.Text);
//添加串口事件处理
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(ReceiveData);
try
{
serialPort1.Open();
btn_open_com.Enabled = false;
btn_close_com.Enabled = true;
}
catch (Exception ex)
{
MessageBox.Show("串口打开失败"+ex, "Error");
}
}
2.3 串口接收事件代码
//串口接收事件
private void ReceiveData(object sender, SerialDataReceivedEventArgs e)
{
string content = serialPort1.ReadExisting(); //从串口中读取输入流,返回string
ShowData(content);
}
private void ShowData(string text)
{
string receiveText = text;
//更新接收数据计数
recv_cntr += (UInt32)receiveText.Length;
lab_recv_cntr.Text = recv_cntr.ToString();
textBox_debug.AppendText("接收到了"+ receiveText.Length.ToString()+ "个数据: "+ text+"\r\n");
if (rbtn_recv_hex.Checked)
{//按HEX模式 展示接收到的内容
byte[] recData = System.Text.Encoding.Default.GetBytes(receiveText);// 将接受到的字符串据转化成数组;
foreach (byte str in recData)
{
textBox_recv.AppendText(string.Format("{0:X2} ", str));
}
}
else
{//按ASCII模式 展示接收到的内容
textBox_recv.AppendText(text); //将收到的字符串追加展示出来
}
}
2.4 发送按钮代码
private void btn_send_Click(object sender, EventArgs e)
{
//串口打开的情况下,才能进行下一步操作
if (!serialPort1.IsOpen) return;
//发送内容不能为空
if ("" == textBox_send.Text) return;
string sendData = textBox_send.Text; //复制发送数据
if (true == rbtn_send_ascii.Checked)
{//字符模式
try
{
serialPort1.Write( sendData );
//更新发送数据计数
send_cntr += (UInt32)sendData.Length;
lab_send_cntr.Text = send_cntr.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "串口数据发送错误");
serialPort1.Close();
btn_open_com.Enabled = true;
btn_close_com.Enabled = false;
}
}
else
{//HEX模式
try
{
sendData.Replace("0x", ""); //去掉0x
sendData.Replace("0X", ""); //去掉0X
string[] strArray = sendData.Split(new char[] { ',', ',', '\r', '\n', ' ', '\t' });
byte[] sendBuffer = new byte[strArray.Length]; //发送数据缓冲区
int decNum = 0,i = 0;
foreach (string str in strArray)
{
try
{
decNum = Convert.ToInt16(str, 16);
sendBuffer[i] = Convert.ToByte(decNum);
i++;
}
catch
{
//MessageBox.Show("字节越界,请逐个字节输入!", "Error");
}
}
serialPort1.Write(sendBuffer, 0, sendBuffer.Length);
//更新发送数据计数
send_cntr += (UInt32)sendBuffer.Length;
lab_send_cntr.Text = send_cntr.ToString();
}
catch
{
MessageBox.Show("当前为16进制发送模式,请输入16进制数据");
}
}
}
https://whycan.com/files/members/1228/bf17a44ca6a9711dd2e93423cb844b6.png
这个电路是我比较倾向的。
在上电时,MUX都会打到终端电阻位置,
这样只有离CPU单元最近的模块能被访问到,就可以依次进行地址赋值。
我感觉原理是没有问题了,但往往这种自定义的设计,会因为开发时间久,测试不方便,成本不够低,不好落地。
请问楼主,航芯的DAP驱动在哪里下载呢?
我原本就装好了DAP-Link的驱动,使用的是WCH-Link(实际上也是DAP-Link)。
按理说,win10应该是免驱的。
说实话,我也不知道我怎么装上的,要不你参考一下这个链接?
参考以下连接:
(1)从MounRiver Studio中提取的WchLink驱动
我的电脑环境情况:
(1)MDK529+coretex-M
(2)有WCH-Link驱动(也是一款DAP-Link)
1、获取开发相关资源
(1)型号支持包:
型号支持包
(2)外设基本例程:
Core_ModulesDemo_Rev2.0.1
Nucleo_ModulesDemo_Rev1.0.8
(3)开发板PDF原理图
ACM32F403RET7_CORE_V1.2
如果链接失效,直接访问官网下载即可:
ACM官方网站
本来想使用ACM32F030xxxx/ACM32F070xxxx,然而晕哥手上只有ACM32F403RET7开发板,这款开发板所使用的主控芯片是ACM32F403RET7,资源非常丰富!不过此处就不细说了,详细内容参考帖子:
上海航芯 ACM32F403RET7 开发板, 促销价 18.8元
开发板贴图
从图上可以看到,资源不多,但是作为一个最小系统板,板载了DAP-Link,已经是非常友好。
6、烧写程序到开发板
参考链接:跳转到全志在线帖子
(1)生成烧写镜像
上述make只是生成了bin文件,我们需要进一步生成烧写镜像,才可以顺利下载。
make image
Flash Layout:
sec bin 0 boot_40M.bin : flash_offs: 0x00000000( 0K) data_size: 0x00002F28( 12K)
sec bin 1 app.bin : flash_offs: 0x00004000( 16K) data_size: 0x00004920( 19K)
sec bin 2 app_xip.bin : flash_offs: 0x00029800( 166K) data_size: 0x000058E0( 23K)
generate image: xr_system.img
cp -t ../../../../out/ ../image/"xr806"/*.bin ../image/"xr806"/xr_system.img *.map
book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc$
(2)获取工具
工具存放在bsp包./tools目录里,程序文件为phoenixMC.exe。
(3)烧写镜像
如下图所示
(4)查看打印
如下图所示
看起来,helloworld字样已经出来了,说明编译环境基本上已经搭建好了。
1、构建工作文件夹
(1)cd ~
(2)mkdir work
(3)cd work
(4)mkdir xr806
(5)cd xr806
2、获取资源
(1)wget http://www.armsoc.cn/whycan/xr806/xr806_sdk_v1.2.1.tgz
(2)wget http://www.armsoc.cn/whycan/xr806/gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
如果获取失败,直接whycan下载(可能需要积分)
-->freeRTOS bsp
xr806_sdk_v1.2.1.tgz
-->gcc工具链
gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
3、编译一个例程
(1)解压bsp
tar -xzvf xr806_sdk_v1.2.1.tgz
(2)选择一个例程进行编译
cd ~/work/xr806/xr806_sdk_v1.2.1/project/demo
ls
可以看到现在有一下几个例程
book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo$ ll
总用量 32
drwxrwxr-x 8 book book 4096 4月 2 16:50 ./
drwxrwxr-x 10 book book 4096 4月 2 16:50 ../
drwxrwxr-x 3 book book 4096 4月 2 17:26 at_demo/
drwxrwxr-x 4 book book 4096 4月 2 17:23 audio_demo/
drwxrwxr-x 8 book book 4096 4月 2 16:50 bluetooth/
drwxrwxr-x 3 book book 4096 4月 2 17:22 hello_demo/
drwxrwxr-x 4 book book 4096 4月 2 16:50 wlan_ble_demo/
drwxrwxr-x 3 book book 4096 4月 2 16:50 wlan_demo/
(3)选择hello_demo
cd hello_demo
(4)进入gcc目录,进行编译
cd gcc
make
结果,编译出错了,原因是我们没有安装交叉编译工具链。
...
/bin/sh: 1: /home/book/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc: not found
../../../../project/project.mk:437: recipe for target 'hello_demo.elf' failed
make[1]: *** [hello_demo.elf] Error 127
make[1]: 离开目录“/home/book/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc”
../../../../project/project.mk:426: recipe for target '__all' failed
make: *** [__all] Error 2
4、安装交叉编译工具链
(1)解压工具链
cd ~/work/xr806/
tar -xvf gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
(2)复制到项目例程指定的目录
根据上面的错误信息,我们可以知道交叉编译工具链,应该是存放在这个位置:
/home/book/tools/gcc-arm-none-eabi-8-2019-q3-update/
cd ~
mkdir tools
cd ~/work/xr806/
cp -r gcc-arm-none-eabi-8-2019-q3-update ~/tools/
5、回到例程目录,重新编译
cd ~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc/
make
编译结果,看起来像是成功了
~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-objcopy -O binary -R .xip hello_demo.elf hello_demo.bin
~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-objcopy -O binary -j .xip hello_demo.elf hello_demo_xip.bin
~/tools/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-size hello_demo.elf
text data bss dec hex filename
39768 1576 2248 43592 aa48 hello_demo.elf
make[1]: 离开目录“/home/book/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc”
book@book-desktop:~/work/xr806/xr806_sdk_v1.2.1/project/demo/hello_demo/gcc$
我们得到了两个bin文件,一个elf文件
hello_demo.bin
hello_demo_xip.bin
hello_demo.elf
@llinjupt
哈哈,你这个功能我好像做过,但是不太完善,以前调试USB手柄的时候写的,你可以看看哈。
帖子跳转 ITX-190——一个性能不强却支持强大的开发板
@LinjieGuo
这个文件是要烧写到哪个地址呢,是地址0吗,我把下面提供的虚拟机里的bin文件烧录到0地址结果出现和你第一次报错一样的错误,但是suniv.h已经是删过冒号的了。
https://whycan.com/files/members/6074/微信截图_20220310161208.png
兄弟你的Flash是什么型号呢?
@gdzh26
限制次数可能是为了防止别人爬网站资源,
或者防止限制代下资源的情况。
另外,好像CSDN也限制每天下载次数。
并没有说whycan好,CSDN不好,
CSDN我没有文档输出,
所以,会员也开了好多年了,
我认为网站的规则如此,
不喜欢可以右上角,
强扭的瓜不甜!
相关帖子:
限制下载次数或限制下载不知是何用意?
你好朋友,我是新来的。
这么多很棒的板子。
我想自己画。 谁能给我一个购买 Allwinner F1C200s 和 F1C100s 的链接?
Hello friends, I am new here.
So many great boards.
I want to draw my own. Can anyone send me a link to buy Allwinner F1C200s and F1C100s?
直接购买晕哥的芯片就可以了。
F1C100s/F1C200s
大哥,ws2812你看看这个color表行不行。
SPI CLK 20MHz
T1H = T0L = 16个SPI数据 = 0.8us
T0H = T1L = 8个SPI数据位 = 0.4us
我从别的网站帖子上面看到了如下信息,我根据这些信息列出理论依据。
WS2812原理与实现
裁剪帖子的部分信息,可以看到,对于WS2812,其时序要求如下:
(1)T0H = T1L = 0.4us (±150ns,建立color表时,尽量不考虑误差范围,可作为芯片SPI时钟误差)
(2)T1H = T0L = 0.85us (±150ns,建立color表时,尽量不考虑误差范围,可作为芯片SPI时钟误差)
(3)与1楼的理论同理,得:
令SPI的一个时钟周期t = 0.05us,即SPI 的f = 20MHz。
T1H = T0L = 17个SPI数据
T0H = T1L = 8个SPI数据位
但是,芯片支持误差容忍(0.15us/150ns),
所以,可以尝试:
T1H = T0L = 16个SPI数据(少1个时钟节拍,0.05us/50ns)
T0H = T1L = 8个SPI数据位
对于上面我使用的WS2811的情况,2M SPI CLK,
情况如下:
(1)T0H = T1L = 0.5us = 500ns
(2)T1H = T0L =2.0us = 4 * T0H = 4 * T1L
看了你的WS2812手册里面给了个范围,
我们以WS2812B为准,将SPI CLK提升到4M。
那么,周期变成一半。
(1)T0H = T1L = 0.25us = 250ns
(2)T1H = T0L =1.0us = 1000ns =4 * T0H = 4 * T1L
观察了一下,完全符合WS2812B的时序要求。
(WS2812的数据传输速度是800KHz,WS2811(400KHz)的2倍)
所以,你至少使用4M的SPI CLK,才能驱动WS2812。
另外,可以把dma怼上去。
我是这样搞:
#define CHIP_NUM 100
typedef strut{
uint8_t rst[200]; //0.5us *200 = 100us
uint8_t frame[ CHIP_NUM ][3][5];
//3 代表颜色分量,R / G / B
//5 颜色数据,5字节SPI数据描述一个分量的颜色深浅
}ws28xx_t,ws28xx_pt;
然后定时使用DMA将帧内存通过SPI发送出去就可以了。
哈哈,大哥果然神速。
我昨天调试了半天ws2811。
怎么搞都不行,后面才发现。12V没接......
时隔多日,回来续帖。
前面知道了原理,接下来,我们得生成一个color表。
color表的结构应该是这样:
uint8_t ws2811_color[256][5]={......}
其中,256对应一中颜色分量的颜色深浅,因为RGB各占8bit。
以下是我针对1楼的时序,生成的color表:
color_map_ws2811.c
color_map_ws2811.txt
下一步是借助color_map_ws2811.c文件,编写CH579M的驱动代码!
使用tiny-R2,默认串口为UART1,bootloader的串口非常容易改,反而RTT的finsh默认串口没修改成功,请问这个在哪里修改啊,我改了几个地方都没效果。
参考官方文档:FinSH 移植
FinSH 的输出:
FinSH 的输出依赖于系统的输出,在 RT-Thread 中依赖 rt_kprintf() 输出。在启动函数 rt_hw_board_init() 中, rt_console_set_device(const char* name) 函数设置了 FinSH 的打印输出设备。
对应串口引脚配置,应该在drv_uart.c里面,
有这样一个结构体,
static rt_err_t uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg);
static rt_err_t uart_control(struct rt_serial_device *serial, int cmd, void *arg);
static int uart_putc(struct rt_serial_device *serial, char c);
static int uart_getc(struct rt_serial_device *serial);
static rt_size_t uart_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction);
void uart_irq_handler(int irqno, void *param);
const struct rt_uart_ops _uart_ops =
{
uart_configure,
uart_control,
uart_putc,
uart_getc,
uart_dma_transmit
};
可以看出,就是以下这个函数负责配置串口引脚的。
static rt_err_t uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg);
市面上常见的2款串行可编程控制LED方案,分别是WS2811和WS2812。
其中,
[1]WS2811是芯片,常规供电为12V,按理说,驱动距离会远一些。
[2]WS2812是灯珠,把可编程芯片内嵌在灯珠里面,常规供电5V,按理说,驱动距离相对短。
相信很多朋友都在51单片机上面驱动过这个芯片,使用方法是:IO模拟单总线时序,达到传输RGB数据的效果。
因为WS2811/2812驱动时序,是us级的,IO模拟的方法,过度依赖CPU,这种做法实在不合理。
正确做法应该是借助片上的通讯外设,如UART/SPI等,兼容WS2811/2812的时序,腾出CPU资源,并且提高灯带驱动的稳定性。
本文章阐述,使用SPI驱动WS2811的思路。
先看手册:


从WS2811的手册,可以得知( 高速模式下 ):
[1]这款芯片支持2种驱动速度:分别为高速模式和低速模式。
[2]对单总线送'0'码和'1'码,需要使用T0H / T1H / T0L /T1L搭配。
[3]搭配出来的'0'码和'1'码所占用时长皆为 2.5us。
[4]T0H = T1L = 0.5us
[5]T1H = T0L =2.0us = 4 * T0H = 4 * T1L
因此,SPI总线的驱动时钟,一个时钟脉冲的周期不能大于 T0H / T1L ,也就是不能大于0.5us。
我们试着就让SPI总线一个时钟脉冲的周期就等于0.5us,Tspiclk = 0.5us。
那么,频率Fspiclk = 1 / Tspiclk = 2MHz。
这种情况下,如果想要送RGB888数据中的 1 位 数据 到WS2811,SPI总线需要发出5个位的数据:
○ 1 : 00001
○ 0 : 11110
如果要发1字节数据(8个位),如R = 0xF0,对应二进制为:
1111 0000
那么SPI应该发出这样的数据:
00001 00001 00001 00001 11110 11110 11110 11110
对其进行组合,可以得到5个字节:
0000 1000 0100 0010 0001 1111 0111 1011 1101 1110
所以,SPI应该发送的数据为:
0X08 0X42 0X1F 0X7B 0XDE
同理,对于R 、G、 B都可以这样操作。
那么,也就是说,想要给一颗WS2811输送RGB888数据,需要发送5*3 = 15个字节。
@LinjieGuo
下载了,还是出错误。
https://whycan.com/files/members/7570/rtt错误1.jpg
用惯了Keil这种界面,有错误直接跳到出错代码处
这个rtt一时难以上手
rtt的源码重新下载解压了吗?
我把我的整个rtt目录上传上来,你看看。
rt_thread_fal_elm_dfs_20220115.zip
我也来学习,初次接触RTT,文件在那里也不知道,给我来了个错误了
https://whycan.com/files/members/7570/RTT.png
哈哈,我上传一下代码啊。
你这个情况,感觉像是源码没有下载全的样子。
可以试试重新拉取系统源码,然后把bsp工程复制进去。
allwinner_tina_prj_v1_fat_elm_dfs.zip
@luoyuan0130
同意你说的互相开源学习,
只要你开源了自己的作品/资源,
积分就来了,
那么自然就可以下载想要的资源。
(开源不等于免费,以下资料分享给你 )
[文章分享:再看中国法院是怎么对待GPL的]
对上一个帖子的要求,我们再度优化bsp_fal_init()函数:
void bsp_fal_init(void)
{
int fd, size;
struct statfs elm_stat;
struct fal_blk_device *blk_dev;
char str[] = "enable sdcard 1 ", buf[80];
/* fal init */
fal_init();
/* create block device */
blk_dev = (struct fal_blk_device *)fal_blk_device_create(FS_PARTITION_NAME);
if(blk_dev == RT_NULL)
rt_kprintf("Can't create a block device on '%s' partition.\n", FS_PARTITION_NAME);
else
rt_kprintf("Create a block device on the %s partition of flash successful.\n", FS_PARTITION_NAME);
/* mount elmfat file system to FS_PARTITION_NAME */
if(dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)
{
rt_kprintf("elmfat filesystem mount success.\n");
return;
}
else
{
rt_kprintf("elmfat filesystem mount failed.\n");
goto __do_mount_bolck_dev_fs_failed_fal_action;
}
__do_mount_bolck_dev_fs_failed_fal_action:
/* make a elmfat format filesystem */
if(dfs_mkfs("elm", FS_PARTITION_NAME) == 0)
{
rt_kprintf("make elmfat filesystem success.\n");
if(dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)
{
rt_kprintf("elmfat filesystem mount success.\n");
}
}
else
{
rt_kprintf("make elmfat filesystem faild.\n");
while(1);
}
/* Get elmfat file system statistics */
if(statfs("/", &elm_stat) == 0)
rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
if(mkdir("/user", 0x777) == 0)
rt_kprintf("make a directory: '/user'.\n");
if(mkdir("/sdcard", 0x777) == 0)
rt_kprintf("make a directory: '/sdcard'.\n");
if(mkdir("/config", 0x777) == 0)
rt_kprintf("make a directory: '/sdcard'.\n");
rt_kprintf("Write string '%s' to /config/config.txt.\n", str);
/* Open the file in create and read-write mode, create the file if it does not exist*/
fd = open("/config/config.txt", O_WRONLY | O_CREAT);
if (fd >= 0)
{
if(write(fd, str, sizeof(str)) == sizeof(str))
rt_kprintf("Write data done.\n");
close(fd);
}
}
编译,修饰,烧写,启动,没啥改变
msh />
msh />
msh />
msh />
msh />ls
Directory /:
user <DIR>
whycan <DIR>
msh />
(使用命令行)擦掉这个这个分区的数据,再试一下:
msh />fal probe
No flash device or partition was probed.
Usage: fal probe [dev_name|part_name] - probe flash device or partition by given name.
[I/FAL] ==================== FAL partition table ====================
[I/FAL] | name | flash_dev | offset | length |
[I/FAL] -------------------------------------------------------------
[I/FAL] | sys_partition | wind25qx | 0x00000000 | 0x00100000 |
[I/FAL] | root_partition | wind25qx | 0x00100000 | 0x00f00000 |
[I/FAL] =============================================================
msh />fal probe root_partition
Probed a flash partition | root_partition | flash_dev: wind25qx | offset: 1048576 | len: 15728640 |.
msh /
msh />
msh />fal erase 0 4096
Erase data success. Start from 0x00000000, size is 4096.
msh />
重启单板,咦?我们刚刚创建的whycan文件夹没了??
这一看,那一看,发现,每次开机,bsp_fal_init()函数都会做一遍格式化操作。
我们是不是可以这样:
(1)[分区创建块设备]
(2)尝试挂载块设备到文件系统
如果成功,就不格式化了
如果失败,则格式化完在挂载
说干就干!修改一下这个bsp_fal_init()函数:(关键代码)
__mount_fal:
/* mount elmfat file system to FS_PARTITION_NAME */
if(dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)
{
rt_kprintf("elmfat filesystem mount success.\n");
}
else
{
/* make a elmfat format filesystem */
if(dfs_mkfs("elm", FS_PARTITION_NAME) == 0)
{
rt_kprintf("make elmfat filesystem success.\n");
goto __mount_fal;
}
else
{
rt_kprintf("make elmfat filesystem faild.\n");
while(1);
}
}
继续前进。
参考文章IOT-OS之RT-Thread(十一)--- FAL分区管理与easyflash变量管理
我们抄袭一下,跟他做法相仿,文件编排略有差异,只为了实现功能。
修改main.c文件,
(1)增加函数 bsp_fal_init()
#include "dfs_posix.h"
#define FS_PARTITION_NAME "root_partition"
void bsp_fal_init(void)
{
int fd, size;
struct statfs elm_stat;
struct fal_blk_device *blk_dev;
char str[] = "elmfat mount to W25Q flash.", buf[80];
/* fal init */
fal_init();
/* create block device */
blk_dev = (struct fal_blk_device *)fal_blk_device_create(FS_PARTITION_NAME);
if(blk_dev == RT_NULL)
rt_kprintf("Can't create a block device on '%s' partition.\n", FS_PARTITION_NAME);
else
rt_kprintf("Create a block device on the %s partition of flash successful.\n", FS_PARTITION_NAME);
/* make a elmfat format filesystem */
if(dfs_mkfs("elm", FS_PARTITION_NAME) == 0)
rt_kprintf("make elmfat filesystem success.\n");
/* mount elmfat file system to FS_PARTITION_NAME */
if(dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)
rt_kprintf("elmfat filesystem mount success.\n");
/* Get elmfat file system statistics */
if(statfs("/", &elm_stat) == 0)
rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.\n",
elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);
if(mkdir("/user", 0x777) == 0)
rt_kprintf("make a directory: '/user'.\n");
rt_kprintf("Write string '%s' to /user/test.txt.\n", str);
/* Open the file in create and read-write mode, create the file if it does not exist*/
fd = open("/user/test.txt", O_WRONLY | O_CREAT);
if (fd >= 0)
{
if(write(fd, str, sizeof(str)) == sizeof(str))
rt_kprintf("Write data done.\n");
close(fd);
}
/* Open file in read-only mode */
fd = open("/user/test.txt", O_RDONLY);
if (fd >= 0)
{
size = read(fd, buf, sizeof(buf));
close(fd);
if(size == sizeof(str))
rt_kprintf("Read data from file test.txt(size: %d): %s \n", size, buf);
}
}
(2)修改main函数,显示调用bsp_fal_init()
int main(int argc, char **argv)
{
rt_kprintf("Start...\n");
rt_kprintf("periph_get_pll_clk:%d\n", periph_get_pll_clk());
rt_kprintf("cpu_get_clk:%d\n", cpu_get_clk());
rt_kprintf("ahb_get_clk:%d\n", ahb_get_clk());
rt_kprintf("apb_get_clk:%d\n", apb_get_clk());
bsp_fal_init();
MainThreadCreat();
return 0;
}
(3)修改start_task,关掉TF/SD卡挂载相关。
void start_thread(void *parameter)
{
int ret = 0;
#if 0
if( 0 == dfs_mount("sd0","/","elm", 0,0) )
{
printf("sd0 mount to / \n");
}
else
{
printf("sd0 mount to / faild \n");
}
#endif
while(1)
{
rt_thread_delay(1);
}
}
(4)编译,修饰,烧写。
按照官方知道文档,测试一下--> 软件包-FAL
(1)查看有那些分区
msh />fal probe
No flash device or partition was probed.
Usage: fal probe [dev_name|part_name] - probe flash device or partition by given name.
[I/FAL] ==================== FAL partition table ====================
[I/FAL] | name | flash_dev | offset | length |
[I/FAL] -------------------------------------------------------------
[I/FAL] | sys_partition | wind25qx | 0x00000000 | 0x00100000 |
[I/FAL] | root_partition | wind25qx | 0x00100000 | 0x00f00000 |
[I/FAL] =============================================================
(2)指定待操作的 Flash 设备或 Flash 分区
不能选择sys_partition 这个分区,因为这个分区存储了我们的系统程序,擦掉系统就没了。
所以我们选择 root_partition分区:
msh />fal probe root_partition
Probed a flash partition | root_partition | flash_dev: wind25qx | offset: 1048576 | len: 15728640 |.
(3)擦除数据
msh />fal erase 0 4096
Erase data success. Start from 0x00000000, size is 4096.
(4)写入数据
msh />fal write 8 1 2 3 4 5
Write data success. Start from 0x00000008, size is 5.
Write data: 1 2 3 4 5 .
(5)读取数据
msh />fal read 0 64
Read data success. Start from 0x00000000, size is 64. The data is:
Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
[00000000] FF FF FF FF FF FF FF FF 01 02 03 04 05 FF FF FF ................
[00000010] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
[00000020] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
[00000030] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
(6)性能测试
msh />fal bench 4096 yes
Erasing 15728640 bytes data, waiting...
Erase benchmark success, total time: 36.614S.
Writing 15728640 bytes data, waiting...
Write benchmark success, total time: 61.441S.
Reading 15728640 bytes data, waiting...
Read benchmark success, total time: 4.267S.
也就是说,FAL根本就没有初始化。
我们让他像elm组件一样,自动初始化。
在fal.c文件底部,加入一个宏修饰
INIT_PREV_EXPORT(fal_init);
编译,修饰,下载,启动查看串口打印:
一眼看过去,肯定不对劲,关键的红字信息。
initialize fal_init[E/SFUD] ERROR: Flash device spi00 not found!
在初始化fal的时候,系统跟我们说,找不到spi00。
咦?我们前面定义的宏,明明是:
#define NOR_FLASH_DEV_NAME "wind25qx"
他跟我们说,找不到spi00,那肯定有问题。
我折腾了很久,发现了问题在menuconfig环节,我手欠的把这一项修改了。
修改这一项为 wind25qx,保存,退出menuconfig,然后编译,修饰,烧写。
文件fal_flash_sfud_port.c
/*
* File : fal_flash_sfud_port.c
* This file is part of FAL (Flash Abstraction Layer) package
* COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Change Logs:
* Date Author Notes
* 2018-01-26 armink the first version
*/
#include <fal.h>
#include <sfud.h>
#ifdef FAL_USING_SFUD_PORT
#ifdef RT_USING_SFUD
#include <spi_flash_sfud.h>
#endif
#ifndef FAL_USING_NOR_FLASH_DEV_NAME
#define FAL_USING_NOR_FLASH_DEV_NAME "wind25qx"
#endif
static int init(void);
static int read(long offset, uint8_t *buf, size_t size);
static int write(long offset, const uint8_t *buf, size_t size);
static int erase(long offset, size_t size);
static sfud_flash_t sfud_dev = NULL;
struct fal_flash_dev nor_flash0 =
{
.name = FAL_USING_NOR_FLASH_DEV_NAME,
.addr = 0,
.len = 16 * 1024 * 1024,
.blk_size = 4096,
.ops = {init, read, write, erase},
.write_gran = 1
};
static int init(void)
{
#ifdef RT_USING_SFUD
/* RT-Thread RTOS platform */
sfud_dev = rt_sfud_flash_find_by_dev_name(FAL_USING_NOR_FLASH_DEV_NAME);
#else
/* bare metal platform */
extern sfud_flash sfud_norflash0;
sfud_dev = &sfud_norflash0;
#endif
if (NULL == sfud_dev)
{
return -1;
}
/* update the flash chip information */
nor_flash0.blk_size = sfud_dev->chip.erase_gran;
nor_flash0.len = sfud_dev->chip.capacity;
return 0;
}
static int read(long offset, uint8_t *buf, size_t size)
{
assert(sfud_dev);
assert(sfud_dev->init_ok);
sfud_read(sfud_dev, nor_flash0.addr + offset, size, buf);
return size;
}
static int write(long offset, const uint8_t *buf, size_t size)
{
assert(sfud_dev);
assert(sfud_dev->init_ok);
if (sfud_write(sfud_dev, nor_flash0.addr + offset, size, buf) != SFUD_SUCCESS)
{
return -1;
}
return size;
}
static int erase(long offset, size_t size)
{
assert(sfud_dev);
assert(sfud_dev->init_ok);
if (sfud_erase(sfud_dev, nor_flash0.addr + offset, size) != SFUD_SUCCESS)
{
return -1;
}
return size;
}
#endif /* FAL_USING_SFUD_PORT */
文件fal_cfg.h
/*
* File : fal_cfg.h
* This file is part of FAL (Flash Abstraction Layer) package
* COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Change Logs:
* Date Author Notes
* 2018-05-17 armink the first version
*/
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_
#include <rtconfig.h>
#include <board.h>
#define NOR_FLASH_DEV_NAME "wind25qx"
/* ===================== Flash device Configuration ========================= */
extern struct fal_flash_dev nor_flash0;
/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \
&nor_flash0, \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WORD, "sys_partition", NOR_FLASH_DEV_NAME, 0, 1*1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "root_partition", NOR_FLASH_DEV_NAME, 1*1024*1024, 15*1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */
修改完之后,分区表情况是这样的:、
(1)分区0:
分区名字 :sys_partition,系统分区
分区绑定的块设备 :NOR_FLASH_DEV_NAME
绑定的块设备起始地址:0
本分区的尺寸 :1*1024*1024,也就是1MB
(2)分区1:
分区名字 :root_partition,根分区
分区绑定的块设备 :NOR_FLASH_DEV_NAME
绑定的块设备起始地址:1*1024*1024,也就是从1MB位置开始。
本分区的尺寸 :15*1024*1024,也就是15MB
报错是意料之中,好,那我们就按照要求,修改一下fal相关的2个文件。
[bsp/allwinner_tina_prj_v1/packages/fal-v0.5.0/packge/samples/porting/fal_cfg.h]
[bsp/allwinner_tina_prj_v1/packages/fal-v0.5.0/packge/samples/porting/fal_flash_sfud_port.c]
这两个文件修改后,我们将文件挪一下,
(1)h文件复制到[bsp\allwinner_tina_prj_v1\packages\fal-v0.5.0\inc\]目录下
(2)c文件复制到[bsp\allwinner_tina_prj_v1\packages\fal-v0.5.0\src\]目录下
(3)删除[bsp/allwinner_tina_prj_v1/packages/fal-v0.5.0/packge/samples/]这个目录
(不要问我为什么要这样做,因为我不懂怎么改里面的SConscript脚本,干脆这样干了,~~笑~~)
回到家里,使用家里电脑,menuconfig之后,选择FAL,然后pkgs --update,成功把包更新到bsp。
Linjie@DESKTOP-NTLR93Q D:\SVN_Public\rt_thread\bsp\allwinner_tina_prj_v1
$ pkgs --update
Start to download package : fal-0.5.0.zip
Downloded 137 KB
Start to unpack. Please wait...
==============================> FAL v0.5.0 is downloaded successfully.
Operation completed successfully.
Linjie@DESKTOP-NTLR93Q D:\SVN_Public\rt_thread\bsp\allwinner_tina_prj_v1
先看目录里有没有东西
Linjie@DESKTOP-NTLR93Q D:\SVN_Public\rt_thread\bsp\allwinner_tina_prj_v1
$ ls -l packages\
total 11
-rw-r--r-- 1 Linjie Administrators 266 Jan 8 20:00 SConscript
drwxr-xr-x 6 Linjie Administrators 4096 Jan 8 20:00 fal-v0.5.0
-rw-r--r-- 1 Linjie Administrators 4096 Jan 8 20:00 packages.dbsqlite
-rw-r--r-- 1 Linjie Administrators 86 Jan 8 20:00 pkgs.json
-rw-r--r-- 1 Linjie Administrators 2 Jan 8 20:00 pkgs_error.json
可以看到,fal-v0.5.0已经被下载下来了。
我们什么都不做,编译看看,因为我们没有实现某些接口,不出意外的话,会报错。
编译完,果然,报错了。
CC build\libcpu\stack.o
CC build\libcpu\trap.o
CC build\packages\fal-v0.5.0\samples\porting\fal_flash_sfud_port.o
In file included from packages\fal-v0.5.0\samples\porting\fal_flash_sfud_port.c:25:0:
packages\fal-v0.5.0\inc/fal.h:29:21: fatal error: fal_cfg.h: No such file or directory
compilation terminated.
scons: *** [build\packages\fal-v0.5.0\samples\porting\fal_flash_sfud_port.o] Error 1
scons: building terminated because of errors.
文档的后面还让我们参考这里FAL
说干就干
<1>定义片外 spi flash 设备,可以参考 fal_flash_sfud_port.c
一会我把这个文件下载下来,捣鼓一下。
<2>定义 flash 设备表
Flash 设备表定义在 fal_cfg.h 头文件中,定义分区表前需 新建 fal_cfg.h 文件 ,请将该文件统一放在对应 BSP 或工程目录的 port 文件夹下,并将该头文件路径加入到工程。
fal_cfg.h 可以参考 示例文件 fal/samples/porting/fal_cfg.h 完成。
一会这个文件我也下载下来,捣鼓捣鼓。
好,这两个文件弄下来了(复制),那么放在哪里呢?
想了一下,我编不下去了,source insight包含了整个工程(BSP只包含allwinner_tina_prj_v1,其他没有包含。)。
好家伙,一个"fal"关键词的文件都没有。感觉是配置了跟没配置一样。
---- fal Matches (0 in 0 files) ----
上面是FAL的开启指引,咱们按照指引进行一顿操作!
--- fal: Flash Abstraction Layer implement. Manage flash device and partition.
[*] Enable debug log output
[*] FAL partition table config has defined on 'fal_cfg.h'
[*] FAL uses SFUD drivers
(spi00) The name of the device used by FAL
version (v0.5.0) --->
保存,然后使用命令,从menuconfig更新packge到工程中,packages目录里面有一些内容,
没有.c文件,不知道是不是有异常。
x@LAPTOP-BH56UJG6 E:\SVN_Public\rt_thread\bsp\allwinner_tina_prj_v1
$ pkgs --update
x@LAPTOP-BH56UJG6 E:\SVN_Public\rt_thread\bsp\allwinner_tina_prj_v1
$ ls -l packages\
total 7
-rw-r--r-- 1 meika Administrators 266 Jan 8 13:44 SConscript
-rw-r--r-- 1 meika Administrators 1288 Jan 8 14:27 fal_cfg.h
-rw-r--r-- 1 meika Administrators 2048 Jan 8 13:44 packages.dbsqlite
-rw-r--r-- 1 meika Administrators 2 Jan 8 13:44 pkgs.json
-rw-r--r-- 1 meika Administrators 2 Jan 8 14:59 pkgs_error.json
编译工程,按理说我没有实现指定的接口,应该会报错,但是结果是没有报错,跟之前一样。
@LinjieGuo
请教了RTT群里的大神,RTT是支持把SPI FLASH进行分区管理的。也就是说,可以把Flash分出2个区或者多个区,然后bin文件下载进分区0,分区1/2...就可以用来格式化了。
这得益于RTT的扩展包FAL--RTT-FAL支持
我们根据指导文件进行操作。
1.1、打开 FAL
使用 fal package 需要在 RT-Thread 的包管理器中选择它,具体路径如下:
RT-Thread online packages
system packages --->
--- fal: Flash Abstraction Layer implement. Manage flash device and partition.
[*] Enable debug log output
[*] FAL partition table config has defined on 'fal_cfg.h'
(onchip) The flash device which saving partition table
(65536) The patition table end address relative to flash device offset.
[ ] FAL uses SFUD drivers
(norflash0) The name of the device used by FAL (NEW)
version (latest) --->
每个功能的配置说明如下:
(1)开启调试日志输出(默认开启);
(2)分区表是否在 fal_cfg.h 中定义(默认开启)。如果关闭此选项,fal 将会自动去指定 Flash 的指定位置去检索并装载分区表,
具体配置详见下面两个选项;
存放分区表的 Flash 设备;
分区表的 结束地址 位于 Flash 设备上的偏移。
(3)启用 FAL 针对 SFUD 的移植文件(默认关闭);
然后让 RT-Thread 的包管理器自动更新,或者使用 pkgs --update 命令更新包到 BSP 中。
9、疑问,为什么上面挂接sd卡的代码要延时呢?
因为不延时,挂接不成功啊!
为什么会这样呢?通过查看代码,其实是跟SDIO相关的。
int rt_mmcsd_core_init(void)
{
rt_err_t ret;
/* initialize detect SD cart thread */
/* initialize mailbox and create detect SD card thread */
ret = rt_mb_init(&mmcsd_detect_mb, "mmcsdmb",
&mmcsd_detect_mb_pool[0], sizeof(mmcsd_detect_mb_pool) / sizeof(mmcsd_detect_mb_pool[0]),
RT_IPC_FLAG_FIFO);
RT_ASSERT(ret == RT_EOK);
ret = rt_mb_init(&mmcsd_hotpluge_mb, "mmcsdhotplugmb",
&mmcsd_hotpluge_mb_pool[0], sizeof(mmcsd_hotpluge_mb_pool) / sizeof(mmcsd_hotpluge_mb_pool[0]),
RT_IPC_FLAG_FIFO);
RT_ASSERT(ret == RT_EOK);
ret = rt_thread_init(&mmcsd_detect_thread, "mmcsd_detect", mmcsd_detect, RT_NULL,
&mmcsd_stack[0], RT_MMCSD_STACK_SIZE, RT_MMCSD_THREAD_PREORITY, 20);
if (ret == RT_EOK)
{
rt_thread_startup(&mmcsd_detect_thread);
}
rt_sdio_init();
return 0;
}
rt_mmcsd_core_init()这个函数里面,创建了一个线程,这个线程里面负责SDIO接口的一些事情,
具体做什么事情还没搞懂,凭我的直觉,反正就是跟他有关系。~笑~
void mmcsd_detect(void *param)
{
struct rt_mmcsd_host *host;
rt_uint32_t ocr;
rt_int32_t err;
while (1)
{
if (rt_mb_recv(&mmcsd_detect_mb, (rt_ubase_t *)&host, RT_WAITING_FOREVER) == RT_EOK)
{
if (host->card == RT_NULL)
{
mmcsd_host_lock(host);
mmcsd_power_up(host);
mmcsd_go_idle(host);
mmcsd_send_if_cond(host, host->valid_ocr);
err = sdio_io_send_op_cond(host, 0, &ocr);
if (!err)
{
if (init_sdio(host, ocr))
mmcsd_power_off(host);
mmcsd_host_unlock(host);
continue;
}
/*
* detect SD card
*/
err = mmcsd_send_app_op_cond(host, 0, &ocr);
if (!err)
{
if (init_sd(host, ocr))
mmcsd_power_off(host);
mmcsd_host_unlock(host);
rt_mb_send(&mmcsd_hotpluge_mb, (rt_ubase_t)host);
continue;
}
/*
* detect mmc card
*/
err = mmc_send_op_cond(host, 0, &ocr);
if (!err)
{
if (init_mmc(host, ocr))
mmcsd_power_off(host);
mmcsd_host_unlock(host);
rt_mb_send(&mmcsd_hotpluge_mb, (rt_ubase_t)host);
continue;
}
mmcsd_host_unlock(host);
}
else
{
/* card removed */
mmcsd_host_lock(host);
if (host->card->sdio_function_num != 0)
{
LOG_W("unsupport sdio card plug out!");
}
else
{
rt_mmcsd_blk_remove(host->card);
rt_free(host->card);
host->card = RT_NULL;
}
mmcsd_host_unlock(host);
rt_mb_send(&mmcsd_hotpluge_mb, (rt_ubase_t)host);
}
}
}
}
8、访问tf/sd卡
(1)格式化sd卡,有3种方法
<方法1>使用msh命令行格式化:
msh />list_device
device type ref count
-------- -------------------- ----------
sd0 Block Device 0
wind25qx Block Device 0
spi10 SPI Device 0
spi1 SPI Bus 0
spi00 SPI Device 0
spi0 SPI Bus 0
uart2 Character Device 0
uart0 Character Device 2
msh />mkfs -t elm sd0
msh />
<方法2>程序里面格式化(参考官方文档:虚拟文件系统)
dfs_mkfs( "elm", "sd0");//其中elm是文件系统类型,sd0是块设备名称
<方法3>把tf卡拔出来,电脑格式化~~~笑~~
(2)挂载sd卡到根目录
原本,我想把spi flash块设备挂载为/,然后sd卡挂接为/sdcard,
奈何本人水平太差,不知道怎么分割spiflash的空间,一部分作为程序空间,一部分作为存储空间。(希望高手指教)
所以,直接把sd卡挂接为/。
几行代码搞定,把代码写在线程里:
void start_thread(void *parameter)
{
int ret = 0;
rt_thread_delay(100);
/*挂载sdio0上的sd卡,文件系统类型为elm*/
if( 0 == dfs_mount("sd0","/","elm", 0,0) )
{
printf("sd0 mount to / \n");
}
else
{
printf("sd0 mount to / faild \n");
}
while(1)
{
rt_thread_delay(1);
}
}
(3)使用msh给sd卡创建文件夹。
7、查看代码,看看能不能找到问题所在
既然是一个成熟的系统,那么,十有八九,不是别人系统问题,只能是单板匹配问题。
单板差异,那么驱动就有差异,E/MMC相关的是sdio,我们看看SDIO引脚配置是否匹配。
从源码里面看到,
SDIO 0所使用的引脚为:/* SDC0: PF0-PF5 */[[]],
SDIO 1没有使用,所以没有配置。
static void sdio_gpio_init(struct sdio_drv *sdio_des)
{
int pin;
if ((rt_uint32_t)sdio_des->mmc_des == MMC0_BASE_ADDR)
{
/* SDC0: PF0-PF5 */[[]]
for (pin = GPIO_PIN_0; pin <= GPIO_PIN_5; pin++)
{
gpio_set_func(GPIO_PORT_F, pin, IO_FUN_1);
gpio_set_pull_mode(GPIO_PORT_F, pin, PULL_UP);
gpio_set_drive_level(GPIO_PORT_F, pin, DRV_LEVEL_2);
}
}
else if ((rt_uint32_t)sdio_des->mmc_des == MMC1_BASE_ADDR)
{
//todo: config gpio port
RT_ASSERT(0);
}
}
对应我们的单板,SDIO0 使用的引脚情况是一致的。
找不到红色字的原因,只好先放下他。先看看其他东西怎么玩!
6、搜索相关内容
通过搜索关键字:[E/[MMC]] [err]:0x00000100, RTO
找到相关帖子
(1)f1c100s 运行时提示错
看来RTT论坛并不重视答疑,从2020年的帖子,到现在都没有解答。
(2)找不到相关内容~~~~难受!
5、看看系统启动流程
我们看看系统注册了什么组件、注册了什么驱动。启动的时候,做了什么事情。
RTT借助宏INIT_EXPORT实现了自动初始化机制,我们找到这个宏的定义:
(参考帖子:[求助]RTT组件自动统一初始化宏INIT_EXPORT)
自动初始化机制的核心就在文件D:\rt-thread-gitee_master\src\components.c
和D:\rt-thread-gitee_master\include\rtdef.h里面
因为代码篇幅过长,不做详细描述,咱们使能RTT内核调试宏,将初始化流程打印出来看看
(1)使能内核调试宏
#ifndef RT_DEBUG_INIT
#define RT_DEBUG_INIT 1
#endif
(2)编译、修饰、烧写、查看启动日志
可以看到,启动的时候,执行了哪些组件的初始化。(BOARD/PREV/DEVICE/COMPONENT/ENV/APP)
打印日志上面2条红色的错误依然醒目,得看看是什么原因导致的。
4、现象,接上串口0,看打印。
打印了一些乱七八糟的东西,可能是板子不匹配导致的。
(1)修改main.c文件,干掉一些东西,先让系统跑起来。
#include "rtthread.h"
#include "drv_clock.h"
#include "drv_gpio.h"
#include <rtdevice.h>
#include <dfs_fs.h>
#include <drv_sdio.h>
#include <drv_fb.h>
#include <stdio.h>
#include "UartCursor.h"
#include "LVGL_Interface.h"
#include "demo.h"
#include "AppPriorityList.h"
lcd_layer_Struct lcd_layer1={
.width=100,
.height=100,
.posx=0,
.posy=0,
.priority=1,
.pipe=1,
.alpha_enable=1,
.alpha_value=0xA0,
.vram=(void *)0x80500000,
.vram_format=VRAM_FORMAT_RGB565,
};
lcd_layer_Struct lcd_layer2={
.width=100,
.height=100,
.posx=50,
.posy=50,
.priority=2,
.pipe=0,
.alpha_enable=1,
.alpha_value=0xA0,
.vram=(void *)0x80600000,
.vram_format=VRAM_FORMAT_RGB565,
};
void start_thread(void *parameter)
{
while(1)
{
rt_thread_delay(1);
}
}
#define RT_STARTLOOP_THREAD_STACK_SIZE 2048
#define MY_DISP_HOR_RES LV_HOR_RES_MAX
static void MainThreadCreat()
{
rt_thread_t tid;
tid = rt_thread_create("start_thread", start_thread, RT_NULL,
RT_STARTLOOP_THREAD_STACK_SIZE, PRIORITY_START_LOOP, 20);
RT_ASSERT(tid != RT_NULL);
rt_thread_startup(tid);
rt_kprintf("[Thread]start_thread Created.\n");
}
int main(int argc, char **argv)
{
rt_kprintf("Start...\n");
rt_kprintf("periph_get_pll_clk:%d\n", periph_get_pll_clk());
rt_kprintf("cpu_get_clk:%d\n", cpu_get_clk());
rt_kprintf("ahb_get_clk:%d\n", ahb_get_clk());
rt_kprintf("apb_get_clk:%d\n", apb_get_clk());
MainThreadCreat();
return 0;
}
(2)编译,修饰,烧写。
复位单板,启动,看起来较为正常了,但是还是有些问题。
插上TF卡,还是这个样子,怀疑是板子引脚不匹配导致的。
最近画了块f1c200s_ch579m的板子,尝试给200s跑RTT。
F1C100s-LCD-TV-CH579M 板子
涉及内容:
(1)基于RTThread的F1C100s开发(带boot启动+硬件多图层+硬件游标+LVGL+SDIO)
(2)Gitee-RT-Thread
(3)RT-Thread 下载
1、从上面链接下载资源,获取资源
(1)[rt-thread-gitee_master.zip]
(2)[allwinner_tina_prj_v1.zip]
(3)[env_released_1.2.0.zip]
2、安装ENV
(1)安装步骤,请观看视频:跳转到RTT官方视频页
3、解压资源
(1)解压 [rt-thread-gitee_master.zip] 到D盘根目录(当然也可以其他盘啦~笑~)
(2)解压 [allwinner_tina_prj_v1.zip] ,
然后复制allwinner_tina_prj_v1 到 rt-thread-gitee_master\bsp目录下。
(有人问,为什么不用官方的allwinner_tina呢?因为官方的工程,不带bootloader,咱们为了方便,直接借助网友的工程。)
(3)在目录 D:\rt-thread-gitee_master\bsp\allwinner_tina_prj_v1,打开ENV。
(4)在ENV下,输入menuconfig。
(5)编译RTT,输入scons。
(6)得到未经修饰的rtthread.bin
(7)执行脚本文件,[flashtospi.bat],
这个脚本用于修饰rtthread.bin,增加魔术头,并下载bin文件到flash中。
(8)提示缺少120D.dll文件,咱们从网上复制一个这个文件进来,放在D:\rt-thread-gitee_master\bsp\allwinner_tina_prj_v1\tools目录下。
继续执行第(7)步,修饰rtthread.bin成功。但是下载失败。
板子接入USB,按住上面的BOOT键,按下RST键,然后松开RST,此时电脑识别到usb设备。
继续执行第(7)步,程序下载成功。
问题已经解决,在keil下,关键代码如下:
(1)h文件
/*自动初始化模块*/
#define RT_SECTION(x) __attribute__((section(x)))
#define RT_UNUSED __attribute__((unused))
#define RT_USED __attribute__((used))
typedef int (*init_fn_t)(void);
#ifdef _MSC_VER /* we do not support MS VC++ compiler */
#pragma section("rti_fn$f",read)
struct rt_init_desc
{
const char* level;
const init_fn_t fn;
};
#define INIT_EXPORT(fn, level) \
const char __rti_level_##fn[] = level"__rt_init_"#fn; \
__declspec(allocate("rti_fn$f")) \
RT_USED const struct rt_init_desc __rt_init_msc_##fn = \
{__rti_level_##fn, fn };
#else
#define INIT_EXPORT(fn, level) \
RT_USED const init_fn_t __rt_init_##fn RT_SECTION(".rti_fn." level) = fn
#endif
/* board init routines will be called in board_init() function */
#define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1")
/* pre/device/component/env/app init routines will be called in init_thread */
/* components pre-initialization (pure software initilization) */
#define INIT_PREV_EXPORT(fn) INIT_EXPORT(fn, "2")
/* device initialization */
#define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "3")
/* components initialization (dfs, lwip, ...) */
#define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "4")
/* environment initialization (mount disk, ...) */
#define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5")
/* appliation initialization (rtgui application etc ...) */
#define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6")
(2)c文件
static int rti_start(void)
{
return 0;
}
INIT_EXPORT(rti_start, "0");
static int rti_end(void)
{
return 0;
}
INIT_EXPORT(rti_end,"7");
void rt_components_init(void)
{
const init_fn_t* fn_ptr;
for (fn_ptr = &__rt_init_rti_start; fn_ptr < &__rt_init_rti_end; )
{
(*fn_ptr)();
fn_ptr ++;
}
}
以上代码源自RTT bsp,以及1楼参考的文章。
成功的工程:ITX_190_HWA.zip
继续描述场景
(1)优化等级-O0
(2)不勾选One ELF Section per Function
编译后,想要自动调用的宏还是没有被调用。
因为是公司代码,不方便上传,先上次map文件:
CMSIS-RTOS2-free_map.zip
如果大神们不好诊断,明天,我可以用其他单板实现这个框架,发代码出来。
编译环境:Keil 5
(1)map文件关键信息
__rt_init_rti_start 0x08011ce0 Data 4 hw_action.o(.rti_fn.0)
__rt_init_rti_end 0x08011ce4 Data 4 hw_action.o(.rti_fn.7)
hw_action.o(.text) refers to hw_action.o(.rti_fn.0) for __rt_init_rti_start
hw_action.o(.text) refers to hw_action.o(.rti_fn.7) for __rt_init_rti_end
hw_action.o(.rti_fn.0) refers to hw_action.o(.text) for rti_start
hw_action.o(.rti_fn.7) refers to hw_action.o(.text) for rti_end
hw_dev_led.o(.rti_fn.4) refers to hw_dev_led.o(.text) for register_hw_dev_led
Removing hw_dev_led.o(.rti_fn.4), (4 bytes).
0x08011ce0 0x08011ce0 0x00000004 Data RO 2106 .rti_fn.0 hw_action.o
0x08011ce4 0x08011ce4 0x00000004 Data RO 2107 .rti_fn.7 hw_action.o
如题,我写了个简单的设备管理器,
每个设备,写完之后,应该有个注册函数,
我想让这个注册函数自动被管理器调用。
参考到了RTT的宏,指定这些函数在某一个特定的代码段,
按顺序排列起来,然后从头到尾,逐个调用。
#define INIT_EXPORT(fn, level) \
const init_fn_t __rt_init_##fn RT_SECTION(".rti_fn."level) = fn
#define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1")
#define INIT_CPU_EXPORT(fn) INIT_EXPORT(fn, "2")
#define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "3")
#define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "4")
#define INIT_FS_EXPORT(fn) INIT_EXPORT(fn, "5")
#define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6")
参考这篇文章: RT-Thread 学习笔记(七)
我从中抄袭了这些代码
(1)头文件代码
/*自动初始化模块*/
#define RT_SECTION(x) __attribute__((section(x)))
#define RT_UNUSED __attribute__((unused))
#define RT_USED __attribute__((used))
typedef int (*init_fn_t)(void);
#define INIT_EXPORT(fn, level) \
const init_fn_t __rt_init_##fn RT_SECTION(".rti_fn."level) = fn
#define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1")
#define INIT_CPU_EXPORT(fn) INIT_EXPORT(fn, "2")
#define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "3")
#define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "4")
#define INIT_FS_EXPORT(fn) INIT_EXPORT(fn, "5")
#define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6")
(2)c文件代码
static int rti_start(void)
{
return 0;
}
INIT_EXPORT(rti_start, "0");
static int rti_end(void)
{
return 0;
}
INIT_EXPORT(rti_end,"7");
void rt_components_init(void)
{
const init_fn_t* fn_ptr;
for (fn_ptr = &__rt_init_rti_start; fn_ptr < &__rt_init_rti_end; )
{
(*fn_ptr)();
fn_ptr ++;
}
}
(3)调用:
①初始化设备管理器的时候,调用rt_components_init()函数,
②修饰注册函数
INIT_COMPONENT_EXPORT(register_hw_dev_led);
(4)串口打印,没有看到register_hw_dev_led()函数的调用打印。
板子已经发出去制作,但是还没测试。
板子尺寸:10cm*10cm
板载资源:
(1)F1C100s 408MHz 32MB DDR
(2)引出CVBS/TV out 带莲花座
(3)SPI Flash X2
(都挂载在SPI0上,SPI Flash0 是系统存储器,SPI Flash1焊盘兼容Nand Flash)
(4)引出HP接口,带耳机座
(5)板载功放芯片,可接喇叭
(6)板载MIC模块
(7)板载SD卡座
(8)板载JTAG接口,
板载UART0接口(PE0 PE1)
复位按键,Flash Boot按键,方便调试
(9)板载LCD 接口,带背光电路
FPC40P 电阻屏+ DC2-40P牛角座
(10)板载USB Host座,同时带XH2.54座,方便扩展。
(11)板子DC接口,可12V供电,并引出12V XH2.54座子。
(12)CH579M 30MHz, RAM 20KB/Flash 256KB
(通过SPI1与F1C100s连接,目的是扩展串口,以太网透传)
a.扩展以太网接口 10Mbps
b.扩展4串口
c.引出SWD调试口,方便调试。
d.引出USB Host接口
板子还没测试,程序也没有调试,先上图,各位大神也可以过来观摩观摩!
画板子不专业,希望各位大哥可以指点指点!
板子资源:
调试屏底板V2_线位图.pdf
调试屏底板V2_原理图.pdf
调试屏底板V2_whycan打包_20211220-1235.zip
注意,很多地方我没打丝印标识,兄弟们可以下载文件,自行打丝印!
注意,很多地方我没打丝印标识,兄弟们可以下载文件,自行打丝印!
注意,很多地方我没打丝印标识,兄弟们可以下载文件,自行打丝印!
兄弟们,看看我的帖子,
https://whycan.com/t_3138.html
里面的流程,内容,
完全是晕哥帮忙搞出来的。
晕哥帮忙解决了问题,
还给了这么多的积分,真的很厚道。
个人认为,对于咱们搞电子/嵌入式的职业,少说都有6K/8k起步吧,
真正能解决问题的资源,不说几十块,几百块,甚至几千块都值得!
白P可耻!!白P可耻!!白P可耻!!
居然还在吵,说实话,别人卖服务的,就值这个价。
我们换个角度讲,你搞了个linux开发板,卖200块。
我买了你的开发板,而我水平又比较差,我天天捣鼓。
一有不懂我就艾特你!!!
第一天,我私聊你:环境怎么装?
第二天,我私聊你:怎么编译内核,怎么编译设备树,怎么......
......
过阵子我私聊你:你这个系统接wifi网络不稳定,是不是有问题?
又过阵子我私聊你:你这个系统使用USB接4G模块没反应,是不是有问题?
......
......
那么请你告诉我,直到我把产品做出来,技术支持耗掉多少工时?200块够发工资吗?
我耗掉了多少工时,我老板这个时间段给我发的工资要多少?项目是不是已经逾期了?
这个时候,有一家开发板厂商,他已经把这个东西都捣鼓好了,我只需要写业务代码就好了,一两天上手。
但是,这个开发板有点贵,1800元!!!
天啊,不可想象,居然是我半个月工资了!!!
......
抱歉,兄弟们,我编不下去了,我还要上班......
总得来说,你们懂的......
电脑显示正常吗?
请教了多位大神,借鉴了资料:
https://blog.csdn.net/zottffssent123/article/details/114636842
测试完后,确认是编码问题。
修改为GBK文件就可以了。
因为CH552G买不到,使用了CH554,使用WCH工具,通过USB线下载了楼主的各个版本程序,都识别不到设备,(未知设备都没有)。以下是我的电路图纸:
DAP_link_Project.zip
http://103.47.82.49/share/DAP_link_Project.zip
麻烦各位大哥看看。
从dotnet core 2.1起,官方就发布了关于arm的支持,但是不是支持ARMv6以及更早的 CPU 指令集版本,而V3S的cortex-A7是可以运行的,所以在论坛里找了一下,发现有一个帖子进行了尝试,但是遇到了ICU的问题就没有下文了,这里我分享一下我的过程。
1、编译V3S的buildroot,用的晕哥的配置,烧录到V3S后,确保可以正常运行。
2、去官网下载dotnet core 的对应版本https://dotnet.microsoft.com/ ,我这里下的是5.0的最新版本。
3、解压下载的包,拷贝到一张TF卡上,因为上百M的文件无法放入spiflash内。
4、在本地电脑上预先编译发布一个可以在arm上运行的应用程序,可以下载我的helloworld.
5、拷贝publish文件到TF卡内。
6、插入TF卡,给V3S上电。
7、挂载TF卡,mount /dev/mmcblk0 /mnt/mmc
8、运行一下dotnet --info,如果报ICU找不到的错,再运行一下export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
9、cd到对应目录,执行./publish/hello_world。# ./publish/hello_world Hello World! 你好世界!
附件:
publish.zip
buildroot-2018.08.2-v3s.zipICU问题解决链接:
https://github.com/dotnet/core/issues/2186#issuecomment-671105420
哈哈,我被ICU困住了
Hi everyone ,
I design a new PCB with reference of lichee Pi Schematic, but I removed SPI Flash as I don't need to boot from SPI Flash.
After soldering board I can't see signal on SDClock, But can see on SPI Flash Clock.Unfortunately I also not reserve usb connector, as my idea was to flash sdcard pc side and boot the board.
Crystal is oscillating.
So with default boot form F1C100s it will not attempt to boot from SD ?
Any suggestion how to move forward ?If no option, possibly I need to make new pcb with USB & SPI Flash.
嗨,大家好,
我参考lichee Pi Schematic设计了一个新的PCB,但由于不需要从SPI Flash引导,因此删除了SPI Flash。
焊完板后,我在SDClock上看不到信号,但在SPI闪存时钟上却看到了。不幸的是,我也不保留USB连接器,因为我的想法是在sdcard pc侧进行闪存并启动开发板。
晶体振荡。
因此,使用默认引导形式F1C100s,它将不会尝试从SD引导吗?
任何建议如何前进?如果没有选择,可能我需要使用USB和SPI Flash制作新的PCB
Thanks & Regards
PV
如果我没记错的话,是优先从SD卡启动的。是不是SD卡中没有正确的引导程序呢?
从网上找到icu的源码,试图编译它。参考教程
https://blog.csdn.net/imatt/article/details/109599852
流程如下:
(1)找到我的交叉编译工具链路径
home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/host/bin/
(2)设置环境
export CC=/work/sinlinx-v3s-sdk/buildroot/out/host/bin/arm-buildroot-linux-gnueabihf-gcc
export CXX=/work/sinlinx-v3s-sdk/buildroot/out/host/bin/arm-buildroot-linux-gnueabihf-g++
export AR=/work/sinlinx-v3s-sdk/buildroot/out/host/bin/arm-buildroot-linux-gnueabihf-ar
#根目录(便于使用)
export CROSS_ROOT=/work/sinlinx-v3s-sdk/buildroot/out/host/bin
(3)进入源码目录,创建arm-build
cd ./icu4c/source
mkdir arm-build
(4)
cd arm-build
../source/runConfigureICU Linux/gcc
make
cd ..
(5)编译
./configure --host=arm-linux --prefix="${CROSS_ROOT}/usr" CXXFLAGS=-std=c++11 --with-sysroot="$CROSS_ROOT" --with-cross-build='/home/sinlinx/Documents/icu/source/arm-build' --disable-samples --disable-tests
(6)install
sudo make install
[ 0.952845] Creating 4 MTD partitions on "spi0.0":
[ 0.957800] 0x000000000000-0x000000100000 : "u-boot"
[ 0.966748] rfd_ftl: no RFD magic found in 'u-boot'
[ 0.973911] ftl_cs: FTL header not found.
[ 0.979699] 0x000000100000-0x000000210000 : "dtb"
[ 0.988407] rfd_ftl: no RFD magic found in 'dtb'
[ 0.995293] ftl_cs: FTL header not found.
[ 1.000986] 0x000000110000-0x000000620000 : "kernel"
[ 1.019761] rfd_ftl: no RFD magic found in 'kernel'
[ 1.027133] ftl_cs: FTL header not found.
[ 1.032773] 0x000000510000-0x000001000000 : "rootfs"
[ 1.066081] rfd_ftl: no RFD magic found in 'rootfs'
[ 1.073276] ftl_cs: FTL header not found.奇怪,这是什么错误?
我也不知道,要请教一下晕哥了
合作伙伴的电池输出48V, 我们公司的设备是5V输入, 用什么电源方案比较好呢? DC-DC?
http://whycan.com/t_4561.html#p45268
(出处:哇酷开发者社区)
谢谢晕哥,MP4560方案应该是OK的。
换256x16bitx2cs结构的DDR颗粒就可以,如K4B8G1646,H5TC8G63AMR等DualDie 96ball 封装。原理图不清晰 好像是H5TQ4G83AFR 512x8bit 78ball芯片。单颗粒A33最好用16bit。原理图ODT CKE ZQ CS都是分别引出的,看您PCB引出的焊盘 如果是我画的这样就可以用。
https://whycan.com/files/members/1389/QQ图片20210414125137_20210414-1422.jpg
小姐姐总是这么厉害,仰望!
楼主请问我在编译根文件系统时,出现了这个问题,该怎么解决
freadahead.c: In function 'freadahead':
freadahead.c:92:3: error: #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
92 | #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
| ^~~~~
CC fseek.o
CC fseeko.o
make[5]: *** [Makefile:1915: freadahead.o] Error 1
make[5]: *** Waiting for unfinished jobs....
fseeko.c: In function 'rpl_fseeko':
fseeko.c:110:4: error: #error "Please port gnulib fseeko.c to your platform! Look at the code in fseeko.c, then report this to bug-gnulib."
110 | #error "Please port gnulib fseeko.c to your platform! Look at the code in fseeko.c, then report this to bug-gnulib."
| ^~~~~
make[5]: *** [Makefile:1915: fseeko.o] Error 1
make[4]: *** [Makefile:1674: all] Error 2
make[3]: *** [Makefile:1572: all-recursive] Error 1
make[2]: *** [Makefile:1528:all] 错误 2
make[1]: *** [package/pkg-generic.mk:230:/home/windovo/buildroot-2017.08/output/build/host-m4-1.4.18/.stamp_built] 错误 2
make: *** [Makefile:79:_all] 错误 2
可能是源码没有完整下载导致的。
或者是c库没选对。
amturing 说:@Kevincoooool
你好,以及哇酷的站长您好,我是帖子中的店铺管理者,由于我的侵权,甚至是无知,我倒卖了开源的作品,是我不对,只是为了搞点小钱,就侵犯了,甚至不顾及了劳动成果,是我的不对,别人购买了这个产品,我也是再说,这个不是我的原创,是网络的以为大佬做的,我并没有声称是自己的劳动成果,在此所有的产品,我已经下架了,来这里给大家以及原创道个歉!你这个1积分是如何下载到东西的,没有道理,既然不是晕哥的忠实粉丝。其实嘛可以自己下载改一改啥的,如果实在没这技术,店铺表明出处加上个如有侵权请联系,小本生意挣点外快不容易。再给吹嘘一波楼主,说不定楼主一开心还给你下个百八十单的=。=
积分少的情况下,是可以通过花钱购买资源的。
我开源的V3S板 被这个人倒卖 https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-23475677529.32.758375f96Aenbg&id=638672311949
另一个大佬开源的V3S板 也被他倒卖 https://item.taobao.com/item.htm?spm=a230r.1.14.23.2c2a21a3zPsol1&id=637906605633&ns=1&abbucket=13#detail
建议大家以后开源只放原理图PDF文件 不要放PCB和SCH文件
卧槽,666啊。
屏幕啥型号 贵不
我买的,5寸,电容屏,比较贵,86+10(运费)。
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.21472e8dmTYuVF&id=615049709656&_u=b1l781v83141
分享一个华芯微特的SWM32SRET7电路。
芯片介绍:
⚫ 内核
◼ 32 位 ARM® Cortex™-M4 内核
◼ 24 位系统定时器
◼ 工作频率最高 120MHz
◼ 硬件单周期乘法
◼ 集成嵌套向量中断控制器(NVIC),提供最多 240 个、8 级可配置优先级的中断
◼ 通过 SWD 接口烧录
⚫ 片上 SRAM 存储器
◼ 128KB
⚫ 片上 FLASH 存储器
◼ 512KB
◼ 支持用户定制 ISP(在系统编程)更新用户程序
⚫ 串行接口
◼ UART 模块,具有独立 8 字节 FIFO,最高支持主时钟 16 分频
◼ SPI 模块,具有 8 字节独立 FIFO,支持 SPI、SSI 协议,支持 Master/slave 模式
◼ I2C 模块,支持 7 位、10 位地址方式,支持 Master/slave 模式
◼ CAN 模块,支持协议 2.0A(11Bit 标识符)和 2.0B(29Bit 标识符)
⚫ PWM 控制模块
⚫ 定时器模块
◼ 6 路 32 位通用定时器
◆ 具备独立中断 ◆ 可做计数器使用 ◆ 支持输入单脉冲捕获功能
◼ 32 位看门狗定时器,溢出后可配置触发中断或复位芯片
⚫ RTC 模块
⚫ DMA 模块
⚫ SRAMC 模块
⚫ SDRAMC 模块
注意:只支持字操作
◼ 支持 16Bit 位宽的 SDRAM
◼ 支持兼容 PC133 标准的 SDRAM 颗粒
◼ 支持 2MB 到 32MB 的外部 SDRAM 颗粒
⚫ NORFLC 模块
◼ 支持并行 NOR FLASH 接口
◼ 支持 8 位数据位宽和 16 位数据位宽的外部 NOR FLASH 存储器 ◼ 最大支持 24 位地址线
⚫ SDIO 接口模块
⚫ TFT-LCD 驱动模块
◼ 支持 SYNC 接口的外部 LCD 扩展
◼ 支持最高分辨率 1024*768,实际分辨率可以配置
◼ 输出数据宽度 16Bit
◼ 支持横屏和竖屏模式
⚫ GPIO
⚫ 模拟外设
⚫ 欠压检测(BOD)
⚫ 温度传感器
⚫ 环境
价格才10块钱左右,一般的菜单显示足够了。
工程文件:
SWM32SRET7_5寸_480x800_GT911.7z
PDF原理图文件:
PCB_Project.pdf
效果图:
dso_2019 说:英语都这么好,看你们写的很费劲,要百度翻译才行
测试百度翻译。
我最近遇到的中国产品的问题是,购买了1W激光模块,工作了12-13个小时,然后就停了。我从其他论坛上了解到的情况对于中国激光模块来说非常普遍。
It is suggested that the laser head should work for 15 minutes and rest for 5 minutes instead of working continuously, which is beneficial to prolong the life of the laser head.
https://whycan.com/files/members/1560/QQ图片20210127164232.png
第一步就要劝退,下载要20小时
下载帖子下面的虚拟机吧。都配置好了
卓林 说:请问,我将可执行程序拷贝到板子上执行,发现提示找不到文件
# ./test_qt -sh: ./test_qt: not found #
但是实际上文件是在根目录的,
# ls bin lib32 mnt run test_qt var dev linuxrc opt sbin tets2 etc lost+found proc sys tmp lib media root test usr
是什么原因呢,方便看看吗?
我把相同的代码用ubuntu的qmake编译后是可以执行的。
并且lib文件夹下也都把需要的文件复制进去了,是不是还需要配置什么东西,环境变量或者别的。
看看是不是权限问题,粗暴一点,chmod 777 xxx
编译出来,根文件系统,尺寸大的话,参考这几层的回复。
解决方法:把QT和一些没用到的库取消勾选就好了。
下面的几层回复,没有组织好,但是你要的答案,确实在里面。
http://whycan.com/t_3138.html#p31496
http://whycan.com/t_3138.html#p31627
http://whycan.com/t_3138.html#p36643
你好 linjie
buildroot 里配置了
Search Results ─
│ Symbol: BR2_PACKAGE_LRZSZ [=y] 这里
│ Type : boolean
│ Prompt: lrzsz
│ Location:
│ -> Target packages
│ (1) -> Networking applications
│ Defined at package/lrzsz/Config.in:1
│ Depends on: !BR2_STATIC_LIBS [=n]
编译后 在 output/images/rootfs.tar /bin 里没有找到 lrz命令,,,,
# cd ../
# ls
bin hello lib32 media proc sbin usr
dev hellonano linuxrc mnt root sys var
etc lib main.c opt run tmp
# cd bin
# ls
ash dumpkmap linux64 nice sh
busybox echo ln pidof sleep
cat egrep login ping stty
chattr false ls pipe_progress su
chgrp fdflush lsattr printenv sync
chmod fgrep mkdir ps tar
chown getopt mknod pwd touch
cp grep mktemp rm true
cpio gunzip more rmdir umount
date gzip mount run-parts uname
dd hostname mountpoint sed usleep
df kill mt setarch vi
dmesg link mv setpriv watch
dnsdomainname linux32 netstat setserial zcat
# lrz
/bin/sh: lrz: not found
#LinjieGuo 说:LinuxGo 说:你好 linjie
那我重新编译 打包 烧录到芯片后
pc下载 SecureCRT.zip 这个工具就能跑了啊
不用自己装了是的,先运行绿色.bat,输入Y,破解,然后退出,找到SecureCRT.exe执行程序,连接串口就ok了。
在buildroot里勾选,是可以的喔,我测试过。我电脑在家里,我得晚上回去看看,现在不方便搞f1c100s,你看看是不是勾选错了,或者直接下载我配置好的虚拟机,
你好 linjie
我在编译 的时候出现
l10nflist.c:42:19: fatal error: argz.h: No such file or directory
# include <argz.h>
^
compilation terminated.
make[2]: *** [Makefile:78: l10nflist.o] Error 1
make[2]: Leaving directory '/home/jonsen/f1c100s/lrzsz/lrzsz-0.12.20/intl'
make[1]: *** [Makefile:172: all-recursive] Error 1
make[1]: Leaving directory '/home/jonsen/f1c100s/lrzsz/lrzsz-0.12.20'
make: *** [Makefile:282: all-recursive-am] Error 2不知如何处理?
直接进buildroot里,make menuconfig,然后找到lrzsz这个支持包,勾选上,然后编译。就有了,这种编译的过程学习一下就ok了。
为什么是这样呢?我这个小白肯定是不知道,那么我们百度一下尝试科普。
参考链接:https://jingyan.baidu.com/article/2c8c281ded86ef0008252ab0.html
缺省情况下ALSA静音所有的输出。为了获得声音,必须解除主音量和PCM音量的静音。
amixer -c 0 sset Master,0 100%,100% unmute
amixer -c 0 sset PCM ,0 100% unmute
选项包括mute,unmute,capture,nocapture,rec,norec,数字或left:right。
amixer不带参数运行时,返回声卡上所有通道的设置情况。
为了在每次插入声卡驱动模块时,都打开静音,您可以在/etc/modules.conf加入下列语句:
post-install snd-card-sb16 amixer -c 0 sset Master,0 100%,100% unmute && amixer -c 0 sset PCM ,0 100% unmute
在成功插入了alsa声卡模块之后,系统会出现/proc/asound目录,这个目录描述了声卡的工作情况,以及创建的设备文件。
虽然看不懂,但是我们知道了:
缺省情况下ALSA静音所有的输出。为了获得声音,必须解除主音量和PCM音量的静音。
通过上面的步骤,已经成功构建根文件系统,我们来做打包操作。
只需要修改build.sh文件就可以了,注释掉相关的编译命令。
function build_buildroot()
{
echo "Build buildroot"
cd $BUILDROOT_DIR
mkdir -p $BUILDROOT_OUT_DIR
# cp configs/sinlinx_defconfig $BUILDROOT_OUT_DIR/.config
# make O=$BUILDROOT_OUT_DIR oldconfig
# make O=$BUILDROOT_OUT_DIR
rm -rf $ROOTFS_DIR
mkdir -p $ROOTFS_DIR
tar xvf $BUILDROOT_OUT_DIR/images/rootfs.tar.bz2 -C $ROOTFS_DIR
}
然后,执行这个脚本:
./build.sh
生成一个img文件,烧写进单板,运行madplayer看看。
madplayer ./0001.mp3
执行成功,输出如下图所示,但是没有声音,不知道为啥。
我们应该怎么做呢?我们进入./buildroot/out目录,这个是工作目录。进入配置界面。
cd /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out
make menuconfig
进入这个界面,把这个项给勾选上。(按Y)
Target packages --->
Audio and video applications --->
[Y] madplay
保存并退出,然后在这个目录下,执行命令
make
mkdir -p rootfs
sudo tar xvf ./images/rootfs.tar.bz2 -C ./rootfs
我根据参考帖子的方法,交叉编译madplayer,结果是不顺利的,干脆直接在buildroot里面添加madplayer包。
但是sinlinx的源码包编译方法是使用build.sh脚本的,所以我们要这样做。
(1)阅读build.sh文件,得知编译流程
(2)我们手工处理
(3)注释掉手工处理的相关操作,然后./build.sh
说干就干!通过阅读可以得知,有这样一段代码,用于buildroot的编译。
function build_buildroot()
{
echo "Build buildroot"
cd $BUILDROOT_DIR
mkdir -p $BUILDROOT_OUT_DIR
cp configs/sinlinx_defconfig $BUILDROOT_OUT_DIR/.config
make O=$BUILDROOT_OUT_DIR oldconfig
make O=$BUILDROOT_OUT_DIR
rm -rf $ROOTFS_DIR
mkdir -p $ROOTFS_DIR
tar xvf $BUILDROOT_OUT_DIR/images/rootfs.tar.bz2 -C $ROOTFS_DIR
}
把某些变量展开,实际上是这样的。
echo "Build buildroot"
cd /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot
mkdir -p /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out
cp configs/sinlinx_defconfig /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/.config
make O=/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out oldconfig
make O=/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out
rm -rf /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/rootfs
mkdir -p /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/rootfs
tar xvf /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/images/rootfs.tar.bz2 -C /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/rootfs
可以看出,这一段脚本,先复制了.config文件过来,然后make编译buildroot。然后创建rootfs文件,用于解压根文件系统。
你好,Linjie :
我的液晶屏是800✖️480。
在哪边修改?LinjieGuo 说:LinuxGo 说:楼主,helloword出来了,接上液晶,液晶不正常。
Uboot启动时液晶是正常显示了个小企鹅。
文件系统全部加载完后液晶就不正常了。
这改哪边呀?你接的LCD分辨率多少呢
得到了hello程序,我们发现,得通过一种方式传数据给单板。
手上又没有TF卡,又不懂怎么用usb传数据,NFS还没研究过,唯有使用调试串口通过命令行终端传输了。
参考我旧的帖子:https://whycan.com/t_4266.html
把lrzsz-0_12_20_tar.gz上传到/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/app目录。
(1)解压
tar -xzvf lrzsz-0_12_20_tar.gz
(2)配置
cd lrzsz-0.12.20/
./configure --cache=arm-linux
(3)编译
make CC=/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/host/bin/arm-linux-gcc
编译得到lrz,lsz。存放在./src/ 目录之下。
我们将这2个工具打包进img文件里面。
修改build.sh。在copy_file_list项中添加2行内容:
$APP_DIR/lrzsz-0.12.20/src/lsz:$ROOTFS_DIR/root/
$APP_DIR/lrzsz-0.12.20/src/lrz:$ROOTFS_DIR/root/
最终结果如下
copy_file_list=(
$ROOTFS_OVERRIDE_DIR/etc/inittab:$ROOTFS_DIR/etc/inittab
$ROOTFS_OVERRIDE_DIR/etc/profile:$ROOTFS_DIR/etc/profile
$ROOTFS_OVERRIDE_DIR/etc/wpa_supplicant.conf:$ROOTFS_DIR/etc/wpa_supplicant.conf
$ROOTFS_OVERRIDE_DIR/etc/hostapd.conf:$ROOTFS_DIR/etc/hostapd.conf
$ROOTFS_OVERRIDE_DIR/etc/udhcpd.conf:$ROOTFS_DIR/etc/udhcpd.conf
$ROOTFS_OVERRIDE_DIR/etc/mdev.conf:$ROOTFS_DIR/etc/mdev.conf
$ROOTFS_OVERRIDE_DIR/etc/ts.conf:$ROOTFS_DIR/etc/ts.conf
$ROOTFS_OVERRIDE_DIR/etc/init.d/rcS:$ROOTFS_DIR/etc/init.d/
$ROOTFS_OVERRIDE_DIR/etc/init.d/S50sshd:$ROOTFS_DIR/etc/init.d/
$ROOTFS_OVERRIDE_DIR/etc/init.d/S90camera:$ROOTFS_DIR/etc/init.d/
$ROOTFS_OVERRIDE_DIR/etc/init.d/S90wifiap:$ROOTFS_DIR/etc/init.d/_S90wifiap
$ROOTFS_OVERRIDE_DIR/etc/init.d/S90wifista:$ROOTFS_DIR/etc/init.d/_S90wifista
$ROOTFS_OVERRIDE_DIR/etc/init.d/S99appstart:$ROOTFS_DIR/etc/init.d/
$ROOTFS_OVERRIDE_DIR/etc/ssh/sshd_config:$ROOTFS_DIR/etc/ssh/
$ROOTFS_OVERRIDE_DIR/root/*.sh:$ROOTFS_DIR/root/
$ROOTFS_OVERRIDE_DIR/root/demo-h264enc:$ROOTFS_DIR/usr/bin/
$APP_DIR/demo-camera/demo-camera:$ROOTFS_DIR/usr/bin/
$APP_DIR/demo-qt/digitalclock:$ROOTFS_DIR/root/
$APP_DIR/lrzsz-0.12.20/src/lsz:$ROOTFS_DIR/root/
$APP_DIR/lrzsz-0.12.20/src/lrz:$ROOTFS_DIR/root/
$PREBUILT_DIR/libs/*:$ROOTFS_DIR/lib/
)
重头./build.sh,得到新的img文件,烧录进单板。
上面我们已经知道应该使用那个编译器了,这个时候我们便是用这个编译器编译一个程序,放到单板上运行吧。
//hello.c
#include <stdio.h>
int main(void)
{
printf("hello whycan!\r\n");
return 0;
}
编译器路径:/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/host/bin/arm-linux-gcc
执行编译命令:
/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/host/bin/arm-linux-gcc -o hello hello.c
你好 linjie 按上面的检查了一遍 都一样 还是卡在那
LinjieGuo 说:看看14楼的内容,是否勾选上了。
http://whycan.com/t_3138.html#p26711
唯有召唤无所不能的晕哥出场了。
微凉VeiLiang 说:ghosoft 说:现在情况是连上电脑一点反应没有,
晶振起振了24MHz
ID脚是悬空的
复位C104+R103
还有什么地方要检查
能不能是供电不行? 我几路都是1117出的检查VAR 的电阻 是不是200K
破案了, 是这个问题, 用的10K的, 拆了就启动了
然后用FEL把镜像烧进了SPI FLASH, 启动时候报无法识别错误
CPU: Allwinner F Series (SUNIV)
Model: Lichee Pi Nano
DRAM: 32 MiB
Using default environmentSetting up a 800x480 lcd console (overscan 0x0)
In: serial@1c25000
Out: serial@1c25000
Err: serial@1c25000
Net: No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot: 2 1 0
SF: unrecognized JEDEC id bytes: ef, 70, 18
Failed to initialize SPI flash at 0:0 (error -2)
No SPI flash selected. Please run `sf probe'
No SPI flash selected. Please run `sf probe'
=>SPI FLASH还有厂家限制么?
有可能,你看看我的贴子
http://whycan.com/t_3138.html#p26632
或者看看是不是使用了非winbind牌子的SPI Flash。
https://blog.csdn.net/kencaber/article/details/107575210
看看14楼的内容,是否勾选上了。
http://whycan.com/t_3138.html#p26711
你好 请问这里 选择分支:点击Branch->f1c100s-480272 480272 这个版本和屏幕有关系吗? 分支里只有f1c100s-480272lcd-test 我的屏幕时800*480 也用这个分支吗?
LinjieGuo 说:4 编译linux内核
4.1 获取linux内核源码
(1)打开链接:https://github.com/Icenowy/linux.git
...成功编译,生成的 zImage 在 arch ‣ arm ‣ boot 目录下
既然我们是买的板子,肯定要有技术支持啊。
尝试与开发板的技术联系,得到以下回应。
他们已经帮我们配好了,将对应的fex文件,cp为sys_config.fex文件就可以了。/笑
我们一条命令搞定:
cp tools/pack/chips/sun8iw8p1/configs/tiger-spinand-standard/sys_config.fex.800x480 tools/pack/chips/sun8iw8p1/configs/tiger-spinand-standard/sys_config.fex
然后重新执行 ./build.sh
编译后得到 img文件,重新烧写进去,启动出来,正常进入界面。
随便触摸一下,发现左右和上下反过来了。
使用最新的2020年8月份的源码,触摸屏正常了。
大佬 我到这步卡住了
记录了16+0 的读入
记录了16+0 的写出
16777216 bytes (17 MB, 16 MiB) copied, 0.0912342 s, 184 MB/s
记录了984+0 的读入
记录了984+0 的写出
1007616 bytes (1.0 MB, 984 KiB) copied, 0.0097831 s, 103 MB/s
记录了7+1 的读入
记录了7+1 的写出
7999 bytes (8.0 kB, 7.8 KiB) copied, 0.000651522 s, 12.3 MB/s
记录了3800+1 的读入
记录了3800+1 的写出
3891312 bytes (3.9 MB, 3.7 MiB) copied, 0.0505016 s, 77.1 MB/s
mkfs.jffs2: error!: rootfs/
error 2 (No such file or directory)
两个错误
不知怎么办了,。,LinjieGuo 说:6 打包出烧写spi flash的bin文件
先将已经被解压过的文件,统统存放在一个文件夹里,防止干扰视线。
....
用root用户看看,sudo -i,切换到root用户。
楼主,麻烦问下,为什么你编译arm上跑的应用软件时,使用的是:make CC=/home/book/f1c100s/buildroot-2017.08/output/host/bin/arm-linux-gcc
为什么不用直接使用编译kernel时的交叉编译器呢? 比如这个:arm-linux-gnueabi-gcc-7.2.1疑问: 为什么会出现两套交叉编译器呢?
根文件系统是buildroot出来的,buildroot里面自己下载了一个编译器,用来编译根文件系统。
我们的内核是单独编译的,所以有2套编译器。
如果buildroot里包含内核,应该编译器就相同了。
我是这样理解的,根文件系统用什么编译器,应用程序就应该用什么编译器。
应该是是缺库,用静态链接,一般没有问题。
编译命令行加 -static 能不能跑?
如果是缺少库,参考这篇文章,把相关的库文件复制过来。
https://whycan.cn/t_4266.html
LinjieGuo 说:mysteryli 说:啥型号的nand,能共享一下镜像么,我最近编译V3S遇到点坑,想整个镜像快速测试下我的板子
好,我上传一下上来。
型号是MXIC品牌的MX36LF1GE4,但是我搜索居然搜索不到。
看到开发板的硬件资料,发现居然是精简的核心板原理图,没有告诉我们Flash型号,也没有电源管理芯片相关电路。
我将其修改为MX35LF1G,在tb上面可以搜索出,MX35LF1GE4AB,这个型号应该是一样的。以下是我编译出来的镜像:
sinlinx-v3s-linux.zip
镜像第一次启动的时候,8s就可以开机完毕了,第二次启动的时候会多次尝试使用sd卡,要40s左右,不知道是不是有界面选择的原因,我等屏幕到了,然后再做后续介绍。好的,刚好我手头有这个型号的spiflash,我下载进去试试,就是MX35LF1G,估计携程MX36是写错了
再问一下这个镜像默认的屏幕是多大分辨率的?
还有,如果你常用qq咱们可以一起讨论,我情况和你类似也是单片机转linux哈哈
一起交流是可以的,你在晕哥的别墅QQ群里,加我,名字跟论坛ID一样。
我问过客服,他的描述是这样的:
请问驱动5寸屏幕,需要修改提供的源码吗
已读
alexlees 2021-1-5 13:47:41
一样的
也就是说,应该不需要修改源码,但是既然是嵌入式单板,使用LCD控制,没有匹配屏幕分辨率的方案,是需要修改源码的,客服的回复似乎不科学,所以我得收到屏才能明确。
基于帖子 编译开源播放器madplayer,播放音乐,我准备将播放器madplayer移植过来V3s。但是这周要回家,估计要暂停一下更新了。
为了帖子[慢更]小白探索如何使用V3s在线播放音乐 能够继续进行下去。
我没有明确的方向,先各方面玩一玩。这个帖子是在linux ubuntu下编译mad player,并播放音乐。
参考文章:构建嵌入式Linux应用系统 —— mp3播放器 madplay的移植
(1)拉取源码
ftp://ftp.mars.org/pub/mpeg/
从链接里下载一下三个源码包:
libid3tag-0.15.1b.tar.gz
libmad-0.15.0b.tar.gz
madplay-0.15.2b.tar.gz
(2)创建工作目录
mkdir /home/sinlinx/SIN-V3s/mad_player
(3)创建各版本输出目录
mkdir tarball src-x86 src-arm target-x86 target-arm
(4)上传源码进tarball
(5)解压源码
tar xzvf libid3tag-0.15.1b.tar.gz
tar xzvf libmad-0.15.0b.tar.gz
tar xzvf madplay-0.15.2b.tar.gz
(6)编译 madplay所依赖的库文件
a) libid3tag
#cd ../src-x86/libid3tag-0.15.1b
#./configure -prefix=/home/sinlinx/SIN-V3s/mad_player/target-x86
#make
#make install
b) libmad
#cd ../ libmad-0.15.1b
#./configure -prefix=/home/sinlinx/SIN-V3s/mad_player/target-x86
#make
#make install
编译libmad时候出现
cc1: error: unrecognized command line option “-fforce-mem”
解决方式是:找到libmad configure之后的Makefile,
删除 -fforce-mem
原因是gcc 3.4 或者更高版本,已经将其去除了,所以会出现上面的错误!
(7)编译安装 madplay
如果我们还是像刚才那样配置编译选项:
#cd madplay-0.15.2b
#./configure -prefix=/home/sinlinx/SIN-V3s/mad_player/target-x86
提示找不到mad.h头文件。出现这样的错误提示,是因为madplay依赖于libmad库,因此在配置madplay的时候,它会查找相关依赖库的头文件mad.h。因为我们之前已经编译并安装了依赖库,所以只需要根据提示设置 CPPFLAGS环境变量,指向mad.h头文件所在的位置即可。
#./configure -prefix=/home/sinlinx/SIN-V3s/mad_player/target-x86 CPPFLAGS=-I/home/sinlinx/SIN-V3s/mad_player/target-x86/include
提示找不到libmad库文件。出现这样的错误提示,是因为madplay依赖于libmad库,因此在配置madplay的时候,它会查找相关依赖库的库文件libmad.so。因为我们之前已经编译并安装了依赖库,所以只需要根据提示设置
LDFLAGS环境变量,指向libmad.so库文件所在的位置即可
#./configure -prefix=/home/sinlinx/SIN-V3s/mad_player/target-x86 CPPFLAGS=-I/home/sinlinx/SIN-V3s/mad_player/target-x86/include LDFLAGS=-L/home/sinlinx/SIN-V3s/mad_player/target-x86/lib
#make
#make install
(8)上传一个mp3文件到/home/sinlinx/SIN-V3s/mad_player/target-x86/bin目录。
(我的mp3文件命名为0001.mp3)
(9)在ubuntu上面播放测试madplayer是否能够工作
cd /home/sinlinx/SIN-V3s/mad_player/target-x86/bin
./madplay 0001.mp3
执行命令后,console上面输出内容如下:
MPEG Audio Decoder 0.15.2 (beta) - Copyright © 2000-2004 Robert Leslie et al.
Title: Tetris
Artist: CheetahMobile Games
Orchestra: CheetahMobile Games
Album: Rolling Sky OST
Track: 29
Comment: 163 key(Don't
modify):L64FU3W4YxX3ZFTmbZ+8/ZgOOJyVt636f0A43R5s34w/N/EwiWIaOfxUHrFg3D/M22zIla23pRDyjuXVCLS5X/ZvQzK6axrNQ8gWcDRKttQ5E3IHnFFfZNkcu3s7h5xu6T1giWpDOF7JQ+v5zZymuhXEEKJXDlvbvzCMXtWuc0tOqAFjB1LU8Bpn1KUMZfB4yc+OKKkh9RJYwYFAlPFxbnGgEw48aj1XbtIMqj1L4N90GxVZzb2UiXwC7Nq+LR3hEts1WHTw3VpwZNgfkJCk3AG+jptSFm1mr/bO6SwtthEfhcuiSRwdJPdkC00xAMqinwGKqW5vnFU31mV1xqM0JuwGInEmUNWYQMpNZP0GKJOumDCUST5+YLFBS42L00AsfaKz75jOamT5rDYPUgPLEsd3XK/Tt53wt4hscf+jekS9dUie90VDRxtghnEXkkaZn5B46TkKdSNLX160ISdbf6ywi4SypxwQOc9S/+QUi9s=
输出这样的内容,说明成功了,并且可以听到悦耳的音乐。
LinjieGuo 说:mysteryli 说:你这个是基于SD卡还是spiflash?
spi nand的。
啥型号的nand,能共享一下镜像么,我最近编译V3S遇到点坑,想整个镜像快速测试下我的板子
好,我上传一下上来。
型号是MXIC品牌的MX36LF1GE4,但是我搜索居然搜索不到。
看到开发板的硬件资料,发现居然是精简的核心板原理图,没有告诉我们Flash型号,也没有电源管理芯片相关电路。
我将其修改为MX35LF1G,在tb上面可以搜索出,MX35LF1GE4AB,这个型号应该是一样的。
以下是我编译出来的镜像:
sinlinx-v3s-linux.zip
镜像第一次启动的时候,8s就可以开机完毕了,第二次启动的时候会多次尝试使用sd卡,要40s左右,不知道是不是有界面选择的原因,我等屏幕到了,然后再做后续介绍。
哥们 你这个板子的资料能否共享下?
请看这个链接,我就不发了,如果失效了,你问这个楼主吧。
板子其实也不贵,默认顺丰是23元,买的时候让店主改普通快递就好了。
https://whycan.com/t_5349.html
LinjieGuo 说:想烧写img文件,折腾了好久,死活识别不到。
https://whycan.com/files/members/1845/sinlinx006.png更换全志官方的驱动,一般就在这个烧写软件那个目录。
我把设备驱动给卸掉,然后重新插入,得到这样的一个未知设备
使用指定目录安装
结果是失败的。
注意,当前环境已经是"禁用强制驱动签名"
运行虚拟机,根据手册上面的教程,安装工具:
需要安装的主要依赖库:
sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386
x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dri:i386 libgl1-mesa-dev g++-multilib
mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 dpkg-dev
sudo apt-get install u-boot-tools
sudo apt-get install libswitch-perl
创建工作目录:
mkdir -p /home/sinlinx/SIN-V3s
上传源码到ubuntu,解压源码:
进入工作目中
cd /home/sinlinx/SIN-V3s/
解压
tar zxvf sinlinx-v3s-sdk_20190519.tar.gz
编译
cd sinlinx-v3s-sdk
./build.sh
我们不关心这个过程做了什么,只知道,我们拿到了源码,编译之后,最终可以生成img文件。
小白探讨如何使用V3s在线播放播放音乐。
今天有人找我做一个项目,上面需求是接网线,在线播放音乐。
然而,这样的东西,我居然不敢接,因为没做过,怕周期长,烂尾。
这个东西难吗?答案肯定是否定的。
毕业多年,我一只从事单片机的开发,尽管懂得一些linux开发的皮毛,实际上做任何项目我都避开linux,原因很简单,我内心有恐惧感,我怕项目发展下去,出现不可控的情况发生。
我认为我个人业余时间多做知识储备,总有一天有能力使用linux开发的。我带着这样的心态,一年两年过去了,我的linux水平却没有提升,我回头观望,我关注的是:
"XX芯片性价比高",
"鸿蒙代码薄,比linux容易",
"rtt单片机就能跑,容易上手"
......
我的内心一直在避开使用linux开发,带着对linux的恐惧,进行其他知识的储备,可以说,这几年来,我的linux水平没有提高,甚至还倒退了。
今天,看到这样的一个项目需求,我虽然不敢接,但是我意识到了我知识的浅薄。我在思考,社会人才这么多,要是linux都不懂,不知道什么时候被淘汰涨不动工资。我也是时候,应该做些什么了。
我拿出吃灰的V3s开发板,打算利用业余时间,实现这个"简单"的项目。
楼主:
我编译内核的时候会报错,
在ubuntu 和centos下都试过, 网上说更新ubuntu的内核到其他版本可以解决,试过好几个版本也都一样,你们编译没遇到这个问题吗?
make[1]: *** 正在等待未完成的任务....
In file included from ./include/linux/string.h:6:0,
from ./include/uapi/linux/uuid.h:22,
from ./include/linux/uuid.h:19,
from ./include/linux/mod_devicetable.h:13,
from scripts/mod/devicetable-offsets.c:3:
./include/linux/compiler.h:242:10: fatal error: asm/barrier.h: 没有那个文件或目录
#include <asm/barrier.h>
^~~~~~~~~~~~~~~
compilation terminated.
scripts/Makefile.build:150: recipe for target 'scripts/mod/devicetable-offsets.s' failed
make[2]: *** [scripts/mod/devicetable-offsets.s] Error 1
make[2]: *** 正在等待未完成的任务....
scripts/Makefile.build:575: recipe for target 'scripts/mod' failed
make[1]: *** [scripts/mod] Error 2
Makefile:556: recipe for target 'scripts' failed
make: *** [scripts] Error 2
root@sechfly-All-Series:/mnt/home/sechfly/samba/F1C100S/Code/linux-f1c100s-480272lcd-test#
root@sechfly-All-Series:/mnt/home/sechfly/samba/F1C100S/Code/linux-f1c100s-480272lcd-test#
root@sechfly-All-Series:/mnt/home/sechfly/samba/F1C100S/Code/linux-f1c100s-480272lcd-test#
没有遇到过这种问题呢!兄弟你要自己琢磨一下了。是不是文件没拉齐全
请教个问题,按照楼主LinjieGuo的方法编译hello.c,用的楼主的buildroot,为啥出现下列问题:
qsv@ubuntu:~/rootfs$ ../buildroot-2017.08/output/host/bin/arm-linux-gcc -o Boardhello hello.c
/home/qsv/buildroot-2017.08/output/host/bin/../lib/gcc/arm-buildroot-linux-uclibcgnueabi/6.4.0/../../../../arm-buildroot-linux-uclibcgnueabi/bin/ld: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.27' not found (required by /home/qsv/buildroot-2017.08/output/host/bin/../lib/gcc/arm-buildroot-linux-uclibcgnueabi/6.4.0/../../../../arm-buildroot-linux-uclibcgnueabi/bin/ld)
collect2: error: ld returned 1 exit status
我也不知道。得你自己琢磨一下了。
使用[Aodzip]的buildroot资源为tiny-200s-r3构建linux运行环境
buildroot-tiny200 (F1C100/200s) 开发包近期更新内容 * 已支持DVP摄像头 *
(1)安装ubuntu,如果看过这篇文章,可以直接使用这个教程里的虚拟机
https://whycan.com/t_3138.html
https://pan.baidu.com/s/17vk0_QWRNRuxwi5EZ_P-Xg 提取码:54pb
虚拟机:账号:book 密码:linjie (本来想123456的,但构建手快了)
已有系统忽略此项。
(2)查看ubuntu 的工作ip,使用ssh工具连接上去
①查看虚拟机的工作ip:
ip a
②使用ssh工具,连上ubuntu
(3)git buildroot资源
①新建工作目录
mkdir tiny-200s
②进入工作目录并查看当前文件夹
cd tiny-200s
pwd
打印结果如下:
book@book-virtual-machine:~/tiny-200s$ pwd
/home/book/tiny-200s
③根据git上面的教程,安装相关的库文件
sudo apt install wget unzip build-essential git bc swig libncurses-dev libpython3-dev libssl-dev
sudo apt install pkg-config zlib1g-dev libusb-dev libusb-1.0-0-dev
sudo apt install python3-distutils
sudo apt install dfu-util
④拉取新鲜的资源
git clone https://hub.fastgit.org/aodzip/buildroot-tiny200.git
如果失效,则使用原来的链接:
git clone https://github.com/aodzip/buildroot-tiny200.git
(4)编译动作
①进入buildroot工程目录
cd buildroot-tiny200/
②根据作者的教程,一步步来
make widora_mangopi_r3_defconfig
make -j12
-j12表示多线程编译的意思,如果不知道自己平台多少核,直接make即可。
(5)处理buildroot过程中的异常
若是这个过程中,有什么资源下不动,可以使用迅雷下载,然后上传到buildroot的工作目录下./buildroot-tiny200/dl文件夹的对应名字的目录中。
例如,uboot资源下载太慢。
--2020-10-10 09:58:42-- ftp://ftp.denx.de/pub/u-boot/u-boot-2020.01.tar.bz2
=> “/home/book/tiny-200s/buildroot-tiny200/output/build/.u-boot-2020.01.tar.bz2.TkMJ9l/output”
正在解析主机 ftp.denx.de (ftp.denx.de)... 85.214.49.3, 2a01:238:43f4:4600:bc64:4f44:381f:1163
正在连接 ftp.denx.de (ftp.denx.de)|85.214.49.3|:21... 已连接。
正在以 anonymous 登录 ... 登录成功!
==> SYST ... 完成。 ==> PWD ... 完成。
==> TYPE I ... 完成。 ==> CWD (1) /pub/u-boot ... 完成。
==> SIZE u-boot-2020.01.tar.bz2 ... 14716125
==> PASV ... 完成。 ==> RETR u-boot-2020.01.tar.bz2 ... 完成。
长度:14716125 (14M) (非正式数据)
u-boot-2020.01.tar.bz2 11%[===========> ] 1.60M 6.40KB/s 剩余 27m 4s
可以看出速度,实在是太慢了,我们可以Crrl+C结束当前make,
复制链接ftp://ftp.denx.de/pub/u-boot/u-boot-2020.01.tar.bz2,
使用迅雷将他下载好,然后上传到/home/book/tiny-200s/buildroot-tiny200/dl/uboot-tools目录
(怎么知道是那个文件夹呢?看到文件夹名字和资源相近的,怼进去就可以了)
继续make: make -j12
--2020-10-10 10:26:40-- https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.66.tar.xz
正在解析主机 cdn.kernel.org (cdn.kernel.org)... 151.101.109.176, 2a04:4e42:1a::432
正在连接 cdn.kernel.org (cdn.kernel.org)|151.101.109.176|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 109584352 (105M) [application/x-xz]
正在保存至: “/home/book/tiny-200s/buildroot-tiny200/output/build/.linux-5.4.66.tar.xz.bzVSR9/output”
/.linux-5.4.66.tar.xz.bzVSR9/output 15%[================> ] 16.62M 42.4KB/s 剩余 46m 13
linux内核资源下载太慢,Crrl+C结束当前make,
复制链接https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.66.tar.xz,
使用迅雷将他下载好,然后上传到/home/book/tiny-200s/buildroot-tiny200/dl/linux目录
继续make:make -j12
如果是git上面的资源下载太慢,甚至下载不动,使用迅雷也很慢,修改git的域名前缀为https://hub.fastgit.org/,应该能增加速度。
(6)漫长的buildroot等待过程
(7)成功后,可以目录./buildroot-tiny200/output/images下看到以下文件
ll output/images/
总用量 661345
drwxrwxrwx 1 root root 4096 10月 8 22:12 ./
drwxrwxrwx 1 root root 4096 10月 8 22:12 ../
-rwxrwxrwx 1 root root 8388608 10月 8 22:12 bootfs.vfat*
-rwxrwxrwx 1 root root 15533 10月 8 21:49 devicetree.dtb*
-rwxrwxrwx 1 root root 167772160 10月 8 22:12 flasher.vfat*
-rwxrwxrwx 1 root root 19373568 10月 8 22:11 rootfs.cpio*
-rwxrwxrwx 1 root root 6373990 10月 8 22:11 rootfs.cpio.gz*
-rwxrwxrwx 1 root root 6374054 10月 8 22:12 rootfs.cpio.uboot*
-rwxrwxrwx 1 root root 104857600 10月 8 22:12 rootfs.ext2*
lrwxrwxrwx 1 root root 11 10月 8 22:12 rootfs.ext4 -> rootfs.ext2*
-rwxrwxrwx 1 root root 6422528 10月 8 22:12 rootfs.squashfs*
-rwxrwxrwx 1 root root 20490240 10月 8 22:12 rootfs.tar*
-rwxrwxrwx 1 root root 168820736 10月 8 22:12 sysimage-flasher.img*
-rwxrwxrwx 1 root root 134217728 10月 8 22:12 sysimage-nand.img*
-rwxrwxrwx 1 root root 16777216 10月 8 22:12 sysimage-nor.img*
-rwxrwxrwx 1 root root 114294784 10月 8 22:12 sysimage-sdcard.img*
-rwxrwxrwx 1 root root 408239 10月 8 21:26 u-boot.bin*
-rwxrwxrwx 1 root root 461551 10月 8 22:12 u-boot-sunxi-with-nand-spl.bin*
-rwxrwxrwx 1 root root 441071 10月 8 21:26 u-boot-sunxi-with-spl.bin*
-rwxrwxrwx 1 root root 4317544 10月 8 21:49 zImage*
(8)卡刷
复制sysimage-sdcard.img,使用winimg32烧写SD卡。
参考链接:如何用Win32 Disk Imager烧录镜像到SD卡
https://jingyan.baidu.com/article/f96699bbea3181894e3c1be8.html
(8)dfu线刷spi-nand
插入tiny-200s-r3,(usb连接)
执行以下命令:
./fel-uboot.sh && ./dfu-nand-all.sh
即可完成spi-nand线刷。
从./output/image/文件夹里看到了很多个img/bin文件:
output/images$ ls
bootfs.vfat rootfs.ext2 sysimage-nor.img
devicetree.dtb rootfs.ext4 sysimage-sdcard.img
flasher.vfat rootfs.squashfs u-boot.bin
rootfs.cpio rootfs.tar u-boot-sunxi-with-nand-spl.bin
rootfs.cpio.gz sysimage-flasher.img u-boot-sunxi-with-spl.bin
rootfs.cpio.uboot sysimage-nand.img zImage
请问可以描述一下各个文件是何作用吗?我应该如何烧写spi nand呢?应该不用上编程烧录器吧!/手动笑!
亲,这边建议直接拉取一个新鲜的呢
拉取了新鲜的buildroot,果然ok了,准备下载进去看看。
INFO: vfat(flasher.vfat): cmd: "MTOOLS_SKIP_CHECK=1 mcopy -bsp -i '/home/book/HDD/Disk0/Document/StudyData/F1C100s/tiny200s/buildroot-tiny200/output/images/flasher.vfat' '/home/book/HDD/Disk0/Document/StudyData/F1C100s/tiny200s/buildroot-tiny200/output/images/sysimage-nor.img' '::'" (stderr):
INFO: vfat(flasher.vfat): adding file 'sysimage-nand.img' as 'sysimage-nand.img' ...
INFO: vfat(flasher.vfat): cmd: "MTOOLS_SKIP_CHECK=1 mcopy -bsp -i '/home/book/HDD/Disk0/Document/StudyData/F1C100s/tiny200s/buildroot-tiny200/output/images/flasher.vfat' '/home/book/HDD/Disk0/Document/StudyData/F1C100s/tiny200s/buildroot-tiny200/output/images/sysimage-nand.img' '::'" (stderr):
INFO: hdimage(sysimage-flasher.img): adding partition 'u-boot' (in MBR) from 'u-boot-sunxi-with-spl.bin' ...
INFO: hdimage(sysimage-flasher.img): adding partition 'boot' (in MBR) from 'flasher.vfat' ...
INFO: hdimage(sysimage-flasher.img): writing MBR
我直接使用晕哥网站的离线包 buildroot-tiny200-20200924.tgz,检出git资源,然后执行了以下操作:
(1)make widora_mangopi_r3_defconfig
(2)make
最终,出现以下错误信息,请问是我这里环境出现问题,还是作者的buildroot资源问题呢?
YACC scripts/dtc/dtc-parser.tab.[ch]
HOSTCC scripts/dtc/dtc-lexer.lex.o
HOSTCC scripts/dtc/dtc-parser.tab.o
HOSTLD scripts/dtc/dtc
HOSTCC scripts/kallsyms
UPD include/generated/utsrelease.h
HOSTCC scripts/conmakehash
HOSTCC scripts/sortextable
DTC arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb
arch/arm/boot/dts/suniv-f1c100s.dtsi:501.21-512.5: ERROR (phandle_references): /soc/i2c@1c27000: Reference to non-existent node or label "i2c0_pins"
ERROR: Input tree has errors, aborting (use -f to force output)
scripts/Makefile.lib:285: recipe for target 'arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb' failed
make[3]: *** [arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb] Error 2
Makefile:1269: recipe for target 'dtbs' failed
make[2]: *** [dtbs] Error 2
make[2]: *** 正在等待未完成的任务....
HOSTCC scripts/asn1_compiler
HOSTCC scripts/extract-cert
package/pkg-generic.mk:266: recipe for target '/home/book/HDD/Disk0/Document/StudyData/F1C100s/tiny200s-buildroot/output/build/linux-5.4.66/.stamp_built' failed
make[1]: *** [/home/book/HDD/Disk0/Document/StudyData/F1C100s/tiny200s-buildroot/output/build/linux-5.4.66/.stamp_built] Error 2
Makefile:84: recipe for target '_all' failed
make: *** [_all] Error 2
谢谢分享,不过我看到图纸上面有个USB-->TTL UART*2,芯片似乎挺贵的,我也用不上,所以删掉了。修改后的图纸上传上来,褥羊毛了,但是没有测试。
LCD转接板(sinlinx)_CbyLinjie.zip
1.
Qt库开源代码,我使用的是4.8.7版本;
http://mirrors.sohu.com/qt-all/archive/qt/4.8/4.8.7/
我下载的是qt-everywhere-opensource-src-4.8.7.tar.gz
Perl语言环境5.12版本以上装好之后把bin目录加入环境变量,在cmd 输入perl -v正常即可
Python语言环境 2.7 版本以上; bin加入环境变量 cmd 输入 python --version能显示版本即可
Windows平台上的MinGW开发工具集(内含本地编译器gcc、g++ 4.9以上版本);bin加入环境变量 cmd 输入mingw32-make -v正常即可
Windows平台上的交叉编译器arm-linux-gnueabihf(gcc、g++4.9以上版本)。 bin加入环境变量 cmd 输入 arm-linux-gnueabihf-g++ -v 正常即可2.配置编译器 mkspecs\linux-arm-gnueabi-g++\ qmake.conf 这里面的编译器配置成自己下载的交叉编译器 arm-linux-gnueabihf 我这里是这个。
3.cmd 进入源代码的根目录配置需求 可以使用configure --help查看具体参数,我配置如下
configure -release -opensource -prefix "D:\Qt4.8.7_ARM_Linux" -nomake demos -nomake examples -nomake tests -no-opengl -no-webkit -platform win32-g++ -xplatform linux-arm-gnueabi-g++4.配置好之后会提示输入 mingw32-make
5.最后 mingw32-make install
编译好了库,剩下的就是在qtcreator使用此编译的库就可以 在windows下开发ARM linux上的Qt程序了。
顶一下呀。
看到一个很好的文件,准备下载下,结果要让我发表三个回复,结果认真的发了三个回复,一看2积分,还差一个,重新找两个自己擅长的评论下,结果又评论了两三个,还是2积分,感觉自己被深深的套路了。
https://whycan.cn/files/members/4744/sp200709_173950.png
不会吧,可能还没更新过来,你看我积分不也上来了吗。放心,站主不会搞你的。
关于adb功能的启用,在Linux3.14上,楼主有什么好的推荐吗?
我现在打开了usb gadget驱动,usb functionfs驱动,编译好了adbd、adb,但是板子接电脑一直不能识别(一点动静没有)。不明原因啊,痛苦了几天了。
楼主有空帮忙看看,多谢啦。
不好意思,这个版本我也没搞定。
发PCB出来分享一下啊
========================================================================
板子回来了,但是还没测试,测试完便开始售卖。
上2张开发板快照:
先上一个《ITX-190初级用户手册》。
ITX-190初级用户手册.pdf
注意:文档的内容并非全部都是你想要的,如果没有耐心阅读文档,请通过PDF目录找到相关内容。
这个芯片真的很容易使用,代码还在整理当中,各位先观摩一下《ITX-190初级用户手册》。
ITX-190的设计并不涉及丰富的硬件的外设,推出这款开发板的初衷:
(1)推广国产MCU
(2)利用此开发板作为一个工具,实现一些有趣的/工作上可能用到软件。
有兴趣的朋友可以加入QQ群 1126261648 进行交流。
========================================================================
迪卡大哥,小东西如果确实不用,建议还是送人吧,很难卖出去的。
我手里有一个矿渣, 加载系统一直处于starting kernel, 然后按reset后, 矿渣悲剧了, 显示
U-Boot SPL 2013.04-dirty (Aug 04 2014 - 11:06:44)
Control_status {00420313}
Could not probe the EEPROM; something fundamentally wrong on the I2C bus.
Could not get board ID.
default->A335BNLT.再就没有消息了, 有没有解锁办法?
自己搞一个内核进去不可以吗?
换了这个工具链运行的时候显示段错误了,只是写了个helloworld
# ./hello
Segmentation fault
需要的动态库也移植了
wings@ubuntu:~/Lichee/opt$ ./compile.sh
NEEDED libc.so.0
不知道咋回事啊
使用buildroot里面的交叉编译工具链。参考这篇文章:
https://whycan.cn/t_4266.html
/*--------------------------------------------------------------------------*/
ITX-190开发板,采用华芯微特公司的SWM190-CBT7作为主控,通过人性化的设计,以及强大的软件支持,致力于为广大单片机开发者提供一系列的解决方案。
你可能会问,主控芯片SWM190-CBT7的性能似乎比较低,他到底有什么用?
这个问题其实可以在手册有介绍,在此不做答。
但是我可以告诉你,ITX-190,他的特性是开发时简单,但是功能却不简单。
你购买一个开发板,有2种可能:①工作时,代码的验证。②学习开发板的某个方案
ITX-190,为第二种人准备,也就是说,我们是来学东西,不是买回来吃灰的,让我们一起造轮子吧。
大概描述一下,ITX-190提供了以下的软件支持:
(1)FreeRTOS
(2)命令行控制台
(3)TF卡-perFAT文件系统
(4)SPI Flash +Xmodem实现字库传输
(5)LCD12864/SPI TFT显示
(6)ADC 按键
(7)PWM液晶屏背光
....
对于工程,我们进行了分层的管理方法:
说了这么多,我们来看看ITX-190长什么样子:
对它的板载资源进行描述:
接口引出:
更让人眼馋的是,它的售价居然不到30元,只需要29.9元就可以买到。
不过让人遗憾的是,板子目前还未发售,需要等待十天左右。
来一段视频看看支持花絮:
想要获取ITX-190,请关注whycan,7月之内发售,量不多,仅有50台,密切关注喔。
核心板代号:DemoF1
工程会报绿色,是因为Keep-out线跟邮票孔产生切割了。按一下T 然后按M就可以屏蔽掉了。
下载原理图以及PCB文件:
https://whycan.cn/files/members/1845/F1CXXX_CoreBoard.zip
能不能把那个交叉编译工具链转发一下,下了一天都没有弄下来,好麻烦
您好 http://dl.sipeed.com/LICHEE/Nano/SDK/config 这个config文件请问能分享下么?今天上这个发现config文件下不了。。跟着教程走不下去了。。
稍等,我传上来
https://whycan.cn/files/members/1845/config_ok.zip
下载文件,解压zip包,然后将config_ok复制为.config文件就可以了
MMC: SUNXI SD/MMC: 0 SF: Detected w25q128 with page size 256 Bytes, erase size 4 KiB, total 16 MiB *** Warning - bad CRC, using default environment Setting up a 480x272 lcd console (overscan 0x0) In: serial@1c25000 Out: serial@1c25000 Err: serial@1c25000 Net: No ethernet found. starting USB... No controllers found Hit any key to stop autoboot: 0 SF: Detected w25q128 with page size 256 Bytes, erase size 4 KiB, total 16 MiB device 0 offset 0x100000, size 0x4000 SF: 16384 bytes @ 0x100000 Read: OK device 0 offset 0x110000, size 0x400000 SF: 4194304 bytes @ 0x110000 Read: OK ## Flattened Device Tree blob at 80c00000 Booting using the fdt blob at 0x80c00000 Loading Device Tree to 80e05000, end 80e0a3b5 ... OK Starting kernel ... [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 5.2.0-licheepi-nano+ (zjf@book-virtual-machine) (gcc version 7.2.1 20171011 (Linaro GCC 7.2-2017.11)) #10 Mon May 18 01:03:16 CST 2020 [ 0.000000] CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=0005317f [ 0.000000] CPU: VIVT data cache, VIVT instruction cache [ 0.000000] OF: fdt: Machine model: Lichee Pi Nano [ 0.000000] Memory policy: Data cache writeback [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 8128 [ 0.000000] Kernel command line: console=ttyS0,115200 panic=5 rootwait root=/dev/mtdblock3 rw rootfstype=jffs2 [ 0.000000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes) [ 0.000000] Inode-cache hash table entries: 2048 (order: 1, 8192 bytes) [ 0.000000] Memory: 22696K/32768K available (6144K kernel code, 233K rwdata, 1472K rodata, 1024K init, 228K bss, 10072K reserved, 0K cma-reserved, 0K highmem) [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16 [ 0.000000] random: get_random_bytes called from start_kernel+0x254/0x42c with crng_init=0 [ 0.000047] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns [ 0.000127] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns [ 0.000709] Console: colour dummy device 80x30 [ 0.000807] Calibrating delay loop... 203.16 BogoMIPS (lpj=1015808) [ 0.070245] pid_max: default: 32768 minimum: 301 [ 0.070674] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.070714] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.072400] CPU: Testing write buffer coherency: ok [ 0.074424] Setting up static identity map for 0x80100000 - 0x80100058 [ 0.076719] devtmpfs: initialized [ 0.084396] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns [ 0.084457] futex hash table entries: 256 (order: -1, 3072 bytes) [ 0.084767] pinctrl core: initialized pinctrl subsystem [ 0.086849] NET: Registered protocol family 16 [ 0.088278] DMA: preallocated 256 KiB pool for atomic coherent allocations [ 0.090494] cpuidle: using governor menu [ 0.144032] SCSI subsystem initialized [ 0.144444] usbcore: registered new interface driver usbfs [ 0.144604] usbcore: registered new interface driver hub [ 0.144792] usbcore: registered new device driver usb [ 0.145298] pps_core: LinuxPPS API ver. 1 registered [ 0.145324] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it> [ 0.145850] Advanced Linux Sound Architecture Driver Initialized. [ 0.147573] clocksource: Switched to clocksource timer [ 0.178726] NET: Registered protocol family 2 [ 0.180294] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes) [ 0.180374] TCP established hash table entries: 1024 (order: 0, 4096 bytes) [ 0.180435] TCP bind hash table entries: 1024 (order: 0, 4096 bytes) [ 0.180483] TCP: Hash tables configured (established 1024 bind 1024) [ 0.180774] UDP hash table entries: 256 (order: 0, 4096 bytes) [ 0.180835] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) [ 0.181346] NET: Registered protocol family 1 [ 0.183860] NetWinder Floating Point Emulator V0.97 (double precision) [ 0.186019] Initialise system trusted keyrings [ 0.186614] workingset: timestamp_bits=30 max_order=13 bucket_order=0 [ 0.207933] squashfs: version 4.0 (2009/01/31) Phillip Lougher [ 0.214559] Key type asymmetric registered [ 0.214596] Asymmetric key parser 'x509' registered [ 0.214781] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252) [ 0.214808] io scheduler mq-deadline registered [ 0.214825] io scheduler kyber registered [ 0.227429] suniv-f1c100s-pinctrl 1c20800.pinctrl: initialized sunXi PIO driver [ 0.421545] Serial: 8250/16550 driver, 8 ports, IRQ sharing disabled [ 0.427394] suniv-f1c100s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pe not found, using dummy regulator [ 0.429331] printk: console [ttyS0] disabled [ 0.449598] 1c25000.serial: ttyS0 at MMIO 0x1c25000 (irq = 25, base_baud = 6250000) is a 16550A [ 0.829064] printk: console [ttyS0] enabled [ 0.837489] suniv-f1c100s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pd not found, using dummy regulator [ 0.889606] brd: module loaded [ 0.913898] loop: module loaded [ 0.918114] SCSI Media Changer driver v0.25 [ 0.923707] suniv-f1c100s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pc not found, using dummy regulator [ 0.936693] m25p80 spi0.0: w25q128 (16384 Kbytes) [ 0.942461] 4 fixed-partitions partitions found on MTD device spi0.0 [ 0.948941] Creating 4 MTD partitions on "spi0.0": [ 0.953754] 0x000000000000-0x000000100000 : "u-boot" [ 0.962681] 0x000000100000-0x000000110000 : "dtb" [ 0.971157] 0x000000110000-0x000000510000 : "kernel" [ 0.979945] 0x000000510000-0x000001000000 : "rootfs" [ 0.989196] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver [ 0.995727] ehci-platform: EHCI generic platform driver [ 1.001387] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [ 1.007714] ohci-platform: OHCI generic platform driver [ 1.013380] usbcore: registered new interface driver usb-storage [ 1.021215] input: 1c23400.lradc as /devices/platform/soc/1c23400.lradc/input/input0 [ 1.030119] i2c /dev entries driver [ 1.037778] suniv-f1c100s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pf not found, using dummy regulator [ 1.075933] sunxi-mmc 1c0f000.mmc: initialized, max. request size: 16384 KB [ 1.085407] usbcore: registered new interface driver usbhid [ 1.091109] usbhid: USB HID core driver [ 1.111993] NET: Registered protocol family 17 [ 1.116556] Key type dns_resolver registered [ 1.123402] Loading compiled-in X.509 certificates [ 1.138698] suniv-f1c100s-pinctrl 1c20800.pinctrl: 1c20800.pinctrl supply vcc-pd not found, using dummy regulator [ 1.150125] sun4i-backend 1e60000.display-backend: Couldn't find matching frontend, frontend features disabled [ 1.160956] sun4i-drm display-engine: bound 1e60000.display-backend (ops 0xc0738094) [ 1.170036] sun4i-drm display-engine: bound 1c0c000.lcd-controller (ops 0xc0736cec) [ 1.177818] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013). [ 1.184421] [drm] No driver support for vblank timestamp query. [ 1.191734] [drm] Initialized sun4i-drm 1.0.0 20150629 for display-engine on minor 0 [ 1.249948] Console: switching to colour frame buffer device 60x34 [ 1.273157] sun4i-drm display-engine: fb0: sun4i-drmdrmfb frame buffer device [ 1.281268] cfg80211: Loading compiled-in X.509 certificates for regulatory database [ 1.299447] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7' [ 1.306225] vcc5v0: disabling [ 1.309331] ALSA device list: [ 1.312362] #0: Loopback 1 [ 1.316260] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2 [ 1.324988] cfg80211: failed to load regulatory.db [ 1.331966] VFS: Cannot open root device "mtdblock3" or unknown-block(31,3): error -19 [ 1.340000] Please append a correct "root=" boot option; here are the available partitions: [ 1.348483] 0100 4096 ram0 [ 1.348493] (driver?) [ 1.354603] 0101 4096 ram1 [ 1.354607] (driver?) [ 1.360782] 0102 4096 ram2 [ 1.360788] (driver?) [ 1.366930] 0103 4096 ram3 [ 1.366936] (driver?) [ 1.373097] 0104 4096 ram4 [ 1.373104] (driver?) [ 1.379281] 0105 4096 ram5 [ 1.379288] (driver?) [ 1.385390] 0106 4096 ram6 [ 1.385395] (driver?) [ 1.391552] 0107 4096 ram7 [ 1.391557] (driver?) [ 1.397725] 0108 4096 ram8 [ 1.397733] (driver?) [ 1.403834] 0109 4096 ram9 [ 1.403838] (driver?) [ 1.410010] 010a 4096 ram10 [ 1.410017] (driver?) [ 1.416240] 010b 4096 ram11 [ 1.416246] (driver?) [ 1.422489] 010c 4096 ram12 [ 1.422495] (driver?) [ 1.428728] 010d 4096 ram13 [ 1.428735] (driver?) [ 1.434952] 010e 4096 ram14 [ 1.434958] (driver?) [ 1.441203] 010f 4096 ram15 [ 1.441210] (driver?) [ 1.447434] 1f00 1024 mtdblock0 [ 1.447441] (driver?) [ 1.454031] 1f01 64 mtdblock1 [ 1.454037] (driver?) [ 1.460617] 1f02 4096 mtdblock2 [ 1.460622] (driver?) [ 1.467188] 1f03 11200 mtdblock3 [ 1.467194] (driver?) [ 1.473780] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,3) [ 1.482120] CPU: 0 PID: 1 Comm: swapper Not tainted 5.2.0-licheepi-nano+ #10 [ 1.489147] Hardware name: Allwinner suniv Family [ 1.493902] [<c010e478>] (unwind_backtrace) from [<c010ba5c>] (show_stack+0x10/0x14) [ 1.501647] [<c010ba5c>] (show_stack) from [<c0116db4>] (panic+0xe8/0x2e4) [ 1.508529] [<c0116db4>] (panic) from [<c090129c>] (mount_block_root+0x1ec/0x2e0) [ 1.516006] [<c090129c>] (mount_block_root) from [<c09016bc>] (prepare_namespace+0x158/0x1b8) [ 1.524536] [<c09016bc>] (prepare_namespace) from [<c065a670>] (kernel_init+0x8/0x110) [ 1.532452] [<c065a670>] (kernel_init) from [<c01010e0>] (ret_from_fork+0x14/0x34) [ 1.540000] Exception stack(0xc1831fb0 to 0xc1831ff8) [ 1.545051] 1fa0: 00000000 00000000 00000000 00000000 [ 1.553218] 1fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 1.561382] 1fe0: 00000000 00000000 00000000 00000000 00000013 00000000 [ 1.567993] Rebooting in 5 seconds.. [ 7.547227] Reboot failed -- System halted
博主好,请问我这个好像是没有识别到mtd这个是啥原因,MTD有打开的
CONFIG_MTD_BLKDEVS=y
CONFIG_MTD_BLOCK=y
CONFIG_FTL=y
CONFIG_RFD_FTL=y
CONFIG_MTD_SWAP=y
试一下这个:
观察启动log,发现,卡住的地方,有一条记录: #0: Loopback 1
再次进入配置界面:make ARCH=arm menuconfig
Device Drivers --->Block devices --->
[v]Loopback device support,勾选,看到其他有的选项,也勾上吧,相信也无妨......
上门有这个错误记录,回去看看。不知道是否为这个原因。
系统启动了,但是发现f1c200s,没有网口,没有usb,持续观望学习中。
哪位大神能否解释下为什么sram地址是0?文档上0地址不是BROM吗?
全志F1C100s这款芯片是ARM926内核,通过学习其启动流程,可以知道bootloader的原理。可是由于资料的缺少,以至于,我对于它的启动流程,也只是猜测,并未发现有比较严格的描述。因此对于这个芯片的启动流程,任何回答,我认为都不严谨,但是不影响我们对其进行学习和开发。这部分,比较难以描述清楚,只能通过提问-回答的方式来描述。
(1)芯片上电后,做什么事情呢?
F1C100s上电后,芯片内部接通BROM,执行BROM里的程序。
==>BROM里的程序做什么事情呢?
①检查SDIO接口挂接的存储器是否存在有效魔术头。存在,则根据魔术头加载此存储器的程序,并执行。否则执行下一步。
②检查SPI接口挂接的存储器是否存在有效魔术头。存在,则根据魔术头加载此存储器的程序,并执行。否则执行下一步。
③检测不到有有效程序,芯片就进入FEL模式。
==>魔术头是什么呢?
魔术头应该是96字节的一组数据,里面描述了用于SPL相关信息,用于给BROM识别存储器是否存在有效程序。其中包含了,程序的体积,运行地址,等数据。
==>FEL模式是什么呢?
进入FEL模式,我们可以使用软件sunxi-tools通过USB给芯片下载程序到flash等存储器中。
==>芯片如何跳转到用户程序入口呢?
根据本教程对此问题作答,BROM识别到SPI Flash存在有效程序后,会根据魔术头的内容加载SPI Flash里的数据,到芯片的SRAM0中。
注意,这一块SRAM0位于0X00000000地址处,与BROM地址重合,在BROM启动加载代码时,BROM已经失效。也就是说,我们的程序是无法访问BROM的,只能访问BROM失效后的,并且地址与BROM重合的SRAM0。加载完之后,跳转执行。跳转到什么地方执行?不知道,理论上是0X00000000地址,然后执行复位异常的代码。
由于SRAM0的空间有效,非常小,应该只有45KB左右(理论上是32KB,但是经过测试,可以用45KB)。所以,加载进SRAM0的代码需要负责把体积大的程序复制到DRAM里面,然后跳转过去执行。
这个流程描述的非常模糊,可以这样表示:
·BROM里的程序负责加载bootloader到SRAM0,然后跳转执行。
·bootloader程序负责加载APP到DRAM,然后跳转执行。
有可能APP的体积非常大,加载过程很久,所以可以在加载APP之前,显示产品Logo。
1. 2.8v干什么用了?
2. vra/vrb不需要复杂的退耦网络。1uf电容怼到地即可,如果你不需要tvout的话。
3. esp系列芯片输出阻抗不一定是50欧,需要加补偿网络调到50欧才能进同轴线。
4. 为啥vcc直接进tvout供电了?5v直接进芯片会炸机。
5. 为啥2.5v和1.2v稳压器的输入是3.3v而不是vcc?除非你特别计算过,一般来讲二次转换只会增加损耗。
6. 你的屏幕自带升压?不带的话你的vcc不能直接怼进去,要加横流升压电路的。
7. svref分压器为啥搞两个?
8. 为啥你的reset是从2.5v分出来的?reset电平应该是vccio电平,也就是3.3v。而且你的电容太大了,换0.1uf。
9. 16MHz晶振的话你要改好多代码。现在成品的bsp都是按照24MHz适配的。
10. NAND SPI可以用uboot,但是rtt和XBoot没有适配,fel也要改。自求多福。
11. CP2102电路看手册。nrst应该上拉,vdd,vregin,vbus在bus powered,外置稳压器模式应该都接3.3v。复制粘贴电路的时候一定要先理解再做,要不然早晚要出事。顺便,你导出来的protel格式altium打不开。
顺便说个题外话,这个芯片的2.5v和3.3v需求不是很大。如果不考虑wifi的话2.5v和3.3v完全可以上LDO。1.1V必须上DC/DC。
复制粘贴电路的时候只能中午做,因为早晚会出问题。
请参考https://whycan.cn/t_4266.html,补全运行库。
很多终端工具都支持X/Z modem,很稳定。开发人员使用起来也算方便。
系统启动了,但是发现f1c200s暂时成了一个孤岛,没有网口,没有usb,
大家是怎么把测试软件、文件上传到正在f1c200s里运行的文件系统里的?
解决你的孤岛问题:https://whycan.cn/t_4266.html
尝试从一开发F1C100s应用
既然尝试从零构建F1C100s开发环境成功,我们便开始开发这个神奇的芯片吧。
在这之前,我们写了一个hello程序,我们是怎么装进文件系统里的呢?拷贝到根文件系统,与uboot,内核打包在一起,然后烧写。显然,这样子影响flash寿命不说,肯定大大的减少了我们的开发效率。所以我们不得不采取一种高效的措施,将文件传输到我们的目标板中。
废话不多说,随意概括一下,本贴将包含了以下内容:
1、终端传文件给linux
注意,本贴禁止回复"mark"!
注意,本贴禁止回复"mark"!
注意,本贴禁止回复"mark"!
----------------------------------------
1、使用终端传文件给linux
目标板与外界传文件的方法非多,但是其他方法(NFS启动、wifi传输等),对于我们现在从零构建的工程基础,显然,非常不现实。经过多方面的考虑,最终,选择使用已经能够成功控制单板的串口终端来传输文件。
网上有一个工具,lrzsz,我们可以获取其源码,编译到目标板中。
(1)获取资源
①lrzsz源码:https://whycan.cn/files/members/1845/lrzsz-0_12_20_tar.gz
②终端工具:https://whycan.cn/files/members/1845/SecureCRT.zip
(2)编译这个lrzsz
①新建一个目录存放这个包
mkdir /home/book/f1c100s/lrzsz
②自己想办法将下载到的lrzsz-0_12_20_tar.gz上传到/home/book/f1c100s/lrzsz目录下。
③进入该目录并解压lrzsz包
cd /home/book/f1c100s/lrzsz
tar -xzvf lrzsz-0_12_20_tar.gz
④进入解压出来的目录
cd lrzsz-0.12.20/
⑤输入一下命令生成配置文件
./configure --cache=arm-linux
⑥明确自己交叉编译工具链的位置
我们使用buildroot输出的交叉编译工具链,与根文件系统一致。我的编译器的目录位于这个路径:
/home/book/f1c100s/buildroot-2017.08/output/host/bin/arm-linux-gcc
⑦使用这个交叉编译工具链,编译它
make CC=/home/book/f1c100s/buildroot-2017.08/output/host/bin/arm-linux-gcc
编译出来,生成了两个文件,复制这两个文件到我们的根文件系统bin目录下
sudo cp ./src/lsz /home/book/f1c100s/rootfs/bin/
sudo cp ./src/lrz /home/book/f1c100s/rootfs/bin/
⑧看看我们有没有缺少什么运行库
==>检查第1个文件
/home/book/f1c100s/buildroot-2017.08/output/host/bin/arm-linux-readelf -d ./src/lsz
可以看到,这个程序依赖于这样的运行库
标记 类型 名称/值
0x00000001 (NEEDED) 共享库:[libc.so.0]
==>检查第2个文件
/home/book/f1c100s/buildroot-2017.08/output/host/bin/arm-linux-readelf -d ./src/lrz
发现依赖库跟第一个一样。
⑨复制依赖库,到根文件系统的lib目录下。
那么问题来了,依赖库放在哪里呢?我们在交叉编译工具链哪里搜索一下:
cd /home/book/f1c100s/buildroot-2017.08/output/host/
find -name "libc.so.0"
结果如下:
./arm-buildroot-linux-uclibcgnueabi/sysroot/lib/libc.so.0
复制这个库文件到根文件目录lib中,
sudo cp /home/book/f1c100s/buildroot-2017.08/output/host/arm-buildroot-linux-uclibcgnueabi/sysroot/lib/libc.so.0 /home/book/f1c100s/rootfs/lib/
⑩打包并烧写镜像。
sudo sh /home/book/f1c100s/BuildMyImage.sh
(3)使用这个工具
使用串口CRT工具连接终端,输入命令"lrz",回车,CRT会弹出一个框框,我们可以发送一个文件到目标板
上个图就好了,自己折腾吧。速度有点慢,聊胜于无。(/笑)
大佬有没有RTT的教程呢?
RTT教程没有,但是开源加群交流,QQ群686338051
不是我的群,加不进不关我事喔。
不过其实很简单。开发流程是这样:
(1)下载ENV并安装,参考链接如下:
①ENV使用教程:
https://www.rt-thread.org/page/video.html
②ENV下载:
https://www.rt-thread.org/page/download.html
自己进去找,很容易找到的。
(2)下载RTT官方源码:
①官方下载页:
https://www.rt-thread.org/page/download.html
②git页面:
https://github.com/RT-Thread/rt-thread
使用歪朵拉的加速服务下载git:
https://g.widora.cn/
(3)直接在win下解压RTT,使用ENV进入RTT_3_1_3\bsp\allwinner_tina\
(4)输入scons进行编译。(注意,只能直接编译,不能像STM32一样建议keil工程)
(5)其余自行参考这个帖子的最终结果。
https://whycan.cn/t_3877.html
创建SDL窗口(模拟器)那个函数里面的长宽, 与你上面那个窗口的长宽一致, 就没有黑窗口了.
找到了一种方法,不知道哪位大神尝试一下:
https://blog.csdn.net/hjl240/article/details/47857175
搞了10几年的嵌入式,一直用keil mdk,完全不懂linux环境搭建,请教大家怎么搭建,用什么编译软件最流行?不知道使用uos系统主机是否方便些?感谢!
可以看看我发的帖子,使用linux开发ARM linux的流程大概就这样,不过缺少了app的环节。但勉强可以入口。
按照步骤试了 还是不行
https://whycan.cn/files/members/2435/qqq.png
基本操作呢,可以关掉杀毒软件再试试,不行就换个电脑试试。
下载 sunxi-tools-win32support_f1c100s(20180329).7z,解压缩, 运行 zadig-2.3.exe
点击 Options -> List All Devices:(即使你的设备显示未识别设备也可以,只要装上驱动能下载就可以了)
https://whycan.cn/files/members/3/QQ20180416161704.png
选择 WinUSB (v6.1.7600.16385)
点击 【Install WCID Driver】
https://whycan.cn/files/members/3/QQ20180416161712.png
按上面步奏装好驱动
https://whycan.cn/files/members/3/QQ20180416161717.png
装完后,sunxi-fel.exe 运行一切正常。
接下来烧录一个spi flash试一试。
你看合不合适,代码在此:ch12-SDCard-Fat32.zip
如题,主要担心的是TV部分供电我没给,会不会出啥问题?请有经验的大佬指点一下,不胜感激。
原理图:F1C200S.pdf
粗略看了一下,TV部分电源使用3.3V了。你指的是TV部分电源不像其他人一样使用3.0V吗?
感谢LinjieGuo分享,我是一个超级新手,以前全在windows上开发没怎么接触linux,最近画了个F1c200s想跟下linux,刚好过来跟楼主学一学。弄了两天终于把U-boot、linux-f1c100s-480272lcd-test和buildroot-2017.08三个编译完成。我PCB板上用的是32M的(w25q32),想问一下是不是把suniv-f1c100s-licheepi-nano.dts里配置为w25q32重新编译就可以?https://whycan.cn/files/members/2850/none.png
引用晕哥的话:"不用修改,驱动检测flash id自动识别容量!"
谢谢楼主的分享,很详细。但是我在编译make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4的时候出现了
binman: Node '/binman/u-boot-img': Entry contents size is 0xa6fa9 (683945) but entry size is 0x7e000 (516096)
Makefile:1148: recipe for target 'u-boot-sunxi-with-spl.bin' failed
make: *** [u-boot-sunxi-with-spl.bin] Error 1
这个错误。我也不知道是什么原因,是之前配置可视化出错了吗?
你去打开Makefile文件,看看1148行驶什么内容呢
编译根文件系统时候遇到问题了, 没想好怎么解决, 因为apt安装不了4.12版本的linux-header, 我是在ubuntu18.04的虚拟机中尝试编译的
zt@ubuntu:~/buildroot$ make >>> linux-headers custom Installing to staging directory (cd /home/zt/buildroot/output/build/linux-headers-custom; PATH="/home/zt/buildroot/output/host/bin:/home/zt/buildroot/output/host/sbin:/home/zt/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/zt/crosstool-ng:/home/zt/LicheePi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin" /usr/bin/make -j5 ARCH=arm HOSTCC="/usr/bin/gcc" HOSTCFLAGS="" HOSTCXX="/usr/bin/g++" INSTALL_HDR_PATH=/home/zt/buildroot/output/host/arm-buildroot-linux-uclibcgnueabi/sysroot/usr headers_install) make[1]: Entering directory '/home/zt/buildroot/output/build/linux-headers-custom' make[1]: Leaving directory '/home/zt/buildroot/output/build/linux-headers-custom' if ! support/scripts/check-kernel-headers.sh /home/zt/buildroot/output/host/arm-buildroot-linux-uclibcgnueabi/sysroot 4.12; then exit 1; fi Incorrect selection of kernel headers: expected 4.12.x, got 4.19.x package/pkg-generic.mk:266: recipe for target '/home/zt/buildroot/output/build/linux-headers-custom/.stamp_staging_installed' failed make: *** [/home/zt/buildroot/output/build/linux-headers-custom/.stamp_staging_installed] Error 1
恐怕让您失望了,我也不知道这是什么情况!/无奈
======================================================
经过了上面的折腾,我们完成了这么多事情:
(1)设置CPU工作时钟
(2)使用GPIO
(3)使用串口
(4)使用中断
(5)使用系统定时器
那么,我们就利用这些外设,编写一个类似命令行一样的工程框架,用于调试项目吧。
======================================================
放出工程:Framework_V1.0.7z
(因代码写得乱,移植可能有些困难,有其他平台需要移植的可以联系我,如果哪位朋友优化好结构,希望也可以分享出来)
如果是使用同样的芯片,可以不关注控制台的实现,直接使用lib工程:
Framework_V1.0_lib.7z
测试:
(1)连接串口线
GPA0配置为RX-->连接官方开发板子上面上面丝印RX
GPA1配置为TX-->连接官方开发板子上面上面丝印TX
(2)连接LED线
GPA5-->LED
(1)打开putty,使用串口打开设备,给板子上电。可以看到如下图:
(2)输入help,回车:
(3)使用LED
(可以使用TAB补全指令,使用上方向键回到上一条指令)
①输入LedGPA5 con:配置LED IO
②输入LedGPA5 on:点亮板子上面的LED
③输入LedGPA5 off:熄灭板子上面的LED
④输入LedGPA5 cat:查看LED的情况
上图:
基本框架已经定好了,忽然觉得24MHz是否有点慢了,修改工作频率,只需要修改这行代码即可。
#define SYS_CLK SYS_CLK_48MHz
然后官方的库函数会帮我们进行时钟初始化。
切记,千万不要修改下面三个宏,这三个宏,应该是定死的参数,官方库函数用的,如果变动,可能很多地方需要修改。
/*以下三个参数应该是不需要修改的,作为掩码一样使用,勿动*/
#define __HSI (24000000UL) //高速内部时钟
#define __LSI ( 32000UL) //低速内部时钟
#define __HSE (24000000UL) //高速外部时钟
串口的大概就是这样子了,一个单片机控制系统开发应该需要有一个时间基准,我们现在看看定时器怎么使用。
通过手册可以看出,SWM181内部的定时器情况应该如下:
①1个24位系统滴答定时器
②4个通用32位定时器
③一个32位计数器
-----------------------------------------------------------------
按老套路来走,定时器的使用流程,一般是这样:
(1)设置定时器内部计数器的时钟源
(2)设置计数器的计数方式:自加/自减
(3)设置计数器的装载缓冲器(初值):
(4)使能溢出(自加)/置零(自减)中断
(5)使能定时器运行
-----------------------------------------------------------------
看看官方例程代码是怎么初始化系统滴答定时器的:
官方的库函数配置方法就一行代码:
SysTick_Config(SystemCoreClock/4); //每0.25秒钟触发一次中断
对应的系统滴答定时器中断代码,只需要写成以下格式便可:
void SysTick_Handler(void)
{
//代码
}
-----------------------------------------------------------------
问:上面这行代码为什么这样配置就可以得到"每0.25s触发一次中断"的效果呢?
我们需要了解系统滴答定时器的输入时钟源是什么?系统滴答定时器位于M0架构内部,跟我们这款MCU的外设设计无关,想要知道具体情况,应该翻阅M0架构的相关文档。暂且不做讨论。
我们追踪代码可以得知:
#define __HSI (24000000UL) //高速内部时钟
uint32_t SystemCoreClock = __HSI;
SysTick_Config(SystemCoreClock/4); //每0.25秒钟触发一次中断
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
从代码可以看出,ticks就是定时器初值。
而且翻阅手册,得知:SysTick定时器是一个24位自减定时器。
我们只需要将(SystemCoreClock/4)再除以250,应该就可以将系统滴答定时器,配置为1ms触发一次中断。代码如下:
SysTick_Config(SystemCoreClock/4/250); //每1ms钟触发一次中断
中断服务程序里面放一个变量累加:
u32 gSysTick=0; //32位可以描述49天,若非项目要求,推荐使用32位,效率较高
void SysTick_Handler(void)
{
gSysTick++;
}
编写一个函数用于获取系统滴答值。
#define SysTick_t u64
SysTick_t GetSysTick(void)
{
SysTick_t temp=0;
/*关中断*/
SysTick->CTRL &= ~(1<<1);
temp = gSysTick;
/*开中断*/
SysTick->CTRL |= (1<<1);
return temp;
}
定义一下系统滴答的参数结构:
typedef struct{
SysTick_t Diff; //时间差
SysTick_t Old; //旧的滴答值
SysTick_t New; //新的滴答值
}TimeOut_t;
某些平台申请的变量,默认值非0,我们编写一个函数用于初始化这个结构。
/*--初始化软超时结构---------------------*/
void TimeOutArgsInit(TimeOut_t *tTimeOut)
{
tTimeOut->Diff = 0;
tTimeOut->New = 0;
tTimeOut->Old = 0;
}
这种结构,在使用单片机写裸机状态机程序时,非常好用。结构分明,具体后面再说。
-------------------------------------------------------------------------------------
知道了中断的原理,那么,怎么开中断,怎么安装中断向量呢?
(1)使能外设中断
不同的外设拥有不同的中断,具体情况看对应外设的寄存器。
(2)编写中断服务函数
IRQ中断一共有32个,分别是IRQ0~IRQ31。以IRQ0为例:
void IRQ0_Handler(void)
{
//此处添加代码(判断中断标志,并处理)
}
(3)连接中断服务函数
①配置IRQ的中断源
②设置其优先级
③使能该中断
这三步操作,官方已经实现了操作库,以串口为例:
IRQ_Connect(IRQ0_15_UART0, IRQ0_IRQ, 1);
这样就能将串口0的中断连接到IRQ0,并且将其优先级设置为1。(优先级可设置为0~3,其中0为最高优先级)
---------------------------------------------------------------------------------------------------------------------------
以串口0为例,我们使能其接收中断,然后在中断中将接收的数据写入缓冲区。
SWM181的串口外设寄存器跟其他的芯片有一点点不一样,但是我们按照常规的方式来操作,便能找到共同点:
(1)使能外设时钟
(2)使能IO口时钟
(3)配置引脚功能
(4)配置串口通讯格式:波特率、数据位、停止位、校验位等...
(5)使能发送功能/接收功能
(6)使能发送中断/接收中断
(7)使能串口外设
--------------------------------------------------------
(1)按照上面这种流程去初始化串口,代码如下:
(2)编写中断服务函数:
void __irqUart0_RX(void)
{
u32 dat;
/*--接收中断或接收超时中断--*/
if(UART_INTRXThresholdStat(UART0) || UART_INTTimeoutStat(UART0)) //串口接收FIFO中断或者接收超时中断
{
while(UART_IsRXFIFOEmpty(UART0) == 0) //FIFO非空则不断提取数据
{
if(UART_ReadByte(UART0, &dat) == 0) //提取一个数据
{
printf("%c \r\n",dat); //将提取到得数据打印出来
}
}
}
}
既然串口能够发送数据,现在尝试使用串口来接收数据。串口接收数据使用中断方式,那么就要搞懂这款芯片的中断是怎么管理的。
我们一般写程序需要用到的是IRQ异常,也就是中断请求。从启动文件上看,异常向量表里面有32个IRQ异常向量,命名规则为IRQx_Handler(x=0~31)。
一般中断的流程如下:
外设产生中断-->中断管理器-->CPU
(1)外设产生中断
这款芯片能产生中断的外设有那些呢?
手册上面有个表,上面列举了非常的中断号,不知道怎么用,但是大概能回答本问题。
GPIO、PWM_HALT、IIC0、IIC1、WDT、ADC0、BOD、TIMER_PULSE、DMA、
CACHE、Flash、CAN、CMP、ADC1、HALL、UART0~3、PWM_CH0~3等等...
(2)中断管理器
这款芯片的中断管理器怎么管理外设产生的中断信号呢?
这款芯片的IRQx_Handler(x=0~31)异常向量,默认是不指定中断源的,需要我们配置它的中断信号来源。
①IRQ0~15的中断源可用来源于下表的任意一项。
②IRQ16~31的中断源可用来源于下表的任意1项或者2项(注意:可用配置2项)
怎么配置一个IRQ指向的是什么源呢?
还是看图,中断源的选择应该是由一个多路选择开关来决定的。
对于IRQ0~15,由IRQx_SRC 寄存器的bit[6:0]选择一个中断源:
对于IQR16~31,可由IRQx_SRC 寄存器的bit[4:0]选择中断源1,bit[9:5]选择中断源2,可用配置2个中断源:
(3)CPU处理中断事件
CPU接收到中断信号(异常信号),自动跳转到对应的异常向量处执行代码(异常向量实际上就是一条跳转指令)
刚刚想用keil直接下载程序,便按官方教程,修改Jflash中的相关文件,但是keil还是无法下载,还是要使用官方的Jlink下载软件。
写好串口的程序,下载进去。
芯片没有任何反应。下载之前的点灯程序,按下按键,依然没有任何反应。
芯片似乎挂掉了,可能是由以下原因导致,
①按照官方的教程中修改Jlink的Device.xml文件(重装Jlink,没有解决问题,排除!)
②CH340G IO无法直连MCU IO导致芯片不正常,
③使用了下载软件的校验功能,虽然没有成功过,可能影响了内部的数据
④使用keil下载,虽然下载失败,可能影响了内部的数据
反正现在情况就是显示下载成功,但是没有出现想要的实验现象,具体原因未知。
使用下载软件的校验功能,校验结果说不一致,到底是什么原因呢?
尝试使用串口通讯进行通讯,我在原理图上面怎么找都找不到串口引脚。
翻查数据手册,发现并没有特定的串口引脚,芯片内部有一个神奇的数字信号引脚分配器——>PORTCON。
对于部分数字输入输出功能,可以配置到任意 I/O 引脚,以方便板级布局。包括如下功能:
UARTn_TX UARTn_RX
I2Cn_SDA I2Cn_CLK
PWMx_OUT PWM_BREAK
COUNTERn_IN CAPTURE_IN
CAN_RX CAN_TX
怎么用呢?我们看看下面这个图应该就明白了。
意思是可用把上面列出来的数字类型引脚分配到任意的带FUNCTION功能的引脚上面。
那我们看看那些引脚是带有FUNCTION的呢?上图:
看起来,除了电源引脚、晶振引脚、复位引脚,其余的引脚都支持配置为FUNCTION功能。
怎么配置呢?我们尽量不要关注寄存器层,直接使用官方的例程上面的库接口:
PORT_Init(PORTA, PIN0, FUNMUX_UART0_RXD, 1); //GPIOA.0配置为UART0输入引脚
PORT_Init(PORTA, PIN1, FUNMUX_UART0_TXD, 0); //GPIOA.1配置为UART0输出引脚
来到这里,终于明白为什么开发板上面CH340G的两根串口线不直连MCU了。
初始化串口,使用官方的代码,略微修改波特率为115200。
void SerialInit(void)
{
UART_InitStructure UART_initStruct;
PORT_Init(PORTA, PIN0, FUNMUX_UART0_RXD, 1); //GPIOA.0配置为UART0输入引脚
PORT_Init(PORTA, PIN1, FUNMUX_UART0_TXD, 0); //GPIOA.1配置为UART0输出引脚
UART_initStruct.Baudrate = 115200;
UART_initStruct.DataBits = UART_DATA_8BIT;
UART_initStruct.Parity = UART_PARITY_NONE;
UART_initStruct.StopBits = UART_STOP_1BIT;
UART_initStruct.RXThreshold = 3;
UART_initStruct.RXThresholdIEn = 0;
UART_initStruct.TXThreshold = 3;
UART_initStruct.TXThresholdIEn = 0;
UART_initStruct.TimeoutTime = 10;
UART_initStruct.TimeoutIEn = 0;
UART_Init(UART0, &UART_initStruct);
UART_Open(UART0);
}
重定位编译器C库的标准输出:
int fputc(int ch, FILE *f)
{
UART_WriteByte(UART0, ch);
while(UART_IsTXBusy(UART0));
return ch;
}
这样就能够愉快的使用printf(...)函数进行格式化打印数据了。
-----------------------------------------------------------------------------------------
直接把MCU串口引脚连接到CH340G的串口引脚上,不知道会不会烧掉
PA0(RX)-->TX
PA1(TX)-->RX
CPU上电后,芯片内部自动读取存放在Flash 0地址上面的栈顶地址进而设置堆栈指针。
CPU 内部电压稳定后,发生reset异常,自动跳转到异常的处理函数中。
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
LDR R0, =__main
BX R0
ENDP
可用看到,这里只有一种操作,那就是跳转到__main()函数里面执行了。
__main()和Main() (以前的ARM9使用ADS编写程序用到)是存在差异的,有兴趣自行百度进行科普。
------------------------------------------------------------------------------------------------------
在main()里面,首先便调用以下函数,设置芯片工作频率。
void SystemInit(void)
{
uint32_t i;
SYS->CLKEN |= (1 << SYS_CLKEN_OSC_Pos);
switch(SYS_CLK)
{
case SYS_CLK_24MHz: //0 内部高频24MHz RC振荡器
if(SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) //当前时钟是高频RC,修改高频RC时钟频率时需要先切到一个稳定时钟源
{
switchToRC32KHz();
}
switchToRC24MHz();
break;
case SYS_CLK_6MHz: //1 内部高频 6MHz RC振荡器
if(SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) //当前时钟是高频RC,修改高频RC时钟频率时需要先切到一个稳定时钟源
{
switchToRC32KHz();
}
switchToRC6MHz();
break;
case SYS_CLK_48MHz: //2 内部高频48MHz RC振荡器
if(SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) //当前时钟是高频RC,修改高频RC时钟频率时需要先切到一个稳定时钟源
{
switchToRC32KHz();
}
switchToRC48MHz();
break;
case SYS_CLK_12MHz: //3 内部高频12MHz RC振荡器
if(SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) //当前时钟是高频RC,修改高频RC时钟频率时需要先切到一个稳定时钟源
{
switchToRC32KHz();
}
switchToRC12MHz();
break;
case SYS_CLK_32KHz: //4 内部低频32KHz RC振荡器
if((SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) == 0)
{
switchToRC24MHz();
}
switchToRC32KHz();
break;
case SYS_CLK_XTAL: //5 外部XTAL晶体振荡器(2-30MHz)
if((SYS->CLKSEL & SYS_CLKSEL_SYS_Msk) == 0)
{
switchToRC24MHz();
}
switchToXTAL();
break;
}
for(i = 0;i <10000;i++); //等待时钟稳定。。。
SystemCoreClockUpdate();
}
以上代码中,存在一条神奇的语句,可能要耗费CPU一点时间。
for(i = 0;i <10000;i++); //等待时钟稳定。。。
MCU IO引脚上电后会存在默认高电平/低电平等情况,如果板子设计时没有考虑到这个原因导致的影响,可用在这行语句之前指定引脚状态,减少影响。
--------------------------------------------------------------------------------------------------
展开宏:#define SYS_CLK SYS_CLK_24MHz
可用看到,官方例程里面,MCU默认工作于24MHz。
理论上,可用修改该宏定义为SYS_CLK_48MHz,将MCU工作频率设置为48MHz。但是不知道是否稳定,目前没有尝试。
#define SYS_CLK_24MHz 0 //0 内部高频24MHz RC振荡器
#define SYS_CLK_6MHz 1 //1 内部高频 6MHz RC振荡器
#define SYS_CLK_48MHz 2 //2 内部高频48MHz RC振荡器
#define SYS_CLK_12MHz 3 //3 内部高频12MHz RC振荡器
#define SYS_CLK_32KHz 4 //4 内部低频32KHz RC振荡器
#define SYS_CLK_XTAL 5 //5 外部XTAL晶体振荡器(2-30MHz)
观察startup_xxx.s文件(启动文件),里面做了什么事情呢?
---------------------------------------------------------------------------------------------
(1)开辟栈,并使用标号__initial_sp获得栈顶。
Stack_Size EQU 0x800;
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
---------------------------------------------------------------------------------------------
(2)开辟堆,并使用__heap_limit获取堆的界限。
Heap_Size EQU 0x000;
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
此处明显堆的大小为0,这样的话,按道理来说是无法使用C库里面的malloc()函数分配内存的。
---------------------------------------------------------------------------------------------
(3)异常向量指定:RESET段。
AREA RESET, DATA, READONLY
__Vectors DCD Stack_Mem + Stack_Size ; Top of Stack 栈顶,等于__initial_sp
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD 0
DCD 0
DCD 0
DCD 0
DCD 0
DCD 0
DCD SRAM_SWITCH
DCD SVC_Handler ; SVCall Handler
DCD 0
DCD 0
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD IRQ0_Handler
DCD IRQ1_Handler
DCD IRQ2_Handler
DCD IRQ3_Handler
DCD IRQ4_Handler
DCD IRQ5_Handler
DCD IRQ6_Handler
DCD IRQ7_Handler
DCD IRQ8_Handler
DCD IRQ9_Handler
DCD IRQ10_Handler
DCD IRQ11_Handler
DCD IRQ12_Handler
DCD IRQ13_Handler
DCD IRQ14_Handler
DCD IRQ15_Handler
DCD IRQ16_Handler
DCD IRQ17_Handler
DCD IRQ18_Handler
DCD IRQ19_Handler
DCD IRQ20_Handler
DCD IRQ21_Handler
DCD IRQ22_Handler
DCD IRQ23_Handler
DCD IRQ24_Handler
DCD IRQ25_Handler
DCD IRQ26_Handler
DCD IRQ27_Handler
DCD IRQ28_Handler
DCD IRQ29_Handler
DCD IRQ30_Handler
DCD IRQ31_Handler
__Vectors_End
---------------------------------------------------------------------------------------------
为什么这样设定?
查看sct脚本:工程目录下的输入目录里面存在一个自动生成的KeyLED.sct链接脚本。
脚本的数据来源于,Target设置,作用:指定各段存放的位置。
LR_IROM1 0x00000000 0x00006000 { ; load region size_region
ER_IROM1 0x00000000 0x00006000 { ; 芯片Flash映射在0地址
*.o (RESET, +First) ;指定RESET段链接到头部
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00002000 { ; RW data
.ANY (+RW +ZI) ;变量,堆栈等链接到此处。
}
}
因为芯片内存过小,而且这个芯片不适合扩展内存等操作,在内存管理方面便不多做介绍。
------------------------------------------------------------------------------------------------
尝试使用嵌入式点灯大法来打开这一款MCU,看看点的灯亮不亮,速度快不快。
找到官方例程,.\GPIO\KeyLED,使用J-link上位机通用工具Synwit_Jlink_Download_Check_V1.5.exe将程序下载进MCU。
工程文件里面有个readme.txt:功能说明:按下接在PA4上的按键,则接在PA5上的LED亮;放开按键则LED灭!
程序下载非常成功,但是没有丝毫反应,灯似乎不亮。
按下S2,不亮;松开,不亮。
------------------------------------------------------------------------------------------------
仔细管擦,板子上面似乎有一些跳线位,打开原理图,一看,原来如此,MCU并没有和LED/KEY相连。
(1)使用一根杜邦线将GPA5和LED相连,
(2)使用一根杜邦线将GPA4和KEY相连。
重启单板,按下按键S2,LED亮;松开,LED灭。
嵌入式点灯大法施展成功。
感谢韬哥发来的SWM181CBT6开发板,板子是最小系统,我们仅仅是用于熟悉这个芯片,即使上面资源不多,也丝毫不影响我们对这个芯片外设进行开发。
对SWM181CBT6-LQFP48进行简单的性能介绍。
(1)内置16KB SRAM 120KB Flash
(2)32 位 ARM® Cortex™-M0 内核,可运行在48MHz
(3)SPI x 2 UART x4 I2C*2 CAN*1
8 通道 16 位 PWM 产生器
12 位 8 通道高精度 SAR ADC
16 位 6 通道高精度 SIGMA-DELTA ADC
24MHz、48MHz 精度可达 1%的片内时钟源
芯片淘宝官方店报价:4.6元零售价。看起来性价比还可以。
多余的便不作介绍,开发板直接上图。
板子上面资源不多,主要是:CH340G+芯片+20P大JTAG口。简单的例程调试基本上没有问题。支持一下国产MCU,思考使用什么姿势打开这款芯片的外设资源,后面再更贴。
可能我在写帖子时,忽略了一些东西取消了某些选项,晚点传配置文件上来
现在传上来。包里面存在两个文件".config"以及"config.in"
buildroot配置文件
下载后解包看看。
$ ls -lh output/images/
total 95M
-rw-r--r-- 1 ted ted 95M 1月 6 02:41 rootfs.tar大神指点一下,为什么我编出来的根文件系统有 95MB?
我是想烧录到16MB spiflash,解压出来发现 gdb 和 mplayer 占了几十M;
.config文件
可能我在写帖子时,忽略了一些东西取消了某些选项,晚点传配置文件上来