常用网站

收罗一些常用的网站; 1、立创开源硬件平台 当自己做一些硬件电路时在该网站上找一些参考设计; 立创开源硬件平台 2、立创商城 用于查询芯片的数据手册,有时也在该商城购买一些元器件,比较保真,开发票也很快; 立创商城 3、古月居ROS 用于查看一些ROS相关的教程,依稀记得自己入门ROS就是学习的古月居的教程; 古月居ROS 4、学长的博客 学长的博客网站,我记得自己AD库就是用的学长放在博客上面的; 刘威学长的博客 5、阿里云域名管理控制台 自己博客网站的域名就是在阿里云购买的,续费也是通过该平台进行; 阿里云域名控制台 6、ROBOMASTER赛事报名系统(专属通道投递简历) ROBOMASTER赛事报名系统 7、牛客 找工作时候经常用的,用来看一些面经; 牛客 8、湖南大学WebVPN系统门户 不需要运行VPN客户端即可; 湖南大学WebVPN系统门户 9、威伯斯云登录页面 VPN登录页面; 威伯斯云登录页面 10、书伴 很多关于Kindle的使用技巧; 书伴 11、在线思维导图 用于在线绘制思维导图,可以导出为图片,很方便; 在线思维导图 12、阮一峰的博客 比较有意思; 阮一峰的博客 13、Typora官方中文站 有一些软件使用技巧; Typora官方中文站 14、阿里云资源站 有很多的纪录片和电影小说可以下载; 阿里云资源站 15、磁力天堂 聚合类网站; 磁力天堂 16、哇酷开发者社区 之前搞荔枝派的时候经常使用这个网站; WhyCan Forum(哇酷开发者社区) 17、阿里云矢量图标网站 之前搞LVGL用了很多这个网站上的小图标; 阿里云矢量图标网站

December 30, 2022 · 1 min · Rancho

ubuntu2004无法联网问题

最近Ubuntu2004虚拟机无法联网,而且这个问题很常见,就记录一下; 参考:VMware Ubuntu20.04无法联网的解决方法 一、安装环境及版本 宿主机 Windows 10 虚拟机软件版本 VMware Workstation 16 Pro ubuntu版本 Ubuntu 20.04 二、解决方法 1、虚拟机->设置->网络适配器:进行如下设置: 2、然后打开终端窗口,在终端窗口输入如下命令: sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start 3、再运行ifconfig便可以发现网络已经恢复正常;

December 29, 2022 · 1 min · Rancho

FOC基础源码分析

以基于STM32F103的FOC源码为例分析; 保存电机参数 采用宏定义开关来决定是否要进行参数校准; //1 已校准 //0 未校准 #define IS_ALIGN 0 //参数数据结构体 struct ALIGN_DATA { long direction; int pole; float zero_angle; } DATA_ALIGN; //根据宏定义判断是否要更新FLASH中存储的参数 #if IS_ALIGN Internal_ReadFlash(ALIGN_ANGLE_ADDR, (uint32_t *)&DATA_ALIGN, 3);//读取内部FLASH中的参数 sensor_direction = DATA_ALIGN.direction; //方向 pole_pairs = DATA_ALIGN.pole; //极对数 zero_electric_angle = DATA_ALIGN.zero_angle;//零点角度 #else // //此处略去参数识别代码 // DATA_ALIGN.direction = sensor_direction; //方向 DATA_ALIGN.pole = pole_pairs; //极对数 DATA_ALIGN.zero_angle = zero_electric_angle;//零点角度 Internal_WriteFlash(ALIGN_ANGLE_ADDR, (uint32_t *)&DATA_ALIGN, 3);//将参数写入单片机内部FLASH中 通过UART通信控制电机 /** * @brief 简易串口命令接收,需在while循环里重复调用该函数 * @return 无 */ void commander_run(void) { if ((USART_RX_STA & 0x8000) != 0) { switch (USART_RX_BUF[0]) { case 'H': printf("Hello World!\r\n"); break; case 'T': // T6.28 target = atof((const char *)(USART_RX_BUF + 1)); printf("RX=%.4f\r\n", target); break; case 'D': // D M1_Disable; printf("OK!\r\n"); break; case 'E': // E M1_Enable; printf("OK!\r\n"); break; } USART_RX_STA = 0; } } #define USART_REC_LEN 256 unsigned char USART_RX_BUF[USART_REC_LEN]; //接收缓冲,usart.h中定义长度 //接收状态 // bit15 接收完成标志 // bit14 接收到0x0D // bit13~0 接收的字节数 unsigned short USART_RX_STA = 0; //接收状态标志 //发送的命令必须以"\r\n"作为结尾,以标志命令的结束 void USART1_IRQHandler(void) //串口1中断程序 { unsigned char Res; if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // { Res = USART_ReceiveData(USART1); //读取接收到的字节 if ((USART_RX_STA & 0x8000) == 0) //接收未完成 { if (USART_RX_STA & 0x4000) //接收到了0x0d { if (Res != 0x0a) { USART_RX_STA = 0; //接收错误,重新开始 } else { USART_RX_STA |= 0x8000; //接收完成 USART_RX_BUF[USART_RX_STA & 0X3FFF] = '\0'; //最后一个字节放'0’,方便判断 } } else //还没收到0x0D { if (Res == 0x0d) { USART_RX_STA |= 0x4000; } else { USART_RX_BUF[USART_RX_STA & 0X3FFF] = Res; USART_RX_STA++; if (USART_RX_STA > (USART_REC_LEN - 1)) { USART_RX_STA = 0; //接收错误,重新开始 } } } } } }

November 21, 2022 · 2 min · Rancho

CSAPP笔记

CSAPP学习中所记录的笔记; 第七章 链接 链接是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存中并执行。 链接可以执行于: 编译时:也就是在源代码被翻译成机器代码时; 加载时:也就是在程序被加载器加载到内存并执行时; 运行时:也就是由应用程序来执行; 在早期系统,链接是手动执行的; 在现代系统,链接是由叫做链接器的程序自动执行的; 链接器使分离编译成为可能; 学习链接的必要性: 理解链接器将帮助你构造大型程序; 理解链接器将帮助你避免一些危险的编程错误(例如,在默认情况下,错误的定义多个全局变量的程序将通过链接器,而不产生任何警告信息); 理解链接器将帮助你理解语言的作用域规则是如何实现的(全局变量和局部变量之间的区别?static属性的变量或者函数到底意味着什么); 理解链接将帮助你理解其他重要的系统概念(比如加载和运行程序、虚拟内存、分页、内存映射等); 理解链接将使你能够利用链接库; 7.1 编译器驱动程序 贯穿本章的示例程序: main.c main函数初始化一个整数数组,然后调用sum函数对数组进行求和; int sum(int *a, int n); int array[2] = {1, 2}; int main() { int val = sum(array, 2); return val; } sum.c int sum(int *a, int n) { int i, s=0; for(i=0;i 以上命令等同于以下命令: > 首先运行预处理器,将main.c翻译成ASCII码的中间文件main.i: > ```bash > cpp main.c /tmp/main.i > ``` > 接下来,驱动程序运行C编译器,将main.i翻译成一个ASCII汇编语言文件main.s: > ```plaintext > cc1 /temp/main.i -Og -o /tmp/main.s > ``` > 然后,驱动程序运行汇编器,它将main.s翻译成一个可重定位目标文件main.o: > ```bash > as -o /temp/main.o /tmp/main.s > ``` > 驱动程序经过相同的过程生成sum.o。 > 最后,运行链接器程序ld,将main.o和sum.o以及一些必要的目标文件组合起来,创建一个可执行目标文件prog: > ```bash > ld -o prog /tmp/main.o /tmp/sum.o > ``` 要运行可执行文件prog,使用以下命令: ```bash ./prog shell调用操作系统中一个叫做加载器的函数,它将可执行文件prog中的代码和数据复制到内存,然后将控制转移到这个程序的开头; ...

November 5, 2022 · 1 min · Rancho

DJI面经

DJI面试经验; 流程时间表: 事件 日期 投递简历 4月25日 性格测评 4月27日 第一次面试 5月3日 第二次面试 5月13日 第三次面试 5月20日 电话OC 7月22日 收到录用意向书 7月22日 谈薪电话 10月27日 收到正式OFFER 10月27日 沟通三方信息 10月28日 性格测评: 这个测评的题量还是比较大的(有大概一百多道题),不过时间也是完全足够的,有大概两个小时; 题型全部都是选择题;主要内容为:一些简单的行测题、图形推理题、性格测试题、各种主观题,从难度来说都不是很难,不过听说测评会刷掉挺多的人,不过也没必要刻意去违心地回答这些问题,表现真实一些就可以,毕竟如果是跟自己价值观相差很大的公司,你进入后也不会很舒服; 答题过程中会需要开摄像头,如果自己电脑不带前置摄像头的话,可能需要自备一个; 答题过程中是可以使用草稿纸进行演算的,这个是没有任何问题的; 其他的问题就没有了,可能需要提前了解一些大疆的各种产品信息等等; PS:因为我投递的是提前批,所以并没有笔试部分。 第一次面试: 面试前我很紧张,毕竟是第一次正式面试,甚至比后面的海康暑假实习面试还要早很多; 面试前我准备了很多很多,把自己做过的项目都总结了一下,从头到尾过了一遍,听说会问比较多RTOS相关的知识,所以又把RTOS相关的知识过了一遍,即使这样,准备的还算比较充分,毕竟自己实际也做过很多很多自己的项目,但还是非常紧张; 面试平台用的是腾讯会议,会提前发会议链接; 我很早就在面试间等着,第一场面试的面试官有三位,他们三个轮换着来提问,不过应该其中一位是面试的主导者; 上来就是自我介绍,我提前准备了一个三分钟自我介绍,阿巴阿巴介绍完,面试官就开始问问题;例如你最满意的项目是什么,为什么会很满意,做项目遇到了什么问题,你是怎样解决的等等诸如此类的问题; 出乎我意料的是,整个面试中并没有问到什么知识点,唯一问到的就是单片机是如何启动到main函数的,而这个我正好复习过,就顺利地答上来了,面试官问和我回答的这段时间有二十分钟左右,后续就是问我有什么问题要问吗,我就问了几个应届生培养方案之类的问题; 总的来说,面试过程很愉快,也并没有自己相信的那样紧张; 大概是第二天,就收到了面试通过的邮件,效率很高; 第二次面试: 第一次面试之后过了大概一个星期就是第二次面试,这次面试只有一位面试官; 面试的内容跟第一次面试的内容很相似,也都是自我介绍,问自己做过的项目,最满意的项目是哪个,我就说是曾经做过的小一,然后问为什么会觉得满意,就围绕着这个项目谈了很多(主要可能是我自发的做的这个项目,并没有什么功利性),还问了你有没有跟市面上类似的产品做过比较等等的,你用的这个框架LVGL你觉得有什么不足之处吗; 后面还问了一些其他的问题,比如你FreeRTOS用的熟吗,队里边是只有你一个人用得熟,还是大家用的都很熟,平常在实验室都待到几点,在队伍里的感受怎么样,曾经有没有用过大疆的产品,这个产品你觉得有什么优点(我提到了大疆的一款无人机); 面试官说话让人感觉到很舒服,很愉快,也不会让自己太紧张,这次的面试时间很长,大概有五十多分钟; 大概当晚我就收到了面试通过的消息; 第三次面试: 大概第二次面试通过五六天之后就是第三次面试,这次面试的面试官也是一位;第三次面试跟前两次有些不同,更多的是问我性格相关的问题,对项目相关的问题会少一些; 问的问题有:你用一个词语形容一下自己,这个我当时真的蒙了,就尝试说了几下自己的优势,然后面试官还追问说,那你用一个词语描述下呢?最后好像也没说出什么(还是怪我没有准备完全); 还有就是问我有没有跟别人争执过,因为什么而争执,怎么解决的;你觉得你的性格方面有没有什么缺陷等等; 这场面试感觉答得不是很好,因为有些问题自己之前都没准备到,本以为凉凉了,没想到很快就通过了,然后就是等着综合评估结果; 大概第二天,登录招聘网站,就发现三面通过了,不过听说还会有综合排序,会刷一部分的人; 在七月下旬,终于接到OC(Offer Call)了,我的秋招正式结束;

October 31, 2022 · 1 min · Rancho

AG1280串口通信

因为上次做的板子是将FPGA和一块MCU芯片集成在一块的,他们之间就需要通信,当然最容易实现的就是UART串口通信; 下面的代码是一个Demo代码,实现的功能是,RX接收到什么,TX就发送相同的数据; FPGA芯片 AG1280Q48 时钟频率 48MHZ 波特率 921600 RX引脚 PIN_16 TX引脚 PIN_14 LED引脚 PIN_48 时钟输入引脚 PIN_15 复位引脚 PIN_17 具体代码如下: 顶层模块 module connect_mcu (input clk, input rst_n, input wire uart_rx, output wire uart_tx, output wire led); wire clk_pll_o; //PLL时钟 inpll pll_inst ( .clkin(clk), // PLL.clkin MUST connect to PIN_XX_GB .clkfb(clk_pll_o), .pllen(1'b1), .resetn(rst_n), .clkout0en(1'b1), .clkout1en(1'b0), .clkout2en(1'b0), .clkout3en(1'b0), .clkout0(clk_pll_o), .clkout1(), .clkout2(), .clkout3(), .lock() ); parameter SYSTERM_CLK = 26'd48_000_000; //系统时钟频率 parameter UART_BPS = 20'd921600; //串口波特率 wire flag; wire [7:0] data; // assign led = data[0]; uart_receive #( .SYSTERM_CLK (SYSTERM_CLK), .UART_BPS (UART_BPS) ) u_uart_receive( .clk (clk_pll_o), .rst_n (rst_n), .uart_rx (uart_rx), .receive_done (flag), .uart_data (data) ); uart_send #( .SYSTERM_CLK (SYSTERM_CLK), .UART_BPS (UART_BPS) ) u_uart_send( .clk (clk_pll_o), .rst_n (rst_n), .uart_in_data (data), .uart_in_flag (flag), .uart_tx (uart_tx) ); reg [1:0] led_counter; assign led = led_counter[0]; // parameter SEC_TIME = 32'd48_000_000;//48M reg [31:0] cnt; always @ (posedge clk_pll_o or negedge rst_n)begin if (rst_n == 0) cnt = 4'd1)) begin reg_data ![f1992c7fce5ccbde038bca329048345](img-1.png)

October 30, 2022 · 1 min · Rancho

AT32F403A系列单片机开发

记录AT32开发中遇到的问题; 硬件部分: 硬件部分我是参考官方开发板来做的; 经过测试,硬件部分没有任何问题; 原理图 PCB仿真图 实物图 显示效果 有几个值得关注的地方,我将在下面列出: 使用编码器开关作为输入设备; 使用CH340E芯片作为串口转USB; 通过TYPE-C接口的正反插实现不同的功能(连接CH340E芯片和AT32的USB引脚): 屏幕接口采用的是FPC0.5mm接口,方便安装; 硬件部分的测试很快就结束了,主要就是测试各个外设是否能正常使用; 经测试,主控芯片、屏幕、spiflash、USB接口、CH340E、编码器开关、RTC时钟均能正常使用; 软件开发: 参考资料: 主控芯片使用的是雅特力的AT32F403ACGU7,其特性如下所示: 参考资料网站:https://www.arterytek.com/cn/product/AT32F403A.jsp 下载固件库源码,经解压后,可以在目录: .\AT32F403A_407_Firmware_Library_V2.1.2\project\at_start_f403a\examples 找到各个外设的例子: $ ls acc/ crm/ gpio/ spi/ wwdt/ adc/ dac/ i2c/ sram/ xmc/ bpr/ debug/ i2s/ tmr/ can/ dma/ pwc/ usart/ cortex_m4/ exint/ rtc/ usb_device/ crc/ flash/ sdio/ wdt/ 首先当然是串口打印和点灯,这样能测试时钟配置是否正常,以及判断芯片好坏与否; 具体开发: 关键代码如下: 点灯: void at32_led_init(void) { gpio_init_type gpio_init_struct; /* enable the led clock */ crm_periph_clock_enable(USER_LED_GPIO_CRM_CLK, TRUE); /* set default parameter */ gpio_default_para_init(&gpio_init_struct); /* configure the led gpio */ gpio_init_struct.gpio_pins = USER_LED_PIN; gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_pull = GPIO_PULL_NONE; gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_init(USER_LED_GPIO, &gpio_init_struct); } void at32_led_on(void) { USER_LED_GPIO->clr = USER_LED_PIN; } void at32_led_off(void) { USER_LED_GPIO->scr = USER_LED_PIN; } void at32_led_toggle(void) { USER_LED_GPIO->odt ^= USER_LED_PIN; } 串口: void uart_print_init(uint32_t baudrate) { gpio_init_type gpio_init_struct; /* enable the uart and gpio clock */ crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE); crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE); gpio_default_para_init(&gpio_init_struct); /* configure the uart tx pin */ gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; gpio_init_struct.gpio_mode = GPIO_MODE_MUX; gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN; gpio_init_struct.gpio_pull = GPIO_PULL_NONE; gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct); /* configure uart param */ usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT); usart_transmitter_enable(PRINT_UART, TRUE); usart_enable(PRINT_UART, TRUE); } 串口重定向: ...

October 12, 2022 · 7 min · Rancho

LCD底板设计

打算做一个适配1.33寸屏幕和2.0寸屏幕的底板,屏幕接口留出来两种,FPC排线连接,八位并行接口和SPI接口; 这个可能要搁置一段时间了,因为目前只做了集成MCU和屏幕的板子;

October 12, 2022 · 1 min · Rancho

Typora修改高亮颜色

如何修改 Typora 「高亮」的颜色; Typora 有一个「高亮」的格式(示例:==例子==),类似于荧光笔,但是感觉默认的颜色偏亮,看久了不舒服,所以利用修改主题文件的方式来自定义颜色。 操作很简单,先找到主题文件:「文件」 ==> 「偏好设置」(或者直接 Ctrl + 逗号),在右边「外观」栏中找到「打开主题文件」打开: 打开主题对应的 .css 文件,在最后面加上下面的文字: mark { background: #a9d18e; border-bottom: 0px solid #ffffff; padding: 0.0px; margin: 0 0px; } 如果只是想要单纯改变颜色,也可以只写 background的这一行: mark { background: #a9d18e; } 其中 backgraoud后面的十六进制数为所需要的颜色。border-bottom 是下划线的大小和颜色。padding就是上下左右的边框大小。margin就是所标记文字离左右文字的距离。 最后,Typora 中「高亮」没有快捷键,但是可以自定义。Ctrl+逗号 打开「偏好设置」,在「通用」里最下面打开高级设置,找到下图位置,添加自己需要的快捷键: // Custom key binding, which will override the default ones. "keyBinding": { // for example: // "Always on Top": "Ctrl+Shift+P" }, 修改为: // Custom key binding, which will override the default ones. "keyBinding": { // for example: // "Always on Top": "Ctrl+Shift+P" "Highlight":"Ctrl+Shift+H" }, 最后的效果如下: ...

October 12, 2022 · 1 min · Rancho

AG1280开发记录

AG1280是一款国产的CPLD芯片,我准备将这个芯片和MCU配合起来,来做一些定制化的接口和功能,例如扩展UART接口,外接一些高速的AD/DA芯片; 芯片资源: AG1280资源: LUTs 1280 Distributed RAM (Kbits) 10 EBR SRAM (Kbits) 68 Maximum User I/O pins 40 Number of PLLs 1 Package 48-Pin QFN 价格很便宜,每颗单价大概是7元; 我画了一个评估板,除了这颗CPLD芯片外,还加了一颗STM32F103C6T6芯片,他们之间有六个IO口互相连接来进行通信或者时钟输入; STM32F103C6T6资源: 封装 / 箱体 LQFP-48 核心 ARM Cortex M3 程序存储器大小 32 kB 数据总线宽度 32 bit ADC分辨率 12 bit 最大时钟频率 72 MHz 输入/输出端数量 48 I/O 数据 RAM 大小 10 kB 评估板设计: 板子原理图如下: PCB视图如下: 硬件设计注意: AG1280硬件设计中有几个需要特别注意的点: 1、IO_GLOBE_S1(位于第9脚)、IO_GLOBE_S2(位于第13脚)、IO_GLOBE_S3(位于第15脚)、IO_GLOBE_S4(位于第19脚)、IO_GLOBE_N1(位于第41脚) 、IO_GLOBE_N2(位于第44脚) 、IO_GLOBE_N3(位于第46脚)可以作为全局时钟输入管脚,可用于输入全局时钟。但若要使用PLL,则只能从13、15和19管脚输入。 2、电路板载一个24MHz有源晶振,另外还可以通过PMOD接口从STM32的MCO时钟输出管脚获得时钟,它们被连接到具有PLL输入功能的管脚13、15上。 3、AG1280的GPIO分为North和South两组,可以使用不同IO电平,以实现不同电平逻辑的转换。另外AG1280还需要3.3V电源作为片上Flash电源,且该电源域North组的IO电源共用,因此North组也只能使用3.3V的IO电源电压。South组却可以任选电源电压。 4、AG1280还需要1.2V内核电源电压,且该电源应略迟于Flash电源上电,以方便Flash加载程序。我的图2电路通过PMOD接口从STM32开发板获得3.3V电源,再用LDO芯片XC6206P122MR从3.3V向下稳压到1.2V内核电源,LDO后带有100uF电容,1.2V上电时间自然要落后于3.3V上电。 板子已经发出去打样了,估计今天就能到,我到时候焊接测试下; 软件: 环境配置: AG1280的开发EDA软件Supera还不具备分析和综合电路的能力,但能实现其特有的PLL和片上RAM的IP核打包、综合后的布局布线、下载文件打包及下载等功能。 ...

October 12, 2022 · 2 min · Rancho