STM32模块化编程指南
以延迟函数控制LED灯闪烁(按下key1按键,延迟时间增加闪烁变慢,按下key2按键,延迟时间减短闪烁变快)为原始代码创建 stm32模块化。
1.为什么创建模块化编程?
当代码非常简单的时候,我们一般直接把所有的代码都写在main.c里面。
当代码的功能比较多的时候,如果全部写在main.c,会比较混乱,修改起来也比较麻烦。
而创建模块化编程,可以把相同的功能进行分类整理,使其更加简洁明了。
2.模块化编程思想
模块化是一种设计思想,利用模块化可以把一个非常复杂的系统结构细化到具体的功能点,每个功能点看做一个模块,然后通过某种规则把这些小的模块组合到一起,构成模块化系统。
3.程序模块
一个程序工程包含多个源文件,每个 .c 文件可以被称为一个模块,每一个模块都有其各自的功能,而每一个.h文件则是声明该模块
目录
一、创建.c源文件和.h头文件。
1.创建所需的.c和.h文件。
二、在程序中添加.c源文件
1.依次添加所创建的3个.c文件
2.在.c和.h中写入程序
(1).c源文件
(2).h头文件
三、完善模块化
1.在源文件中写入相应函数,并且在头文件中声明。
(1)延迟函数
(2)按键的外部中断
(3)控制LED灯的亮灭
四、主函数
1.在main.c中引用所需的.h头文件
2.main.c的全部代码
一、创建.c源文件和.h头文件。
1.创建所需的.c和.h文件。
首先我们需要打开程序所在的文件位置,然后双击进入User文件夹 创建所需的文件。
这里需要创建delay.c delay.h、led.c led.h、key.c key.h等六个文本文件。
二、在程序中添加.c源文件
1.依次添加所创建的3个.c文件
在manage project ltems中,选择USER后单击Add Files依次添加所创建的.c文件
2.在.c和.h中写入程序
双击delay.c,在delay.c中写入#include "delay.h",将光标定在"delay.h"中右键单击Open document "delay.h"前往"delay.h",入写#ifndef _DELAY_H_ #define _DELAY_H_ #endif
(1).c源文件
#include " .h"
(2).h头文件
#ifndef _ _H_
#define _ _H_
#endif
在led.c、key.c中进行相同操作
三、完善模块化
1.在源文件中写入相应函数,并且在头文件中声明。
(1)延迟函数
delay.c
#include "delay.h"
__IO uint32_t TimingDelay =0;
//每10us执行一次
void TimingDelay_Decrement()
{
if(TimingDelay!=0)
TimingDelay--;
}
//延迟微秒函数
void Delay_10us(__IO uint32_t value)
{
TimingDelay = value;
while(TimingDelay!=0);
}
//延迟毫秒函数
void Delay_ms(__IO uint32_t value)
{
Delay_10us(value*100);
}
void Delay_init(void)
{
//配置systick定时器每10us
SysTick_Config(SystemCoreClock /100000);
}
delay.h
#ifndef _DELAY_H_
#define _DELAY_H_
#include "stm32F4xx.h"
void Delay_init(void);
void Delay_10us(__IO uint32_t value);
void Delay_ms(__IO uint32_t value);
#endif
(2)按键的外部中断
key.c
#include "key.h"
void key1_init()
{
GPIO_InitTypeDef gpio_info;
EXTI_InitTypeDef exti_info;
NVIC_InitTypeDef NVIC_InitStructure;
//PA0
//初始化GPIOA的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
//初始化中断时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
//配置按键
gpio_info.GPIO_Mode = GPIO_Mode_IN;
gpio_info.GPIO_OType = GPIO_OType_PP;
gpio_info.GPIO_Pin = GPIO_Pin_0;
gpio_info.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio_info.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOA,&gpio_info);
//配置按键的外部中断
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
exti_info.EXTI_Line = EXTI_Line0;
exti_info.EXTI_LineCmd = ENABLE;
exti_info.EXTI_Mode = EXTI_Mode_Interrupt;
exti_info.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&exti_info);
//配置这个外部中断的优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //PA0 对应的是EXTI0_IRQn
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);
}
void key2_init()
{
GPIO_InitTypeDef gpio_info;
EXTI_InitTypeDef exti_info;
NVIC_InitTypeDef NVIC_InitStructure;
//PC13
//初始化GPIOA的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
//初始化中断时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
//配置按键
gpio_info.GPIO_Mode = GPIO_Mode_IN;
gpio_info.GPIO_OType = GPIO_OType_PP;
gpio_info.GPIO_Pin = GPIO_Pin_13;
gpio_info.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio_info.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOC,&gpio_info);
//配置按键的外部中断
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource13);
exti_info.EXTI_Line = EXTI_Line13;
exti_info.EXTI_LineCmd = ENABLE;
exti_info.EXTI_Mode = EXTI_Mode_Interrupt;
exti_info.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&exti_info);
//配置这个外部中断的优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //PA0 对应的是EXTI0_IRQn
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
}
key.h
#ifndef _KEY_H_
#define _KEY_H_
#include "stm32F4xx.h"
void key1_init();
void key2_init();
#endif
(3)控制LED灯的亮灭
led.c
#include "led.h"
void LED_init(void)
{
GPIO_InitTypeDef gpio_info;
//PH0
//初始化GPIOH时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
gpio_info.GPIO_Mode = GPIO_Mode_OUT;
gpio_info.GPIO_OType = GPIO_OType_PP;
gpio_info.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
gpio_info.GPIO_Speed = GPIO_Low_Speed;
GPIO_Init(GPIOH,&gpio_info);
}
void LED_Red_Ctrl(uint8_t state)//红 控制//
{
if(state == 1)//1表示开灯
{
GPIO_ResetBits(GPIOH,LED_RED);//点亮红灯
}
else//其他表示关闭红灯
{
GPIO_SetBits(GPIOH,LED_RED);
}
}
void LED_Green_Ctrl(uint8_t state)//绿 控制//
{
if(state == 1)
{
GPIO_ResetBits(GPIOH,LED_BIUE);
}
else
{
GPIO_SetBits(GPIOH,LED_BIUE);
}
}
void LED_Blue_Ctrl(uint8_t state)//蓝 控制//
{
if(state == 1)
{
GPIO_ResetBits(GPIOH,LED_GREEN);
}
else
{
GPIO_SetBits(GPIOH,LED_GREEN);
}
}
led.h
#ifndef _LED_H_
#define _LED_H_
#include "stm32F4xx.h"
#define LED_RED GPIO_Pin_10//红
#define LED_GREEN GPIO_Pin_11//绿
#define LED_BIUE GPIO_Pin_12//蓝
#define LED_ON 1
#define LED_OFF 0
//初始化LED灯
void LED_init(void);
void LED_Red_Ctrl(uint8_t state);//红
void LED_Green_Ctrl(uint8_t state);//绿
void LED_Blue_Ctrl(uint8_t state);//蓝
#endif
模块化编程完成!
四、主函数
1.在main.c中引用所需的.h头文件
#include "stm32F4xx.h"
#include "stm32f4xx_conf.h"
#include "stdio.h"
#include "led.h"
#include "key.h"
#include "delay.h"
2.main.c的全部代码
#include "stm32F4xx.h"
#include "stm32f4xx_conf.h"
#include "stdio.h"
#include "led.h"
#include "key.h"
#include "delay.h"
int couter = 0;
uint8_t key1;
uint8_t key2;
uint32_t delay_time =10000;
//编写中断服务函数 key1
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)//证明
{
//100ms = 100 000us
delay_time+=10000;
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
//编写中断服务函数 key2
void EXTI15_10_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET)//证明
{
delay_time-=10000;
EXTI_ClearITPendingBit(EXTI_Line13);
}
}
int main(void)
{
LED_init();
key1_init();
key2_init();
Delay_init();
//关闭3个灯
LED_Red_Ctrl(LED_OFF); //关
LED_Blue_Ctrl(LED_OFF);//关
LED_Green_Ctrl(LED_OFF);//关
while(1)
{
//红灯
LED_Red_Ctrl(LED_ON); //开
LED_Blue_Ctrl(LED_OFF);//关
LED_Green_Ctrl(LED_OFF);//关
Delay_10us(delay_time); //延迟
//蓝灯
LED_Blue_Ctrl(LED_ON);
LED_Red_Ctrl(LED_OFF);
LED_Green_Ctrl(LED_OFF);
Delay_10us(delay_time);
//绿灯
LED_Green_Ctrl(LED_ON);
LED_Red_Ctrl(LED_OFF);
LED_Blue_Ctrl(LED_OFF);
Delay_10us(delay_time);
}
}
以上是以延迟函数控制LED灯闪烁为原始代码创建 stm32模块化编程。
作者:hnt墨洋kgym