今日学习内容:
1、寄存器编程,查询参考手册以及原理图;
2、使用寄存器点亮LED灯;
3、使用魔术棒配置编译器。
学习笔记:
1、了解新建Project的过程,需要自己建一个Output的文件,包含有:
a、main.c/stm32f4xx.h/startup_stm32f429_439xx.s(这个是启动文件);
关于启动文件了解到如下内容即可:
1、我们需要在外部定义一个 SystemInit函数设置 STM32 的时钟;
2、STM32 上电后,会执行 SystemInit 函数;当我们不配置系统时时(用一个空的SystemInit 函数骗过程序), STM32 会把 HSI 当作系统时钟, HSI=8M,由芯片内部的振荡器提供。
3、最后执行我们 C 语言中的 main 函数。
b、同时需要更改编译器为AC5;(有可能是因为原来的库还是这个编译器写的)
c、随后进行一些配置选项卡的过程(比如生成的.hex和.axf文件是烧录的)。
2、寄存器映射?
点亮LED灯需要用到三个寄存器,通过原理手册可以查出:
a、GPIOH_ORD寄存器,用于输出控制引脚的电平;
在输出模式时,对端口位设置/清除寄存器 BSRR 寄存器、端口位清除寄存器 BRR 和ODR 寄存器写入参数即可控制引脚的电平状态,其中操作 BSRR 和 BRR 最终影响的都是ODR 寄存器,然后再通过ODR 寄存器的输出来控制 GPIO。
b、GPIOH_MODER寄存器,由于GPIO复位模式默认是输入的,现在要输出改为01模式;
c、RCC_AHB1ENR需要打开时钟;
由于 STM32 的 外设很多,为了降低功耗,每个外设都对应着一个时钟,在芯片刚上电的时候这些时钟都是被关闭的,如果想要外设工作,必须把相应的时钟打开。STM32 的所有外设的时钟由一个专门的外设来管理,叫 RCC(reset and clockcontrol)
本人在写映射的时候犯的错误,对于地址没有搞清楚,特此写出来以后引以为戒(学会用debug模式查看外设寄存器,来寻找问题是怎么出现的):
/*
stm32f4xx.h 文件
头文件用于存放寄存器映射代码
在2.3存储器映射找
*/
/*错误代码
#define GPIOH *(unsigned int *)(0x40021C00)
#define RCC *(unsigned int *)(0x40023800)
*/
#define GPIOH (0x40021C00)
#define RCC (0x40023800)
/*GPIO复位模式默认是输入的,现在要输出改为01模式*/
#define GPIOH_MODER *(unsigned int *)(GPIOH+0x00)
#define GPIOH_ODR *(unsigned int *)(GPIOH+0x14)
#define RCC_AHB1ENR *(unsigned int *)(RCC+0x30)
/*用于学习如何新建工程文件*/
#include "stm32f4xx.h"
void LED_delay( unsigned int time)
{
//粗延时 看晶振速度
for(;time !=0;time--);
}
int main(void)
{
/*打开时钟*/
RCC_AHB1ENR |=(1<<7);
/*第20/21位置01*/
GPIOH_MODER |=(1<<(2*10));
/*第10位置0*/
GPIOH_ODR &=~(1<<10);
while(1)
{
GPIOH_ODR &=~(1<<10);
LED_delay(0xEFFFF);
GPIOH_ODR |=(1<<10);
LED_delay(0xEFFFF);
}
}
void SystemInit(void)
{
}
遇到的问题:
1、debug调试的时候,Peripheral无法查看外设寄存器?
跟教程学习的时候发现无法查看外设寄存器,个人觉得是新版本的问题,参考下面的博客进行解决。
keil无法查看外设寄存器(生成SFR文件)_keil arm5.39 调试时 不能显示寄存器-CSDN博客
Keil MDK 5.14Debug仿真时System Viewer菜单显示空白和Peripherals菜单无外设寄存器的解决办法_debug adapter中的unit空白-CSDN博客
参考: