笔记(STM32篇)day3——寄存器结构体、端口置位函数

2023-05-16

目录

一些C知识点

1、#define和typedef的区别

2、结构体struct

3、结构体中.和->的区别

4、.c文件和.h文件的关系

5、防止重复引用

一、寄存器结构体定义

1、定义结构体变量指针

 2、寄存器赋值

二、端口置位函数

1、端口置位.c文件

2、端口置位.h文件

3、调用

遇到的问题

参考


一些C知识点

1、#define和typedef的区别

        #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量)或者公式,在预处理之后的.i文件中就完成替换。定义在前,原文本在后。

        typedef为关键字,可以使用它为变量取别名,但仅限为类型定义名称,由编译器执行解释。类型在前,别名在后。与define不同,typedef后需要加引号。此外如本文,typedef也可定义结构变量。

#define     Max            255
#define     Add(a,b)       ((a)+(b))
typedef    unsigned int   uint32_t;

2、结构体struct

        结构体声明格式:Book为结构体名称,book为结构体变量名。

struct Book
{
    char title[128];
    char author[40];
}book;

3、结构体中.和->的区别

        ->:用在结构体指针的后面;
        . :用在结构体后面(".“这个运算符可以理解为中文里"的”);

        (*a).b 等价于a->b

4、.c文件和.h文件的关系

        一般来说二者没有本质区别,.h文件是头文件,内含函数声明、宏定义、结构体定义等内容;.c文件是程序文件,内含函数实现,变量定义等内容。

        func.h里声明函数,在func.h同一目录下建立func.c ,func.c里定义了这个函数的内容。如果在main函数所在.c文件里#include这个func.h 后,main函数运行时就会直接找到func.c的函数并运行。

5、防止重复引用

        为防止重复引用,习惯在每个头文件里用条件指示符#ifndef。

#ifndef _STM32F10X_H
#define _STM32F10X_H
    //text
#endif

一、寄存器结构体定义

1、定义结构体变量指针

        如图1所示,GPIO的七个寄存器从每个GPIO的基地址开始,按每32位即每4个字节一个寄存器排列,因此可以使用结构体为GPIO的寄存器分配一块连续内存,结构体内有七个成员对应七个寄存器,以此方便对各个寄存器的配置操作。

图1 GPIO寄存器地址映像和复位值

         如下代码所示,结构体变量为GPIO_TypeDef,所有GPIO内部的寄存器都是这种结构,都可以使用这种结构体去操作内部成员寄存器。因此,如果使用GPIOB,则需要将GPIOB_BASE基地址转化为这种结构体类型的指针,并宏定义为GPIOB。

typedef unsigned int		uint32_t;
typedef unsigned short		uint16_t;

typedef struct
{
	uint32_t CRL;
	uint32_t CRH;
	uint32_t IDR;
	uint32_t ODR;
	uint32_t BSRR;
	uint32_t BRR;
	uint32_t LCKR;
}GPIO_TypeDef;

#define    GPIOB	((GPIO_TypeDef*)GPIOB_BASE)		//GPIOB定义为GPIO_TypeDef类型的指针

 2、寄存器赋值

       通过以上定义,要操作GPIOB的CRL寄存器,代码对比如下:

GPIOB_CRL |= ((1)<<(4*0));
GPIOB->CRL |= ((1)<<(4*0));	
//二者作用相同

二、端口置位函数

       在对端口置位、复位时,与使用移位等位操作相比,写好端口操作函数直接调用来的更方便。

1、端口置位.c文件

        形参为结构变量类型的指针,和端口位。

/**********    stm32f10x_gpio.c    **********/
#include "stm32f10x_gpio.h"

void GPIO_SetBits(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
{
	GPIOx ->BSRR |= GPIO_Pin;
}

2、端口置位.h文件

        对于置位函数,要设置端口的某一位为1,在BSRR寄存器中,低16位为置位功能,即0不影响,1则置位1。因此,可以使用宏定义,若要将寄存器首位置位,则定义GPIO_Pin_0为0x0001,GPIO_Pin_1为0x0002,GPIO_Pin_2为0x0004,以此类推。同时别忘了在头文件中声明函数。

/**********    stm32f10x_gpio.h    **********/
#ifndef _STM32F10X_GPIO_H
#define _STM32F10X_GPIO_H

#include "stm32f10x.h"

#define GPIO_Pin_0    ((uint16_t)0x0001)  /*!< 选择Pin0 */    //(00000000 00000001)b
#define GPIO_Pin_1    ((uint16_t)0x0002)  /*!< 选择Pin1 */    //(00000000 00000010)b
#define GPIO_Pin_2    ((uint16_t)0x0004)  /*!< 选择Pin2 */    //(00000000 00000100)b
#define GPIO_Pin_3    ((uint16_t)0x0008)  /*!< 选择Pin3 */    //(00000000 00001000)b
#define GPIO_Pin_4    ((uint16_t)0x0010)  /*!< 选择Pin4 */    //(00000000 00010000)b
#define GPIO_Pin_5    ((uint16_t)0x0020)  /*!< 选择Pin5 */    //(00000000 00100000)b
#define GPIO_Pin_6    ((uint16_t)0x0040)  /*!< 选择Pin6 */    //(00000000 01000000)b
#define GPIO_Pin_7    ((uint16_t)0x0080)  /*!< 选择Pin7 */    //(00000000 10000000)b

#define GPIO_Pin_8    ((uint16_t)0x0100)  /*!< 选择Pin8 */    //(00000001 00000000)b
#define GPIO_Pin_9    ((uint16_t)0x0200)  /*!< 选择Pin9 */    //(00000010 00000000)b
#define GPIO_Pin_10   ((uint16_t)0x0400)  /*!< 选择Pin10 */   //(00000100 00000000)b
#define GPIO_Pin_11   ((uint16_t)0x0800)  /*!< 选择Pin11 */   //(00001000 00000000)b
#define GPIO_Pin_12   ((uint16_t)0x1000)  /*!< 选择Pin12 */   //(00010000 00000000)b
#define GPIO_Pin_13   ((uint16_t)0x2000)  /*!< 选择Pin13 */   //(00100000 00000000)b
#define GPIO_Pin_14   ((uint16_t)0x4000)  /*!< 选择Pin14 */   //(01000000 00000000)b
#define GPIO_Pin_15   ((uint16_t)0x8000)  /*!< 选择Pin15 */   //(10000000 00000000)b
#define GPIO_Pin_All  ((uint16_t)0xFFFF)  /*!< 选择全部引脚*/ //(11111111 11111111)b

void GPIO_SetBits(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);

#endif	/*_STM32F10X_GPIO_H*/

3、调用

        使用时,在主程序中调用即可。GBIOB已经被定义为GPIO_TypeDef类型的指针,GPIO_Pin_0已经被定义为0x0001。

GPIO_SetBits(GPIOB,GPIO_Pin_0);

遇到的问题

        让LED闪烁,程序看不出问题,但只要是在while里的程序就不会执行,led只会常亮或者常灭,百度这个问题,有优化等级的原因,原来是O1,改成O0不优化就没有问题了,具体为什么不优化就可以运行,暂时不清楚。

int main(void)
{ 
	RCC_APB2ENR |= (1<<3);		
    //控制RCC寄存器打开时钟,RCC偏移0x18为APB2时钟,寄存器第三位为PB使能

	GPIOB_CRL &= ~((0x0F)<<(4*0));
	//初始化,低4位为一组,全部置0
	GPIOB->CRL |= ((1)<<(4*0));		
    //控制GPIOB_CRL低位配置寄存器,GPIOB偏移0x00,PB0通用推挽输出00,模式为输出01
	
	while(1)
	{	
		GPIOB->ODR &= ~(1<<0);		
		Delay_ms(500);
		GPIOB->ODR |= (1<<0);	
		Delay_ms(500);
	}

}

参考

https://doc.embedfire.com/mcu/stm32/f103zhinanzhe/std/zh/latest/index.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

笔记(STM32篇)day3——寄存器结构体、端口置位函数 的相关文章

  • Qt修改UI文件无效解决方案

  • win10关闭升级win11

    win10 11系统之中有一个令人厌倦的作用 xff0c 那便是自动升级 很多人会想起本来电脑上在应用全过程之中没什么难题 xff0c 系统却经常发生升级 xff0c 占用系统資源 xff0c 还会发生自动重启的状况 xff0c 又不可以放
  • 流程图、类图推荐的软件

    inux 下的绘图软件Visio 流程图 xff0c 矢量图 5款替代微软Visio的开源免费软件
  • 屏幕坏点检测

    屏幕坏点检测
  • 解析json方案

    方案一 方案二 方案三 方案四 方案五 方案六 方案七
  • 51单片机+DHT11温湿度传感器+LCD1602显示(最好用的程序,没有之一)

    DHT11传感器原理很简单 xff08 我就不过多解释了 xff09 xff0c 但使用中可能会遇到很多问题 xff0c 问题的本质大部分出在了延时函数之中 xff0c 传统的软件延时与实际相差太多 xff0c 所以尽量不要用 xff0c
  • 51单片机+温湿度传感器+proteus仿真

    前段时间老师让提交的工程实训作业 xff0c 本来想用51单片机加DHT11做一个温湿度控制系统 xff0c 结果发现DHT11温湿度传感器情况下怎么也不好用 xff0c 从网上找了老多资料 xff0c 还是不行 xff0c 所以果断放弃
  • Linux网络编程项目---网络词典(带源码)

    源代码 xff1a https wwz lanzouq com iPsJ706ghzhc 1 包含的文件 client span class token operator span span class token operator spa
  • 四、stm32-USART串口通讯(重定向、接发通信、控制LED亮灭)

    目录 一 固件库模板二 准备资料三 STM32串口通讯1 STM32的USART 简介2 USART 功能框图2 1 数据寄存器2 2 控制器2 3 发送器2 4 接收器2 5 小数波特率生成 3 校验控制3 1 中断控制 4 USART
  • STM32软件模拟iic驱动oled(显示汉字,图片)(二)

    在上一篇介绍的软件模拟iic及iic源码后 xff0c 今天来实现显示汉字与图片以及各个函数的介绍 一 函数介绍及使用 1 显示字符 OLED ShowStr unsigned char x unsigned char y unsigned
  • CMake笔记--find_package 指定路径

    1 find package 指定路径 1 1 命令 find package span class token punctuation span span class token operator lt span PackageName
  • TM4C123系列(四)————UART串口通信

    一 实验简介 使用TM4C123的串口通信功能实现单片机与PC端通信 二 UART介绍 TM4C123有八个串口 xff0c 其中UART0已经与USB集成 xff0c UART0建议只用来和PC端通信 xff0c 不要与外界通信 除此之外
  • STM32软件模拟iic驱动oled(显示汉字,图片)(一)

    一 iic驱动模式 1 硬件驱动 xff1a 所谓硬件驱动就是使用STM32板子上固定的iic接口 xff0c 但是由于板载iic数量有限 xff0c 且大多和别的外设有引脚复用 xff0c 在别的外设使用的情况下还得通过重映射引到别的引脚
  • 初识ESP8266(二)————搭建网络服务器实现远程控制

    一 实验介绍 8266搭建网络服务器 xff0c 通过同一wifi信号下的终端访问ESP8266IP地址 xff0c 对开发板进行控制 二 代码 1 esp8266 server begin 作用 xff1a 启动网络服务 xff0c 搭建
  • 关于舵机的漂移与不听指挥乱动的问题

    在电赛E题中控制二维云台中出现了两个问题 xff0c 也是好不容易才发现原因然后解决的 一 舵机不听指挥乱动 没有与单片机共地 舵机有三条线 xff0c 分别是正负极和信号线 用来输入PWM信号 xff0c 因为舵机所需要的驱动电压比较大
  • 蓝桥杯嵌入式(STM32F103RBT6)备赛手册(一)

    文章目录 一 基础篇一 点亮LED二 驱动蜂鸣器三 Systick定时器四 定时器五 独立按键 三行代码消抖六 IIC协议七 LCD显示八 串口接收与发送九 ADC采样十 RTC时钟十一 PWM输出及输入捕获 一 基础篇 一 点亮LED 由
  • Asahi Linux的Alpha 版本已匹配Mac 设备

    导读Asahi Linux 是一个旨在将 Linux 移植到配备 Apple Silicon 芯片 Mac 设备上的项目 xff0c 项目的目标不仅仅是让 Linux 能够在这些设备上运行 xff0c 而是要将它打磨到可以用作日常操作系统的
  • Linux的优缺点

    导读Linux 是一个流行词 xff0c 你到处都能听到与 Linux 相关的内容 人们在技术论坛上讨论它 Linux 是课程中的一部分 xff1b 你最喜欢的 YouTube 技术主播在兴奋地展示构建他们的 Linux 内核 xff1b
  • 不敢想象!Vim使用者的“大脑”竟是这样

    原始状态 我曾经观看过小提琴家非常有激情地拉弦演奏 xff0c 我有了这种想法 xff1a 也许我投入到文本编辑器中的脑细胞数量和他为投入所喜好的乐器的演奏中差不多吧 我还有种奇异的想象 xff0c 当他独奏的时候 xff0c 脑中的核磁共
  • Windows 10的子系统不是非Ubuntu不可

    Ubuntu 的制造商 Canonical 早已和微软进行合作 xff0c 让我们体验了极具争议的 Bash on Windows 外界对此也是褒贬不一 xff0c 许多 Linux 重度用户则是质疑其是否有用 xff0c 以及更进一步认为

随机推荐

  • 绝对空前!!!互联网史上的最大ddos攻击惊艳登场

    美国遭遇史上最大黑客攻击 xff0c 知名网站全部瘫痪 全世界一半的网络被黑客攻陷 xff0c 大网站无一幸免 就在 xff08 10月22日 xff09 xff0c 美国早上我们见证了互联网建立以来的最大ddos攻击 xff0c twit
  • snprintf()函数探讨

    printf sprintf snprintf 区别 先贴上其函数原型 printf const char format 格式化输出字符串 xff0c 默认输出到终端 stdout sprintf char dest const char
  • 3D创作元素将入住下一代Windows 10和HoloLens中

    新 Windows 10 将会带来崭新的 3D 特性 xff0c 任何用户都可以通过内置的工具来制作发布有关 3D 增强现实 AR 和混合现实 mixed reality 的游戏和素材 北京时间 10 月 26 号晚 10 点 xff0c
  • Chrome 又不支持 HTTP/2 网站的原因

    导读昨晚偶尔清理 Chrome 插件时发现我的 HTTP 2 and SPDY indicator 插件好像好久没亮了 这个插件在你访问到一个支持 HTTP 2 xff08 或之前的 SPDY 协议 xff09 的网站时会点亮 xff0c
  • Win10/11后:Linux启动AMD处理器fTPM出现同款间歇性卡顿

    导读早在2022年3月 xff0c AMD就曾确认 xff0c 在Win10与Win11系统下 xff0c 开启锐龙处理器的fTPM xff0c 将可能导致系统出现间歇性的卡顿 死机等情况 xff0c 并发布BIOS更新进行了修复 但出乎预
  • 12 个好用且不花钱的网络监控工具

    导读要让一个多级机构运行良好而且平稳的话 xff0c 一个非常艰巨重大的任务就是做好网络管理 每个机构都配备专门的人员 xff0c 即网络分析师 xff0c 来进行网络管理 他们 使用了 许多工具来监视网络的运行状况 xff0c 并查看网络
  • Solus Linux 改变发展方向

    导读Solus 是一个独立开发的 Linux 发行版 xff0c 它的一大特色就是 Solus 自创的 Budgie 桌面环境 xff08 最新的 Fedora 也已经新增了这个桌面环境 xff09 xff0c 当然用户也可以选择其他常见的
  • 虚拟机与主机互传文件方法分享

    现在虚拟机的使用已经非常普及 xff0c 无论新手学习 xff0c 还是运维工程师搭建虚拟化平台 xff0c 都会使用到虚拟机 对个人用户来说 xff0c 非常方便就能搭建很多操作系统进行学习 xff1b 对企业用户来说更是降低了服务器的硬
  • RethinkDB成为Linux基金会的一员

    导读日前 xff0c RethinkDB项目有了新的动态 Cloud Native Computing基金会 xff08 CNCF xff09 宣布它购买了NoSQL分布式文件存储数据库RethinkDB的源代码版权 xff0c 将授权协议
  • STM32 汇编程序——串口输出 Hello world

    STM32 汇编程序 串口输出 Hello world 一 USART介绍二 Keil项目 xff08 一 xff09 新建项目 xff08 二 xff09 Hello s代码 xff08 三 xff09 编译生成hex文件 三 电路接法四
  • C语言笔记-头文件

    复习 xff1a 1 输出缓冲区 程序输出的数据并没有立即写入 文件 xff0c 而是先存储到输出缓冲区 xff0c 当满足一定条件时才写入文件中 xff1a 1 遇到 39 n 39 2 遇到输入语句 3 缓冲区满4k 4 程序结束 5
  • 不使用strcat()的字符串连接

    问题描述 在不使用strcat 的前提下 xff0c 实现两个字符串的连接 输入形式 以 39 39 为结束符的两行字符串 输出形式 将第一行字符串连接到第二行字符串 xff0c 然后打印输出 样例输入 abc def 样例输出 defab
  • pixhawk 整体架构的认识

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • 光流定位原理

    无人机上光流定位通常是借助于无人机底部的一个摄像头采集图像数据 xff0c 然后采用光流算法计算两帧图像的位移 xff0c 进而实现对无人机的定位 xff0c 这种定位手段配合GPS可以在室外实现对无人机的精准控制 xff0c 并且在市内没
  • 图形化UDP发包小工具

    文章目录 前言一 构思二 用到的python模块tkiner模块tkiner模块下载 socket模块ThreadPoolExecutor模块导入方式 编码实现客户端服务端代码 三 运行结果客户端发送消息服务端 前言 工具编写用的语言是py
  • C语言之调试技巧(VS2019编译器)

    C语言之调试技巧 xff08 VS2019编译器 xff09 一 什么是调试 xff1f 调试的作用1 1 什么是调试1 2 调试的基本步骤1 3 Debug版本和Release版本的介绍二 Windows环境调试的准备2 1 调试环境的准
  • 怎么在vscode上编写C语言代码

    1 准备工作 xff1a 在vscode的拓展里面下载安装c c 43 43 官方插件 此外 xff0c 需要安装一个c c 43 43 的编译器 MinGW xff0c MinGW 官网下载地址 xff08 点击即可进入官网 xff09
  • Ubuntu20.04系统安装ROS-noetic教程及常见问题的处理

    Ubuntu版本 xff1a 20 04 ROS版本 xff1a Noetic Ninjemys 注 xff1a Ubuntu系统版本要与ROS版本相对应 xff0c 不同版本的Ubuntu系统对应了不同的ROS版本 如Ubuntu20 0
  • 笔记(STM32篇)day2——GPIO及寄存器映射

    目录 一 GPIO结构及模式 1 推挽输出 2 开漏输出 3 复用功能输出 4 上拉 下拉输入 5 复用功能输入与模拟输入 二 寄存器映射 一 GPIO结构及模式 图1 GPIO基本结构 如图1所示为GPIO基本结构 xff0c 右侧I O
  • 笔记(STM32篇)day3——寄存器结构体、端口置位函数

    目录 一些C知识点 1 define和typedef的区别 2 结构体struct 3 结构体中 和 gt 的区别 4 c文件和 h文件的关系 5 防止重复引用 一 寄存器结构体定义 1 定义结构体变量指针 2 寄存器赋值 二 端口置位函数