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=3
Stack_Mem SPACE Stack_Size
__initial_sp
堆
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
启动文件里异常向量表
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
代码区:
AREA |.text|, CODE, READONLY
; Reset handler routine
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
异常向量表
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
。。。。
。。。。
。。。。
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD 0 ; Reserved
DCD 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_Handler
void 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