提前说说:
五月底了,得加紧学习进度了,想在六月底把32的基础知识部分学完并且基本掌握,感觉还是有点难度的。(一天在32上学习的时间大约是3~4h)。
跑马灯寄存器版
一开始接触寄存器的时候,不清楚寄存器是干什么用的。在学Arduino的时候,写代码控制io口依靠的就是digitalWrite和digitalRead函数,而并没有清楚这些函数是怎么调整io的模式,端口引脚还有输出速率。
刚开始学寄存器版本的时候其实我还是不清楚寄存器是干什么的,跑马灯实验学完之后,我才对寄存器有一个基本的概念:控制寄存器来实现底层的驱动。
同样,开始之前还得继续新建模板啥的,这里就略过了,上篇有一个大致的介绍。
那么就从led.h文件开始吧
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
上面代码是C语言的基础,这里就不做过多的解释,大体意思是led.h文件下包含LED_Init()函数
下来在led.c文件中输入代码
#include "stm32f10x.h"
#include "led.h"
void LED_Init(void)
{
RCC->APB2ENR|=1<<2; //使能A时钟
RCC->APB2ENR|=1<<5; //使能D时钟
GPIOA->CRH&=0xFFFFFFF0; //将A端口高位的第一位,即A8位先清除
GPIOA->CRH|=0x00000003; //将A8设置为推挽输出输出速率为50MHz
GPIOA->ODR|=1<<8; //拉高A8电平,先使其没有电压差
GPIOD->CRL&=0xFFFFF0FF; //将D端口高位的第一位,即D2位先清除
GPIOD->CRL|=0x00000300; //将D2设置为推挽输出输出速率为50MHz
GPIOD->ODR|=1<<2; //拉高D2电平,先使其没有电压差
}
接下来在USER文件下的main.c下输入代码:
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
int main(void)
{
delay_init();
LED_Init();
while(1)
{
GPIOA->ODR|=1<<8; //A8电平拉高
GPIOD->ODR|=1<<2; //D2电平拉高
delay_ms(500); //延迟500ms
GPIOA->ODR=~(1<<8); //A8电平拉低,产生电压差
GPIOD->ODR=~(1<<2); //D2电平拉低,产生电压差
delay_ms(500);
}
}
接下来就是编辑,上传给板子(具体方法前一节有),观察板子发现和预期的效果相同。