STM32固件库初识
- 汇编编写得启动文件
startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始化中断向量表(中断服务函数名)、配置系统时钟、对C库函数_main最终去到C得世界。
- 时钟配置文件
system_stm32f10x.c:把外部时钟HSE = 8M,经过PLL倍频到 72M (9倍频),范围为1-16,系统默认 72。
- 外设相关
stm32f10x.h://实现了内核之外的内设的寄存器映射。
xxx:GPIO、USRAT、等等。
stm32f10x_xx.c://外设的驱动函数库文件。
stm32f10x_xx.h://存放外设的初始化结构体,外设初始化结构体成员得参数列表,外设固件库函数的声明。
- 内核(core)相关
CMSIS-Corex 微控制器软件接口标准
core_cm3.h://实现了内核里面外设的寄存器映射
core_cm3.c:
NVIC(嵌套向量中断控制器)、SysTick(系统滴答定时器)
misc.h
misc.c
- 头文件的配置文件
stm32f10x_conf.h://头文件的头文件
stm32f10x_GPIO.h
stm32f10x_usart.h
stm32f10x_i2c.h
stm32f10x_adc.h
stm32f10x_spi.h
·······
- 专门存放终端服务函数的C文件
stm32f10x_it.c
stm32f10x_it.h
中断服务函数可以随意放在其他地方,并不是一定要放在stm32f10x_it.c
中断编程的顺序
1.使能中断请求
2.配置中断优先级分组
3.配置NVIC寄存器,初始化NVIC_InitTypeDef;
4.编写中断服务函数
中断优先级的定义
优先级设定:NVIC_IPRx
高四位用于表达优先级 低四位未用
=====================================================================================================================
NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description
=====================================================================================================================
NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority | | | 4 bits for subpriority
---------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority | | | 3 bits for subpriority
---------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority | | | 2 bits for subpriority
---------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority | | | 1 bits for subpriority
---------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority | | | 0 bits for subpriority
=====================================================================================================================
中断编程
使能中断请求
外设使能,配置外设的中断寄存器
NVIC->总开关 //相当51EA
中断优先级分组
SCB_ARCR -> PRIGRCUP 分组
固件库编程调用什么函数?
NVIC_PriorityFroupConfig()//抢占优先级
NVIC_InitTypeDef 初始化结构体
/* misc.h函数库中 52-68 Line */
/* stm32f10x.h 中 100+ 所有的中断源 */
1.uint8_t NVIC_IRQChannel; //中断源
2.uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级
3.uint8_t NVIC_IRQChannelSubPriority; //子优先级
4.FunctionalState NVIC_IRQChannelCmd; //使能或失能
NVIC_Init 最后初始化 参数是结构体
NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
编写中断服务函数
1.终端服务函数名要怎么写?写错了怎么办
和启动文件里的名字对应,如果写错了也不会报错,而是执行启动文件中的空
2.中断服务函数要写在什么地方 [WEAK]弱定义
stm32f10x_it.c 里面对应的空函数
GPIO中断
/* 管理外部中断 */
外部中断/事件控制器(EXTI) 1->GPIO 2->EXTI 3->NVIC内核
EXTI框图八部分
输入线
1、输入先总共有多少,具体是那些
二十根中断/事件线 EXTI0 – EXTI19 零死角表18-1 EXTI中断/事件线
输入源 0-15 为PX 0-15 X对应可为A、B、C、D、E、F、G、H、I
输入源 16 为PVD输出
输入源 17 RTC 闹钟事件
输入源 18 USB唤醒事件
输入源 19 以太网唤醒时间(只适用互联型)
中断编程的要点
1.初始化要连接到的EXTI的GPIO
2.初始化EXTI用于产生中断/事件
3.初始化NVIC,用于处理中断
4.编写中断服务函数
5.main函数