01、【正点原子】sys.c、sys.h位带操作的简单应用

一、前言

由于本人跟着江科大自化协学习stm32c8t6最小系统板,在浏览其他人代码的时候,发现大佬都喜欢使用位带操作,通过正点原子官方视频学习之后,发现这就是库函数的一种使用。

二、个人理解

位带操作主要是对GPIO口的操作,是将一些寄存器地址通过封装、映射,使之形成与51单片机类似的寄存器操作,但之前也同样需要对IO进行初始化。

三、代码呈现

本代码截取于正点原子的战舰v3(也是精英版的)第十五讲-手把手编写跑马灯实验-位操作

sys.c 这个可以先不研究

#include "sys.h"

//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK Mini STM32开发板
//系统中断分组设置化		   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/10
//版本:V1.4
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//********************************************************************************  
//THUMB指令不支持汇编内联
//采用如下方法实现执行汇编指令WFI  
void WFI_SET(void)
{
	__ASM volatile("wfi");		  
}
//关闭所有中断
void INTX_DISABLE(void)
{		  
	__ASM volatile("cpsid i");
}
//开启所有中断
void INTX_ENABLE(void)
{
	__ASM volatile("cpsie i");		  
}
//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(u32 addr) 
{
    MSR MSP, r0 			//set Main Stack value
    BX r14
}

sys.h 这个就重要了

#ifndef __SYS_H
#define __SYS_H	
#include "stm32f10x.h"
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板		   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/8/18
//版本:V1.7
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
// 	 

//0,不支持ucos
//1,支持ucos
#define SYSTEM_SUPPORT_OS		0		//定义系统文件夹是否支持UCOS
																	    
	 
//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))   //addr 地址  bit 比特
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 
 
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

//以下为汇编函数
void WFI_SET(void);		//执行WFI指令
void INTX_DISABLE(void);//关闭所有中断
void INTX_ENABLE(void);	//开启所有中断
void MSR_MSP(u32 addr);	//设置堆栈地址

#endif

即使是位操作,也少不了IO口调用时钟和初始化,说白了,就是讲库函数里面的GPIO_SetBits、GPIO_ResetBits分别用0、1替换
在这里插入图片描述
下面献上代码:
main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"    //没有加#include"sys.h"是因为delay.h里面头文件已经包含了

/************************************************
 ALIENTEK 战舰STM32F103开发板实验0
 工程模板
 注意,这是手册中的新建工程章节使用的main文件 
 技术支持:www.openedv.com
 淘宝店铺:http://eboard.taobao.com 
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者:正点原子 @ALIENTEK
************************************************/

 
 int main(void)
 {	
 
	 delay_init();
	 
	 LED_Init();
	 
	 while(1){
	 
	  PBout(5)=1;
		PEout(5)=1;

	  delay_ms(500);
		 
	  PBout(5)=0;
		PEout(5)=0;
		 
		 delay_ms(500);
	 
	 
	 }
	 
 }

这是在led.c里面的初始化

#include "led.h"

//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//LED驱动代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/2
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved									  
// 	   

//初始化PB5和PE5为输出口.并使能这两个口的时钟		    
//LED IO初始化
void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB,PE端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5 输出高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5 端口配置, 推挽输出
 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5 输出高 
}
 
  • 13
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
### 回答1: STM32是意法半导体推出的一系列32位微控制器产品,sys.h是其系统头文件之一,用于定义系统级别的函数、宏和变量。 在进行STM32开发时,我们需要下载sys.h头文件并添加到工程中。 首先,我们需要到意法半导体官方网站或其他可靠资源网站下载STM32的软件开发工具包(如STM32CubeMX、STM32CubeIDE等)。这个软件开发工具包中包含了完整的STM32开发环境和相应的例程。 在软件开发工具包中,通常会自带sys.h头文件,也可以从对应的库文件中找到该头文件。 将sys.h头文件复制到自己的工程目录中的合适位置,通常是放在工程文件夹的Inc目录下。 在工程的源文件(通常是.c文件)中,通过#include指令引入sys.h头文件。例如,在main.c文件中,可以使用以下代码引入sys.h头文件: #include "sys.h" 下载并引入sys.h头文件后,我们就可以在代码中使用其中定义的函数、宏和变量了。例如,可以使用其中的宏定义来配置系统时钟,也可以使用其中的函数来配置中断或其他系统级别的操作。 总之,STM32sys.h头文件是STM32开发中的一个重要组成部分,通过下载并引入该头文件,我们可以方便地访问其中定义的系统级别函数、宏和变量,进行系统级别的配置和操作。 ### 回答2: STM32sys.h是一个头文件,主要用于定义STM32系列微控制器的一些系统和寄存器操作的宏和函数。sys.h文件中包含了一些宏定义,用于配置系统的时钟源和频率,以及一些系统相关的设置。在编写STM32的嵌入式软件时,可以包含sys.h头文件来方便地使用其中定义的宏和函数。通过这些定义,我们可以方便地控制和配置STM32的系统时钟、外设时钟和中断等。 为了使用sys.h头文件,我们需要先在工程中引入这个头文件,然后根据需要使用其中的宏和函数。通常情况下,我们可以在代码的开头使用以下代码来引入sys.h头文件: #include "stm32f10x.h" #include "sys.h" 在sys.h头文件中,我们可以找到例如以下这些常用的宏和函数的定义: - RCC和GPIO相关的定义和函数,用于配置和控制系统时钟和GPIO引脚。 - NVIC和中断相关的定义和函数,用于配置和控制外部和内部中断。 - NVIC和SCB相关的定义和函数,用于配置和控制系统的异常和异常处理。 - PWR相关的定义和函数,用于配置和控制电源管理。 - DMA相关的定义和函数,用于配置和控制直接存储器访问。 - SYSCLK和AHB/APB时钟相关的定义和函数,用于配置和控制系统时钟频率。 总的来说,sys.h头文件是STM32微控制器的系统级别头文件,提供了一系列用于配置和控制系统的宏和函数。通过引入sys.h头文件,我们可以方便地进行STM32的系统级别的设置和操作,从而更好地开发STM32嵌入式应用。 ### 回答3: STM32sys.h文件是在STM32片上系统中使用的头文件之一。它包含了有关系统时钟和外设模块的配置信息和函数定义。 首先,我们需要知道sys.h文件是由STM32提供的标准外设库(Standard Peripheral Library,也称为SPL)中的一个文件。SPL库是由STMicroelectronics提供的,用于简化STM32系列微控制器的外设模块和系统功能的配置和编程。 要下载sys.h文件,我们可以在STMicroelectronics的官方网站上找到SPL库的下载链接。在官方网站的支持页面中,我们可以找到与我们使用的具体STM32型号相对应的SPL库。 下载完成后,我们将得到一个zip压缩文件。我们需要解压缩这个文件,然后在解压缩的文件夹中找到sys.h文件。 找到sys.h文件后,我们可以将它复制到我们的工程项目中的合适位置。然后我们需要在我们的代码中引入这个头文件。 在代码中包含sys.h文件后,我们可以使用其中定义的函数和宏来配置和控制系统时钟和外设模块。这些函数和宏提供了一些方便的接口,使得我们可以轻松地配置系统的时钟源、时钟分频系数以及各个外设模块的初始化和控制。 总而言之,下载STM32sys.h文件需要从STMicroelectronics的官方网站找到并下载到我们的项目中。然后,我们可以使用其中定义的函数和宏来进行系统时钟和外设模块的配置和控制。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clockwisee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值