当前位置: 代码迷 >> 综合 >> STM32-------->第二天,Bootloader,启动文件分析,异常向量表,定时器,滴答定时器,独立看门狗,DMA总线,SPI--LCD
  详细解决方案

STM32-------->第二天,Bootloader,启动文件分析,异常向量表,定时器,滴答定时器,独立看门狗,DMA总线,SPI--LCD

热度:80   发布时间:2023-12-03 10:26:56.0

bootloader

 

main flash memory -------- 主闪存, 用户的程序烧写到这里

system memory --------- 系统主存, 芯片厂商的启动程序烧写在这里, 固化的

 

STM32F051K8U开发板的启动模式是从主闪存启动

从系统存储器启动, 主要是用在isp(在线编程, 比如量产烧录代码)

根据选定的启动模式,主闪存存储器,系统存储器或 SRAM 按照以下的说明访问:

● 从主闪存存储器启动 : 主闪存存储器被映射到启动存储空间 (0x0000 0000), 但仍然能从原有的地址空间 (0x800 0000) 访问 . 即闪存存储器的内容可从两个地址开始访问,0x00000000 或 0x800 0000。

● 从系统存储器启动 : 系统存储器被映射到启动空间 (0x0000 0000),但仍然能够在它原有的地址空间 (0x1FFF EC00) 访问。

启动文件分析

具体文件:startup_stm32f051x8.s 

AREA    STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem       SPACE   Stack_Size__initial_sp

 AREA    HEAP, NOINIT, READWRITE, ALIGN=3__heap_baseHeap_Mem        SPACE   Heap_Size__heap_limit

启动文件里异常向量表

AREA    RESET, DATA, READONLYEXPORT  __VectorsEXPORT  __Vectors_EndEXPORT  __Vectors_Size__Vectors       DCD     __initial_sp                   ; Top of StackDCD     Reset_Handler                  ; Reset Handler

代码区:

AREA    |.text|, CODE, READONLY; Reset handler routineReset_Handler    PROCEXPORT  Reset_Handler                 [WEAK]IMPORT  __mainIMPORT  SystemInit  LDR     R0, =SystemInitBLX     R0LDR     R0, =__mainBX      R0ENDP

异常向量表

__Vectors       DCD     __initial_sp                   ; Top of StackDCD     Reset_Handler                  ; Reset HandlerDCD     NMI_Handler                    ; NMI HandlerDCD     HardFault_Handler              ; Hard Fault Handler。。。。。。。。。。。。DCD     USART1_IRQHandler              ; USART1DCD     USART2_IRQHandler              ; USART2DCD     0                              ; ReservedDCD     CEC_IRQHandler                 ; CEC__Vectors_End

以上的表可以理解为一个unsigned int 型的数组, 每个元素是个函数地址, 在reset 之后,该表 __Vectors 被映射到 0地址

查看芯片手册, 如下就是异常向量表, 如reset 之后执行的是0x0000 0004地址,

那就会执行到 __Vectors表里的Reset_Handler,其他也一样

 

定时器

tim6(基本定时器) 实现2秒的定时

勾选中断

 

HAL库手册:

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef * htim)

函数功能:以中断方式启动定时器htim

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)

函数功能: 以中断方式启动的定时器, 定时器到了后的回调函数

滴答定时器 ,HAL_Delay

滴答定时器------>1ms 定时器

向量表:

 DCD     SysTick_Handlervoid HAL_IncTick(void){uwTick++;------------------ 全局变量}
__weak void HAL_Delay(__IO uint32_t Delay){uint32_t tickstart = HAL_GetTick();uint32_t wait = Delay;while((HAL_GetTick() - tickstart) < wait)   不断获取滴答数,进行比较{}}

独立看门狗

独立看门狗的周期 10秒钟, 看门狗的时钟源是lsi-----40khz

 

HAL库手册:

HAL_StatusTypeDef HAL_IWDG_Init (IWDG_HandleTypeDef *hiwdg)

函数功能: 初始化并且启动看门狗

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef * hiwdg)

函数功能: 喂狗

DMA

直接内存存取总线, 在硬件接口的寄存器 和  内存之间建立一条通道

实验: uart1 dma的方式接收电脑发过来的数据

HAL 库手册:

HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)

函数功能: 从huart 接收Size 个字节, 保存到pData

spi--lcd

spi 串行,同步, 全双工

四根线:

时钟线  clk

片选线  cs

主出从入 mosi

主入从出 miso

 

LCD ----------- 液晶屏背光线---------------- PB6

MISO --------------- 输出口, 通过高低电平告诉lcd 驱动ic , spi通讯的数据是命令还是数据?----------------------------------------------PB4

MOSI ----------- SPI 的输出----------------- PB5

SCLK --------- SPI 的时钟 ------------------ PB3

SS ----------- SPI 的片选线----------------PA15

HAL 库 手册:

HAL_StatusTypeDef HAL_SPI_Transmit (SPI_HandleTypeDef *hspi, uint8_t * pData, uint16_t Size, uint32_t Timeout)

函数功能: 依赖spi接口 hspi, 发送Size个字节, 数据在pData, 发送超时是Timeout