- 博客(30)
- 收藏
- 关注
原创 13 DMA 直接存储区访问
开始传输使用DMA_SxM0AR寄存器的地址指针所对应的存储区,当这个存储区数据传输完DMA控制器会自动切换至DMA_SxM1AR寄存器的地址指针所对应的另一块存储区域,如果这一块也传输完成就再切换至DMA_SxM0AR寄存器的地址所对应的存储区,这样循环调用。循环模式相对应于一次模式。DMA传输具有FIFO模式和直接模式,直接模式在每个外设请求都立即启动对存储器传输,在直接模式下,如果DMA配置为存储器到外设传输那DMA会建一个数据存放在FIFO内,如果外设启动DMA传输请求就可以马上将数据传输过去。
2025-01-08 15:38:47
771
原创 12 USART串口通讯
两个设备的“DB9接口”之间通过串口信号建立连接,串口信号线中使用“RS232标准”传输数据信号。由于RS232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过“电平转换芯片”转换成控制器能识别的“TTL校准”的电平信号,才能实现通讯。
2025-01-07 15:43:47
1085
原创 11 通讯基本概念
按数据传输的方式,通讯可分为串行通讯与并行通讯,串行通讯是指设备之间通过少量数据信号(一般是8根线以下),地线及控制信号线,按数据为形式一位一位地传输数据的通讯方式。二并行通讯一般是指使用8、16、32及64根或更多的数据线进行传输的通讯方式。并行通讯可以同时传输多个数据位的数据,串行通信同一时刻只能传输一个数据位的数据。串行通讯与并行通讯的特性对比。
2025-01-06 10:32:40
150
原创 9 RCC使用HSE、HSI配置时钟
3、设置PLL的时钟来源,设置VCO输入时钟分频因子PLL_M,设置VCO输出时钟倍频因子PLL_N,设置PLLCLK时钟分频因子PLL_P,设置OTG FS、SDIO、RNG时钟分频因子PLL_Q。6、读取时钟切换状态位,确保PLLCLK被选为系统时钟。1、开启HSE/HSI,并等待HSE/HSI稳定。2、设置AHB、APB2、APB1的预分频因子。5、把PLLCLK切换为系统时钟SYSCLK。4、开启PLL,并等待PLL稳定。
2024-12-23 22:37:23
513
原创 6 STM32固件库
因为基于Cortex系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难。为解决不同的芯片厂商生产的Cortex微控制器软件的兼容性问题,ARM和芯片厂商建立了CMSIS标准。
2024-11-28 19:16:42
182
原创 5 构建库函数流程
因此该编译器不能对该变量进行优化,必须每次访问该变量时都是从内存中读取它最新的值。在编程中,有些变量可能会被声明但从未在程序的执行过程中使用,编译器通常会进行优化,将这些没有被使用的变量从生成的机器代码中移除或改进,以减少不必要的资源消耗。寄存器的值常常是芯片外设自动更改的,即使没有CPU执行程序,也有可能发生寄存器的值可能会受到外部设备(如芯片、I/O设备等)的影响发生变化。把外设基地址强制类型转换成相应的外设寄存器结构体指针,然后再把结构体指针声明成外设名,因此可以直接操作该外设的全部寄存器。
2024-11-27 22:21:30
382
原创 1 ISP一键下载
从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内预置了一段BootLoader, 也就是常说的ISP程序, 这是一块ROM,出厂后无法修改。是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。内置SRAM,没有程序存储的能力,该模式一般用于调试。通过使用FlyMcu,下载程序。
2024-11-25 19:15:44
355
原创 3 寄存器
例如本寄存器中有两种寄存器位,分别为BRy及BSy,其中的y数值可以是0-15,这里的0-15表示端口的引脚号,如BRO、BSO用于控制GPIOx的第0个引脚,若x表示GPIOA,那就是控制GPIOA的第0引脚,而BR1、BS1就是控制GPIOA第1个引脚。根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程叫寄存器映射。3、紧接着的是本寄存器的位表,表中列出它的0-31位的名称及权限。表上方的数字为位编号,
2024-11-21 08:30:00
769
原创 2 初始STM32
STM32从字面上来理解,ST是意法半导体,M是Microelectronics的缩写,32表示32位,合起来就是指ST公司开发的32位微控制器。
2024-11-21 08:00:00
273
原创 事件标志组
函数描述使用动态方式创建事件标志组使用静态方式创建事件标志组清零事件标志位在中断中清零事件标志位设置事件标志位在中断中设置事件标志位等待事件标志位设置事件标志位,并等待时间标志位1)动态创建事件标志组//返回值为NULL表示时间标志组创建失败,返回值为其他值表示事件标志组创建成功,返回其他句柄2)清除事件标志位//形参xEventGroup表示待操作的事件标志组句柄//形参uxBitsToSet表示待清零的事件标志位//返回值是整数表示的是清零标志位之前事件组中事件标志位的值。
2024-10-18 10:45:33
474
原创 15 队列集
函数描述创建队列集队列添加到队列集中从队列集中移除队列获取队列集在中断中获取队列集中有有效消息的队列1)创建队列集//形参uxEventQueueLength队列集可容纳的队列数量//返回值为NULL则表示队列集创建失败,其他值则表示队列集创建成功并返回队列集句柄2)往队列集中添加队列,需要注意的是,队列在被添加到队列集之前。队列中不能有有效的消息//参数xQueueOrSemaphore表示待添加的队列句柄//参数xQueueSet表示队列集。
2024-10-17 09:32:04
327
原创 14.2 计数型信号量.
计数型信号量相当于队列长度大于1的队列,因此计数型信号量能够容纳多个资源,这在计数型信号量被创建的时候确定的。计数型信号量适用场合:1)事件计数:当每次事件发生后,在事假处理函数中释放计数型信号量(计数值+1),其他任务会获取计数型信号量(计数值-1),这种场合一般在创建时将初始计数值设置为02)资源管理:信号量表示有效的资源数目。任务必须先获取信号量(信号量计数值-1)才能获取资源控制权。当计数值减为0时表示没有资源。当任务使用完资源后,必须释放信号量(信号量计数值+1)。
2024-10-08 17:00:19
745
原创 14.1 二值信号量
信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。假设有一个人需要在停车场停车 :1)首先判断停车场是否还有空车位(判断信号量是否还有资源);2)停车场正好有空车位(信号量有资源),那么就可以直接将车开入空车位进行停车(获取信号量成功);3)停车场已经没有空车位了(信号量没有资源),那么这个人可以选择不停车(获取信号量失败);也可以选择等待(任务阻塞),其他人将车开出停车场(释放信号量资源),然后再将车停入空车位。空车位:信号量资源数(计数值)让出占用车位:释放信号量(计数值++)
2024-10-03 15:00:12
887
原创 13 FreeRTOS消息队列
int8_t * pcHead /* 存储区域的起始地址 *//* 下一个写入的位置 */union} u;/* 等待发送列表 *//* 等待接收列表 *//* 非空闲队列项目的数量 *//* 队列长度 *//* 队列项目的大小 *//* 读取上锁计数器 *//* 写入上锁计数器 *//* 其他的一些条件编译 */} xQUEUE;/* 存储区的结束地址 *//* 最后一个读取队列的地址 *//* 互斥信号量持有者 *//* 递归互斥信号量的获取计数器 */
2024-10-02 16:17:23
700
原创 12 FreeRTOS时间管理
相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束绝对延时:指将整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务,如下图所示:(1)为任务主体,也就是任务要真正要做的工作(2)是任务函数中调用vTaskDealyUntil()对任务进行演示(3)为其他任务在运行xTimeIncrement即是绝对延时时间.
2024-09-29 14:49:19
159
原创 11 FreeRTOS 任务相关API函数
()()()()()()vTaskList()()表格如下图所示:Name:创建任务时给任务分配的名字State:任务的状态信息,X是运行态,B是阻塞态,R是就绪态,S是挂起态,D是删除态Priority:任务优先级Stack:任务堆栈的“高水位线”,就是堆栈历史最小剩余大小Num:任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此编号来做区分。
2024-09-18 16:16:21
349
原创 10 FreeRTOS时间片调度
同等优先级任务轮流享有相同的CPU时间(可设置),叫时间片,FreeRTOS中一个时间片就等于SysTick中断周期运行条件:1、创建三个任务:Task1、Task2、Task32、Task1、Task2、Task3的优先级均为1;即3个任务同等优先级运行过程:1)首先,Task1运行完一个时间片后,切换至Task2运行2)Task2运行完一个时间片后,切换至Task3运行。
2024-09-12 16:39:36
1472
原创 9.3 任务调度—任务切换
任务切换的本质:就是CPU寄存器的切换。假设当由任务A切换到任务B时,主要分两步:第一步:需暂停任务A的执行,并将此时任务A的寄存器(即CPU寄存器)保存到任务堆栈,这个过程叫做保护现场。第二步:将任务B的各个寄存器值(被存于堆栈中)恢复到CPU寄存器中,这个过程叫做恢复现场;对任务A保存现场,对任务B恢复现场,这个整体的过程称之为:上下文切换注意:任务切换是在PendSV中断服务函数里边完成的PendSV中断的触发主要有两个途径:1)SysTick嘀嗒定时器中断调用。
2024-09-12 11:20:36
577
原创 9.2 任务调度—启动第一个任务
假设我们要启动的第一个任务是任务A,那么就需要将任务A的寄存器值恢复到CPU寄存器。任务A 的寄存器值,在一开始创建任务时就保存在任务堆栈里边,每一个任务都有各自的任务堆栈,每创建一个任务,那么就把该任务所对应的寄存器初始值赋值给自己的任务堆栈。注意;1)中断产生时,硬件自动将下PSR、PC(R15)、LR(R14)、R12、R3-R0保存和恢复,而R4-R11需要手动保存和恢复;2)进入中断后硬件会强制使用MSP指针,此时LR(R14)的值将会被自动更新为特殊的EXC_RETURN。
2024-09-10 20:52:22
974
原创 9.1 任务调度—开启任务调度器
函数vTaskStartScheduler()用于启动任务调度器,任务调度器启动后,FreeRTOS便会开始进行任务调度,除非调用函数vTaskEndScheduler()停止任务调度器,否则不会再返回。5)初始化任务运行时间统计功能的时基定时器,任务运行时间统计功能需要一个硬件定时器提供高精度的计数,这个硬件定时器就是在这里进行配置,如果配置不启用任务运行时间统计的功能,就无需进行这项硬件定时器的配置。1)创建空闲任务,根据是否支持静态内存管理,使用静态方式或动态方式创建空闲任务。
2024-09-10 08:54:52
483
原创 8 FreeRTOS 列表和列表项
列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务,列表项就是存放在列表中的项目。列表相当于链表,列表项相当于节点,FreeRTOS中的列表是一个双向环形链表。列表的特点:列表项间的地址是非连续的,是人为连接到一起的列表项的数目随时可以改变,是由后期添加到个数决定的。数组的特点:数组成员地址是连续的,数组在最初确定了成员数量后期无法改变。因此在OS中任务的数量是不确定的,并且任务状态是会发生改变的,所以非常适用列表(链表)这种数据结构。
2024-09-06 17:32:26
898
原创 7 FreeRTOS 临界段代码保护及调度器挂起与恢复
FreeRTOS在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断函数描述任务级进入临界段任务级退出临界段中断级进入临界段中断级退出临界段... ... /*临界区*/... ... /*临界区*/临界段代码特点:1)成对使用2)支持嵌套3)尽量保持临界段耗时短4)强悍。临界区是直接屏蔽了中断,系统任务调度靠中断,ISR也靠中断。任务级进入临界段。
2024-09-05 16:50:54
686
原创 6 FreeRTOS中断管理
让CPU打断正常运行的程序,转而去处理紧急的事件(程序)。中断执行机制,可简单概括为三步:1)中断请求,外设产生中断请求(GPIO外部中断、定时器中断等)。2)响应中断,CPU停止执行当前程序,转而去执行中断处理程序(ISR)。3)退出中断,执行完毕,返回被打断的程序处,继续往下执行。
2024-09-05 11:19:49
988
原创 5 FreeRTOS的任务挂起与恢复
vTaskSuspend() 挂起任务vTaskResume() 恢复被挂起的任务xTaskResumeFromISR() 在中断中恢复被挂起的任务挂起:挂起任务类似暂停,可恢复;删除任务,无法恢复恢复:恢复被挂起的任务FromISR:带FromISR后缀是在中断函数中专用的API函数注意:1)此函数用于挂起任务,使用时需将宏INCLUDE_vTaskSuspend配置为12)无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复3)当传入的参数为NULL,则代表挂起任务自身(当前正在执行的任务)
2024-09-03 16:20:56
1938
原创 4 FreeRTOS的任务创建和删除
* 任务栈栈顶,必须为TCB的第一个成员 *//* 任务状态列表项 *//* 任务事件列表项 *//* 任务优先级,数值越大,优先级越大 *//* 任务栈起始地址 *//* 任务名字 */省略很多条件编译的成员} tskTCB;任务栈栈顶,在任务切换时的任务上下文保存、任务恢复息息相关注意:每个任务都有属于自己的任务控制块,类似于身份证。
2024-09-03 09:53:12
656
原创 3 FreeRTOS移植
STM32F1系列的函数delay_init()将SysTick的时钟频率设置为CPU时钟频率的1/8,而STM32F4/G4/F7/H7/H5系列的函数delay_init()则将SysTick的时钟频率设置为与CPU相同的时钟频率,由于FreeRTOS在配置SysTick时,并不会配置 SysTick 的时钟源,因此这将导致正点原子 STM32F1 系列与正点原子 STM32F4/G4/F7/H7/H5 系列的 FreeRTOSConfig.h 文件有所差异。
2024-09-01 02:24:55
854
原创 2 FreeRTOS基础知识
调度器就是使用相关调度算法来决定当前需要执行的哪个任务。抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。(RTOS是数值越大,它的任务优先级就越大)时间片调度:主要是针对优先级相同的任务,当多个任务优先级相同时,任务调度器会在每一次系统时钟节拍到底时候切换任务。协程式调度(现在几乎不怎么用):当前执行的任务将会一直运行,同时高优先级的任务不会抢占低优先级的任务,FreeRTOS现在虽然还支持,但是官方已经表示不在更新协程式调度。
2024-08-30 21:36:45
794
原创 1 RTOS入门
免费开源:商业产品中使用,无潜在商业风险,无须担心可剪裁:FreeRTOS的核心代码9000+行,包含在3个.c文件中简单:简单易用,可移植性非常好优先级不限:任务优先级分配没有限制(没有限制指的是软件方法,如果使用硬件方法,STM32最多有32个优先级),多任务可同意优先级。任务不限:可创建的实时任务数量没有软件限制,但需要注意的是每一个任务都需要分配任务堆栈,而任务堆栈需要MCU分配内存抢占/协程/时间片:支持抢占式、协程式、时间片流转任务调度。
2024-08-30 16:24:12
253
原创 人工智能——神经网络
一、人工智能发展简史1950年,英国科学家艾伦图灵发表了论文讨论创造出具有真正智能的机器的可能性,并提出了著名的图灵测试:如果一台机器能够与人类展开对话而不能被辨别出其机器身份,那么称这台机器具有智能。现在活跃于电脑,手机,还有各种硬件上的“智能助手”在各自的功能领域,通常被大众认为挺有智能的。从1956年的达特茅斯会议开始,人工智能(Artificial Intelligence,AI)作为一个专门的研究领域出现,经历了超过半个世纪的起伏,终于在2007年前后,迎来了又一次大发展。二、人工智能的定
2021-06-13 14:37:44
2114
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人