STM32日更 2nd
STM32日更 2nd
补充:
寄存器文档模板
- 首先创建两个新文件OBJ、USER
obj存放hex文件、编译产生的文件
user存放用户编写的main.c、STM32F4 启动文件、stm32f4xx.h
头文件。
2.GPIO工作模式
( 1 ) 输入模式(上拉、下拉、浮空)
( 2 ) 输出模式(推挽/ / 开漏、上拉/ / 下拉)
( 3 ) 复用功能(推挽/ / 开漏、上拉/ / 下拉)
( 4 ) 模拟输入输出(上下拉无影响)
解释说明:
( 1 )上下拉电阻作用,开启上拉电阻,引脚默认高电平;反之,默认低电平。
( 2 )推挽:由P-MOS 和 N-MOS 管组成(将 P-MOS 当作NPN三极管,N-MOS当作 PNP 三极管),输入一个高电平时,P-MOS 管导通,N-MOS 管截止 ;反之相反。
两个 MOS 管将轮流导通,一个负责灌电流(电流输出到负载),一个负责拉电流(负载电流流向芯片),使其负载能力和开关速度都比普通的方式有很大的提高。
( 3 )开漏:不论输入是高低电平,P-MOS 管总处于关闭状态。输入低电平时,N-MOS 管导通,输出低电平。当输入高电平时,N-MOS 管截止,为高阻态。
想让引脚输出高电平,引脚须接上拉电阻,通常选择内部上拉模式后再外接一个 10K 上拉电阻。
特性,引脚具有“线与”关系。当多个开漏输出模式的引脚接在一起,有一个引脚为低电平,所有管脚都为低。只有当所有引脚输出高阻态时,才由上拉电阻的 VDD 决定。VDD 连几V,输出就是几V。前提是这个 STM32 引脚是容忍 这个V数的。
主要应用在输出电平为 0-3.3V 而且需要高速切换开关状态的场合。除此之外,我们一般选择推挽输出模式。
正文
- STM32 固件库
主要是库帮助文档使用,简直不要太方便,学stm32必备,哪个外设函数不白,ctrl+f搜索即可。 - 库函数模板创建
与寄存器模板相同要添加obj、user文件,新增libraries文件,包含CMSIS 和 STM32F4xx_StdPeriph_Driver(外设驱动文件inr、src),在固件库中可以找到,最后新建项目放到根目录即可(这里我们命名为 Template)
图中还有APP(用来自建外设函数,像led.c、led.h)
user下要包含这些文件
文末会有库函数模板 - 库函数工程建立
1)首先要和上述文件建立联系
建立好是这样的
2)接着要配置魔术棒选项卡
这个厉害了,控制输出hex文件
3)Listing 选项卡中把输出文件夹也定位到我们工程目录下的 Obj 文件夹,就是存放存放hex文件、编译产生的文件
4)C/C++选项卡配置(配置宏)
STM32F40_41xxx,USE_STDPERIPH_DRIVER
5)很重要的一步,配置路径,把含.h的
都配置进来
4. 库函数点灯
重点利用32固件库手册,把不懂的函数看明白
5. STM32 时钟系统
看懂时钟树
附带思维导图解析
会利用PLL计算公式,算系统时钟
注意:我参考的普中stm32f4开发攻略V2.0学习,该部分函数写错了改为如下。
比如我们设置 HSE 作为系统时钟源,那么调用的函数就是:
RCC_SYSCLKConfig ( RCC_SYSCLKSource_HSE )
原理是CFGR 寄存器最低两位控制选谁当系统时钟源
用哪个外设使能哪个时钟
比如 GPIO 外设它是挂接在 AHB1 总线上的,RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能GPIOF端口
(通过查看32中文手册的2.3 存储器映射查看某外设挂在哪个总线上)
6.keil使用中遇到的错误和解决方案
用keil4编译提示 warning: #1-D: last line of file ends without a newline最后行回车不管用
解决办法:最后一行回车后还要保证是在第一列,新一行不能有空格等空字符才能不出此警告
.\Obj\Template.axf: Error: L6218E: Undefined symbol SysTick_CLKSourceConfig (referred from systick.o).
undefined symbol 意思是未定义的符号,符号是指函数或变量.你要检查一下你是否定义了相关名称的函数.或者是函数所在的文件没有正确加入到工程当中,该函数在misc.h中,路径中已经包含。说明只剩下要调用的.h文件,没包含misc.c文件
出现Target not created,原因主要有:
编译时出错,语法错误,变量未定义。
连接时出错,调用外部函数,而由缺少相应的OBJ文件。
其他原因,用Demo版,限制是程序不能大于4K,结果你超过了4k。
Target not created:意思就是编译没有成功。这是因为程序中有错误。
7.测量小灯泡用多大电阻:用高电平电压减去发光二极管压降(一般是1.8V左右)除以0.005就等于电阻值,单位是欧姆。
正向工作电流控制在5~10mA
引脚长的是正极,接电源的正极。
6. stm32位带操作,主要控制GPIO输入输出,置位,使用起来很方便,原理是寄存器映射
#define led1 PFout(9) //D1 指示灯连接的是 PF9 管脚
#define led2 PFout(10) //D2 指示灯连接的是 PF10 管脚
直接就可以使用 led1=1 来表示,这就和 51 单片机管脚操作方法一样。
7. SysTick 系统定时器实现精确延时
SysTick 定时器寄存器很简单,只有 4 个,分别是 CTRL、LOAD、VAL、CALIB。这些寄存器都可以在《STM32F3与 F4 系列 Cortex M4 内核编程手册》 4.5 SysTick timer (STK)章节或者库函数 core_cm4.h 文件中找到,里面有详细的介绍。
配置好后delay_ms(500); //精确延时 500ms
8. 蜂鸣器实验
根据 STM32F407 芯片数据手册可知,单个 IO 口的最大输出电流是 25mA,而蜂鸣器的驱动电流是 30mA 左右,整个芯片的输出电流最大也就 150mA,所以用三极管把它放大在驱动,也就是常说的STM32 芯片是用来做控制的,而不是驱动。
引脚输出低电平时,PNP 三极管导通,蜂鸣器发声;当 PF8 引脚输出高电平时,PNP 三极管截止,蜂鸣器停止发声。