stm32开发模板 && 建议

1.stm32开发建议

        stm32开发有很多种,比如使用寄存器开发,使用固件库(也称标准库)开发,还要的使用HAL库开发。这三种开发其实都是对寄存器进行操作,这个是本质,我们抓住本质去看问题,就会轻松很多。寄存器开发,和51开发差不多,自己对寄存器地址操作,但是寄存器也封装了一下,让开发者使用相对轻松一点。标准库是在寄存器基础进行封装,让开发者使用,管理起来更加方便,但是同样带来一个问题,对于新手不是很友好。HAL库是在标准库基础上再次封装,封装得更加抽象了,对新手也不是很友好。当然使用来说,标准库和HAL库都是很方便的,学起来相对容易,但是都是不知所以然的,很多人让他自己写就不会了,都是在别人的基础上进行开发,或者说遇到一些难题就不行了,当然不排除学得好的大佬。

2.程序运转流程

首先是启动文件,名为“startup_stm32f10x_hd.s”的文件(怎么选择是根据芯片型号选择的,这些都是ST公司提供的,我们可以在此基础上进行二次开发),它里边使用汇编语言写好了基本程序,当STM32 芯片上电启动的时候,首先会执行这里的汇编程序,从而建立起C 语言的运行环境,所以我们把这个文件称为启动文件。该文件使用的汇编指令是Cortex-M3 内核支持的指令,可参考《Cortex-M3 权威指南》中指令集章节

 文件:    

     startup_stm32f10x_ld.s

     startup_stm32f10x_md.s

     startup_stm32f10x_hd.s

    其中,ld.s 适用于小容量 产品;md.s 适用于中等容量产品;hd.s 适用于大容量产品;

这里的容量是指 FLASH 的大小.判断方法如下:

    小容量:FLASH≤32K

    中容量:64K≤FLASH≤128K

    大容量:256K≤FLASH
 

对于启动文件这部分我们主要总结它的功能,其功能如下:
• 初始化堆栈指针SP;
• 初始化程序计数器指针PC;
• 设置堆、栈的大小;
• 初始化中断向量表;
• 配置外部SRAM 作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);
• 调用SystemIni() 函数配置STM32 的系统时钟。
• 设置C 库的分支入口“__main”(最终用来调用main 函数); 

2.2.stm32f10x.h文件

stm32f10x.h这个文件就是对寄存器进行封装了,也提供了很多函数,建议多看看这个文件。

 2.3.main文件

main文件就是我们逻辑文件的地方了。

3.开发模板

这里以一个案例进行说明,就我们的点灯实验。

3.1.硬件

3.1.1.引脚

找到想要点亮的LED灯的管脚,这里选择PB0(PB0的含义是,GPIOB的第0位)。这些LED 灯的阴极都是连接到STM32 的GPIO 引脚,只要我们控制GPIO 引脚的电平输出状态,即可控制LED 灯的亮灭。

3.1.2.时钟

        由于STM32 的外设很多,为了降低功耗,每个外设都对应着一个时钟,在芯片刚上电的时候这些时钟都是被关闭的,如果想要外设工作,必须把相应的时钟打开
        STM32 的所有外设的时钟由一个专门的外设来管理,叫RCC(reset and clockcontrol),RCC 在《STM32 中文参考手册》的第六章。关于RCC 外设中的时钟部分,我们在后面的章节《RCC—使用HSE/HIS 配置》中有详细的讲解,这里我们暂时先了解下。所有的GPIO 都挂载到APB2 总线上,具体的时钟由APB2 外设时钟使能寄存器(RCC_ APB2ENR)来控制。

 

 3.2.软件

1. 使能GPIO 端口时钟;一定要开启时钟,移植代码的时候,这个是注意点
2. 初始化GPIO 目标引脚为推挽输出模式;
3. 编写简单测试程序,控制GPIO 引脚输出高、低电平。

//头文件
#include "stm32f10x.h"   // 包含寄存器的定义
#include "led.h"   //我们自己定义的头文件

// LED初始化函数
void LED_Init(void)
{	
	//1.打开控制GPIOB的时钟(APB2)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	//2.配置结构体	
	GPIO_InitTypeDef led_init;
	led_init.GPIO_Pin   = GPIO_Pin_0;      //GPIOB0引脚
	led_init.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出	
	led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz
	
	//3.对成员进行初始化
	GPIO_Init(GPIOB, &led_init);
}

就到测试文件里面了,测试文件主要是在main函数里面,先调用我们写的初始化函数,然后在while(1) 循环里面进行控制led状态即可。

至此,整个项目就开发完毕了,其他项目也可以参考这种开发思路,说白了就是,找到硬件,确定GPIO,开启相应的时钟,初始化寄存器,然后就到逻辑控制了。从这里看出,标准库开发,很简单,都是库背后帮我们做了什么事情我们要知道,这样才学到家,学的深一点,才可以更好的适应各种项目开发,这些是个人心得,希望可以对你有帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值