历史上的今天
今天是:2025年07月29日(星期二)
2019年07月29日 | stm32 各头文件或C文件功能
2019-07-29 来源:eefocus
stm32f10x_con.h
配置文件:加载哪个外设、使能assert 对参数进行检查,如果使能了assert 需要在main文件中添加 _assert_faild 函数。 使能assert会增大编译出执行文件的大小,调试完后可以将assert 屏蔽。
stm32f10x.h头文件中包含了stm32f10x_conf.h 。
stm32f10x.h
1、对所有的外设的地址进行映射,映射到存储区,即定义某外设结构体变量,因为结构体是连续存储的只要将外设的基地址强制转换为结构体类型的指针,那么该外设的寄存器就可以通过指针进行访问,以GPIO为例:
定义外设的结构体,结构体变量都是volatile类型,告诉编译器不要进行优化,读取值从内存读取不要读缓存。
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
GPIO外设的地址
#define PERIPH_BASE ((uint32_t)0x40000000) //外设别名区的基地址
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) // APB2外设总线上寄存器的基地址,GPIO挂在APB2总线上
// GPIO外设的地址
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
// 将外设地址强制转化为结构体的指针,然后就可以通过指针GPIOx区访问某个端口中的寄存器
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
2、外设寄存器位的定义
core_cm3.c文件
内核相关的变量和函数的定义:NVIC、systick、MPU(有的MCU没有)、调试组件
1、NVIC相关的变量和函数。
中断向量的使能_(我理解相当于全局中断的使能)
中断向量的禁止
中断向量的挂起
清除挂起的中断
设置中断的优先级
读取中断的优先级
2、systick定时器的配置,static __INLINE uint32_t SysTick_Config(uint32_t ticks);用来使能中断、开启systick定时器。
系统滴答定时器的配置,具体的systick 的介绍在cortex-m3 技术手册中有介绍。
system_stm32f10x.c
1、 时钟的频率,系统时钟的初始化,在最后设置了中断向量表的基地址和偏移地址:
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
当在MDK中改变烧写程序IROM的地址时FLASH_BASE 的地址要改为IROM的地址,如果改为函数void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);修改NVIC_VectTab_FLASH 的地址,实际上这两种设置向量表的方法是一样的,都要修改向量表的基地址。
偏移量默认偏移量是0,从代码区启动则向量表的地址0x0800 0000,0x0800 0000保存的是堆栈栈顶的地址,代码区的烧写地址在MDK软件中设置。
IAP远程升级能用到这部分的内容,可以参考正点原子的教程。
misc.c
1、void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);函数用来设置中断向量表的位置:SRAM or Flash 默认是在Flash中,偏移量必须是0x200的整数倍。
2、NVIC中断管理的函数,使能、分组等。
3、SCB system control block 系统控制块
系统控制块结构体包含了:
startup_stm32f10x_md.s
启动文件,启动文件中定义了该类型MCU堆的大小和栈的大小,还有中断向量表。中断向量表通过伪指令分配了各个中断入口函数,在程序进行链接时就会把中断向量表中伪指令中断函数分配实际的flash地址。
史海拾趣
|
【说明】:太阳能闪光钥匙扣,是最新的太阳能应用产品,利用弱光型非晶硅太阳能电池的供电原理,使高品质LCD闪烁发光,是一款品牌宣传的工艺精品,也是新颖的送礼佳品。由太阳能供电,无须更换电池;液晶屏幕亮暗交替变化,室内或室外光线下都可闪 ...… 查看全部问答> |
|
全部采用旧电子管收音机的6P1牛和电子管,底盘是铝的。电阻和电容是新的。耦合是WIMA,曾经用千层糕电容,不过那种电容实在太脆弱了,电烙铁在其表面一烫就短路报废了。 另外曾采用所谓西电麻线做连线,发觉这种线的外布皮很容易烂,安全性不好,已较 ...… 查看全部问答> |
|
TCPMP Wince6.0 VS2005 编过了, interface.plg死活加载不上 相关的只做过一个改动 player下main.c下只改了一个宏定义 // don\'t want to use common.dll, but don\'t want to collide with DLL import function either #define tcscpy_s _tcscpy_s 改成了 #define tcscpy_s _mtcscpy_s 原因是_tcscpy_s ...… 查看全部问答> |
|
各位英雄: 小弟最近研究摄像头驱动(WINCE5.0+PXA270+OV9650),涉及到DMA中断。 BSP中至少有两个驱动使用DMA中断: 其一就是音频,在\\Src\\Kernel\\Oal\\intr.c文件中使用OALIntrStaticTranslate( ...… 查看全部问答> |
|
如题,在ppc2003模拟器的屏幕上画了一幅bitmap,能不能对该bitmap写一个鼠标点击事件?如何实现?请赐教!在线等… 查看全部问答> |
|
一开始碰到的问题:发送CMD0能执行返回01,CMD1超时没响应。查到原因:模板程序控制SD供电逻辑反了。#if 0 #define MSD_POWER_ON() GPIO_ResetBits(GPIOD, GPIO_Pin_10) #define MSD_POWER_OF ...… 查看全部问答> |




