当前位置: 首页 > news >正文

东莞网站优化服务公司天河做网站开发

东莞网站优化服务公司,天河做网站开发,烟台网站建设方案书,怎么做能让网站收录的快前言 我们讲了GPIO的输出#xff0c;虽然我们使用的是固件库编程#xff0c;但是最底层的操作是什么呢#xff1f;对#xff0c;我们学习过51单片机的同学肯定学习过 sbit 修改某一位的高低电平#xff0c;从而实现对于硬件的控制。那么我们现在在STM32中有没有相似的操作… 前言 我们讲了GPIO的输出虽然我们使用的是固件库编程但是最底层的操作是什么呢对我们学习过51单片机的同学肯定学习过 sbit 修改某一位的高低电平从而实现对于硬件的控制。那么我们现在在STM32中有没有相似的操作呢答案肯定是有的。那么我们今天就来讲讲位带操作。 创作不易点个三连不迷路 STM32第八节位带操作——GPIO输出和输入 位带 位带简介 P00xFE; //总线操作sbit LED1 P0^0; //位操作 LED1 0 如此这般就是总线操作与位操作的区别在51单片机中。那么我们在32中该如何操作呢          位操作就是可以单独的对一个bit位进行读和写的过程。51 单片机中通过关键字 sbit 来实现位定义而 STM32 是通过访问位带别名区来实现。         在 STM32 中有两个地方实现了位带一个是 SRAM 区的最低 1MB 空间另一个是外设区最低 1MB 空间。这两个 1MB 的空间除了可以像正常的 RAM 一样操作外他们还有自己的位带别 名区位带别名区把这 1MB 的空间的每一个位膨胀成一个 32 位的字当访问位带别名区的这些 字时就可以达到访问位带区某bit位的目的。 如图所示 我们以ODR寄存器为例而位带操作就是把寄存器中的每一个位都重新找了个地址。这个地址在位带别名区内而且在位带别名区里会膨胀成4个字节但是操作的时候只有最低位有效ODR0。 位带区分布  在位带操作中不止止是片上外设会有位带操作而且SRAM也会有1MB的位带区位带区里面的每一个位都可以通过位带别名区的地址来访问一位为四个字节。 结合上述例子我们知道GPIO_ODR的基地址那么我们怎么知道每一位所对应的地址呢那么我们就有了位带区与位带别名区地址转换。 位带区与位带别名区地址转换 位带区地址与位带别名区的地址之间的转换         接着我就来给大家讲解一下转换的公式的具体含义及代码展示。 前一个呢是位带别名区地址0x 4200 0000 和 0x 2200 0000.接着呢就是A-0x 2000 0000这个算出来的是偏移地址字节。一个字节有八个位而一个位是四个字节。n*4为字节的偏移数n为位号。从公式来看我们只需要知道A以及n就可以算出位带地址。再编程上来说可以统一用一个公式表示 // AliasAddr 0x42000000 (A-0x40000000)*8*4 n*4 // AliasAddr 0x22000000 (A-0x20000000)*8*4 n*4// 把“位带地址 位序号”转换成别名地址的宏 #define BITBAND(addr, bitnum) ((addr 0xF0000000)0x02000000((addr 0x00FFFFFF)5)(bitnum2)) 为了方便操作我们可以把这两个公式合并成一个公式把“位带地址 位序号”转换成别名区地址统一成一个宏。 addr 0xF0000000 是为了区别 SRAM 还是外设实际效果就是取出 4 或者 2如果是外设则取出的是 40X02000000 之后就等于 0X420000000X42000000 是外设别名区的起始地址。如果是 SRAM则取出的是 20X02000000 之后就等于 0X220000000X22000000 是 SRAM 别名区的起始地址。addr 0x00FFFFFF 屏蔽了高三位相当于减去 0X20000000 或者 0X40000000。 外设的最高地址是0X20100000跟起始地址 0X20000000 相减的时候总是低5位才有效所以就把高三位屏蔽掉来达到减去起始地址的效果具体屏蔽掉多少位跟最高地址有关。SRAM 同理分析。«5 相当于 *8*4«2 相当于 *4。 最后我们就可以通过指针的形式操作这些位带别名区地址最终实现位带区的bit位操作。 // 把一个地址转换成一个指针 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))// 把位带别名区地址转换成指针 #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) 编写程序——实现GPIO上的位带输出操作 使用位带的方式访问GPIO的ODR寄存器 拷贝一份上节课的代码并稍作修改使用条件编译使得上一部分代码编译下一部分代码不编译。我们看到上一部分代码是使得LED2即绿色自动亮灭亮灭中间稍作迟缓 #include stm32f10x.h // 相当于51单片机中的 #include reg51.h #include bsp_led.h #include bsp_key.hvoid Delay(uint32_t count) {for(;count!0;count--); }int main(void) { LED_GPIO_Config();LED_KEY_Config(); #if 1while(1){//GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);LED2(OFF);Delay(0xFFFFF);//GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);LED2(ON);Delay(0xFFFFF);} #elsewhile(1) { if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) KEY_ON ){LED1(ON);}if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) KEY_ON ){LED2_TOGGLE;} } #endif } 那么输出怎么写呢我们现在开始操作ODR寄存器从公式上看我们要先写进去通用的公式然后用n代替参量写一个带参宏出来然后强制转换为地址并使用指针操作加上 * 。然后再定义一个GPIOB_ODR_Addr用来表示(GPIOB_BASE0x0c)基地址加偏移量 #define GPIOB_ODR_Addr (GPIOB_BASE0x0c) #define PBOut(n) *(unsigned int*)((GPIOB_ODR_Addr 0xF0000000)0x02000000((GPIOB_ODR_Addr 0x00FFFFFF)5)(n2))然后我们就可以在main函数中做修改如此这般我们就通过位带操作实现了操作寄存器从而实现LED灯的亮灭 while(1){PBOut(0) 1;Delay(0xFFFFF);PBOut(0) 0;Delay(0xFFFFF);} 完整代码展示 #include stm32f10x.h // 相当于51单片机中的 #include reg51.h #include bsp_led.h #include bsp_key.h#define GPIOB_ODR_Addr (GPIOB_BASE0x0c) #define PBOut(n) *(unsigned int*)((GPIOB_ODR_Addr 0xF0000000)0x02000000((GPIOB_ODR_Addr 0x00FFFFFF)5)(n2))void Delay(uint32_t count) {for(;count!0;count--); }int main(void) { LED_GPIO_Config();LED_KEY_Config();#if 1while(1){PBOut(0) 1;Delay(0xFFFFF);PBOut(0) 0;Delay(0xFFFFF);} #elsewhile(1) { if(Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN)KEY_ON)LED1(ON);if(Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN)KEY_ON)LED2_TOGGLE;} #endif }同样的原理打开别的颜色的灯 从原理图可知我们要打开BLUE灯就是打开PB1口即把PBOut0改为PBOut1即可其他的以此类推。 编写程序——实现GPIO上的位带输入操作 使用位带的方式访问GPIO的IDR寄存器 输入的话就该操作下面一部分代码了。首先我们要算出IDR的这个第0位地址为 #define GPIOA_IDR_Addr (GPIOA_BASE0x08) #define PAin(n) *(unsigned int*)((GPIOA_IDR_Addr 0xF0000000)0x02000000((GPIOA_IDR_Addr 0x00FFFFFF)5)(n2))#define GPIOC_IDR_Addr (GPIOA_BASE0x08) #define PCin(n) *(unsigned int*)((GPIOC_IDR_Addr 0xF0000000)0x02000000((GPIOC_IDR_Addr 0x00FFFFFF)5)(n2))那么我们发现我们写的Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN)和Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN)函数就没有用了我们在这里修改为 while(1) { // if(Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN)KEY_ON) // LED1(ON); // if(Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN)KEY_ON) // LED2_TOGGLE;if(PAin(0)KEY_ON){while(PAin(0)KEY_ON);LED1(ON);}if(PCin(13)KEY_ON){while(PCin(13)KEY_ON);LED2_TOGGLE;}} 这里我们使用了两种方式来实现按键控制LED灯的亮灭分别控制PA0和PC13端口。  完整代码展示 #include stm32f10x.h // 相当于51单片机中的 #include reg51.h #include bsp_led.h #include bsp_key.h#define GPIOA_IDR_Addr (GPIOA_BASE0x08) #define PAin(n) *(unsigned int*)((GPIOA_IDR_Addr 0xF0000000)0x02000000((GPIOA_IDR_Addr 0x00FFFFFF)5)(n2))#define GPIOC_IDR_Addr (GPIOA_BASE0x08) #define PCin(n) *(unsigned int*)((GPIOC_IDR_Addr 0xF0000000)0x02000000((GPIOC_IDR_Addr 0x00FFFFFF)5)(n2))int main(void) { LED_GPIO_Config();LED_KEY_Config();while(1) { if(PAin(0)KEY_ON){while(PAin(0)KEY_ON);LED1(ON);}if(PCin(13)KEY_ON){while(PCin(13)KEY_ON);LED2_TOGGLE;}} } 小结 到这里我们的课程就结束啦从下一节开始就是中级篇的讲解了我们下次见咯 创作不易点个三连不迷路
http://www.zqtcl.cn/news/904937/

相关文章:

  • ui在线设计网站滁州 来安县建设局网站
  • 做印尼购物网站如何发货wordpress怎么换中文
  • 深圳方维网站建设公司企业网站推广方式和策略
  • 沙洋县住房和城乡建设局网站单页网站下载
  • 江宁区住房建设局网站建设工程扣分查询网站
  • wordpress火车采集优化算法分类
  • 厦门做网站公司有哪些有什么好的加盟店项目
  • wap网站开发技术怎么做消费信贷网站
  • 公司网站开发外包公司深圳网站建设sz886
  • 中英文网站建设需要懂英语吗电气网站设计
  • 双语网站用什么程序做新网站如何被网站收录
  • 怎么做视频平台网站想开个小说网站怎么做
  • 网站安全监测预警平台建设成效阐述网络营销策略的内容
  • 网站上的qq如何做悬浮沧州做网站的公司
  • 电子商务网站系统规划报告移动商城 网站建设方法方式
  • 网站建设架构选型引擎seo优
  • 什么电脑做网站前段用网站建设工作人员有哪些职责
  • 网站建设技巧网站建设 总结
  • 有站点网络营销平台搜一下百度
  • 沈阳网站建设找德泰诺wordpress 访客计数器
  • 专业网站建设价格分析企业展示型网站建设方案
  • 东丽做网站公司帮做网站的公司
  • 网站的icon图标做多大验证wordpress
  • html制作音乐网站代码已经买了域名怎么做网站
  • 网站做收付款接口山东专业的制作网站
  • 龙岗建设高端网站如何建立网站会员系统吗
  • 中国建设银行的网站色彩wordpress 图片采集器
  • 渭南做网站价格江西省城乡住房建设部网站
  • 个人网站可以做充值安徽建设厅网站首页
  • 技术支持 东莞网站建设石材小企业网站建设查询