当前位置: 首页 > news >正文

百度旗下的外贸建站公司教育培训机构加盟

百度旗下的外贸建站公司,教育培训机构加盟,河南app开发,太原经济型网站建设价格目录 1、原理图2、文件结构3、使用寄存器模式点亮3.1、什么是寄存器3.2、寄存器开发的本质3.3、寄存器开发步骤3.4、主要源码3.4.1、main.c3.4.2、drv_gpio.h3.4.3、drv_gpio.c3.4.4、使用BSRR和BRR影子寄存器优化drv_gpio.c3.4.5、效果演示 4、使用标准库模式点亮4.1、使用标准…

目录

    • 1、原理图
    • 2、文件结构
    • 3、使用寄存器模式点亮
      • 3.1、什么是寄存器
      • 3.2、寄存器开发的本质
      • 3.3、寄存器开发步骤
      • 3.4、主要源码
        • 3.4.1、main.c
        • 3.4.2、drv_gpio.h
        • 3.4.3、drv_gpio.c
        • 3.4.4、使用BSRR和BRR影子寄存器优化`drv_gpio.c`
        • 3.4.5、效果演示
    • 4、使用标准库模式点亮
      • 4.1、使用标准库模式的好处
      • 4.2、主要源码
        • 4.2.1、main.c
        • 4.2.2、drv_gpio.h
        • 4.2.3、drv_gpio.c
        • 4.2.4、效果演示多了白灯

1、原理图

在这里插入图片描述
如图知,拉低为点亮

  • LED

    引脚状态
    D3红PB5输出, 拉低为亮
    D3绿PB0输出, 拉低为亮
    D3蓝PB1输出, 拉低为亮

2、文件结构

在这里插入图片描述

3、使用寄存器模式点亮

3.1、什么是寄存器

寄存器是微控制器(MCU)内部的一种特殊存储器,用于存储配置参数、状态信息或控制信号。每个寄存器通常有固定的地址,并且每一位或一组位对应特定的功能。

3.2、寄存器开发的本质

寄存器开发的本质是直接与硬件交互,绕过高级库(如 HAL 库或标准库)的封装,直接操作底层硬件。
STM32 的寄存器开发是通过直接读写寄存器来实现对外设的控制。

3.3、寄存器开发步骤

(1) 查找寄存器地址

  • 根据 STM32 的参考手册(Reference Manual),找到目标外设的寄存器地址。
  • 每个外设(如 GPIO、TIMER、USART 等)都有一组寄存器,用于配置和控制其行为。

(2) 配置寄存器

  • 通过指针操作或直接访问寄存器地址,向寄存器写入特定的值,以配置外设的工作模式、中断、时钟等。

(3) 读取寄存器

  • 通过读取寄存器的值,获取外设的状态信息(如标志位、数据等)。

3.4、主要源码

3.4.1、main.c
#include "drv_gpio.h"// SysTick 初始化
void SysTick_Init(void)
{SysTick->LOAD = 72000000 / 1000 - 1; // 1ms 延时SysTick->VAL = 0;					 // 清空当前值SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
}// 精确延时函数(单位:ms)
void Delay_ms(uint32_t ms)
{for (uint32_t i = 0; i < ms; i++){while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));}
}int main()
{// 初始化 SysTickSysTick_Init();// 初始化 RGB LEDRGB_Init();while (1){RGB_RedOn();Delay_ms(500);  // 延时 500msRGB_RedOff();RGB_GreenOn();Delay_ms(500);  // 延时 500msRGB_GreenOff();RGB_BlueOn();Delay_ms(500);  // 延时 500msRGB_BlueOff();}
}
3.4.2、drv_gpio.h
#ifndef _DRV_GPIO_H_
#define _DRV_GPIO_H_//ARM提供的,有所有外设寄存器的信息
#include "stm32f10x.h"void RGB_Init(void);void RGB_RedOn(void);void RGB_RedOff(void);void RGB_GreenOn(void);void RGB_GreenOff(void);void RGB_BlueOn(void);void RGB_BlueOff(void);#endif
3.4.3、drv_gpio.c
#include "drv_gpio.h"void RGB_Init(void)
{// 1.配置RCCRCC->APB2ENR |= (1 << 3);// 2.配置PB5的功能// bit 20~23 全部置为0//  bit 20 置为1//pb5GPIOB->CRL &= (uint32_t)(~(0xF << 20));GPIOB->CRL |= (uint32_t)(1 << 20);  //配置为通用推挽输出模式(0b0001)//pb0GPIOB->CRL &= (uint32_t)(~(0xF));GPIOB->CRL |= (uint32_t)(1);//pb1GPIOB->CRL &= (uint32_t)(~(0xF << 4));GPIOB->CRL |= (uint32_t)(1 << 4);  // 3.将pb5、pb0、pb1的初始值改为1,防止配置完就亮灯GPIOB->ODR |= (1 << 5);GPIOB->ODR |= 1;GPIOB->ODR |= (1 << 1);}void RGB_RedOn(void)
{// 3.拉低PB5对应的ODR寄存器地址GPIOB->ODR &= ~(1 << 5);
}void RGB_RedOff(void)
{GPIOB->ODR |= (1 << 5);
}void RGB_GreenOn(void)
{GPIOB->ODR &= ~(1);
}void RGB_GreenOff(void)
{GPIOB->ODR |= 1;
}void RGB_BlueOn(void)
{GPIOB->ODR &= ~(1 << 1);
}void RGB_BlueOff(void)
{GPIOB->ODR |= (1 << 1);
}
3.4.4、使用BSRR和BRR影子寄存器优化drv_gpio.c

由于对ODR直接操作, 可能有意无意修改到其他引脚的状态

#include "drv_gpio.h"void RGB_Init(void)
{// 1.配置RCCRCC->APB2ENR |= (1 << 3);// 2.配置PB5的功能// bit 20~23 全部置为0//  bit 20 置为1//pb5GPIOB->CRL &= (uint32_t)(~(0xF << 20));GPIOB->CRL |= (uint32_t)(1 << 20);  //配置为通用推挽输出模式(0b0001)//pb0GPIOB->CRL &= (uint32_t)(~(0xF));GPIOB->CRL |= (uint32_t)(1);//pb1GPIOB->CRL &= (uint32_t)(~(0xF << 4));GPIOB->CRL |= (uint32_t)(1 << 4);  // 3.将pb5、pb0、pb1的初始值改为1,防止配置完就亮灯GPIOB->ODR |= (1 << 5);GPIOB->ODR |= 1;GPIOB->ODR |= (1 << 1);}void RGB_RedOn(void)
{// 3.拉低PB5对应的ODR寄存器地址//GPIOB->ODR &= ~(1 << 5); GPIOB->BRR &= (1 << 5);// 直接将PB5拉低,同时不影响其他位
}void RGB_RedOff(void)
{//GPIOB->ODR |= (1 << 5);GPIOB->BSRR |= (1 << 5); //直接拉高,并不影响
}void RGB_GreenOn(void)
{//GPIOB->ODR &= ~(1);GPIOB->BRR &= (1);
}void RGB_GreenOff(void)
{//GPIOB->ODR |= 1;GPIOB->BSRR |= (1);
}void RGB_BlueOn(void)
{//GPIOB->ODR &= ~(1 << 1);GPIOB->BRR &= (1 << 1);
}void RGB_BlueOff(void)
{//GPIOB->ODR |= (1 << 1);GPIOB->BSRR |= (1 << 1);
}
3.4.5、效果演示

在这里插入图片描述

4、使用标准库模式点亮

4.1、使用标准库模式的好处

标准库封装了底层寄存器的操作,提供了易于理解的API函数,开发者无需直接读写寄存器。

4.2、主要源码

4.2.1、main.c
#include "drv_gpio.h"// SysTick 初始化
void SysTick_Init(void)
{SysTick->LOAD = 72000000 / 1000 - 1; // 1ms 延时SysTick->VAL = 0;					 // 清空当前值SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
}// 精确延时函数(单位:ms)
void Delay_ms(uint32_t ms)
{for (uint32_t i = 0; i < ms; i++){while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));}
}int main()
{// 初始化 SysTickSysTick_Init();// 初始化 RGB LEDRGB_Init();while (1){RGB_RedOn();Delay_ms(500);  // 延时 500msRGB_RedOff();RGB_GreenOn();Delay_ms(500);  // 延时 500msRGB_GreenOff();RGB_BlueOn();Delay_ms(500);  // 延时 500msRGB_BlueOff();RGB_WriteOn();Delay_ms(500);  // 延时 500msRGB_WriteOff();}
}
4.2.2、drv_gpio.h
#ifndef _DRV_GPIO_H_
#define _DRV_GPIO_H_//使用gpio标准库
#include "stm32f10x_gpio.h"#define RGB_Port GPIOB
#define RGB_Pin_R GPIO_Pin_5
#define RGB_Pin_G GPIO_Pin_0
#define RGB_Pin_B GPIO_Pin_1void RGB_Init(void);void RGB_RedOn(void);void RGB_RedOff(void);void RGB_GreenOn(void);void RGB_GreenOff(void);void RGB_BlueOn(void);void RGB_BlueOff(void);void RGB_WriteOn(void);void RGB_WriteOff(void);#endif
4.2.3、drv_gpio.c
#include "drv_gpio.h"void RGB_Init(void)
{// 1.RCC配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 2、配置红、绿、蓝灯输出GPIO_InitTypeDef gpio_initStruct = {0};gpio_initStruct.GPIO_Pin = RGB_Pin_R | RGB_Pin_G | RGB_Pin_B;gpio_initStruct.GPIO_Speed = GPIO_Speed_50MHz;gpio_initStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(RGB_Port, &gpio_initStruct);GPIO_SetBits(RGB_Port, RGB_Pin_R | RGB_Pin_G | RGB_Pin_B);
}void RGB_RedOn(void)
{// 3.拉低PB5对应的ODR寄存器地址GPIO_ResetBits(RGB_Port, RGB_Pin_R);
}void RGB_RedOff(void)
{GPIO_SetBits(RGB_Port, RGB_Pin_R);
}void RGB_GreenOn(void)
{GPIO_ResetBits(RGB_Port, RGB_Pin_G);
}void RGB_GreenOff(void)
{GPIO_SetBits(RGB_Port, RGB_Pin_G);
}void RGB_BlueOn(void)
{GPIO_ResetBits(RGB_Port, RGB_Pin_B);
}void RGB_BlueOff(void)
{GPIO_SetBits(RGB_Port, RGB_Pin_B);
}void RGB_WriteOn(void)
{GPIO_ResetBits(RGB_Port, RGB_Pin_R | RGB_Pin_G | RGB_Pin_B);
}void RGB_WriteOff(void)
{GPIO_SetBits(RGB_Port, RGB_Pin_R | RGB_Pin_G | RGB_Pin_B);
}
4.2.4、效果演示多了白灯

在这里插入图片描述

http://www.dtcms.com/a/481388.html

相关文章:

  • 做网站之前的工作福州 网站设计公司
  • 北京网站设计联系电话租房网站开发文献综述模板
  • 做网站的计划概要建筑安全网
  • 昆山哪里有做网站的社交网站备案
  • 内部网站建设公司手机端网站排名
  • 博客系统做网站泉州seo排名
  • 菏泽建设局网站千牛网页版登录入口
  • 做网站难度国外网站大牛不懂英语可以做吗
  • wordpress 迁移升级谷歌排名优化入门教程
  • 网站商品展示页怎么做的软文代写服务
  • 免费 支付宝购物网站模版代码高亮网站
  • kesioncms企业网站蓝色模板网址大全2345视频
  • 做外贸接私单的网站263企业邮箱网页登录入口
  • 马鞍山市 网站建设网站的设计制作流程
  • 嘉兴网站建设低价推荐深圳福田教育
  • 旅行社网站建设设计公司哪家好房产网签是什么意思
  • 温州建设局网站深圳建设企业网站公司
  • 嘉定区整站seo十大排名家装设计公司排行榜
  • 做网站 套用模板之后用什么改如何进行公司网站的建设
  • 天津网站备案去哪网站到期请续费
  • 怎么查网站有没有做推广长沙网络科技公司官网
  • 如何不备案做购物网站深圳集团网站建设哪家好
  • 郴州网站建设软件定制开发平台制作一个网站难吗
  • 网站建设的企业目标北京医疗网站建设
  • 网站建设属于什么网站建设人员培训纲要
  • 手机做兼职的网站有哪些什么是网络广告营销
  • 公司网站设计用什么wordpress 第三方登录
  • wordpress导航栏做产品分类网站标签优化
  • 在线网站免费做网站的调查问卷
  • 肇庆企业免费建站阿里网站如何做接入