赞
踩
今天呢,是stm32程序开发的第一个程序。因为之前设计的stm32单片机最小系统板还在进行焊接工作,所以暂时先用现有的stm32最小系统板来进行程序的开发。
手中使用的是小马哥研制的stm32最小系统和DAP Link下载器。
从原理图中可以看到控制LED灯的引脚是PC13引脚,当控制单片机PC13引脚输出低电平的时候,小灯会点亮。当控制单片机PC13引脚输出高电平的时候,小灯会熄灭。
关键程序如下图所示(库函数版本)。
main.c文件的内容如下。
#include "stm32f10x.h"
#include "led.h"
//粗略延时
void delay(uint32_t timers)
{
uint16_t i=0,j=0;
for(i = 0;i<timers;i++)
{
for(j =0;j<65535;j++);
}
}
int main(void)
{
LED_Init();
while(1)
{
LED_ON();
delay(100);
LED_OFF();
delay(100);
}
}
led.c文件的内容如下。
#include "stm32f10x.h"
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
void LED_ON(void)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}
void LED_OFF(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
led.h文件的内容如下。
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED_ON(void);
void LED_OFF(void);
#endif
可以看出库函数版本很简单的。你可以暂且把他当作一个模板。如果想要控制其他引脚,只需要修改一小部分内容即可。
如果是想要更深入的了解stm32的内部寄存器的操作,就请看下面的寄存器版本吧。
首先需要了解的是APB2 外设时钟使能寄存器(RCC_APB2ENR)
。
因为我们要控制PC13引脚,也可以理解为需要打开其对应的时钟。我们使用下面的代码来实现在APB2 外设时钟使能寄存器中令IOPCEN
这一位置为1。
RCC->APB2ENR |= (uint32_t)0x00000010;
后面的好理解,但是前面的RCC->APB2ENR
这个是什么东东嘞。我查找了一下RCC的定义。然后我就一点点的包起来"洋葱"。
这时候呢,出现了一个(RCC_TypeDef *)
。可以看出RCC_TypeDef是一个结构体变量,如果在后面加一个小星,也就成为了结构体指针了。RCC_BASE 可以运算出等于0x40021000。
此外,在手册中也有表明0x40021000主要负责外设:复位和时钟控制。
综上所示,#define RCC ((RCC_TypeDef *) RCC_BASE)
,可以改为#define RCC ((RCC_TypeDef *) 0x40021000)
RCC变量这里指的是(RCC_TypeDef *) 0x40021000
,是结构体指针类型的。
RCC->APB2ENR可以理解为直接对内存中的APB2ENR的寄存器进行操作。
运行语句前。
运行语句后。
当芯片的时钟配置好之后,需要配置引脚的具体的功能。比如:是输入还是输出,如果是输出频率是多大等等。从下图中,我看我们可以看到如果想控制PC13引脚,那只需要修改其中的20、21、22、23位即可。我们可以使用下面的语句实现。这时候你会发现我这里做了一步清零的操作,这个是非常重要的。有知道的小伙伴可以把答案打在评论区。
GPIOC->CRH &= (uint32_t)0xFF0FFFFF;//使用前清零
GPIOC->CRH |= (uint32_t)0x00300000;//配置PC13为推挽输出,最大速度50MHz
当我们引脚的具体功能设置完成后,下面只需要操作寄存器控制引脚输出高低电平即可。我们可以用下面的代码来实现PC13引脚输出高电平。
GPIOC->BSRR = (uint32_t)0x00002000;//PC13引脚输出高电平
之后,我们可以用下面的代码来实现PC13引脚输出低电平。
GPIOC->BRR = (uint16_t)0x2000; //PC13引脚输出低电平
具体的参考代码如下。
#include "stm32f10x.h"
//粗略延时
void delay(uint32_t timers)
{
uint16_t i=0,j=0;
for(i = 0;i<timers;i++)
{
for(j =0;j<65535;j++);
}
}
int main(void)
{
RCC->APB2ENR |= (uint32_t)0x00000010;//打开GPIOC时钟
GPIOC->CRH &= (uint32_t)0xFF0FFFFF;//使用前清零
GPIOC->CRH |= (uint32_t)0x00300000;//配置PC13为推挽输出,最大速度50MHz
while(1)
{
GPIOC->BSRR = (uint32_t)0x00002000;//PC13引脚输出高电平
delay(100);
GPIOC->BRR = (uint16_t)0x2000; //PC13引脚输出低电平
delay(100);
}
}
芯片的GPIO的特点。
下图主要介绍了控制GPIO使用的寄存器,以及GPIO端口模式介绍。
下图是GPIO口的基本结构。
下图是输入浮空、输入上拉、输入下拉。
下图是输出模式。
下图是复用模式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。