
1. 硬件原理图

要点亮这几个LED灯,对应引脚都需要输出低电平
2. 软件设计
2.1 新增驱动文件


新建LED驱动的头文件和源文件,
注:此处将LED的两个文件新建在了工程的User文件夹中,就不用再包含头文件了;如果在User文件夹下再建了一个文件夹,将LED的驱动文件放在其中,那需要在keil中新增头文件的包含路径。


2.2 驱动文件的实现
在驱动文件中肯定会用到GPIOA、GPIOB等宏定义,所以需要包含“stm32f4xx.h”文件,这个文件中包含寄存器映射等定义

外设的初始化配置
1. 开GPIO的时钟
2. 定义一个GPIO的初始化结构体
3. 配置GPIO初始化结构体成员
4. 调用GPIO初始化函数,把配置好的结构体成员的参数写入寄存器
2.2.1 开启时钟
需开启GPIOF和GPIOC的时钟,查手册,这两个外设位于AHB1总线上


每个函数都可以在.c文件中查看定义、函数形参的可取的值,如下示例:
/**
* @brief Enables or disables the AHB1 peripheral clock.
* @note After reset, the peripheral clock (used for registers read/write access)
* is disabled and the application software has to enable this clock before
* using it.
* @param RCC_AHBPeriph: specifies the AHB1 peripheral to gates its clock.
* This parameter can be any combination of the following values:
* @arg RCC_AHB1Periph_GPIOA: GPIOA clock
* @arg RCC_AHB1Periph_GPIOB: GPIOB clock
* @arg RCC_AHB1Periph_GPIOC: GPIOC clock
* @arg RCC_AHB1Periph_GPIOD: GPIOD clock
* @arg RCC_AHB1Periph_GPIOE: GPIOE clock
* @arg RCC_AHB1Periph_GPIOF: GPIOF clock
* @arg RCC_AHB1Periph_GPIOG: GPIOG clock
* @arg RCC_AHB1Periph_GPIOG: GPIOG clock
* @arg RCC_AHB1Periph_GPIOI: GPIOI clock
* @arg RCC_AHB1Periph_GPIOJ: GPIOJ clock (STM32F42xxx/43xxx devices)
* @arg RCC_AHB1Periph_GPIOK: GPIOK clock (STM32F42xxx/43xxx devices)
* @arg RCC_AHB1Periph_CRC: CRC clock
* @arg RCC_AHB1Periph_BKPSRAM: BKPSRAM interface clock
* @arg RCC_AHB1Periph_CCMDATARAMEN CCM data RAM interface clock
* @arg RCC_AHB1Periph_DMA1: DMA1 clock
* @arg RCC_AHB1Periph_DMA2: DMA2 clock
* @arg RCC_AHB1Periph_DMA2D: DMA2D clock (STM32F429xx/439xx devices)
* @arg RCC_AHB1Periph_ETH_MAC: Ethernet MAC clock
* @arg RCC_AHB1Periph_ETH_MAC_Tx: Ethernet Transmission clock
* @arg RCC_AHB1Periph_ETH_MAC_Rx: Ethernet Reception clock
* @arg RCC_AHB1Periph_ETH_MAC_PTP: Ethernet PTP clock
* @arg RCC_AHB1Periph_OTG_HS: USB OTG HS clock
* @arg RCC_AHB1Periph_OTG_HS_ULPI: USB OTG HS ULPI clock
* @param NewState: new state of the specified peripheral clock.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->AHB1ENR |= RCC_AHB1Periph;
}
else
{
RCC->AHB1ENR &= ~RCC_AHB1Periph;
}
}
//1.开启时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
2.2.2 定义初始化结构体

注释中写明了参数可取的枚举值
//2.定义初始化结构体
GPIO_InitTypeDef GPIO_InitStruct;
2.2.3 配置GPIO初始化结构体成员
//3.配置GPIO初始化结构体成员
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//配置为上拉模式
2.2.4 调用GPIO初始化函数
//4.GPIO初始化函数
GPIO_Init(GPIOF,&GPIO_InitStruct);
注:此时完成初始化后,端口被配置为上拉、推挽输出模式;查手册可知,当上电复位后,ODR(输出数据寄存器)默认多为 0,所以引脚默认会输出低电平,只调用此函数的话,灯会被点亮。
内部上拉主要影响输入态/高阻态时电平;一旦推挽输出开始驱动,输出电平(尤其是低电平)会覆盖上拉效果。
3. 主函数的实现
#include "stm32f4xx.h"
#include "led.h"
void delay(uint32_t count);
int main(void)
{
LED_Config();
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_6);
delay(0xFFFFFF);
GPIO_ResetBits(GPIOF,GPIO_Pin_6);
delay(0xFFFFFF);
}
}
void delay(uint32_t count)//软件延时
{
for(;count>0;count–);
}
4. 标准库补充知识
4.1 系统初始化,时钟配置

4.2 断言




“断言(assert)”你可以把它理解成:程序员在代码里写的“我要求这里必须满足某个条件,否则立刻报错” 的检查。
-
断言 = 调试期的参数/逻辑检查
-
条件不满足就进入 assert_failed 让你快速定位错误
-
不想要开销就关闭(不定义 USE_FULL_ASSERT),它就啥也不做
网硕互联帮助中心







评论前必须登录!
注册