STM32
直播中

zhongnian

9年用户 1453经验值
擅长:MEMS/传感技术
私信 关注
[问答]

如何利用STM32F103RCT6实现LED灯的闪烁?

如何利用STM32F103RCT6实现LED灯的闪烁?

回帖(2)

钱敏

2021-11-26 16:13:34
原理:

注意:这里使用迷你版,其他版本IO口设置不同,详细请查询原理图





由图可知:LED0是PA8,LED1是PD2,且都是共阳极,高电平灭,低电平亮
所以只需要控制这两个IO口的电平就能实现LED灯的闪烁了。
GPIO口设置前要先进行时钟的使能!!!
(外设,包括GPIO使用前都要先使能相应的时钟!!)
同时设置为推挽输出(可以准确输出高低电平)
还要设置输出速度。

由于STM32都是使用相应的底层,所以要记住以下几个函数:


1个初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);


2个读取输入电平函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);


2个读取输出电平函数
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);


4个设置输出电平函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);


主要代码:
main.c


******************************************************************************
* 文件名:LED灯
* 描  述:L1,L2每隔500ms闪烁一次
* 作  者:思索与猫
* 日  期: 19/4/1
* 备  注:
*         
******************************************************************************
#include "stm32f10x.h"                  // Device header
#include "led.h"
#include "delay.h"


int main()
{
                delay_init();        //延时函数初始化
                LED_Init();                     //LED灯初始化
                while(1)
                {
                                GPIO_SetBits(GPIOA,GPIO_Pin_8);      //PA8,PD2高电平,L0,L1灭
                                GPIO_SetBits(GPIOD,GPIO_Pin_2);
//下方代码为更简单的对位操作IO口,实现LED灯亮灭
//                                PAout(8) = 1;   
//                                PDout(2) = 1;


                                delay_ms(500);                                             //延时500ms
                                GPIO_ResetBits(GPIOA,GPIO_Pin_8);    //PA8,PD2低电平,L0,L1亮
                                GPIO_ResetBits(GPIOD,GPIO_Pin_2);
//                                PAout(8) = 0;
//                                PDout(2) = 0;


                                delay_ms(500);
                }
}


led.h


#ifndef __LED_H
#define __LED_H


void LED_Init(void);


#endif


led.c


#include
#include


void LED_Init()
{
                GPIO_InitTypeDef GPIO_InitStructure;          //定义一个结构体
               
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);       
                //PA,PD时钟使能,这里使用了或运算
               


                //定义PA8 GPIO口设置
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;         //设置引脚
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速度
                GPIO_Init(GPIOA,&GPIO_InitStructure);                     //初始化GPIO口
                GPIO_SetBits(GPIOA,GPIO_Pin_8);                   //PA8输出高电平,L0灭
       
               
                //定义PD2 GPIO口设置
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                   //设置引脚
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速度
                GPIO_Init(GPIOD,&GPIO_InitStructure);                           //初始化GPIO口
                GPIO_SetBits(GPIOD,GPIO_Pin_2);                                          //PD2输出高电平,L1灭
}
举报

jinyi7016

2021-11-29 09:49:59
根据电路上的LED接法,IO口电平变化,LED亮灭变化
但一定要有延时时间,否则眼睛看不出来
举报

更多回帖

发帖
×
20
完善资料,
赚取积分