【GD32F427开发板试用】位带操作实现多线程下的跑马灯

news/2023/5/28 7:50:27

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:SmallWhite

一、位带操作

作用:对某一位或者几个连续的位进行操作

前言

我们在使用GD32等单片机时使用到的固件库编程,很经常会遇到位带操作,固件库对外设寄存器的每个关键bit都做了定义,例如宏定义中的:

写1:用1左移n位后和具体位进行|=的运算得到
写0:用1左移n位后取反得到第n位的0值然后和具体位进行&=的运算得到

/* GPIO_OCTL */
#define GPIO_OCTL_OCTL0            BIT(0)               
#define GPIO_OCTL_OCTL1            BIT(1)

例如上述代码中的端口输出控制寄存器(GPIOx_OCTL),和待会还要用到的端口输入状态寄存器(GPIOx_ISTA),想要实现对GPIO的某一位(某一pin)操作的话,需要知道这两个寄存器的地址
1.端口输入状态寄存器(GPIOx_ISTAT, x=A…I)
地址偏移:0x10
复位值:0x0000 XXXX
2.端口输出控制寄存器(GPIOx_OCTL, x=A…I)
地址偏移:0x14
复位值:0x0000 0000

所以说每个端口x的输入状态以及输出控制寄存器的地址=端口x基地址+寄存器的偏移地址:

#define output_offset 0x14
#define input_offset  0x10//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA+output_offset) //0X40020000U+0x0U+output_offset
#define GPIOB_ODR_Addr    (GPIOB+output_offset) //0X40020000U+0x00000400U+output_offset
#define GPIOC_ODR_Addr    (GPIOC+output_offset) //0X40020000U+0x00000800U+output_offset
#define GPIOD_ODR_Addr    (GPIOD+output_offset) 
#define GPIOE_ODR_Addr    (GPIOE+output_offset) #define GPIOA_IDR_Addr    (GPIOA+input_offset) 
#define GPIOB_IDR_Addr    (GPIOB+input_offset)  
#define GPIOC_IDR_Addr    (GPIOC+input_offset)
#define GPIOD_IDR_Addr    (GPIOD+input_offset) 
#define GPIOE_IDR_Addr    (GPIOE+input_offset)

二、实现位带操作的前提条件

1.支持位带操作的两个内存区的范围是:
0x2000_0000‐0x200F_FFFF(SRAM区中的最低1MB)
0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB)
而GPIOA~GPIOE的地址刚好在以上范围内(0x4002 0000~0x4002 1000)

2.查阅GD32的数据手册说明:

3.对于片上外设位带区的某个bit,我们假设记它所在字节地址为A,位序号为n,则该bit在别名区的地址为:
Addr=0x42000000+(A-0x40000000)_32+4_n

4.回到代码中实现:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
整体宏定义代码如下:

//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) #define output_offset 0x14
#define input_offset  0x10//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA+output_offset) //0X40020000U+0x0U+output_offset
#define GPIOB_ODR_Addr    (GPIOB+output_offset) //0X40020000U+0x00000400U+output_offset
#define GPIOC_ODR_Addr    (GPIOC+output_offset) //0X40020000U+0x00000800U+output_offset
#define GPIOD_ODR_Addr    (GPIOD+output_offset) 
#define GPIOE_ODR_Addr    (GPIOE+output_offset) #define GPIOA_IDR_Addr    (GPIOA+input_offset) 
#define GPIOB_IDR_Addr    (GPIOB+input_offset)  
#define GPIOC_IDR_Addr    (GPIOC+input_offset)
#define GPIOD_IDR_Addr    (GPIOD+input_offset) 
#define GPIOE_IDR_Addr    (GPIOE+input_offset)//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)  //输入
void Led_Flash_Task(void *p_arg)
{OS_ERR err;while(1){running_led_out=!running_led_out;OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//延时1s}
}

5.现在跑个UCOS多线程下的跑马灯看看:

可以看到正常运行串口发送线程和跑马灯线程,UCOS部分的移植也是看网上的,具体步骤还没时间去完全理清思路,现在就是能跑的状态,目前也是发的第一篇文章,如有错误请多多指教!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4554932.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

我们一起学JavaScript之面向对象

&#x1f4e6;个人主页&#xff1a;楠慧 &#x1f3c6;简介&#xff1a;一个大二的科班出身的&#xff0c;主要研究Java后端开发 ⏰座右铭&#xff1a;成功之前我们要做应该做的事情&#xff0c;成功之后才能做我们喜欢的事 &#x1f495; 过客的你&#xff0c;可以给博主留下一…

致年轻时如此拼搏的你我

离别总是伤人意 这一篇文章写在这个时候是有其特殊意义和价值&#xff0c;起码对我来说是这样的。这个时候正是一年一度的毕业季&#xff0c;而我最敬重的师兄即将要离校实习&#xff0c;很幸运的是师兄收到了很不错的 offer&#xff0c;在这里祝他能实现自己的梦想。再想一想…

和你走在南京种满梧桐的大街小巷

这是写给阿俊看的 阿俊&#xff0c;我很棒吧&#xff01;嘻嘻☺ 2017年一月初旬刚一考试结束我们就踏上了属于我们的南京之旅。出发的时候福州还下着小雨&#xff0c;到处都是湿漉漉的&#xff0c;空气里都透着冷湿&#xff0c;在去你学校的公交车上我特意查了一下南京的天气…

第7期:内卷和躺平,你怎么选

大家好&#xff0c;我是你们的老朋友老王随聊&#xff0c;今天和大家讨论的话题——内卷和躺平你怎么选&#xff1f; 通过这段时间和群里同学们交流&#xff0c;发现很多大学生甚至职场小白对IT行业里的内卷讨论的比较多。可能很多人在选择是否内卷的问题上依然处于徘徊状态&am…

Kubernets核心介绍及实战

1、资源创建方式 命令行YAML 2、Namespace 名称空间用来隔离资源 “namespace"通常被翻译为「命名空间」&#xff0c;听起来好像比较抽象&#xff0c;其实重点是在这个"space”。它和描述进程的虚拟地址空间的address space一样&#xff0c;都是提供一种独占的视角…

Excel如何将行高列宽等格式设置一并全复制?

今天要和大家分享的是&#xff0c;Excel如何将行高列宽等格式设置一并全复制&#xff1f;复制粘贴在简单不过的操作&#xff0c;但是往往粘贴过去的时候&#xff0c;尤其是行高和列宽并没有保留原来的设置&#xff0c;使得数据格式走样…… &#xff08;方方格子插件&#xff…

第五章SpringFramework之AOP

文章目录AOP概念及相关术语概述为什要用 AOP相关术语横切关注点Advice通知Join Point连接点Point CUT 切入点切面目标代理基于注解的SpringAOP准备工作切入点表达式语法重用切入点表达式对应的切面前置通知返回通知异常通知后置通知环绕通知切面的优先级总结Spring AOP 的实现步…

1995考研数一真题解析

1995考研数一真题解析

两种在CAD中加载在线卫星影像的方法

概述 经常使用CAD的朋友应该会有这样的一个烦恼&#xff0c;就是当加载卫星图到CAD中进行绘图的时候&#xff0c;由于CAD本身的限制和电脑性能等原因&#xff0c;往往不能加载太大的地图图片到CAD内&#xff0c;这里给大家介绍两种在CAD内加载在线卫星影像的方法&#xff0c;希…

android关闭权限管理,Android6.0权限管理以及使用权限该注意的地方

Android 6.0 Marshmallow首次增加了执行时权限管理&#xff0c;这对用户来说&#xff0c;能够更好的了解、控 制 app 涉及到的权限。然而对开发人员来说却是一件比較蛋疼的事情。须要兼容适配&#xff0c;并保证程序功能的正常执行。什么叫执行时权限管理呢&#xff1f;在Andro…

posix API与网络协议栈

posix API与网络协议栈 scoket socket包含两部分&#xff1a;fd、tcb&#xff08;tcp control block&#xff09; 其中&#xff0c;fd属于文件系统&#xff0c;可在用户态进行操控&#xff1b;而tcb属于内核协议栈 三次握手 服务端API socekt()&#xff1a;创建一个tcb和f…

Java设计模式-观察者模式Observer

介绍 观察者模式是行为设计模式之一。当您对对象的状态感兴趣并希望在任何更改时得到通知时&#xff0c;观察者设计模式非常有用。在观察者模式中&#xff0c;观察另一个对象状态的对象被称为观察者&#xff0c;而被观察的对象则被称为主体。 优点 观察者模式设计后&#xff0…

史上最全金融产品架构分析四:信托公司

1.业务种类 信托业可以经营的业务项目依《信托投资公司管理办法》法可分为如下&#xff1a; &#xff08;1&#xff09;受托经营资金信托业务。即委托人将自己合法拥有的资金&#xff0c;委托信托投资公司按照约定的条件和目的&#xff0c;进行管理、运用和处分。 &#xff08…

一切技术创新史都是数据史

文/李根 ligenqbitai.com量子位 出品 | 公众号 QbitAI你可曾想过这样一个问题&#xff1a;如果以技术创新、科技发展而论&#xff0c;我们当前正处在一个怎样的周期&#xff1f;有按照热门技术领域的定义&#xff0c;比如这是一个AI、5G和区块链等交叉交融的时代。也有按照应用…

RPC框架泛调用原理及转转的实践

RPC框架泛化调用功能在网关、接口测试等场景下有着广泛的需求&#xff0c;本文给各位读者介绍一下主流的泛化调用实现方式及原理&#xff0c;比较各种实现方案的优缺点&#xff0c;并分享泛化调用在转转的实践。一方面有助于RPC框架使用方理解泛化调用&#xff0c;更好地使用泛…

读懂消费贷款之中国消费金融发展史

读懂消费贷款之中国消费金融发展史 本期让我们来了解以下中国消费金融的发展史吧~ 中国消费金融发展史大致可以分为四个阶段&#xff1a;萌芽期、试点期、发展期、规范期。 萌芽期&#xff08;1985-2009&#xff09; 主要提供服务方为商业银行和汽车金融公司。这个阶段主…

世界是部金融史

世界是部金融史 作者 : 陈雨露、杨栋 出版年: 2011-1页数: 286定价: 39.50元ISBN: 9787200085303历史、政治、经济&#xff0c;三门学科结合在一起讲&#xff0c;还讲的很有意思&#xff0c;一个下午看完&#xff0c;其中几点印象深刻&#xff1a;1. 中国历史中皇帝的集权过程…

VScode快速配置C/C++环境

文章目录我安装时仅参考了这两篇分享1.下载并安装VScode 商店C/C插件2.下载MinGW-W64 x86_64-win32-seh3.配置各种.json5.Hello_world.cpp测试我安装时仅参考了这两篇分享 伸手党进&#xff1a;具体步骤主要是这篇&#xff1a;Hudiscount-Vscode配置C/C环境 MinGW-W64 x86_64-…

与姬十三探讨如何42天搞定2500万美金投资,创业秘密都在这里

PMCAFF&#xff08;pmcaff.com&#xff09;&#xff1a;最大互联网产品社区&#xff0c;是百度&#xff0c;腾讯&#xff0c;阿里等产品经理的学习交流平台。定期出品深度产品观察&#xff0c;互联产品研究首选。还在遗憾错过分答发布会第一现场&#xff1f;在行分答深度报告读…

渣渣二本的辛酸面试之路~

点击上方“IT平头哥联盟”&#xff0c;选择“置顶或者星标”你的关注意义重大&#xff01;作者&#xff1a;jsonchao链接&#xff1a;https://juejin.im/post/5caf0f89f265da038145c66e一篇非常接地气的面试心得&#xff0c;作者也通过自己的努力&#xff0c;找到了不错的工作。…