自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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入门到实战29 -- I2C

iic为半双工,可以一主多从写数据读数据。

2025-09-03 15:39:59 106

原创 GD32入门到实战28--RS485(Modebus)

常见485硬件电路。

2025-09-03 01:00:15 255 1

原创 GD32入门到实战27--传感器任务框架搭建

我们编写sensor_drv.c。

2025-09-02 16:19:33 74

原创 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

原创 GD32入门到实战23--测量捕获的pwm脉宽

我们要明确一个概念,定时器1有四个输入通道ci0~ci3,输入捕获通道有四个ch0~ch3。

2025-08-31 19:03:56 136

原创 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入门到实战21--输入捕获

我们新建capture_drv.c。

2025-08-30 16:03:51 195

原创 GD32入门到实战21--PWM输出

【代码】GD32入门到实战21--PWM输出。

2025-08-30 14:51:17 135

原创 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入门到就业8--中断概念

可以看到中断服务函数的地址。ARM异常/中断硬件结构。

2025-06-19 22:23:56 107

原创 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入门到就业3--GPIO输入

读输入寄存器GPIO_ISTAT的0位。所以后四位为0100 = 4;配置PA0为浮空输入模式。

2025-06-15 19:39:59 102

原创 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关注的人

提示
确定要删除当前文章?
取消 删除