嵌入式:STM32

STM32 启动流程是怎样的?

根据启动模式,从不同的存储器加载程序运行。
STM32的启动代码在startup_stm32f10x_xx.s(xx根据微控制器所带的大、中、小容量存储器分别为hd、md、ld)中,其中的程序功能主要包括初始化堆栈、定义程序启动地址、中断向量表和中断服务程序入口地址,以及系统复位启动时,从启动代码跳转到用户main函数的入口地址。


image.png

原文链接:https://blog.csdn.net/wwt18811707971/article/details/78678059

SRAM和RAM的区别?

SRAM是静态RAM,速度快,价格贵。

SWD下载和调试程序时,boot引脚要怎么连接?

貌似不影响。

ISP是什么意思?

ISP(in-system programming)--在线系统编程

STM32的中断处理时怎样的?

从地址80000000开始执行,然后跑到reset中断,然后跳到main函数。
参考:https://www.cnblogs.com/long5683/p/9638866.html

STM32 IAP官方例子

https://www.st.com/en/embedded-software/x-cube-iap-usart.html

串口怎么判断数据结束的?

通过结束位和开始位,结束时高电平,如果后面继续时高电平,说明本次结束了。如果时低电平,说明是下一个数据到了。

HAL_Delay实现原理?

在一个while循环里面等待SysTick的滴答计时到达。注意不能放在中断里面,否则会卡死。

stm32 几个关键的地址

外设起始地址

define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */

define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL)

define USART1_BASE (APB2PERIPH_BASE + 0x1000UL)

所以串口1的地址是0x40000000UL + 0x00010000UL + 0x1000UL = 0x40011000

typedef struct
{
__IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 /
__IO uint32_t DR; /
!< USART Data register, Address offset: 0x04 /
__IO uint32_t BRR; /
!< USART Baud rate register, Address offset: 0x08 /
__IO uint32_t CR1; /
!< USART Control register 1, Address offset: 0x0C /
__IO uint32_t CR2; /
!< USART Control register 2, Address offset: 0x10 /
__IO uint32_t CR3; /
!< USART Control register 3, Address offset: 0x14 /
__IO uint32_t GTPR; /
!< USART Guard time and prescaler register, Address offset: 0x18 */
} USART_TypeDef;
可以看到,限制都是通过结构体的方式来操作寄存器了。

有什么常见的简称?

Interrupt Request,简称IRQ
NMI,不可屏蔽中断

什么是临界段代码?

代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。

stm32 如何关闭中断?

vPortRaiseBASEPRI

MRS与MSR寄存器是什么?

MRS: 状态寄存器到通用寄存器的传送指令。
MSR: 通用寄存器到状态寄存器的传送指令。

BASEPRI是什么?

设置为n后,屏蔽所有优先级数值大于等于n的中断和异常。Cortex-M的优先级数值越大其优先级越低。
参考:https://www.cnblogs.com/qiyuexin/p/8921718.html

HAL_NVIC_SetPriority的函数输入是怎么对应优先级的?

值越小,优先级越高

FreeRTOS任务切换过程?

https://blog.csdn.net/jiejiemcu/article/details/81039707

串口中断发送方式是怎样的?

起始就是给usart结构体先赋值,然后开中断
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
一个个字节赋值给DR寄存器,然后发出去。

STM32为什么要把代码烧到flash的0x0800000中去?

STM32开机会进行地址映射,在访问0x0000000时,会通过memmap,转换成0x08000000,进而访问flash。

image.png

要记住两个关键的地址:flash起始地址:0x08000000, ram起始地址0x20000000
至于为什么要写到0x08000000,据说时这样就有两个地址对应同一个物理地址,可以加快访问速度。例如(0x00000000和0x08000000都是对应flash的0x08000000地址)
参考:https://blog.csdn.net/weixin_42231514/article/details/106178653?utm_medium=distribute.pc_relevant.none-task-blog-title-7&spm=1001.2101.3001.4242

stm32一个字是多少字节?

stm32是32位的,所以一个字是32位,4个字节。

FreeRTOS的启动原理

通过pendsv和systick中断,来进行切换的。

FreeRTOS临界区怎么操作

使用vPortEnterCritical,进而是调用vPortRaiseBASEPRI(),
实际是把寄存器basepri的值设置成了0x50了

Stm32 HAL库一般是怎么管理寄存器的?

一般是结构体管理,每个结构体都有一个基地址
例如系统配置寄存器

#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */


typedef struct
{
  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */
  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */
#else
        uint32_t RESERVED0;
#endif
  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */
  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */
  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */
        uint32_t RESERVED1;
  __IOM uint32_t SHPR[2U];               /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */
  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */
} SCB_Type;

就规定了SCB这个SCB_Type结构体实例的地址是SCB_BASE

使能中断,实际修改的是什么寄存器呢?

HAL_NVIC_EnableIRQ修改的是ISER寄存器

FreeRTOS进行bootloader跳转时,需要注意什么?

需要关闭中断,一般我们都会关闭外设的中断,但其实了解FreeRTOS的切换任务流程后,可以知道任务切换时依赖systick中断的,所以我们一定要把systick中断也关闭掉。不然如果我们在app一开始调用__enable_irq()的时候,就会找不到中断处理函数,然后跑飞。关闭systick中断:
SysTick->CTRL = SysTick->CTRL & 0xFFFFFF00;

FreeRTOS的systick中断是在函数vPortSetupTimerInterrupt()中使能的。

stm32和freeRTOS的堆栈是怎样管理的?

在有freeRTOS时,他的map文件如下,可以看到堆栈时从0x0000000020015858开始,因为ram的基地址是0x0000000020000000,所以FreeRTOS总共占用了0x15858,转成10进制,约等于80K。从80K后面的就不属于freeRTOS管理。


image.png

从图片可以看出,堆和栈的空间是完全分开的。
这些不受freeRTOS管理的内存。
栈地址是:
0x0000000020015e58 到 0x0000000020015a58 可以看到是向下生长的。

堆地址是:
0x0000000020015858 到 0x0000000020015a58 可以看到是向上生长的。

下图是一个栈数据溢出到堆区,然后被堆区数据memset为0后,出现hard fatal的实际例子。


image.png

FreeRTOS堆和栈的配置如下,也可以单独配置Task的栈大小


堆栈配置.png
单独配置任务栈的大小.png

什么是freertos的优先级继承?

就是低优先级A的拿到互斥锁之后,然后一个高优先级的任务B要来拿锁,但A现在持有,所以B只能挂起来,为了尽快拿到锁,得让低优先级尽快跑完,不然任务B可能一直阻塞(如果来了个比B低优先级的任务C,因为B在阻塞,C就先跑了,这就导致了优先级反转,明明B优先级高,却任务C先跑),于是系统就把A的优先级调高到B的水平。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 一。输入模式 1. 浮空输入 浮空输入模式下,上拉和下拉两个开关断开,高或低电平通过施密特触发器到达输入数据寄存器...
    呼啦啦的爱阅读 390评论 0 0
  • 1 简介 STM32F10x标准外设库是一个完整的包,包含了所有标准外设的设备驱动,适用于STM32价值系列(高、...
    hackvilin阅读 6,499评论 0 13
  • # STM32之串口DMA接收不定长数据 ## 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,...
    杰杰T_T阅读 535评论 0 0
  • 姓名:周崇杰 学号:16140120059 专业:机械设计制造及其自动化 转载自:http://blog.csd...
    CJbaby阅读 4,713评论 0 5
  • 前几天,芋头给我发过一条信息,说希望第一条说说求99,我去看了他的第一条说说,却没有祝99,照片里的男生让...
    七月夏栀阅读 153评论 0 0