栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

寄存器操作的方法实现两个LED灯的交替闪烁

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

寄存器操作的方法实现两个LED灯的交替闪烁

目录

STM32标准固件库简介

代码以C语言开发

目录结构

页面配置

Proteus中仿真实现


STM32标准固件库简介

stm32f10x.h 这个头文件实现了片上外设的所以寄存器的映射,是一个非常重要的头文件,在内核中与之相对应的头文件是 core_cm3.h

system_stm32f10x.c 实现了 STM32 的时钟配置,操作的是片上 的 RCC 这个外设。系统在上电之后,首选先会执行由汇编编写的 启动文件,启动文件中的复位函数中调用的 SystemInit 函数就在 这个文件里面定义。调用完之后,系统的时钟就被初始化成 72M 。 如果后面我们需要重新配置系统时钟,我们就可以参考这个函数 重写。为了维持库的完整性,我们不会直接在这个文件里面修改 时钟配置函数。

stm32f10x_it.c 这个文件是专门用来编写中断服务函数的,在我 们修改前,这个文件已经定义了一些系统异常 ( 特殊中断 ) 的接口, 其它普通中断服务函数由我们自己添加。但是我们怎么知道这些中 断服务函的接口如何写?在学习中断和启动文件的时候会详细介 绍。

stm32f10x_conf.h 这个文件被包含进 stm32f10x.h 文件。当我们使 用固件库编程的时候,如果需要某个外设的驱动库,就需要包含该 外设的头文件: stm32f10x_ppp.h ,包含一个还好,如果是用了多外 设,就要包含多个头文件,这不仅影响代码美观也不好管理,现 我们用一个头文件 stm32f10x_conf.h 把这些外设头文件都包含在里面, 让这个配置头文件统一管理这些外设头文件,我们在应用程序中只 要包含这个配置头文件即可,我们又知道这个头文件在 stm32f10x.h的最后被包含,所以最终我们只需要包含 stm32f10x.h 这个头文件即 可,非常方便。默认情况下是所以头文件都被包含,没有被注释掉。

代码以C语言开发 delay_ms.c:
#include "stm32f10x.h" 
void delay_ms(uint32_t CntDwn) 
{ 
 for( ; CntDwn != 0; CntDwn--); 
}

delay_ms.h:

#ifndef __delay_ms_h 
#define __delay_ms_h 
#include "stm32f10x.h" 
void delay_ms(uint32_t CntDwn); 
#endif  

bsp_led.c:
#include "stm32f10x.h" 
#include "stm32f10x_gpio.h" 
#include "bsp_led.h" 
 
void LED_GPIO_Config(void) 
{ 
 GPIO_InitTypeDef GPIO_InitStructure; 
 
 RCC_APB2PeriphClockCmd(LED1_GPIO_CLK, ENABLE); 
 GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN; 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
 GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); 
 
 RCC_APB2PeriphClockCmd(LED2_GPIO_CLK, ENABLE); 
 GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN; 
 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure); 
 
 GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); 
 GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); 
}

bsp_led.h:

#ifndef __bsp_led_h 
#define __bsp_led_h 
 
#define LED1_GPIO_PORT GPIOB // GPIO Port B 
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB // GPIO Port CLK -- RCC's APB2ENR
#define LED1_GPIO_PIN GPIO_Pin_2 // PB2 
#define LED2_GPIO_PORT GPIOC // GPIO Port C 
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOC // GPIO Port CLK -- RCC's APB2ENR
#define LED2_GPIO_PIN GPIO_Pin_2 // PC2 
 
#define ON 0 
#define OFF 1 
 
#define LED1(d) if(d) 
 GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); 
 else 
 GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN) 
#define LED2(d) if(d) 
 GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); 
 else 
 GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PIN) 
 
 
void LED_GPIO_Config(void); 
#endif 

main.c:

#include "stm32f10x.h" 
#include "bsp_led.h" 
#include "delay_ms.h" 
int main(void) 
{ 
 LED_GPIO_Config(); 
 
 while(1) 
 { 
 LED1(ON); 
 LED2(OFF); 
 delay_ms(0x1FFFFF); 
 
 LED1(OFF); 
 LED2(ON); 
 delay_ms(0x1FFFFF); 
 } 
}

目录结构

页面配置

版本选择

XX.hex文件配置

 

等等。

Proteus中仿真实现

(1) D2闪,D3灭

 

 (2) D3闪,D2灭

 

喜欢,就点个赞吧!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/457052.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号