首页 > 编程语言 >stm32寄存器编程

stm32寄存器编程

时间:2023-05-26 22:46:15浏览次数:52  
标签:LED 推挽 寄存器 编程 stm32 操作 GPIO

stm32编程三种方法

  1. 寄存器操作
  2. 标准库
  3. hal库

.1 寄存器操作

为什么要有位操作?因为STM32本身只支持8、16、32位整体操作,而不下支持单独一位操作。但是实际中有对1位单独操作的需求。

一般是这么做的:读取整个的32位,然后对其中一位做操作后,再整体位写回去。

.2位带操作

这么做是可以的,但是效率低。如何改进效率?答案肯定是想一个办法能够直接一次性修改那一位同时还不影响其他位。如果不支持是没办法的,除非硬件给你支持位操作。而ARM又不支持位操作,所以发明位带操作来替代。位带操作的思路是不让你直接单独操作这一位,而是把这一位给你映射到别的某个地方的32位,然后你在别的垃地方操作那个32位就相当是操作这里的这1位。

什么是寄存器(control register)?

给具有特殊功能的内存地址起了个名字叫xxx寄存器,这些寄存器可以被过软件编程修改从而控制硬件资源。寄存器起码具备以下功能:输入、输出、存储、清除。

什么是GPIO(general purpose input output )?

GPIO就是芯片的引脚(芯片上的引脚有些不是GPIO,只有一部分是),作为GPIO的这类引脚,他的功能和特点是可以被编程控制它的工作模式,也可以编程控制他的电压高低等。

在开发板上,我们设计电路时就把LED接在了一个GPIO上,这样我们就可以通过编程控制GPIO的模式和输入输出值来操控LED亮还是灭;如果你当时设计电路时把LED接在非GPIO上那就不可能了。

用寄存器编程点亮一颗LED

操作stm32外设使用的一般步骤

第一步、了解该硬件的通用工作原理,再查看具体原理图:

LED硬件通用原理:LED本身有2个接线点,一个是LED的正极,一个是LED的负极。

LED这个硬件的功能:亮或不亮,想要点亮一颗LED只需要给他的正负极上加正电压即可,要熄灭一颗LED只需要去掉电压即可。

image-20230525102732996

第二步、软件件编程:

  1. 使能GPIOB所在时钟:APB2 外设时钟使能寄存器(RCC_APB2ENR)

  2. 设置工作模式设为推挽输出:GPIOx_CRL对应设为0001

  3. 设置GPIOB_ODR点亮LED:GPIOx_ODR给低电平

使能GPIOB所在时钟:

地址:0x40021000+0x18。3号是B时钟。输入1开启时钟。

*(unsigned int*)0x40021018 |=((1)<<3);
image-20230525221134674 image-20230525221134674 image-20230525215813061

设置工作模式设为推挽输出

CRL实际地址为0x40010C00。四位为一组共有八组,PB1指的是CNF1+MODE1,赋值 0001 0000就是给蓝灯设置通用推挽输出。

//设置蓝灯CRL推挽输出,最后一组置0001
*( unsigned int*)0x40010C00|= ((1)<<(4*1));
image-20230526223312066

设置通用

//控制ODR寄存器,配置低电平点亮LED,高电平熄灭LED
*( unsigned int*)0x40010C0C= 0XFFFD;
*( unsigned int*)0x40010C0C= 0XFFFF;

问题1:编译缺少 axf文件,解决:

void SystemInit(){
    //在main.c文件中添加空函数,骗过startup编译器
}

问题2:keil5通过dap仿真烧录到开发板,找不到axf文件

说明编译没通过,否则自动生成axf文件,在Objects文件夹下。

问题3:Flash Download failed - “Cortex-M3“解决方法

image-20230526223312066

标签:LED,推挽,寄存器,编程,stm32,操作,GPIO
From: https://www.cnblogs.com/Kaelthas/p/17436001.html

相关文章

  • 打卡 c语言趣味编程 掷骰子
    问题描述:骰子是一个有六个面的正方体,每个面分别印有1~6之间的小圆点代表点数。假设这个游戏的规则是:两个人轮流掷骰子6次,并将每次投掷的点数累加起来。点数多者获胜:点数相同则为平局。要求编写程序模拟这个游戏的过程,并求出玩100盘之后谁是最终的获胜者。思路:要得到6个......
  • Java编程之数组
    数组(容器)数组是一组数据类型相同的数据的组合,将这些数据统一的管理起来,数组本身是一个引用数据类型,数组内存储的类型可以是基本类型也可以是引用类型。数组的特点数组本身是一个引用数据类型数组是在堆内存中的一串连续的地址存在数组在初始化时必须指定长度堆内存的数组空......
  • C#异步编程概念和使用
    异步编程要搞懂3个概念async、Task、await;async修饰符指明方法为异步方法;Task是异步方法返回类型;await是运算符,用来等待异步方法完成;当在异步方法中调用异步方法(理解为启动任务),可以在合适的时机等待任务完成,然后再使用返回的结果,这就是异步编程的优势,可以在一个过程中执行多......
  • 2023.5.26编程一小时打卡
    一、问题描述:定义复数类MyComplex,主函数完成相关测试。MyComplex类结构说明:1、数据成员包括:私有数据成员:实部x(double)虚部y(double)。2、成员函数包括:无参构造函数MyComplex(void),其功能是将数据成员数部和虚部的值均设为0;有参构造函数MyComplex(doublevalue1,doublevalue2),其功能......
  • 转:什么是AOP编程思想
    转自:https://www.duidaima.com/Group/Topic/ArchitecturedDesign/12108AOP的核心思想是将横切关注点抽象为一个独立的模块(称之为“切面”),然后在需要应用它的地方进行调用。比如,在需要记录日志的方法中,我们可以定义一个切面来负责日志记录,这样所有调用该方法的地方都会被自动添加......
  • QT编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)
    由于工作需要,需要利用QT平台完成手机与ble蓝牙的通讯,所以就找了各种资料,算是初步的能够连接完成demo代码,但是依旧有些代码没有理解,比如特性那一片的代码,稍后还得研究啊(对了,这是低功耗蓝牙,不是经典蓝牙,看清楚了,当初不清楚经典蓝牙和低功耗蓝牙,浪费我一个星期,说多了都是泪,下面是代码......
  • Angular Material教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介AngularMaterial是AngularJS开发人员的UI组件库。AngularMaterial的可重用UI组件有助于构建有吸引力,一致且功能强大的Web页面和Web应用程序,同时遵循现代Web设计原则,如浏览器可移植性,设备独立性和优雅降级。AngularMaterial入门教程-从简单的步骤了解角度材料,从基......
  • Rust async 编程
    Rustasync编程AsynchronousProgramminginRust:https://rust-lang.github.io/async-book/中文书名《Rust异步编程指南》:https://github.com/rustlang-cn/async-bookRust语言圣经(RustCourse):https://course.rs/advance/async/getting-started.html一、GettingStarted1.......
  • 【java】同步异步和多线程编程
    Java基本概念并发基于时间段内的,同时发生(处理多个任务的能力,时间段)存在同步和互斥的问题(任务之间的时序问题)同步:前一个处理的结果作为下一个处理的资源(互相之间有依赖)互斥:不能同时使用临界资源。解决时序问题的机制:锁,信号量,原子操作Java中的多线程机制并行(完全......
  • 异步编程(Thread、ThreadPool、Task、异步关键字async/await)
    一、什么是异步Thread,是微软.Net1.0推出;ThreadPool 是微软.Net2.0推出;Task是微软.Net4.0推出;async/await是微软.Net5.0推出;       同步和异步主要用于修饰方法。当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法;当一个方......