- 博客(175)
- 收藏
- 关注
原创 RK3566(泰山派):boa服务器移植
使用此参数,则会在DocumentRoot设定的目录添加一个ip地址作为新的DocumentRoot来 处理客户端的请求。如DocumentRoot设置为/var/www,则http://localhost/ 则转换成/var/www/127.0.0.1/,若注释此参数,则为/var/www/。DirectoryIndex:指定预生成目录信息的文件,注释此变量将使用DirectoryMaker变量。MimeTypes:设置包含mimetypes信息的文件,一般是/etc/mime.types。
2024-05-16 22:51:12 716
原创 RK3566(泰山派):FRP内网穿透实现
泰山派的ip地址为192.168.113.40,boa服务器的端口号为80,具体见boa服务器的boa.conf文件,如图。我在嘉立创泰山派上面运行了个boa服务器,但是boa服务器只能内网访问,使用非常不方便,所以给boa服务器搞个内网穿透。输入需要内网穿透的ip地址和端口,远程端口1000-65535中随便输入,可以保存用就行。frp nps服务器在淘宝上面买的,8块大洋一个月,购买链接。用WinSCP登录访问泰山派开发板,新建frpnc文件夹,买了后,用这个实现内网穿透,服务器使用官方地址。
2024-05-16 22:45:24 327
原创 RK3566(泰山派):3.1寸屏幕D310T9362V1SPEC触摸驱动(竖屏)
从原理图中可知GP7101和触摸共同挂在道I2C下,所以引用&i2c1并添加一个我们自己定义的myts@38触摸节点。一般触摸都放在/kernel/drivers/input/touchscreen目录下,所以我们在此路径下创建一个my_touch目录用来存放Makefile和my_touch.c文件。touchscreen/Makefile中把my_touch.c编译到内核中,当然也可以选择obj-m编译成模块。要想my_touch下的Makefile生效还需要在上一层目录的Makef
2024-05-14 22:27:52 1013 1
原创 RK3566(泰山派):GP7101背光驱动
调试屏幕我们一般会先把背光点亮如果使用的是泰山派的背光电路那直接使用代码里面默认的背光PWM驱动就行,但为了保护屏幕背光我们选择的是扩展板上的板载背光电路给3.1寸屏幕背光供电,扩展板板载背光电路PWM脚是通过GP7101 i2C转PWM芯片实现。因为我们之前的背光驱动也是用的"backlight"节点,为了不去修改上层我们自己写的驱动也是用的"backlight"节点所以两个节点会冲突,所以我们在tspi-rk3566-dsi-v10.dtsi中把之前的屏蔽掉留下我们自己写的驱动。触摸驱动I2C写函数。
2024-05-14 22:12:12 846
原创 基于梁山派的口袋示波器
梁山派示波器,由屏幕,按键,拨轮按键,模拟信号采集输出电路组成。一路模拟信号采集,一路波形发生输出,全金属BNC接头连接质感满满。独立三个静音按键,两个拨轮按键搭配。
2024-03-24 21:52:38 1089
原创 基于GD32E230C8T6的数字示波器
SPI是一个环形总线结构,由四根线组成,SSPSR是SPI设备内部的移位寄存器,根据SPI时钟信号状态,往SSPBUF中移入或移出数据,注意这个环形的说法,这里当MOSI向从机发送一位数据后,从机的MOSO也会移位数据给主机,只不过主机可以根据需要是否将其放置接收缓冲区中,比如,如果是主机发送0×80,从机可能会移位过来一位无意义的数据,这时主机不会管这些数据,会选择丢弃。ADC采样的频率越高,得到的数字信号就越接近原来的模拟信号,也就是保真度越高,但是需要更多的资源和计算功耗。此时构成正相比例放大电路。
2024-03-23 15:12:28 1089
原创 基于systick实现获取系统运行时间
该代码段是一个典型的systick模块,实现了系统时钟初始化、定时中断服务以及获取系统运行时间功能。代码结构清晰、模块化设计、层次分明、接口简洁,易于理解和维护。rcu_clock_freq_get(CK_AHB): 获取AHB时钟频率SysTick_Config(): 配置SysTick定时器while (1);: 死循环g_sysRunTime++: 将系统运行时间加1return g_sysRunTime: 返回系统运行时间。
2024-02-29 21:51:07 448 1
原创 软件分层模块化设计,---抽象与硬件分离
这段代码展示了LED驱动模块的设计,体现了软件分层模块化设计的几个方面:结构体封装:使用结构体 Led_GPIO_t 封装了LED的相关信息,包括使用的 RCC 外设、GPIO 端口和引脚号,使得 LED 相关的信息更具可读性和可维护性。模块化函数设计:将 LED 相关的功能函数(初始化、点亮、熄灭)封装成了独立的函数,分别是 LedDrvInit()、TurnOnLed() 和 TurnOffLed(),这样设计使得 LED 功能模块化,易于扩展和维护。
2024-02-29 21:48:13 975
原创 DWT硬件延时
- DWT里有一个32位的寄存器叫CYCCNT,它是一个向上计数器,记录的是内核时钟运行的次数,内核时钟跳动一次,该计数器就加1,如果内核时钟是120MHz,那精度就是1/120M = 8.3ns,而单片机程序的运行时间通常都是微秒级别的,所以DWT实现延时的精度是非常高的。- 要实现DWT延时的功能,总共涉及到三个内核寄存器: DEMCR、 DWT_CTRL、 DWT_CYCCNT,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值;当CYCCNT溢出之后,会清O重新开始向上计数。- 如果内
2024-02-26 14:06:52 406
原创 RAM不够?使用CCMRAM
这段代码是针对 ARM Cortex-M 系列处理器的链接脚本代码,用于描述内存布局中的 .ccmram(Core Coupled Memory RAM)段。综合来看,这段代码的作用是定义了一个名为 .ccmram 的段,该段将位于指定的 CCMRAM 内存区域中。:这一行代码创建另一个全局符号 _eccmram,它将指向此时的地址,即 .ccmram 段的结束地址。:这一行代码创建一个全局符号 _sccmram,它将指向此时的地址,即 .ccmram 段的起始地址。*(.ccmram) 和。
2023-08-12 14:56:00 1229
原创 pinctrl_desc结构体注册
首先,pinctrl_register_one_pin 函数用于注册单个引脚,它分配内存并初始化引脚描述符,然后将其插入到引脚描述符树中。其次,pinctrl_register_pins 函数用于注册一组引脚,它遍历引脚描述符数组并调用 pinctrl_register_one_pin 函数来逐个注册引脚。接着,函数会注册所有的引脚,调用 pinctrl_register_pins 函数进行引脚的注册。如果注册过程中发生错误,则会打印错误信息,释放已注册的引脚描述符,并跳转到错误处理标签 out_err。
2023-08-07 12:59:35 500
原创 pinctrl设备树节点映射详细分析imx_dt_node_to_map
这是一个名为 imx_dt_node_to_map 的函数,用于将设备树中的节点映射为引脚控制器的配置映射。以下是该函数的详细分析:首先,函数从引脚控制器设备结构体 pctldev 中获取指向 imx_pinctrl 结构体的指针 ipctl,以及指向 imx_pinctrl_soc_info 结构体的指针 info。函数查找节点 np 所属的引脚组,通过调用 imx_pinctrl_find_group_by_name 函数来查找。如果找不到组,则会打印错误信息并返回错误码 -EINVAL。
2023-08-07 12:57:49 748
原创 pinctrl_desc函数操作集实现
它通过传入的引脚 ID,在 imx_pinctrl_soc_info 结构体中查找对应的寄存器配置信息,并将传入的配置值写入配置寄存器。对于每个具有配置的引脚,将配置映射的类型设置为 PIN_MAP_TYPE_CONFIGS_PIN,引脚名设置为引脚的名称,配置数组设置为引脚的配置,配置数量设置为 1。首先,函数从引脚控制器设备结构体 pctldev 中获取指向 imx_pinctrl 结构体的指针 ipctl,以及指向 imx_pinctrl_soc_info 结构体的指针 info。
2023-08-07 12:44:21 351
原创 pinctrl_desc函数操作集
这些函数指针定义了与引脚配置相关的操作,并提供了对引脚配置的获取、设置和调试显示功能的支持。gpio_set_direction: 由于控制器可能需要根据GPIO配置为输入或输出来进行不同的配置,因此可以实现方向选择器函数作为需要引脚复用的GPIO控制器的支持。初始化 imx_pinctrl_desc时得知函数操作集为imx_pctrl_ops,imx_pmx_ops,imx_pinconf_ops。pin_config_config_dbg_show: 调试时显示驱动程序的引脚配置参数。
2023-08-07 12:37:50 289
原创 pinctrl_desc结构体实现
使用 devm_kmalloc 函数分配内存,大小为 sizeof(*info->pin_regs) * info->npins,并将返回的内存指针赋值给 info->pin_regs。
2023-07-24 17:50:48 263
原创 pinctrl设备及其结构体
pinctrl_info 是一个指向 struct imx_pinctrl_soc_info 的指针,用于存储与设备匹配时需要使用的数据。这行代码使用 of_match_device 函数在设备树匹配数组 imx6ul_pinctrl_of_match 中查找与当前设备匹配的项。这行代码将匹配项中的 data 字段赋值给 pinctrl_info,并进行类型转换,使其指向 struct imx_pinctrl_soc_info 类型的数据。:指向引脚描述符数组的指针,描述了由该引脚控制器处理的所有引脚。
2023-07-24 17:46:13 187
原创 pinctrl 配置信息详解
这就是宏 MX6UL_PAD_UART1_RTS_B GPIO1_IO19 的含义,看的比较仔细的同学应该会发现并没有 conf_reg 寄存器的值,config_reg 寄存器是设置一个 PIN 的电气特性的,这么重要的寄存器怎么没有值呢?, 在 这 里 就 相 当 于 设 置IOMUXC_SW_MUX_CTL_PAD_UART1_RTS_B 寄存器为 0x5,也即是设置 UART1_RTS_B 这个 PIN 复用为GPIO1_IO19。
2023-07-24 17:42:27 370
原创 DSP开发:串口sci中断接收数据实现
这一行代码设置 SCI 控制寄存器 (SciaRegs.SCICCR),包括停止位的设置为1位(1 stop bit)、不启用环回测试(No loopback)、不使用奇偶校验(No parity)、数据位设置为8位(8 char bits)、异步模式(async mode)和空闲线协议(idle-line protocol)。这两行代码将之前计算得到的高位波特率寄存器值(scihbaud)和低位波特率寄存器值(scilbaud)写入 SCI 的波特率寄存器,从而配置 SCI 的通信波特率。
2023-07-20 19:14:00 1541
原创 DSP开发:串口sci的发送与接收实现
LSPCLK(低速外设时钟)的频率为 37.5MHz,SCI的分频因子为 8(由于设置了 SCIHBAUD 和 SCILBAUD 分别为高8位和低8位),所以分频后的SCI时钟频率为 37.5MHz / 8 = 4.6875MHz。这段代码实现了串口SCI(串行通信接口)的初始化以及向串口发送数据的功能,并且通过函数重定向,将标准库的输出函数重定向到串口SCI上,实现了通过类似于标准库的 printf 函数的格式化字符串向串口SCI发送数据的功能。:用于存储接收到的字符串的字符数组,初始值全部为0。
2023-07-20 19:06:25 2776
原创 DSP开发:串口SCI重定位或重定义printf函数实现
0);/** @brief 串口打印重定向*/return _c;return _c;for(i=0;i
2023-07-20 18:57:49 722
原创 DSP(css)开发代码掉电保存下载到flash
这行代码使用了MemCopy函数,将数据从Flash存储器的RamfuncsLoadStart地址复制到RamfuncsRunStart地址,复制的长度由RamfuncsLoadEnd和RamfuncsLoadStart之间的差值确定。这样做的目的是将时间敏感的代码和FLASH配置代码加载到RAM中运行,以提高执行速度和响应时间。总体来说,这段代码的目的是将时间敏感的代码和FLASH配置代码从Flash存储器复制到RAM中,并在RAM中运行,以提高执行效率和响应时间。main函数添加下列内容(一般添加在。
2023-07-13 18:10:07 545
原创 DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作)
DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作)
2023-07-13 18:04:50 779 3
原创 重定义/自定义printf到串口输出实现的三种方法(cubeide)
ifdef __GNUC__ //串口重定向#else#endifreturn ch;这段代码是重定义了printf函数的输出方法,使用串口进行输出。它通过重定义PUTCHAR_PROTOTYPE宏来定义了一个名为__io_putchar(对于GCC编译器)或fputc(对于其他编译器)的函数。首先,根据编译器类型,PUTCHAR_PROTOTYPE宏会被定义为__io_putchar或fputc。GCC编译器使用__io_putchar,而其他编译器使用fputc。
2023-07-13 17:37:38 2374
原创 SGM58031与单片机驱动实现
最后,再次使用 HAL_I2C_GetState 函数等待 I2C 状态变为 HAL_I2C_STATE_READY,确保传输结束。然后,使用 HAL_I2C_GetState 函数等待 I2C 状态变为 HAL_I2C_STATE_READY,表示传输完成。然后,使用 HAL_I2C_GetState 函数等待 I2C 状态变为 HAL_I2C_STATE_READY,表示传输完成。紧接着,通过调用 smg58031_i2c_readregister 函数读取 chip_id 的值,并将其转换为 id。
2023-07-09 18:49:30 1542 1
原创 16位ADC芯片SGM58031驱动重点
第一个字节,0b1001000(第一个7位是I2C地址),第8位是读/写位,现在是低写2。第三个字节,0b10000100(要写入的配置寄存器的MSB,Bit[8]=0表示连续模式)4。第四字节,0b10000011(要写入的配置寄存器的LSB,Bit[7:5]='100’表示数据速率100Hz)第一个字节,0b1001000(第一个7位是I2C地址),第8位是读/写位,现在是低写2。第三个字节,0b10010001(第一个7位是I2C地址),第8位是读/写位,现在是高读4。数据速率等于配置的数据速率。
2023-07-09 18:36:25 2359 2
原创 CSS安装出错:Unicode Character Check -> Your temp directory path contains Unicode characters........
安装css,的时候出现上面内容,并导致无法安装css,上面内容报错原因是:Unicode字符检查->您的临时目录路径包含Unicode字符,这些字符可能破坏套接字。我的出错原因:电脑买的比较早,那时候不懂电脑,用户名只用了中文,后来懂电脑了,只修改了登录账号的用户名,其他原来相关的目录名,并没有修改为非中文,想重装系统,但资料比较多,还没全部整理完。查看用户目录,用户名为中文,而temp目录在用户目录的子目录下,也会有中文。上面查看,我的目录下有中文,导致出现开头错误,下面为解决办法。
2023-07-08 22:24:50 2256
原创 libjpeg库使用实例细节分析
这段代码是一个使用libjpeg库进行JPEG文件解析的模块。以下是代码的主要功能和结构:MyErrorMgr结构体定义了自定义的错误管理器,用于处理libjpeg库的错误。isJPGFormat函数用于判断给定的文件是否为JPEG格式。它使用libjpeg库的函数来读取文件头并检查是否为有效的JPEG文件。CovertOneLine函数用于将从JPEG文件中提取的一行像素数据转换为可以在显示设备上使用的格式。根据输入和输出的像素位数,它将像素数据转换为24位、16位或32位的格式。
2023-06-27 16:08:42 790
原创 标准输入stdin与屏幕输入tslib实例细节分析
其他线程通过调用GetInputEvent函数获取输入数据,线程会在没有输入数据时进入休眠状态,直到输入模块的子线程读取到数据并唤醒它们。总结来说,该函数的作用是从标准输入中读取一个字符,并将输入事件的类型设置为标准输入,时间戳设置为当前时间。此外,还定义了一个名为 g_tTouchScreenOpr 的触摸屏输入模块结构体,并初始化了其中的成员,包括模块名称、设备初始化函数和获取输入数据函数等。GetInputEvent函数用于获取输入数据,它会使当前线程休眠,等待输入模块的子线程读取到数据后唤醒它。
2023-06-23 11:31:06 317
原创 FreeType使用实例细节分析
然后,函数计算 GBK 编码值的区位码。该函数的作用是利用 FreeType 库加载指定字符的字形图像,并提取其中的位图信息,包括位置、尺寸、像素位数、行间距和数据缓冲区。这段代码实现了字体管理器的功能,包括注册字体模块、显示支持的字体模块、获取指定字体模块、设置字符尺寸、获取字符尺寸、获取字符位图、设置字体模块信息和初始化字体模块等操作。然后定义了一些静态变量,包括文件描述符 g_iFdHZK,指向字库文件的内存映射指针 g_pucHZKMem,以及指向字库文件结尾的指针 g_pucHZKMemEnd。
2023-06-23 11:10:42 601
原创 socket编程应用案例详细分析
pthread_mutex_lock 和 pthread_mutex_unlock 函数用于获取和释放互斥锁,确保在访问共享资源之前和之后的临界区域被正确保护。g_tNetDbgSendConVar 是一个静态变量,被声明为 pthread_cond_t 类型,用于在发送线程和其他线程之间实现等待和唤醒的操作。g_tNetDbgSendMutex 是一个静态变量,被声明为 pthread_mutex_t 类型,用于在发送线程和其他线程之间实现互斥访问。线程首先进入休眠状态,等待被唤醒。
2023-06-20 21:33:02 614
原创 Linux下实现自己的printf函数
在函数内部,我们首先使用 va_start 宏初始化一个 va_list 对象,然后使用 vprintf 函数和该对象来输出格式化字符串和参数列表中的值。iNum = vsprintf(strTmpBuf, pcFormat, tArg):使用格式化字符串和可变参数列表将数据格式化到临时缓冲区strTmpBuf中,并返回格式化后的字符串长度。如果当前结构体的isCanUse标志为1,表示该结构体可用,则调用该结构体的DebugPrint函数打印调试信息,传入的参数为pcTmp。
2023-06-16 14:33:55 943
原创 两个HC-05蓝牙之间的配对
买了个垃圾蓝牙,不能软件控制AT模式,使用下面方法将就用。使用串口一定要知道三要素,一是波特率,二是串口号,三是数据格式,HC-05只支持一种数据格式: 数据位8 位,停止位1 位,无校验位,无流控制。进入 AT 命令方法:1,按住按键或EN脚拉高,此时灯是慢闪,HC-05进入AT命令模式,默认波特率一般是38400;此模式我们叫原始模式。原始模式下一直处于AT命令模式状态。2,HC-05上电开机,红灯快闪,按住按键或EN拉高,HC-05进入AT命令模式,默认波特率是9600;
2023-06-14 10:12:33 1659
原创 STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)
mpu6050_write_byte函数用于向MPU6050的指定寄存器写入单个字节的数据。mpu6050_get_accelerometer函数用于获取MPU6050的加速度值。mpu6050_read_byte函数用于读取MPU6050指定寄存器的单个字节数据。mpu6050_get_gyroscope函数用于获取MPU6050的陀螺仪值。mpu6050_set_gyro_fsr函数用于设置陀螺仪传感器的量程范围。mpu6050_hw_init函数用于初始化MPU6050相关的硬件引脚。
2023-06-12 15:31:57 1450
原创 STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)
然后,它通过串口调试助手打印这些数据。mpu6050_write_byte(uint8_t addr, uint8_t reg, uint8_t dat): 向MPU6050指定寄存器写入一字节数据的函数。mpu6050_read_byte(uint8_t addr, uint8_t reg, uint8_t *dat): 读取MPU6050指定寄存器的值的函数。MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat): 将数据写入MPU6050寄存器的函数。
2023-06-12 15:22:57 3192 5
原创 tb6612电机驱动软件开发(代码pid实现,调试,控制实现)
函数Location_Speed_control是控制小车运动的主函数,它调用了location_left_pid_control和location_right_pid_control函数计算位置环的输出值,并将其作为目标速度传入speed_left_pid_control和speed_right_pid_control函数计算速度环的输出值。函数speed_left_pid_control和speed_right_pid_control是速度环的PID控制函数,根据实际速度和目标速度计算控制量。
2023-06-09 15:17:20 2172 2
原创 基础工程(cubeide串口调试,printf实现,延时函数)
* 串口1,调试串口 ------------------------------------------------------------*/ /* 接收缓冲, */ uint8_t g_usart_rx_buf [ USART_REC_LEN ] = {0 };0 };/* HAL库使用的串口接收缓冲 */
2023-06-09 12:30:27 864
原创 tb6612电机驱动软件开发(cubeide工程调试,引脚等设置)
系统时钟分频得到的总线时钟:AHB(Advanced High performance Bus,高级高性能总线,用于高性能模块CPU、DMA、DSP之间的连接)、APB1、APB2、APB3和APB总线时钟(Advanced Peripheral Bus,高性能外围总线,用于低带宽的周边外设之间的连接,例如UART)以及Systick时钟的最终来源都是系统时钟SYSCLK。③:PLL 分频系数 M 配置。用于连接电机的电机A电机输出端1,A电机输出端2,B电机输出端2,B电机输出端1来控制电机的正反转。
2023-06-07 21:34:25 1375
原创 tb6612电机驱动与JGB37-520减速直流电机
编码器是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号,前者称为码盘,后者称为码尺。按照读出方式编码器可以分为接触式和非接触式两种;按照工作原理编码器可分为增量式和绝对式两类。增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关。按照原理可分为(常见的)
2023-06-07 19:29:01 13677 5
IAR Embedded Workbench 安装包
2024-04-02
基于梁山派的口袋示波器源码
2024-03-24
基于GD32的简易数字示波器源代码
2024-03-12
简易数字示波器原理图与PCB设计
2024-03-12
PCB封装库大全(AD)
2024-03-02
AD原理图库大全(包含大量常见电子器件)
2024-03-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人