寄存器版本的跑马灯操作流程(战舰开发板V3)
跑马灯需要配置的IO口
PB5&PE5两个IO口。
需要配置的寄存器
RCC_APB2ENR外设时钟使能寄存器
GPIOx_CRL端口配置低寄存器
ODR端口输出寄存器
BSRR端口位设置/清除寄存器
BRR端口位清除寄存器
IO口寄存器说明
配置IO口的流程
Led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void) // LED初始化函数体定义
{
RCC->APB2ENR|=1<<3; // 使能时钟
RCC->APB2ENR|=1<<6; // 使能时钟
//GPIOB.5
GPIOB->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_MODE5); // 对相应的位进行清零操作
GPIOB->CRL |= GPIO_CRL_MODE5; // 配置IO口模式
GPIOB->BSRR |= GPIO_BSRR_BS5; // 配置IO口初始状态
//GPIOE.5
GPIOE->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_MODE5); // 对相应的位进行清零操作
GPIOE->CRL |= GPIO_CRL_MODE5; // 配置IO口模式
GPIOE->BSRR |= GPIO_BSRR_BS5; // 配置IO口初始状态
}
Led.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void); // 在头文件中声明LED初始化函数
#endif
Main.c
#include "delay.h"
#include "stm32f10x.h"
#include "led.h"
int main(void)
{
delay_init(); // 延迟函数初始化
LED_Init(); // LED初始化
while(1)
{
GPIOB->BSRR |= GPIO_BSRR_BS5; // 对PB5进行置1操作
GPIOE->ODR |= GPIO_BSRR_BS5; // 对PE5进行置1操作
delay_ms(500);
GPIOB->BRR &= ~GPIO_BRR_BR5; // 对PB5进行置0操作
GPIOE->BRR &= ~GPIO_BRR_BR5; // 对PE5进行置0操作
delay_ms(500);
}
}
为什么对寄存器操作会是这种格式?(以RCC为例)
RCC为何为指针?
RCC是什么类型的指针?
我们看到RCC本身就是个指针格式,指针类型为“RCC_TypeDef *”类型,那我们再看看“RCC_TypeDef”类型的结构体中的成员是什么:
我们可以看到RCC指针所指向的结构体类型有以下成员:
typedef struct
{
__IO uint32_t CR;
__IO uint32_t CFGR;
__IO uint32_t CIR;
__IO uint32_t APB2RSTR;
__IO uint32_t APB1RSTR;
__IO uint32_t AHBENR;
__IO uint32_t APB2ENR;
__IO uint32_t APB1ENR;
__IO uint32_t BDCR;
__IO uint32_t CSR;
#ifdef STM32F10X_CL
__IO uint32_t AHBRSTR;
__IO uint32_t CFGR2;
#endif /* STM32F10X_CL */
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
uint32_t RESERVED0;
__IO uint32_t CFGR2;
#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */
} RCC_TypeDef;
因此才有了我们程序中的代码的:
RCC->APB2ENR|=1<<3; // 使能时钟
RCC->APB2ENR|=1<<6; // 使能时钟
这种形式的写法。
IO口配置的几种形式
#include "delay.h"
#include "stm32f10x.h"
#include "led.h"
int main(void)
{
delay_init();
LED_Init();
while(1)
{
GPIOB->BSRR |= GPIO_BSRR_BS5;
GPIOE->ODR |= GPIO_BSRR_BS5;
delay_ms(500);
//GPIOB->BRR &= ~GPIO_BRR_BR5; // 形式一
GPIOB->BRR &= ~GPIO_Pin_5; // 形式二
GPIOE->BRR &= ~GPIO_BRR_BR5;
delay_ms(500);
}
}
我们看预定义格式就知道了:
GPIO_Pin_n的宏定义格式
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */
GPIO_BRR_BRn的宏定义格式
/******************* Bit definition for GPIO_BRR register *******************/
#define GPIO_BRR_BR0 ((uint16_t)0x0001) /*!< Port x Reset bit 0 */
#define GPIO_BRR_BR1 ((uint16_t)0x0002) /*!< Port x Reset bit 1 */
#define GPIO_BRR_BR2 ((uint16_t)0x0004) /*!< Port x Reset bit 2 */
#define GPIO_BRR_BR3 ((uint16_t)0x0008) /*!< Port x Reset bit 3 */
#define GPIO_BRR_BR4 ((uint16_t)0x0010) /*!< Port x Reset bit 4 */
#define GPIO_BRR_BR5 ((uint16_t)0x0020) /*!< Port x Reset bit 5 */
#define GPIO_BRR_BR6 ((uint16_t)0x0040) /*!< Port x Reset bit 6 */
#define GPIO_BRR_BR7 ((uint16_t)0x0080) /*!< Port x Reset bit 7 */
#define GPIO_BRR_BR8 ((uint16_t)0x0100) /*!< Port x Reset bit 8 */
#define GPIO_BRR_BR9 ((uint16_t)0x0200) /*!< Port x Reset bit 9 */
#define GPIO_BRR_BR10 ((uint16_t)0x0400) /*!< Port x Reset bit 10 */
#define GPIO_BRR_BR11 ((uint16_t)0x0800) /*!< Port x Reset bit 11 */
#define GPIO_BRR_BR12 ((uint16_t)0x1000) /*!< Port x Reset bit 12 */
#define GPIO_BRR_BR13 ((uint16_t)0x2000) /*!< Port x Reset bit 13 */
#define GPIO_BRR_BR14 ((uint16_t)0x4000) /*!< Port x Reset bit 14 */
#define GPIO_BRR_BR15 ((uint16_t)0x8000) /*!< Port x Reset bit 15 */
上一篇:stm32f407 内部flash保存数据
下一篇:STM32跑马灯配置流程
推荐阅读最新更新时间:2024-11-12 10:28
设计资源 培训 开发板 精华推荐
- STEVAL-IPE012V3,带有基于 STPM01 和 STM8L152C6 的 Rogowski 线圈传感器的单相电能表评估板
- STM32F103RxT6验证板
- 电赛主控----GK_F103VE_1.0
- 用于有线网络的 400V 交流转直流单输出电源
- 无人机V1.3_开源
- 使用 Microchip Technology 的 SY88149HL 的参考设计
- EVAL-AD1939AZ,评估板,用于评估 AD1939 具有 PLL 192 kHz、24 位编解码器的四个 ADC/八个 DAC
- 使用 NXP Semiconductors 的 LTC1754E 的参考设计
- 使用 Richtek Technology Corporation 的 RT8572 的参考设计
- AP2132 2A CMOS LDO REGULATOR可调版的典型应用
- 已结束 |TI 新一代 MSP430™ 产品在低成本超声波水表中的方案介绍及快速应用指南
- EEWorld 电路图频道全新改版上线,立即前往体验
- 电阻哪个强?看Vishay演示视频 抢楼发言赢好礼
- Intel白皮书下载有奖
- 有奖活动“庖丁”解智能睡眠监测仪,一波“水军”来围观
- LPC55S69 新一代基于ARM Cortex-M33内核 通用安全低功耗MCU
- EEWorld邀你来拆解(第7期)——拆拆减肥利器,看看跳绳里都有什么
- ADI有奖直播:储能系统助力电动汽车快充站的建设 8月31日上午10:00-11:30 为您揭晓!
- 购买TI store MSP432P401R LaunchPad 晒单就送礼!