新建工程
新建工程基本步骤
• 建立工程文件夹,Keil中新建工程,选择型号
• 工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹(文件较多,建立文件夹便于方便管理)——为添加工程文件准备
• 工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里——在Keil方便管理
• 工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹
• 工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER——使用库函数的条件编译
• 工程选项,Debug,下拉列表选择对应调试器STLINK,Settings,Flash Download里勾选Reset and Run
也可以建立一个属于自己风格的工程,只要能通过编译,工程就基本没有问题。
工程架构
主动执行 被动执行
主动执行
startup_xx.s 启动文件:程序执行最基本的文件
用汇编写的,其中定义了中断向量表、中断服务函数等
中断服务函数中的复位中断——整个程序的入口
system_xx.c / .h :设置微控制器的启动,初始化嵌入式闪存接口、锁相环、更新系统内核的时钟变量
被动执行——STM32的资源
stm32f10x.h + core_cm3.c / .h :外设和内核外设的寄存器描述
库函数文件:封装了寄存器的操作,便于配置外设
stm32f10x_conf.h :配置头文件的包含关系
启动文件的选择——型号分类及缩写
配置寄存器
配置寄存器——RCC寄存器——使能GPIOC时钟
GPIO是APB2的外设——在7.3.7 RCC_APB2ENR中配置
PC13口的模式——在8.2.2 GPIOx_CRH中配置
给PC13口输出数据——在8.2.4 GPIOx_ODR中配置
RCC -> APB2ENR = 0x00000010; GPIOC -> CRH = 0x00300000; GPIOC -> ODR = 0x00000000; |
需要不断查手册看每个寄存器的每一位是干什么的,并且存在弊端——把除了PC13之外的位都配置成了0,影响其他位,需要&=和|=
这样,虽然代码简单,但是不太方便,需要改进——为工程添加库函数
利用库函数间接配置寄存器
//使能时钟——配置GPIOC的外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //配置端口模式(使用结构体来配置参数) GPIO_InitTypeDef GPIO_InitStructure; //结构体类型 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //引出结构体参数 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //引出结构体参数 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引出结构体参数 GPIO_Init(GPIOC,&GPIO_InitStructure); //设置端口的高低电平进行点灯 GPIO_SetBits(GPIOC,GPIO_Pin_13); //高电平 GPIO_ResetBits(GPIOC,GPIO_Pin_13); //低电平 |
库函数和寄存器的区别
库函数:经过函数的包装,不需要通过查手册来确认哪一位是干什么的;代码更长但是语义更加明确,只需要调用库函数按照指示填好参数。
寄存器:需要通过查手册来确认哪一位是干什么的