- 博客(15)
- 收藏
- 关注
原创 FreeRTOS 任务调度解读
注意:各个任务的栈是相互独立的,中断函数的栈也是独立于各任务的。找到taskA的栈指针(taskA_TCB.pxTopOfStack),然后手动 从 taskA 的栈中把 R4~R11 加载到 CPU对应寄存器(加载完后taskA的栈指针需更新),然后更新 寄存器PSP = taskA的栈指针,最后。OS确定第一个运行的任务taskA:启动调度器前,taskA在创建的任务中优先级最高(假设为max_priority),且在优先级为max_priority的那一批任务中,taskA是最后一个创建的任务。
2024-10-06 19:47:09
1362
原创 STM32外设地图-I2C
软件置位START标志,然后等待 SB标志置位,等到后,软件把从机地址写入 I2C_DR,然后等待 ADDR标志置位,等到后,软件清零ADDR标志(若只接收1Byte数据,则此时软件 清零ACK标志 并置位STOP标志),后面每次等RXNE标志置位时 软件从I2C_DR 读1字节数据,当读完倒数第二字节时,软件清零ACK标志 并置位STOP标志,当读完最后一字节时,软件等待 STOP标志清零,等STOP标志清零后,接收结束。在SCL高电平期间,禁止改变SDA的值)在SCL高电平期间,禁止改变SDA的值)
2024-10-03 23:25:57
1214
原创 STM32外设地图-SPI
此时若最后1字节数据已接收成功(数据已保存在rcv_buf),则:等待TXE = 1(有超时判断),等TXE = 1(或等待超时)后,再等待BSY = 0(有超时判断),等BSY = 0(或等待超时)时传输结束,若等待超时则调用“,此时若最后1字节数据已写入SPI_DR,则:等待TXE = 1(有超时判断),等TXE = 1(或等待超时)后,再等待BSY = 0(有超时判断),等BSY = 0(或等待超时)时传输结束,若等待超时则调用“----线程A挂起等待完成量cpt;
2024-09-27 13:33:22
1000
原创 rtthread CAN驱动解读
线程A 获取 tx_fifo互斥量(永久等待),从 链表freelist 取出首节点 sndbxinx_list_X 并找到与其绑定的 TX Mailbox_X,接着把报文写到 TX Mailbox_X 并请求发送此邮箱(若无法发送则把节点sndbxinx_list_X 重新插入 链表freelist,并释放 tx_fifo互斥量 ,然后返回线程A),然后永久等待完成量“sndbxinx_list_X.completion”…线程A 通过设置 msg.priv 告诉驱动用哪个发送邮箱发送。
2024-09-16 12:28:37
1508
原创 STM32外设地图-CAN
先把第一帧报文写入空闲的 TX Mailbox_X(发送邮箱有3个) 并请求CAN1发送此邮箱(置位 邮箱对应的TXRQ标志),剩下的报文缓存到buff中, TX Mailbox_X 发送完成后(发送成功 or 因没有接收节点ACK而发送失败),RQCP_X标志置位并触发CAN1_TX中断,在CAN1_TX中断函数中,从缓存buff中取出一帧报文 并写入 TX Mailbox_X,然后请求CAN1发送此邮箱。这种方式的优点是软件可以控制恢复时间,避免恢复太快的问题,缺点是需要软件做额外的工作。
2024-09-15 17:48:43
1452
原创 STM32外设地图-Timer
使用CC1和 CC2通道测量输入PWM波形的频率和占空比时,CC1通道采样PWM上升沿,CC2通道采样PWM下降沿,Slave mode为Reset mode 并选择 CC1通道的信号为 TRGI,当CC1通道发生捕获时,TRGI信号会置位UG标志,此时如果UIE标志为1,则会触发 Update interrupt,换句话说,每次CC1通道发生捕获,都会触发Update interrupt,结果就是CPU会频繁响应Update interrupt。配置计数器为Upcounting mode,循环模式。
2024-09-15 13:25:48
1335
原创 STM32外设地图-ADC
② DMA中断周期(dma缓存更新周期): 若dma缓存只能保存一次循环的数据,则ADC Scan完一次时,DMA立刻触发中断,DMA中断周期为 21us ~ 336us;PS:如果 DMA channel传输完成时 需触发DMA channel中断,可考虑把ADC配置为 多通道单次采样,并把 regular group的外部触发配置为定时器触发,这样可以用定时器周期性启动 regular group 采样,进而控制DMA中断周期,就不用通过 加大dma缓存 来延长DMA中断周期。
2024-09-15 11:39:12
1078
原创 STM32外设地图-DMA
3、在DMA传输过半中断、DMA传输完成中断、IDLE中断的中断函数中,计算DMA写入接收环形缓存的数据字节数并更新环形缓存的状态。在IDLE中断的中断函数中,调用接收回调函数把收到的数据长度告诉任务A。peripheral:起始地址为UART1寄存器RDR地址,地址不增加,单数据长度为1字节;memory:起始地址为 接收环形缓存起始地址,地址增加,单数据长度为1字节;使能DMA channel的传输过半中断、传输完成中断;最后使能UART的DMA接收模式。2、使能UART的IDLE中断。
2024-09-15 00:56:01
565
原创 STM32外设地图-GPIO和AFIO
PS: 如果软件在运行时修改了PA13、PA14的配置,导致MCU复位后,无法用Jlink下载程序或无法用Jlink调试程序,可以先修改软件,取消软件对PA13、PA14的配置(让其保持复位默认状态),然后用导线手动拉低NRST引脚使MCU处于复位状态,然后在下载程序的同时,手动释放NRST引脚。③ pin为AFIO时,外设A是否需要引脚重映射:在STM32F103中,当外设A属于 pin 的 “Remap外设”时,软件需要控制外设A执行引脚重映射;部分重映射:外设A的部分引脚重映射。
2024-09-14 18:23:18
1224
原创 CortexM3内核外设-Systick
PS:库函数会选择FCLK作为Systick时钟,并启动SysTick,同时设置Systick中断优先级为最低,并使能Systick中断。1、编写Systick中断服务函数并添加到中断向量表中:SysTick_Handler()
2024-09-14 17:34:50
362
原创 CortexM3内核外设-NVIC
根据全局的优先级分组(即PRIGROUP的值),每个中断的8bit的优先级(STM32只用了高4bit)被拆分成抢占优先级、响应优先级。(中断服务函数指针,长度为4Byte):当NVIC确定要响应中断X时,NVIC先根据中断向量表地址(VTOR寄存器的值,此寄存器值可通过软件修改)找到中断向量表,然后根据中断X的中断编号,从中断向量表中找到与之对应的向量(中断服务函数指针),最后让CPU去运行其中断服务函数。:若中断0、中断1同时触发,此时CPU响应了中断0,则未能被响应的中断1的挂起标志将置位;
2024-09-14 16:50:15
1249
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人