- 博客(45)
- 收藏
- 关注
原创 GD32入门到实战32--产品配置参数存储方案 (NORFLASH)
我们要实现:原本设定的modebus从机(单片机)地址是01,存储在norflash里,按下按键后修改地址为02,重新上电modebus从机(单片机)地址仍然是02。我们之前已经实现norflash的驱动了,我们在应用层实现产品配置参数存储方案。我们在app这个文件夹里创建store_app.c。
2025-09-04 20:22:04
22
原创 GD32入门到实战31--SPI
因为我们要写的#define BUFFER_SIZE 4099太大,所以我们把GD32的栈容量改大。128Mbit,每页256byte(字节),1块64kb,1块有16个扇区,每个扇区4kb。我们开始驱动NORFLASH。
2025-09-04 17:00:29
26
原创 GD32入门到实战30--产品配置参数存储方案 (EEPROM)
我们要实现:原本设定的modebus从机(单片机)地址是01,存储在eeprom里,按下按键后修改地址为03,重新上电仍然是03。我们之前已经实现eeprom的驱动了,我们在应用层实现产品配置参数存储方案。这是有人问了up,up这个要怎么才可以实现修改从机地址呀?那我们当然是要写个修改从机地址的函数,我们在mb.c添加。我们在app这个文件夹里创建store_app.c。
2025-09-04 00:23:13
66
原创 GD32入门到实战26--ADC(单/多通道+DMA+常见十种算法)
要才会产生eoc标志,会把转换值,但是,所以我们要用到规则组类似于主流程,注入组类似中断,注入组打断规则组优先执行信号源的输出阻抗对ADC的采样有影响表格为。
2025-09-02 13:58:04
804
原创 GD32入门到实战25--独立看门狗
所以我们32分频:40k/32 = 1.25k (0.8ms周期)装载值为2000ms/0.8ms=2500。我们要设置看门狗最大超时时间2000ms。驱动层写完了,我们在应用层创建业务文件。程序运行时要及时喂狗!编写wdg_drv.c。
2025-09-01 19:54:45
139
原创 GD32入门到实战24--RTC实时时钟
主电源掉电由纽扣电池给RTC和BKP(掉电易失)供电。我们添加这几个.c文件到gd32_hal。我们新建rtc_drv.c。
2025-09-01 19:21:12
206
原创 FreeRTOS实战:任务创建与调度详解
我们发现pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof(
2025-08-31 15:41:59
596
原创 GD32入门到实战22--红外NEC通信协议
假使接收到1就>>1再|0x80,如果接收到0就>>1。红外传输协议地位在前,所以我们可以这样保存数据到数组。新建红外驱动层代码ir_drv.c。
2025-08-30 22:21:32
194
原创 GD32入门到实战20--定时器
我们看芯片的数据手册可以知道定时器0~13都可以配置为120Mhz的主频。我们新建timing文件编写定时器的代码timing_drv.c。GD32F303ZET6为例。
2025-08-30 14:06:48
123
原创 PCB之板载天线设计
我们先进行铺铜,要对天线部分进行净空(全部层禁止铺铜),设置范围:右边天线与铜相切。当然,和射频天线座子一样,都要多打过孔到gnd网络(提高抗干扰能力)我们尽量把走线设置和焊盘差不多大或者大点,这里是19.6mil。我们用嘉立创阻抗计算器进行计算,我们这里是两层板所以选择模式为。我们的阻抗线宽约23mil,我们就以23mil线宽来布阻抗线。我们发现芯片焊盘太小了无法布23mil这么宽。我们先用细的导线引出来,在中途改为阻抗线宽。,只对天线区域执行该规则。我们需要在规则里面设置。这种板载天线也是要做。
2025-08-21 15:57:05
307
原创 PCB之射频天线座PCB布局设计
也就是顶层参考PWR层(GND层对应区域要禁止铺铜),原因是天线工作频率较高,离相邻层过近会引入寄生电容,这会影响天线的谐振频率。我们用画的是四层板,对应层分别是顶层,GND层,PWR层 ,底层,我们用嘉立创阻抗计算器计算阻抗,我们进行。,可以降低接地阻抗,保证信号的回流,简单来说就是给信号一个良好的参考,在计算阻抗之前,我们先了解一下各种阻抗模式的定义。,过大容易使信号发生反射。因为我们是隔层参考,所以。天线通常是50Ω的阻抗。
2025-08-21 15:15:01
204
原创 GD32入门到实战19--裸机任务调度
再编写一个注册任务调度回调函数(接口函数),再这个函数参数填写函数地址(B),就可以把函数的地址(B)传递给函数指针(A),这个A函数指针 = B函数的地址。while持续执行TaskHandler()任务调度函数,如果某业务结构体数组的run标志位为1,表明时间到,要执行该业务模块的函数。我们用这个函数来进行各个业务模块的时间倒计时,1ms减一次(嘀嗒定时器),时间片减完把这个任务的.run置1,表示到时间了。我们在systick.c里定义一个函数指针变量(A)来保存任务调度函数的地址。
2025-08-20 17:40:48
147
原创 GD32入门到就业18 -- 中断配合dma收数据
然后我们要修改usart函数,之前我们是串口接收缓冲区非空时产生中断,现在我们要串口接收为空闲时产生中断(USART_INT_IDLE)让dma搬运数据。这时候我们的初始化函数就写完了,我们要对dma搬运的数据在串口中断进行处理。我们在原先的结构体添加DAM相关参数,并在结构体变量里添加数据。当然我们总的串口初始化也一样要把dma初始化添加就去。首先我们要在GD32_Hal里添加dma的库文件。我们在usart0这个工程的基础上改。总文件 usart_drv.c。我们就要dma初始化结构体了。
2025-08-19 17:19:42
247
原创 GD32入门到就业17--环形队列
环形队列就是把读取的数据放入一个缓冲区中head为出队,tail为入队。当接收数据太快了 我们处理读取数据来不及,会导致数据丢失。我们在Driver新建queue.c和queue.h。我们在queue.h里新建环形队列相关的结构体。底层环形队列写完这时候要开始在应用层调用。我们在上期代码进行优化。
2025-08-19 14:54:51
144
原创 GD32入门到就业16--函数指针在串口中断的应用
我们再编写一个接口回调函数,填入函数名,把我们要指向的函数的地址保存到全局变量 pProcUsartDataFunc 中,这样,pProcUsartDataFunc 指向了 ProcUartData 函数。这时候我们会发现 串口中断函数里要调用usb2com_app.c的函数,drv文件(下层)调用app文件(上层)我们优化上一篇的串口接收实验的函数,我们把串口.c里面的业务函数放到应用层。我们编写一个函数指针变量,来保存要指向的函数地址。---------函数指针。
2025-08-18 17:04:05
194
原创 GD32入门到就业15--串口接收
把g_rcvDataBuf[4](lednum)的地址转为LedCtrlInfo_t结构体,则g_rcvDataBuf[4](lednum)对应结构体ledNum,g_rcvDataBuf[5](ledon/off)对应结构体ledState。来处理数据,处理数据包的两个帧头,如果帧头不对就舍弃,从而把有用的数据存到g_rcvDataBuf[ ]里。用usartTask(void)处理数据包,先判断有没有接收到数据,再对数据包的数据进行异或处理,判断是否与数据包最后一位校验位一样,再进行led控制。
2025-08-18 15:39:21
296
原创 GD32入门到就业14--串口
传输数据时先传送字符的低位,后传送字符的高位。即低位(LSB)在前,高位(MSB)在后。添加usart.c文件(在\GD32_hal\Source)为了使用方便,用printf我们要在main.c添加头文件。在GD32F30x_固件库使用指南中找到USART。GD32f303为例有5个串口。串口以GD32F303为例。标志位(红色圈为常用)然后编写串口重定向函数。打开魔术棒,勾选微库。
2025-08-15 21:21:13
203
原创 GD32入门到就业13--volatile作用
在gd32f30x.h里宏定义的地址表达式都有volatile的修饰,很多代码的全局变量前都有volatile的修饰。),所以一些全局变量容易被编译器优化,volatile可以防止编译器优化。大部分时候我们都会开启编译器优化(内存不够时。
2025-08-10 14:02:22
110
原创 GD32入门到就业12--按键扫描(状态机)
创建状态机相关结构体,创建状态相关枚举结构体,总结构体。体来确定要用到的参数,再创建数组存放要配置的参数。和led.c类似的写法,先创建结构。短按key1--led1亮,长按灭。短按key2--led2亮,长按灭。短按key3--led3亮,长按灭。再key.h里面宏定义几个码值。
2025-08-10 13:32:22
211
原创 GD32入门到就业11 -- systick系统嘀嗒定时器
if()...//先判段是否大于最大值,如果大于最大值返回1,表示异常。计数寄存器(递减)可以配置当计数值为0时是否产生中断异常。我们用SysTick_Config( );我们进入SysTick_Config( );选择时钟源,使能中断,打开定时器。在工程中创建systick.c。在中断服务函数记录系统运行时间。把值-1赋值给重装载寄存器。
2025-06-30 22:51:15
188
原创 GD32入门到就业10--EXTI实战
运行完函数可以发现寄存器配置成2/2了,也就是SCB->AIRCCR寄存器成0xFA05000。我们在.hd文件里面打一个断点,全速执行,我们按下按键,我们可以发现程序卡死在中断服务函数。/*IO连接到EXTI线*/用gpio_exti_source_select函数。执行到nvic_irq_enable函数里。我们在key.编写Exti0中断服务函数。使能中断,但是没有编写中断服务函数。编写keygpio初始化函数。使能中断,配置中断的优先级。编写exti0中断服务函数。编写key初始化函数。
2025-06-30 10:29:13
167
原创 GD32入门到就业9--EXTI中断
注意:GPIO0~4有独立的EXTI线触发中断,GPIO5~9共用一个EXTI线,GPIO10~15共用一个EXTI线。EXTI_5~9线可以都连接到EXTI5_9中断,EXTI_5~9线都可以触发中断。exti是GPIO和中断之间的控制器,EXTI中断触发。同一时间EXTI_x线只能连接一个GPIO口。EXTI硬件结构(以EXTI0为例)EXTI5~9图示例。
2025-06-20 08:46:41
185
原创 GD32入门到就业7--流水灯软件架构
Driver(驱动层)添加led_driver.c添加头文件。初始化led,用for函数把存放gpio参数的值全部初始化完。这个数组里写要初始化的引脚参数。创建结构体,用到的GPIO的。驱动层API-LED设计。得到存放参数数组数量值。
2025-06-19 19:55:30
199
原创 GD32入门到就业6--基于内核DWT实现硬件延时
我们用rcu_clock_freq_get()得到系统时钟频率AHB算出1us跳动次数,乘n次,延时等待nus。添加delay.h,将delay.c里的函数进行声明。我们用DWT实现硬件延时功能。常见硬件延时:嘀嗒定时器。DWT数据跟踪监视点单元。重复调用微秒延时函数。
2025-06-19 09:49:35
227
原创 GD32入门到就业5--时钟树
注释:在system.gd32f30x.c里可以修改时钟源(不用的注释掉,用的取消注释)在固件手册RCU章节找到rcu_ckout0_conufig()然后调用system_clock_120m_hxtal();之前在启动文件注释的这几行,就是对系统时钟进行初始化的函数。配置三种容量的单片机,是否生效跟选的单片机型号有关。可以看到当前生效的时120M系统时钟主频。配置AHB,APB1,APB2时钟。配置PLL锁相环的频率为系统时钟。时钟输出引脚配置(PA8)进入SystemInit。等待外部高速晶振稳定。
2025-06-16 14:34:33
187
原创 GD32入门到就业4--HAL库点亮LED
把\GD32F30x_Firmware_Library_V2.1.5\GD32F30x_Firmware_Library_V2.1.5\Firmware\CMSIS的四个头文件和\GD32F30x_Firmware_Library_V2.1.5\GD32F30x_Firmware_Library_V2.1.5\Firmware\CMSIS\GD\GD32F30x\Include两个文件。在GD32的固件手册里面查找RCU和GPIO。创建工程,添加四个文件夹。
2025-06-15 21:29:25
266
原创 GD32入门到就业2--GPIO输出
(uint32_t *)(地址))外面这个*表示访问地址。把16进制数转换为地址要加(uint32_t *),(先配置3和2位CTL8为10,及输出模式2MHz。新建工程 选择GD32F303ZET6。成功配置GPIOA_Pin8为输出模式。查找GD32GPIOx的基地址。要添加上面这个库才可以。接下来配置输出高电平。
2025-05-23 08:57:54
223
原创 GD32入门到就业1
单片机通过APB总线向片上外设里面的寄存器写数据或者读取数据,片上外设里的控制器会根据寄存器的数据进行操作。Use MicroLlB:是专门针对嵌入式的微库,可以节省单片机的内存flase等资源。每组GPIO口都有配置寄存器和数据寄存器(八个)备用功能输出:复用功能,如I2C,SPI...平时用到的printf的接口函数都在里面。按位与0:1变0,0不变(给寄存器置0)设备上电单片机读取flash数据指令。ram是代码执行过程中保存变量数据的。按位与:同1不变,同0与结果为0。flash保存代码指令。
2025-05-21 23:21:32
118
原创 FreeRTOS--简介
同等优先级任务轮流地享有相同的 CPU 时间(可设置)2、其他状态的任务想运行,必须先转变成就绪态。高优先级的抢占低优先级的任务(类似中断)1、仅就绪态可转变成运行态。
2025-02-11 10:05:04
141
原创 stm32学习7--C语言基础知识复习
如果(#if) SYS_SUPPORT_OS成立 执行 code 结束(#endif):0或1,x = 1 执行A.... , x = 0 执行B....如果没有定义这个宏,就定义这个宏,再包含头文件,.... ,结束编译。上面没用结构体类型别名,创建一个结构体,下面用typedef,do{...}while(条件),要先执行一次,再判断条件。声明这个函数/变量再别的文件定义,在本文引用。执行完毕判断while(0)为0,跳出循环。宏定义 LED(x) =struct {...}结构体。
2025-02-10 15:45:11
161
原创 stm32学习5--DAP下载调试(Debug教程)
main函数调用delay_ms函数,delay_ms函数调用delay_us函数。需要把函数或者全局变量添加到watch1/watch2窗口。改浅工程路径,建议少于10个中文。任务管理器强制关闭keil5。设置后点击全速运行会自动停止。查看数组等内存地址值的变化。需要执行进入函数才能看到。:擦除整个flash。注:nus等为变量的值。的值(只能看全局变量)
2024-12-19 15:47:21
380
原创 keil5教程
FLASH:加完得到的是字节也就是B。SRAM :加完得到的是字节也就是B。双击工程可以生成.map文件。拉到最后可以看到工程内存大小。ROM :FLASH大小。RW :SRAM大小。
2024-12-19 11:18:14
1389
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人