前言:根据正点原子战舰V3板上资源和光盘资源进行学习。(内容来自第13、14、15讲,前面的内容略过,会在以后的内容中体现)
代码逻辑流程:
使能IO口时钟
初始化IO口模式
//主要介绍寄存器版本的流程,最后附上库函数版本和位操作版本的代码
事先准备
1.复制A盘-4.程序源码-标准历程 寄存器版本
2.打开上述文件-USER-keil工程文件-右键文件夹名字-manage project items-Groups中添加“HARDWARE”
3.在‘1’中文件中新建文件夹“HARDWARE”
4.KEIL中新建两个文件为“LED.c”“LED.h”,保存至“HARDWARE”文件夹
5.通过manage将.c添加至HARDWARE,通过魔术棒 - C/C++ - “include path”- 将.h添加到路径中
初始化要用到的两个端口的计时器
B和E,通过“A盘” - “STM32参考资料” - “STM32中文参考手册” - 6.3.7查看外设时钟使能寄存器:
扫描二维码关注公众号,回复:
9824193 查看本文章
![](/qrcode.jpg)
RCC->APB2ENR |= 1 << 3;
RCC->APB2ENR |= 1 << 6;
RCC为32的时钟控制器,APB2ENR为外设时钟使能寄存器
配置GPIO寄存器
//GPIOB.5
GPIOB->CRL &= 0xFF0FFFFF; //AND
GPIOB->CRL |= 0x00300000; //OR
GPIOB->ODR |= 1<<5;
//GPIOE.5
GPIOE->CRL &= 0xFF0FFFFF; //AND
GPIOE->CRL |= 0x00300000; //OR
GPIOE->ODR |= 1<<5;
CRL为端口配置低寄存器,每一个hex表示一个寄存器,ODR为端口输出数据寄存器,将第五位置一为初始化,B5E5在硬件上连接了两个灯,低电平有效。
烧录,正常
附上寄存器版本全部代码
//led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void){
RCC->APB2ENR |= 1 << 3;
RCC->APB2ENR |= 1 << 6;
//GPIOB.5
GPIOB->CRL &= 0xFF0FFFFF; //AND
GPIOB->CRL |= 0x00300000; //OR
GPIOB->ODR |= 1<<5;
//GPIOE.5
GPIOE->CRL &= 0xFF0FFFFF; //AND
GPIOE->CRL |= 0x00300000; //OR
GPIOE->ODR |= 1<<5;
}
//led.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
//main.c
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
int main()
{
delay_init();
LED_Init();
while(1){
GPIOB->ODR |= 1<<5;
GPIOE->ODR |= 1<<5;
delay_ms(500);
GPIOB->ODR = ~(1<<5);
GPIOE->ODR = ~(1<<5);
delay_ms(500);
}
}
位操作实现main代码如下
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
int main(void)
{
delay_init();
LED_Init();
while(1){
PBout(5) = 1;
PEout(5) = 0;
delay_ms(500);
PBout(5) = 0;
PEout(5) = 1;
delay_ms(500);
}
}
库函数版本如下
//led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_5);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE, GPIO_Pin_5);
}
//main.c
#include"stm32f10x.h"
#include"led.h"
#include"delay.h"
int main(void)
{
delay_init();
LED_Init();
while(1){
GPIO_SetBits(GPIOB, GPIO_Pin_5);
GPIO_SetBits(GPIOE, GPIO_Pin_5);
delay_ms(500);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
GPIO_ResetBits(GPIOE, GPIO_Pin_5);
delay_ms(500);
}
}
我们看到库函数版本的初始化函数内容很多,每个口有六条语句,分别为:
0.初始化GPIO口结构体;1.设置时钟使能;2.设置输出模式;3.设置输出口;4.设置输出速度;5.将1~4中设置的参数初始化到GPIO口中;6.通过setbits函数,将指定的口置一。