32位单片机

服务热线:13828722724

32位MCU CKS32F103x8的位绑定原理与实现方法

2020-04-29 09:56:00   责任编辑:     0

  用过8051单片机的人员都了解其可以直接通过位操作进行外设的控制,比如对于单片机IO的操作可以直接P1.0=1进行输出设置或S=P1.0进行输入读取。而从8位MCU 8051转移到ARM的32位 MCU CKS32F103x8上之后基本上都变成了库函数的操作,IO也是整体操作,一时不适应,仍是怀念位操作的方便直观。其实位操作在中科芯的CKS32F103x8上也是可以实现的。



  位操作的实现与MCU内部的Memory mapping是紧密关联的,所以先看一下Memory mapping,以GPIO的操作为例,


  在外设寄存器区域分为了1MB bit band区域和32MB bit band别名两部分,其中1MB bit band区域就是库函数操作的区域,对于外设的操作都是按32bit进行的,而32MB bit band别名区域是1MB bit band区域的每个位的一个映射,这也是为什么是32倍关系的一个原因。那么如何对GPIO进行位操作呢?


  下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的:


  bit_word_addr = bit_band_base + (byte_offset×32) + (bit_number×4)


  其中:


  bit_word_addr:是别名存储器区中字的地址,它映射到某个目标位。


  bit_band_base:是别名区的起始地址,此处即是0x42000000。


  byte_offset:是某外设的偏移地址,对于GPIOA就是0x10800。


  bit_number:是目标位所在位置(0-31),比如PA3的bit_number就是3。


  通过该公式计算出的bit_word_addr就是目标位操作的地址,可以对其进行读写操作。


  下面针对GPIOA的输入(GPIOx_IDR:offset=0x08)输出(GPIOx_ODR:offset=0x0c)寄存器的绑定方式给出实例:


  1、定义bit_band_base


  #define BIT_BAND_BASE 0x42000000


  2、定义一个通用的位绑定宏


  #define BitBand(byte_offset, bit_number) *( (volatile unsigned long *)( BIT_BAND_BASE + ((byte_offset&0xFFFFF) << 5) + (bit_number << 2)))


  3、定义GPIO的byte_offset


  #define GPIOA_ODR_OFFSET (0x10800+ 0X0C)


  #define GPIOA_IDR_OFFSET (0x10800+ 0X08)


  4、对于GPIO的输出输入进行宏的位定义


  #define PAout(n) BitBand(GPIOA_ODR_OFFSET , n)


  #define PAin(n) BitBand(GPIOA_IDR_OFFSET , n)


  通过以上定义就可以在程序中采用PAout(0)=1或S=PAin(0)对GPIOA的0引脚进行输出设置和输入读取了,其他的GPIO也可以类比着进行修改即可。


电话

0755-27883824

地址:深圳市宝安区西乡街道银田创意园B8栋502

传真:0755-61204158

邮箱 : 13510937553@163.com