自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 STC8G之硬件I2C接口

STC8G系列单片机拥有一个I2C接口。它支持主机模式和从机模式。本文主要介绍主机模式。

2024-05-19 10:51:06 239

原创 STC8G之PCA模块详解

STC8G系列有1个PCA控制器,它带有3个通道(3 channel),或者说3个子模块,他们都共用一个16位的定时器:PCA Base Timer。这个定时器为3个子模块提供时基。PWM发生器(对外输出PWM波)软件模拟定时器脉冲输出(输出可编程的方波信号)捕获模式(对外部输入到引脚的电平信号进行采样)

2024-05-18 16:13:12 606

原创 FreeRTOS基础七:资源管理

实现多个任务对同一个资源的互斥访问,以确保资源在使用过程中的状态的一致性,确保安全使用。FreeRTOS使用了PendSV和SysTick中断。要将configKERNEL_INTERRUPT_PRIORITY 设置为系统中优先级最低的值。这个优先级是用来设置PendSV和SysTick中断的优先级。在port.c文件中的xPortStartScheduler函数中,内核配置了PendSV和SysTick中断的优先级。临界区临界区的底层原理是非常简单而粗暴的。互斥体互斥体

2023-09-24 17:02:09 635

原创 FreeRTOS基础六:中断管理2

我们可以把这一些需要受内核管理的中断,优先级设置的低一些,把另一些不允许关闭的中断优先级设置的高一些,然后通过BASEPRI这个寄存器把优先级低于某个值的(优先级寄存器的值大于等于某个值的)中断一口气全屏蔽掉,这样我们在进入临界段前,只保存BASEPRI的值就好了。如下图所示,向一个STM32F103单片机的中断A的优先级寄存器中写入数据0101_1111,向中断B的优先级寄存器中写入数据0111_1111,由于只有高4位有效,因此中断A的数值优先级是5,中断B的数值优先级是7,且B的优先级高于A。

2023-08-19 22:09:54 1053

原创 GD32移植CoreMark实现性能测评

本文将演示CoreMark移植到GD32/STM32上进行性能测评。文章末尾给出了GD32F130C8T6,GD32F303CCT6和STM32F103ZET6三款单片机的测试对比结果。访问CoreMark的Github主页,下载如下图所示的源文件。在工程中新建一个子目录CoreMark,并放入其中。在Keil开发环境中,需要对CoreMark源文件(.c)加入到分组中,并指定CoreMark的头文件的包含路径,这些步骤不再赘述。 main函数CoreMark代码框架定义了main函数,因此我们要屏蔽掉自己

2022-07-05 22:18:40 3179

原创 Air724UG之串口通信

Air724UG串口通信

2022-06-15 14:52:41 3776

原创 GD32F130之USART多机通信

简介在多机通信中,一个从机应该只接收它需要接收的数据,且只应该在它需要接收数据时才检测串口。而始终接收RX线上的数据对从机来说是一种负担。多机通信硬件设计远距离方案:RS485板级方案:静默模式静默模式有什么作用?答:如果 USART 处于静默模式,所有的接收状态标志位将不会被置位。如何进入静默模式?答:软件可以通过将 USART_CMD 寄存器中MMCMD 位置 1 使 USART 进入静默模式。如何从静默模式中唤醒?答:有两种方式可选,①检测到总线

2022-06-07 16:14:06 23

原创 GD32F130之LVD低压检测

阿萨德sad手大sadsadsad阿萨德撒阿萨德阿萨德的

2022-05-05 16:34:08 6892 5

原创 GD32F130之FMC用户非易失存储器

广义上的EEPROM的分类PROM:即Programmable ROM的缩写,也就是可编程ROM。可编程的意思通俗说就是可以写入自定义的数据。PROM出厂后,用户可以进行“一次”数据改写操作,之后就无法继续改写了。 EPROM:可擦除(erase)、可编程ROM。也就是说用户除了可以进行编程外,还可以将前一次编程的数据抹去,这样就可以继续进行编程了。所以用户可以进行多次“擦除-编程-当做ROM使用”操作。这种芯片大多使用紫外线进行擦除,芯片封装上开了一个小窗口,放在紫外线下一段时间就可以将数据擦除,擦

2022-05-03 20:14:07 2825 1

原创 STM32单片机不同boot模式的本质

简介如下图所示,是CM3内核规定的4GB地址空间的划分情况。于是各个芯片设计厂商(如ST,NXP等)在设计CM3内核单片机时,就会遵守这个规定。下图是STM32F103系列的存储器映射方案图。可以发现,⑤处SRAM映射的地址确实是从0x20000000开始,结束地址取决于单片机SRAM的实际大小。在①处的Code空间,ST将【④System memory】、【③Main Flash memory】和【②Aliasd memory】映射在此。其中【System memory】就是存储单

2022-04-25 13:28:32 2386 2

原创 爆改串口实现OneWire驱动DS18B20

OneWire简介由美信(Maxim)开发OneWire是一种单总线通信接口,一根双向数据线,还有一根共同电压参考地线。 低速(15kbps),串行半双工通信 可以支持100米长距离通信 单主多从总线结构,最多支持63个从机挂接在同一个总线上。 总是由主机发起通信过程,从机是被动参与通信。 每个字节数据传输时,位按照LSB顺序 每个OneWire从机都有一个出厂就设定好的,固化在ROM中的不可更改的64位器件唯一ID。 主机和从机的数据线驱动引脚都要配置为开漏输出模式。总线通过一个外部

2022-04-17 18:36:44 5656 4

原创 记群内因串口DMA发送而引发的讨论

起初我的发送代码写的是下面这种实现:void USART0_printf(const char*format , ...){ int tx_len; va_list args; //将要发送的数据写入到DMA发送缓冲区USART0_tx_dma_buf va_start(args,format); tx_len = vsnprintf((char*)USART0_tx_dma_buf,USART0_TX_DMA_BUF_SIZE,format,args); va_end(arg

2022-04-12 18:41:34 1303 1

原创 vsnprintf函数使用

简介作用:使用vsnprintf()用于向一个字符串缓冲区打印格式化字符串,且可以限定打印的格式化字符串的最大长度。此函数需要C99或者C++11及以上版本才能支持。int vsnprintf (char * sbuf, size_t n, const char * format, va_list arg );参数sbuf:用于缓存格式化字符串结果的字符数组参数n:限定最多打印到缓冲区sbuf的字符的个数为n-1个,因为vsnprintf还要在结果的末尾追加\0。如果格式化字符串长度大

2022-04-12 14:57:55 20701

原创 USART+DMA+循环队列接收不定长数据

GD32F130之FreeRTOS环境下USART+DMA接收不定长数据

2022-04-11 21:53:52 5006 1

原创 GD32F130之DMA

什么是DMADMA,即Direct Memory Access,是一种在无需CPU参与的情况下,将数据块在内存(SRAM)和外设(一般是I/O设备)之间高效传输的硬件机制。实现这种功能的集成电路单元叫做DMA Controller,即DMA 控制器。使用DMA的好处一般情况下,为了实现内存(SRAM)和外设(一般是I/O设备)之间的数据传输,有三种常用的方法:轮循法(polling),中断法(interrupt)以及本文要介绍的DMA方法。轮循法(polling):在主循环中,CPU不断检查

2022-04-11 19:49:12 5190

原创 FreeRTOS基础四:特殊的队列之邮箱

邮箱(Mailbox)FreeRTOS中的队列有一种特殊的用法,我们把它叫做邮箱。邮箱不是另一种组件,它还是队列,只是用法比较特殊而已。邮箱是长度为1的队列

2022-04-11 16:38:49 8643

原创 FreeRTOS基础四:队列

FreeRTOS中的队列组件提供了任务到任务,任务到中断以及中断到任务的通信机制。当队列创建的时候,队列的长度和元素的大小都设定好了。队列的基本特性备份入队策略Queue by copy vsersus Queue by reference队列的创建和使用使用xQueueCreate()内核函数来创建一个队列。队列的存储空间从FreeRTOS heap中分配。在使用xQueueCreate()创建队列时,如果FreeRTOS heap中没有足够的存储空间分配给当前队列,则函数

2022-04-11 15:33:57 6911 1

原创 GD32F130之USART自带的RS485方向切换功能

关于RS485收发器的基本使用在使用单片机实现串口RS485通信时,需要外接一个TTL转RS485的收发器芯片,例如SP3485和MAX3485。由于RS485使用的是单数据通道,差分信号传输方式,所以是半双工通信,即收发不能同时进行。 那么就需要用一个信号控制RS485的收发器芯片的数据传输方向。拿SP3485举例:此芯片内部由接收器(receiver)和发送器(或者叫驱动器,driver)组成。如下图所示。RE引脚控制接收器的使能,低电平时使能接收器;DE引脚控制发送器的使能,高电平时使能发送器

2022-04-09 21:51:17 8268 2

原创 TM1650数码管驱动芯片

简介TM1650是一款国产4位共阴数码管驱动芯片,它还带有矩阵按键扫码功能。它的基本参数如下:工作电压:3~5V 数码管驱动模式:8段x4位共阴数码管 矩阵按键驱动模式:7x4矩阵按键,不支持组合键 通信接口:类IIC,使用了IIC相同的时序,但没有完全遵守IIC的协议,不带从机地址引脚定义SCL:串行通信时钟线SDA:串行通信数据线做数码管驱动使用时DIGx:数码管的位选引脚,灌电流驱动,最大可吸收150mA电流 A~DP:数码管的段驱动引脚,拉电流驱动,最大可输出25m

2022-04-09 11:20:39 33884 22

原创 FreeRTOS基础一:源码结构和移植

初步认识FreeRTOS的源码包结构注:croutine.c实现了FreeRTOS的协程(co-routine)功能。协程通常被用在低端,RAM很小的微处理器上,如今并不常用,FreeRTOS也不会再对此功能进行更新。FreeRTOS |────Source 目录,存放FreeRTOS源代码文件 | ├─include 目录,内核通用头文件 | ├─portable 目录,编译器+处理器适配文件 |

2022-04-08 19:32:53 2267

原创 FreeRTOS基础五:软件定时器

软件定时器的作用:在指定的时间到来时执行指定的函数,或者以某个频率周期性地执行某个函数。被执行的函数叫做软件定时器回调函数。软件定时器由FreeRTOS内核实现,不需要硬件支持。软件定时器只有在调用定时器回调函数时才需要占用CPU时间。在FreeRTOS应用程序中使用软件定时器,则需要:将软件定时器的源码(FreeRTOS/Source/timers.c)添加到项目中 在FreeRTOSConfig.h中定义configUSE_TIMERS为1软件定时器回调函数软件定时器回调函数的原型如

2022-04-08 16:44:18 10672 2

原创 FreeRTOS基础二:堆内存管理之heap_4方案

简介heap_4方案也是要定义一个全局数组ucHeap,用于当做堆内存池,其大小在FreeRTOSConfig.h中使用configTOTAL_HEAP_SIZE 来定义。heap_4方案在绝大多数情况下都优于标准库中的malloc()和free()函数。/* Allocate the memory for the heap. */#if( configAPPLICATION_ALLOCATED_HEAP == 1 ) /* The application writer has already

2022-04-07 16:25:21 5102

原创 OLED显示屏I2C接口

简介本文将介绍两种不同尺寸的OLED显示屏:0.96寸和0.91寸。他们都是4引脚I2C接口的,如下图所示:0.96英寸OLED基本参数工作电压:3.3~5V(内置3.3V LDO,I2C通信接口电平是3.3V的) 像素点阵规模:128x64(128列,64行,共8192颗LED) 驱动IC:SSD13060.91英寸OLED基本参数工作电压:3.3~5V(内置3.3V LDO,I2C通信接口电平是3.3V的) 像素点阵规模:128x32(128列,32行,共4096颗LED

2022-04-06 20:09:35 21823 1

原创 GD32软件IIC实现

简介代码

2022-04-06 19:01:15 607

原创 GD32F130之Timer13定时器

简介Timer13是一个L2级别定时器,它的功能最为简单。其特性如下:通道数:1计数方向:向上计数计数器宽度:16位时钟源:只有一个来自RCU模块的内部时钟时基单元定时器时钟Timer13的时钟源只能是来自RCU模块的内部时钟。结合下图GD32F130的时钟树和GD32F130的固件库时钟设置所知,CK_AHB为48MHz,且APB1预分频器系数为1,则Timer13的外设时钟为48MHz。//文件:system_gd32f1x0.c//固件版本V3.3.3st

2022-04-02 13:50:32 5447

原创 GD32F130之EXTI中断和事件控制器

简介EXTI,即extended interrupts and events controller,扩展的中断和事件控制器。之所以说是扩展的,是为了区分于内核自带的NVIC。NVIC由ARM Cortex-M3内核设计,而EXTI则由芯片厂商设计。EXTI 的中断功能依赖NVIC。GD32F130的EXTI包含27条独立且结构相同的通道,称之为EXTI Line x(x=0~27),但是有些通道功能未开放,实际能使用的只有24条。具体参考应用手册:《表 5-4. GD32F130xx 和 和 GD3

2022-03-03 14:17:30 2301

原创 GD32F130之USART串口通信

简介GD32F130系列最多支持2个串口:USART0和USART1,其中USART0功能比USART1丰富。过采样机制采样定理告诉我们,当采样频率大于信号频率的2倍时,就可以真实还原线路上的信号。而实际应用中,采样频率一般都远大于信号频率的2倍。GD32F130的USART的接收电路,就可以选择以16倍频率或者8倍频率采样Rx引脚上的信号。当选择16倍频率过采样方式时,USART接收器在接收一个位的时候,会在一个比特率位的时间内对Rx采样16次,并选择中间3个采样点(第7、8、9个)进

2022-02-28 20:44:21 11703 4

原创 GD32F130之GPIO

简介电气特性电流驱动能力:25mA max内部拉电阻阻值:30~50KΩ配置流程通用数字输出模式当CTL[1:0]=10时,配置GPIO为通用数字输出模式,此模式下,GPIO引脚可以输出高低电平信号来驱动外部电路。在通用数字输出模式下,通过OMODE寄存器配置为推挽输出或者开漏输出两种不同的输出模式。OMODE=0为推挽输出;OMODE=1为开漏输出。在通用数字输出模式下,通过OSPD寄存器来配置输出信号的速度。这个..

2022-02-21 11:23:36 14365 2

原创 FreeRTOS基础六:中断管理1

嵌入式实时系统需要对外界的某个事件做出及时的响应动作。例如串口外设收到了一帧数据后,需要通知数据解析任务,同时还要将数据传递给解析任务,完成数据的处理。设计出一种好的策略来完成这个过程时需要考虑以下几个问题:如何检测事件?中断是主要的事件检测手段,但是也可以使用轮询法。 当中断发生后,应该将多少处理工作放在中断服务函数(ISR)中,将另外的多少处理工作放在中断函数外(也就是main函数)?通常的经验是,在中断服务函数中尽可能做最少的工作,保证中断服务函数能迅速执行完成。 当中断检测到事件发生时,中断

2021-11-15 16:00:09 5373

原创 FreeRTOS基础九:任务通知

简介总体上来说,FreeRTOS应用由多个任务和中断函数构成。任务与任务,任务与中断函数之间可能需要通信(或者是同步,广义上来说同步也属于通信)。前面我们已经介绍了使用一些通信媒介对象,如队列,事件组以及信号量来完成通信或者同步。通过队列,事件组以及信号量来完成通信,都需要创建一个通信媒介对象,通信的内容会经过这个通信媒介对象来传递,例如任务A向队列中放数据,然后队列B从队列中读取数据。这种通信方式属于间接通信。本章介绍的任务通知(Task Notifications)技术,属于直接通信技术

2021-11-14 17:07:24 222

原创 FreeRTOS基础三:任务管理2

时间片和tick中断时间片轮转机制并不保证优先级相同的任务会均分CPU时间,它只保证处于就绪态且优先级相同的多个任务会轮流从就绪态转为运行态。Idel任务带有时间片轮转机制且基于优先级的抢占式调度器算法这种调度算法是FreeRTOS应用使用最多的算法策略。为了使用这种调度算法,需要在FreeRTOSConfig.h中将下面两个宏定义为1。#define configUSE_PREEMPTION 1 //使用抢占式调度算法#define configUSE_TI...

2021-11-01 20:07:20 3533 1

原创 FreeRTOS基础三:任务管理1

任务函数每一个任务在创建时都需要绑定一个任务函数,作为任务执行的逻辑,通俗说就是告诉这个任务该做些什么工作。在FreeRTOS中,任务函数需要满足以下要求:函数原型固定为:void TaskFunction(void* pvParameters) 函数的主体流程必须是一个无限循环,不能像普通的函数一样执行完就退出,它应该永不退出,直到任务被删除void TaskFunction(void* pvParameters){ uint32_t a = 0; uint

2021-10-31 15:09:04 1752

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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