- startup_xx.s是启动汇编源文件,上电的时候先执行此文件,从而建立起C语言的运行环境。初始化堆栈指针SP,初始化程序计数器指针PC,设置堆栈的大小,初始化中断向量表,(若开发板上有外部SRAM)配置外部SRAM作为数据存储器。++调用SystemInit()函数配置STM32系统时钟++,设置C库的分支入口——main,最终调用main函数。
文件名 | 功能 |
---|---|
stm32f10x.h | 寄存器映射头文件 |
startup_stm32f10x_md.s | 启动汇编,初始化堆栈,C语言入口 |
stm32f10x_it.c | 中断 |
system_stm32f10x.c | 包含SystemInit函数 |
- Direct Memory Acess
- MPU响应DMA时不经过MCU,直接从内存读取数据进行进行交换。
- 在DMA模式下,MCU只需向DMA下达指令,让DMA控制器来处理数据的传送,数据传输完毕再把信息反馈给MCU,这样就减轻了对MCU资源的占有率,节省系统资源。
- 中断请求是事件向MCU发送一个请求,既要求MCU停止目前的工作而去执行中断子程序。从而可以输入或者输出一个数据,弹中断完毕后,MCU又返回执行它原来的程序。
- 用中断方式节省了MCU时间,是管理I/O的一个有效的方法,适用于随机出现的服务。但是每处理一次I/O操作都要中断一次,消耗一定的MCU时间,对于高速的外围设备以及成组交换的数据的情况,使用DMA比较的合适。而DMA是一种完全由硬件执行I/O交换的工作方式。既考虑了中断响应,又节约了中断开销。传输速率很高.
- 可以对单独的bit位进行读写,类似51可位寻址。位带区把每一位膨胀为32位,通过操作膨胀出来的字可以达到操作位带区的每一位。(++用32位来映射1位++)。
- 公式如下。0X42000000是位带别名区的起始地址,0X40000000是外设位带区的起始地址A-40000000表示该比特前有多少个字节,x8表示一个字节有8位,一位膨胀为4个字节(4个地址),n为bit在A地址中的序号(偏移量offset)一位膨胀为4个字节所以x4。
- RTC是一个32位定时器,只能向上计数,时钟源HSE/128,LSE,LSI。
- CE117E板子上无外部低速晶振(LSE),这里使用内部低速振荡器(LSI),然后开启APB1的时钟。
- RTC启动步骤:
使用RCC_APB1PeriphClockCmd使能PWR和BKP区域(即备份域)的时钟系统
使能LSI(RCC_CSR->LSION)
选择时钟源(RCC_BDCR->RTCSEL)
使能RTC时钟(RCC_BDCR->RTCEN)
允许对BKP区域的访问PWR_BackupAccessCmd(PWR_CR->DBP)
使用库函数RTC_WaitForSynchro对备份域和APB进行同步
使用RTC_ITConfig使能秒中断
使用RTC_SetPrescaler分频配置把RTC时钟频率设置成1Hz
- RTC中断:RTC中断有秒中断和闹钟中断,公用一个中断入口,需要在中断函数中判断是哪种中断并且清除相应的中断标志位。
- sysTick是ARM内核的一部分,属于内核的外设,常用来作为操作系统的心跳(系统时基)(切换时间片)。sysTick定时器捆绑在NVIC(嵌套向量中断控制器(Nested Vectored Interrupt Controller))中,可以选择内部和外部时钟源。
- 相关的寄存器定义和库函数存在于core_x.h中。
- 相关寄存器
位段 | 名称 | 描述 |
---|---|---|
16 | CONTFLA | 是否减到0 |
2 | CLKCOURCE | 0外部时钟源(STCLK = HCLK/8)1自由时钟源(FCLK = HCK) |
1 | TICKINT | 1使能异常请求 |
0 | ENABLE | sysTick使能 |
位段 | 名称 | 描述 |
---|---|---|
23:0 | RELOAD | sysTick定时器重装值,自动重装 |
位段 | 名称 | 描述 |
---|---|---|
23:0 | CURRENT | 当前值 |
位段 | 名称 | 描述 |
---|---|---|
23:0 | TENMS | 10ms内倒计时的格数,由外部提供基准。通常把该值装到RELOAD。 |
- tick(滴答声)sysTick系统定时器是一个24bit的递减定时器,在允许中断和使能的情况下减到0触发中断。
- SCB(System contorl block)属于,内核中。
- SCB->SHP[12](SHPRx(x = 1,2,3)寄存器为32位寄存器,但是只能字节寻址所以core_x.h定义的SCB结构体将SHP分成了12组,即SHP[12])控制系统控制的优先级。
- 内核优先级用SCB->SHP[12]来控制,其他用NVIC->IP来控制。数越大优先级越低。
- 1. 设置重载寄存器值 2. 清除当前数值寄存器的值 3. 配置控制与状态寄存器