寄存器点灯实验

操作过程

使能IO口时钟配置寄存器RCC_APB2ENR

初始化IO口模式,配置寄存器GPIOx_CRH/CRL

操作IO口,输出高低电平,配置寄存器GPIOx_ODR或者BSRR/BRR。

APB2 外设时钟使能寄存器(RCC_APB2ENR)

在STM32中文参考手册6.3RCC寄存器描述的6.3.7小节可以看到该寄存器的使用说明

因为使用的是GPIOA端口组,所以使能IOPAEN位,该位置1则IO端口A时钟开启

端口配置低寄存器(GPIOx_CRL) (x=A…E)

在中文参考手册的8.2节可以找到GPIO寄存器相关配置寄存器的描述

因为开发板上的PA1连接到了LED灯,所以对CNF1和MODE1进行初始化,MODE1初始化为11,设置为输出模式,速度为50MHz,CNF1初始化为00,设置为通用推挽输出模式

因为没有用到更高的引脚位,所以端口配置高寄存器(GPIOx_CRH) 并不用配置

端口输出数据寄存器(GPIOx_ODR)

往ODR寄存器的ODR1位写入0,则PA1引脚输出低电平,LED灯被点亮

端口位设置/清除寄存器(GPIOx_BSRR) ,端口位清除寄存器(GPIOx_BRR)

也可以使用这两个寄存器,因为是PA1输出低电平LED灯才被点亮,所以这两个寄存器都有效

如果LED灯是引脚输出高电平才能被点亮,那就只有端口位设置/清除寄存器(GPIOx_BSRR)的设置功能才能输出高电平,BRR寄存器不行

程序

参照手册搭建好寄存器的工程模板后,新建LED.h和LED.c文件,开始编写代码

LED.h

在头文件中要添加函数声明,因为写了多种初始化方法,所以这些函数都要添加声明

#ifndef __LED_H__
#define __LED_H__//宏定义,LED_Init_3,LED_Init_4
#define IOPAEN                  0x01<<2
#define CNF1_AND_MODE1          ((u32)0x0F<<4)
#define OUT_MODE_PP            ((u32)0x03<<4)
#define ODR1                    ((u16)0x01<<1)
#define BSRR_BR1                ((u32)0x01<<17)
#define BRR_BR1                 ((u16)0x01<<1)void LED_Init_1(void);
void LED_Init_2(void);
void LED_Init_3(void);
void LED_Init_4(void);#endif

LED.c

分别用三种不同的写法实现点亮LED灯,方法一是直接往寄存器写入十六进制,方法二是用移位的方法初始化寄存器,但这两种方法的数值第一眼看去不好理解,不看参考手册的话很难知道0xFFF4是初始化什么,(u16)0x01<<2也是一样

所以推荐使用第三种方法,用宏定义,先在LED.h头文件中定义好数值,然后使用时直接调用宏名即可,可以让人一眼就看出初始化的是哪个位

第四种方法是使用BSRR或BRR寄存器对PA1进行赋值,一样能使LED灯点亮

#include "LED.h"
#include "stm32f10x.h"/*** @name     LED_Init_1* @brief LED初始化-寄存器(写法1)* @param    None* @retval  None*/
void LED_Init_1()
{//初始化APB2上GPIOA的时钟RCC->APB2ENR |= 0xFFF4;//GPIOA端口配置低寄存器//4 ~ 7配置的是PA1,所以先将这4位清零GPIOA->CRL &= 0xFFFFFF0F;//然后MODE1初始化为11,CNF1初始化为00,设置为通用推挽输出模式GPIOA->CRL |= 0xFFFFFF3F;//配置端口输出数据寄存器,将ODR1置0,输出低电平,点亮LEDGPIOA->ODR &= 0xFFFD;
}/*** @name    LED_Init_2* @brief LED初始化-寄存器(写法2)* @param    None* @retval  None*/
void LED_Init_2()
{//初始化APB2上GPIOA的时钟RCC->APB2ENR |= ((u16)0x01<<2);//GPIOA端口配置低寄存器//4 ~ 7配置的是PA1,所以先将这4位清零GPIOA->CRL &= ~((u32)0x0F<<4);//然后MODE1初始化为11,CNF1初始化为00,设置为通用推挽输出模式GPIOA->CRL |= ((u32)0x03<<4);//配置端口输出数据寄存器,将ODR1置0,输出低电平,点亮LEDGPIOA->ODR &= ~((u16)0x01<<1);
}/*** @name    LED_Init_3* @brief LED初始化-寄存器(写法3)* @param    None* @retval  None*/
void LED_Init_3()
{//初始化APB2上GPIOA的时钟RCC->APB2ENR |= IOPAEN;//GPIOA端口配置低寄存器//4 ~ 7配置的是PA1,所以先将这4位清零GPIOA->CRL &= ~CNF1_AND_MODE1;//然后MODE1初始化为11,CNF1初始化为00,设置为通用推挽输出模式GPIOA->CRL |= OUT_MODE_PP;//配置端口输出数据寄存器,将ODR1置0,输出低电平,点亮LEDGPIOA->ODR &= ~ODR1;
}/*** @name    LED_Init_4* @brief LED初始化-寄存器(测试BSRR寄存器和BRR寄存器)* @param   None* @retval  None*/
void LED_Init_4()
{//初始化APB2上GPIOA的时钟RCC->APB2ENR |= IOPAEN;//GPIOA端口配置低寄存器//4 ~ 7配置的是PA1,所以先将这4位清零GPIOA->CRL &= ~CNF1_AND_MODE1;//然后MODE1初始化为11,CNF1初始化为00,设置为通用推挽输出模式GPIOA->CRL |= OUT_MODE_PP;//配置端口输出数据寄存器,将ODR1置0,输出低电平,点亮LED//GPIOA->ODR &= ~ODR1;//配置端口位设置/清除寄存器(GPIOx_BSRR) 31-16位置1则对应的ODR位清0,LED点亮//GPIOA->BSRR |= BSRR_BR1;//配置端口位清除寄存器(GPIOx_BRR) 15-0位置1则对应的ODR位清0,LED点亮GPIOA->BRR |= BRR_BR1;
}

main.c

主函数中引入LED.h头文件后,直接调用LED初始化函数即可

#include "LED.h"int main()
{//LED_Init_1();//LED_Init_2();//LED_Init_3();LED_Init_4();while(1){}
}

STM32使用寄存器点灯实验相关推荐

  1. STM32使用库函数点灯实验

    GPIO库函数介绍 重要函数: 1个初始化函数:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);2个读取输 ...

  2. 【STM32+机智云】机智云手机APP点灯实验踩坑记录

    [STM32+机智云]机智云手机APP点灯实验踩坑记录 一.实验背景 因为项目开发需要用到云平台,所以开始学习机智云平台,听说机智云比较容易入门,还有手机APP.因此开始了踩坑之旅,一切的一切开始于一 ...

  3. stm32官方例程在哪找_正点原子Linux第十一章模仿STM32驱动开发格式实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第十一章模仿STM32驱动开发格式实验 在上一章使用C语 ...

  4. STM32串口寄存器操作(转)

    源:STM32串口寄存器操作 //USART.C/*************************************************************************** ...

  5. 【10天基于STM32F401RET6智能锁项目实战第2天】(分别用库函数和寄存器点灯)

    分别用库函数和寄存器点灯 一.用寄存器点灯 二.用库函数点灯 一.用寄存器点灯 硬件分析:首先我们要先去看原理图找到相应的GPIO口 然后再去看用到的寄存器 首先我们先看一下GPIO口是挂载在AHB1 ...

  6. stm32汉字字库显示实验与OLED的使用(开始于2021-09-01)

    stm32汉字字库显示实验与OLED的使用 1.字库的使用 GBK字库的简介: GBK库的由两部分组成,如下图: 高位从0x81开始是为了兼容ASII字符,因为未扩展的ASII字符是从0-128,即0 ...

  7. STM32串口中断接收实验

    STM32串口中断接收实验的详细说明 准备 代码实现 总结 准备 材料:STM32F407ZGT6最小系统板,串口1通过跳线帽连接到了CH340上. 需求:从电脑向板子的串口1发送一个字符串(以回车和 ...

  8. STM32F103ZET6+新建工程+点灯实验

    STM32F103ZET6+新建工程+点灯实验 目前,ST公司已经停止标准外设库的更新,转而推广HAL库和LL库.HAL库是由标准外设库升级而来的,学习标准外设库有助于对HAL库的理解,接下来我就简单 ...

  9. PLC、STM32单片机--485modbus通信实验

    PLC.STM32单片机–485modbus通信实验 接线: 单片机 PLC USB转485模块 A-------------------A-------------------A B-------- ...

最新文章

  1. 【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?膨胀卷积
  2. java动态添加组件_有关Java Swing动态增加组件
  3. WINCE6.0+S3C2443下ADC在电池驱动应用
  4. hihoCoder week17 最近公共祖先·三 lca st表
  5. Asp SqlDataSource将数据库数据绑定在 GridView
  6. c语言大作业_2018 C语言大作业--21_Ekko制作教程
  7. python下载文件保存_从URL下载文件并将其保存在Python文件夹中
  8. 进程句柄和进程ID的区别和关系
  9. C++11多线程---future和promise
  10. APP架构师必看:面对爆发流量如何进行架构调整
  11. 【Java并发编程学习】3、线程挂起、恢复和终止
  12. pdf多页合成一张pdf图片
  13. 本科三级专业目录计算机类,大学本科专业目录
  14. SpringBoot实现本地、网络文件下载、zip压缩包批量下载
  15. 平台与品牌-创作者-用户共舞,西五街交出种草新答卷
  16. centos(一)安装及 设置基础软件仓库出错 的问题
  17. Java校验身份证号码的工具类
  18. 解决springboot警告WARNING: All illegal access operations will be denied in a future release
  19. RN学习和开发笔记(一)
  20. 能测试成绩的学习软件,普通话学习测试这个软件上,我平均成绩能达到二甲,请问如果在真正的普通话考试上,我大概能得到什么等级...

热门文章

  1. Small Office Home Office模式——线上团队开发
  2. Javascript中的Number
  3. 展示一个一键分享插件
  4. 广播单播组播的知识总结与分享
  5. 论文翻译:2000_narrowband to wideband conversion of speech using GMM based transformation
  6. 如何实现已发布app的自动更新
  7. 《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文
  8. java 读取 doc_java使用poi读取doc和docx文件的实现示例
  9. nLite工具集成驱动到windows安装光盘(操作简化版)
  10. Rhapsody使用简介