当前位置:网站首页>[Punctuality Atom] Simple application of sys.c, sys.h bit-band operations
[Punctuality Atom] Simple application of sys.c, sys.h bit-band operations
2022-07-30 07:13:00 【Clockwisee】
前言
Because I follow the Jiangke University Self-Chemistry Association to studystm32c8t6最小系统板,when browsing other people's code,It is found that the big guys like to use the bit band operation,After learning through the official video of Punctual Atom,It is found that this is no different from the use of library functions.
个人理解
Bit-band operations are mostly rightGPIO口的操作,It is to encapsulate some register addresses、映射,to form with51MCU similar register operation
代码呈现
This code is intercepted from the battleship of the punctual atomv3(Also the elite version)第十五讲-Write the marquee experiment by hand-位操作
sys.c This can be ignored first
#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
Even bit manipulation,也少不了IOPort call clock and initialization,说白了,It's about library functionsGPIO_SetBits、GPIO_ResetBits分别用0、1替换
Submit the code below:
main.c
#include "stm32f10x.h"
#include "led.h"
#include "delay.h" //没有加#include"sys.h"是因为delay.hThe header files are already included
/************************************************ 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 输出高
}
边栏推荐
猜你喜欢

【江科大自化协stm32F103c8t6】笔记之【入门32单片机及利用TIM输出比较配置PWM】

DeepLearing4j深度学习之Yolo Tiny实现目标检测

十三、Kotlin进阶学习:内联函数let、also、with、run、apply的用法。

树莓派OpenCV+OpenCV-contrib

十五、Kotlin进阶学习:一、子类与子类型;二、协变;三、逆变;

三种内核结构---宏内核、微内核、混合内核

边境的悍匪—机器学习实战:第十章 Keras人工神经网络简介

QT串口动态实时显示大量数据波形曲线(四)========“界面的美化与处理”

QT连载4:基于QT和STM32H750的LORA试验平台(3)

七、Kotlin基础学习:1、创建类;2、构造函数;3、继承;4、封装;5、抽象类;6、接口;7、嵌套类;8、内部类;9、枚举类
随机推荐
Xcode 绑定按钮点击事件
十八、Kotlin进阶学习:1、挂起函数执行的顺序;2、使用 async 和 await 异步执行挂起函数;3、协程的调度器;4、父子协程;
OpenCV中(rows,cols)与图像(x,y)
QT连载3:基于QT和STM32H750的LORA试验平台(2)
Kotlin协程的简单用法:1、GlobalScope(不建议使用);2、lifecycleScope、viewModelScope(建议使用);
基于全球模式比较计划CMIP6与区域气候-化学耦合模式 WRF-Chem 的未来大气污染变化模拟
HSPF 模型应用
基于PyTorch深度学习无人机遥感影像目标检测、地物分类及语义分割
Configure MMdetection environment and train
Jdbc & Mysql timeout analysis
Common exception analysis of Redis client
DeepLearing4j深度学习之Yolo Tiny实现目标检测
思谋面试准备
C语言实战小项目(传统卡牌游戏)
单例模式:Swift 实现
CLUE模型构建方法、模型验证及土地利用变化情景预测
【江科大自化协stm32F103c8t6】笔记之【入门32单片机及TIM定时中断初始化参数配置】
R-GIS: 如何用R语言实现GIS地理空间分析及模型预测
Receive emails from gmail with pop3
基于遥感解译与GIS技术环境影响评价图件制作(最新导则)