avatar
Articles
127
Tags
0
Categories
17
首页
归档
友链
李瑞琦的博客
首页
归档
友链

李瑞琦的博客

面试题
Updated2025-10-31|05-MCU01-FreeRTOS
14.FreeRTOS支持哪些类型的中断?中断处理的基本原则是什么?21.FreeRTOS如何处理异常和错误? 24.如何在FreeRTOS中实现低功耗模式?25.FreeRTOS的移植过程通常需要考虑哪些硬件特性? 29.FreeRTOS如何与其他操作系统进行集成?30.FreeRTOS的调试工具和方法有哪些?
08 STM32
Updated2025-10-31|05-MCU02-STM32
STM32系统架构STM32F4系列的系统架构如图所示(来自User Manual): 可以看到内核通过3条总线连接到AHB(Advanced High-performance Bus)总线矩阵,然后与高速外设(DMA、MAC、USB…)、Flash、SRAM低速外设(通过APB总线桥接)连接 Data Sheet里面也有个比较好的架构图: ARM Cortex-M系列的CPU都包含以下3条总线: I-Bus:指令总线,负责在 0x0000_0000 – 0x1FFF_FFFF 之间的取指操作,访问的存储器对象是Flash D-Bus:数据总线,负责在 0x0000_0000 – 0x1FFF_FFFF 之间的数据访问操作,访问的存储器对象是Flash S-Bus:系统总线,负责在 0x2000_0000 – 0xDFFF_FFFF 和 0xE010_0000 – 0xFFFF_FFFF 之间的所有数据传送,取指和数据访问都算上,访问对象是SRAM和外设寄存器 不同内核实际上各个总线能访问的地址范围不一样 参考: Cortex-M3权威指南第六章 STM32...
ADC
Updated2025-10-31|05-MCU02-STM32
HAL库ADC1.硬件问题STM32的ADC、DAC的供电电源是VDDA,直接把他连到VDD上就行了,千万别加电阻。 ADC的测量范围是:0~VDDA,如果加了电阻,则VDDA会小于3.3V,那么ADC的量程也将缩小。 2.软件问题ADC和串口一样,每次读取前都得开启一次,不然就只能读一次 12345678910111213uint16_t get_adc(void){ //开启ADC1 HAL_ADC_Start(&hadc1); //等待ADC转换完成,超时为100ms HAL_ADC_PollForConversion(&hadc1,100); //判断ADC是否转换成功 if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)) { return HAL_ADC_GetValue(&hadc1); } return...
HAL串口中断
Updated2025-10-31|05-MCU02-STM32
HAL串口中断1.每次使用串口中断前必须初始化一下1HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuffer,LENGTH);//指定缓冲区以及触发中断的长度 ==每次中断后都得在用一次该语句,不然就只能触发一次中断,第一次中断前初始化时也要写这句== 2.串口发送函数12HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData,                     uint16_t Size, uint32_t Timeout) 功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。 参数: UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1*pData 需要发送的数据Size 发送的字节数Timeout ...
HAL库外设配置方法
Updated2025-10-31|05-MCU02-STM32
STM32 HAL各种外设配置方法(不包括CubeMX)1.外部中断只需要在CubeMX里对IO配置,自己重写一下回调函数就行了 123456789101112131415161718192021void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin==KEY0_Pin) { HAL_Delay(10);/* 延时一小段时间,消除抖动 */ if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==GPIO_PIN_RESET) flag=0; } else if(GPIO_Pin==KEY2_Pin) { HAL_Delay(10);/* 延时一小段时间,消除抖动 */ if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET) flag=1; } else...
IIC
Updated2025-10-31|05-MCU02-STM32
IIC1.IIC的地址问题 IIC中的器件地址DEV_ADDRESS是7位地址,但C语言中没有7bit的数据类型,所以你只能传uint8_t的数据进去。HAL库会把这个变量的高7位提取出来作为地址,根据实际情况对最后一个读写位set或reset。 通常数据手册在表述地址的时候,地址是在一个8位二进制数的低7位,比如6050就是0x68=0110 1000,但HAL库IIC传进去的地址在一个8位二进制数的高7位,就变成了0xD0(写)或者0xD1(读)这点要注意。 HAL库你在传地址的时候不需要自己考虑第8位是0还是1,它那个函数内部会自动根据你调用的是IIC读还是IIC写来对那一位进行运算。不过你要是非要传第8位已经写0或1的地址进去也行,因为运算结果不会变,只要你不写反就行了 2. IIC的数据传输IIC一般根据从机寄存器的位数来确定一次传几个字节的数据。通过以下函数中的 Size参数可以设定传输数据的字节数 12345HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,...
Keil的Debug技巧
Updated2025-10-31|05-MCU02-STM32
Debug 技巧1.Debug时,黄色箭头代表程序运行到哪里了,蓝色箭头是鼠标移动的位置 2.可以通过看Systick的值来计算语句运行的时间 3.从Watch Window可以设置在某变量发生变化时设置断点 4.单步调试【单步调试】也就是每点⼀次按钮,程序运⾏⼀步。遇到函数会进⼊函数。点击图标按钮,或者按快捷键F11。(这⾥取消上⾯的断点) 5.逐步调试【逐步调试】即逐⾏调试,也就是每点⼀次按钮,程序运⾏⼀⾏。遇到函数不会进⼊函数。点击图标按钮,或者按快捷键F10。 6.跳出调试【跳出调试】即挑出函数调试,也就是每点⼀次按钮,程序跳出⼀个函数,直到跳出最外⾯的函数(main函数)。点击图标按钮,或者按快捷键Ctrl + F11。 7.运⾏到光标处【运⾏到光标处】即将光标放在某⼀处,点击该按钮(或Ctrl +...
SPI
Updated2025-10-31|05-MCU02-STM32
SPI学习1.SPI的物理结构 MOSI:主设备输出,从设备输入 MISO:主设备输入,从设备输出 SCK:时钟信号线 CS:设备片选,低电平表示被选择 一个SPI接口可以同时连接多组从设备,只需要增加CS线即可 用CUBEMX设置SPI默认只有3个引脚(没有CS),如果下面开启了NSS,系统会自动给你指定一个CS引脚,否则就要自己指定CS引脚 在通信开始/结束时,手动控制CS引脚的电平 2.SPI工作原理主机和从机内部都有一个移位寄存器,主机发送数据时,同时也会受到一组数据,不过不需要对该数据处理。主机接收数据时,要给从机发送一组没有意义的数据,同时接收数据。 3.寄存器相关的寄存器有2组 CPOL(时钟极性寄存器):控制高电平还是低电平时空闲状态 CPHA(相位控制寄存器):控制是奇数还是偶数跳变是读取数据 这个怎么选一般要看芯片手册 4.SPI的其他参数
SysTick详解
Updated2025-10-31|05-MCU02-STM32
SysTick详解SysTick定时器简介SysTick定时器也叫SysTick滴答定时器,它是Cortex内核的一个外设,被嵌入在NVIC中。它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取。当定时器计数到0时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号。因此只要知道计数的次数就可以准确得到它的延时时间。 SysTick定时器作为HAL_Delay的基准在cube生成的代码中,main函数中HAL_RCC_ClockConfig();初始化系统时钟的时候Systick被初始化。初始化时,Cube默认设置Systick中断优先级为最高优先级,中断周期由函数HAL_SYSTICK_Config(SystemCoreClock / (1000U /...
内存的分区
Updated2025-10-31|05-MCU02-STM32
内存的分区及存放位置一、内存分区介绍程序中内存有以下分区: 栈区(stack) 临时创建的局部变量存放在栈区。 函数调用时,其入口参数存放在栈区。 函数返回时,其返回值存放在栈区。 const定义的局部变量存放在栈区。 堆区(heap)堆区用于存放程序运行中被动态分布的内存段,可增可减。 可以有malloc等函数实现动态分布内存。 有malloc函数分布的内存,必须用free进行内存释放,否则会造成内存泄漏。 全局区(静态区)(static)内存在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在。它主要存放静态数据(局部static变量,全局static变量)、全局变量。当程序结束后,变量由系统释放 。 常量区存放数字 和 常量字符串。当程序结束后,由系统释放 。 常量区的内容不可以被修改。 代码区存放函数体的二进制代码。 123456789101112131415161718192021222324//main.cpp#include <iostream>using namespace std;#include...
1…10111213
avatar
Li Ruiqi
总有低谷
Articles
127
Tags
0
Categories
17
Follow Me
Categories
  • 01-计算机基础八股12
  • 02-开发工具12
    • CMake7
  • 03-C++14
  • 04-Linux52
    • 01-Linux基本操作8
    • 02-系统移植9
    • 03-内核开发24
    • 04-应用开发8
    • 05-安卓开发3
  • 05-MCU28
    • 01-FreeRTOS7
    • 02-STM329
    • 03-MSP4304
    • 04-LVGL4
  • 06-嵌入式硬件5
  • 07-RISC-V4
Website Info
Article Count :
127
Unique Visitors :
Page Views :
Last Update :
©2019 - 2025 By Li Ruiqi
Framework Hexo|Theme Butterfly
人因梦想而伟大