[开发工具] 【华大测评】+HC32F460开发板之位段(bit band)功能

[复制链接]
4034|36
 楼主| qjp1988113 发表于 2020-9-30 12:35 | 显示全部楼层 |阅读模式
本帖最后由 qjp1988113 于 2020-9-30 12:42 编辑

今天测试下HC32F460的位段功能。由于官方没提供例程,该程序由正点原子STM32对应的程序修改。
先来看下华大手册的官方描述:
11.png
写的比较简单,也未给出详细的具体操作说明。
下面给出STM32关于位段操作的说明,含地址对应公式:
33.png
44.png
我们参考M3编程手册--《Cortex M3权威指南》里面的位段说明,因为它是中文版本。
77.png
很明显位段的功能,就是把外设寄存器BIT位的操作控制等效为一个32为地址寄存器的操作。
我们往这个地址写读均能得到对应外设寄存器BIT位等效的回应。当然这个等效的寄存器地址
跟外设是有一定关联的。
再具体大家可以去看上面的那本书。
华大HC32F460的例程里面对于寄存器的定义划分和ST还是有差异的,我们查找手册(我们这里仅仅做IO输出输入的控制):
111.png
222.png
333.png
有这3个寄存器的明细,我们就可以开始了:
//periBitBand         0X42000000 ~0X43FFFFFF  32M
//GPIO  0X40053800 ~0X40053FFF  1K

#define GPIO_BASE       (0x40053800ul)
//位带操作,实现51类似的GPIO控制功能
//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))
//IO口地址映射
#define GPIOA_ODR_Addr    (GPIO_BASE+0X04+0X10*0) //0x40020014
#define GPIOB_ODR_Addr    (GPIO_BASE+0X04+0X10*1) //0x40020414
#define GPIOC_ODR_Addr    (GPIO_BASE+0X04+0X10*2) //0x40020814
#define GPIOD_ODR_Addr    (GPIO_BASE+0X04+0X10*3) //0x40020C14
#define GPIOE_ODR_Addr    (GPIO_BASE+0X04+0X10*4) //0x40021014   
#define GPIOH_ODR_Addr    (GPIO_BASE+0X04+0X10*5) //0x40021C14   


#define GPIOA_IDR_Addr    (GPIO_BASE+0x00+0X10*0) //0x40020010
#define GPIOB_IDR_Addr    (GPIO_BASE+0x00+0X10*1) //0x40020410
#define GPIOC_IDR_Addr    (GPIO_BASE+0x00+0X10*2) //0x40020810
#define GPIOD_IDR_Addr    (GPIO_BASE+0x00+0X10*3) //0x40020C10
#define GPIOE_IDR_Addr    (GPIO_BASE+0x00+0X10*4) //0x40021010
#define GPIOH_IDR_Addr    (GPIO_BASE+0x00+0X10*5) //0x40021C10


//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 PHout(n)   BIT_ADDR(GPIOH_ODR_Addr,n)  //输出
#define PHin(n)    BIT_ADDR(GPIOH_IDR_Addr,n)  //输入

在加入上诉定义之后后,我们就可以使用了。
我们定义:
//IO输出
#define  LED0   PEout(6)
#define  LED1   PAout(7)
#define  LED2   PBout(5)
#define  LED3   PBout(9)


//IO输入
#define KEY0                 PDin(3)           //PD3
#define KEY1                 PDin(4)                //PD4
#define KEY2                 PDin(5)                //PD5
#define KEY3                 PDin(6)                //PD6


当然IO口的初始化程序要另写。
//按键扫描程序:
uint8_t KEY_Scan(uint8_t mode)                  //按键扫描函数
{
        static uint8_t key_up=1;//按键按松开标志
        if(mode)key_up=1;  //支持连按                  
        if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==0))
        {
                delay_ms(10);//去抖动
                key_up=0;
                if(KEY0==0)return 1;
                else if(KEY1==0)return 2;
                else if(KEY2==0)return 3;
                else if(KEY3==0)return 4;
        }else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1)key_up=1;            
         return 0;// 无按键按下
}


main函数里面的调用:
key=KEY_Scan(0);                //得到键值
if(key)
{                                                   
        switch(key)
        {                                 
                case KEY0_PRES:        //控制LED0翻转
                        LED0=!LED0;
                        break;
                case KEY1_PRES:        //控制LED1翻转         
                        LED1=!LED1;
                        break;
                case KEY2_PRES:        //控制LED2翻转
                        LED2=!LED2;
                        break;
                case KEY3_PRES:        //控制LED3翻转
                        LED3=!LED3;
                        break;
        }
}else delay_ms(10);

编译下载,具体现象:

5b104e311f95c52e39d9b77382434767 (1).gif
好了,今天就到这!






zeshoufx 发表于 2020-9-30 17:05 | 显示全部楼层
谢谢分享【HC32F460开发板之位段(bit band)功能】
qcliu 发表于 2020-10-11 17:01 | 显示全部楼层
非常感谢楼主分享
tfqi 发表于 2020-10-11 17:01 | 显示全部楼层
介绍的非常详细
wiba 发表于 2020-10-11 17:02 | 显示全部楼层
非常有参考价值
zljiu 发表于 2020-10-11 17:03 | 显示全部楼层
楼主辛苦 了
coshi 发表于 2020-10-11 17:03 | 显示全部楼层
资料非常不错
djx0 发表于 2021-12-29 12:14 | 显示全部楼层
很实用,感谢分享
mdc9 发表于 2022-5-19 15:28 | 显示全部楼层
mark!!!!!!!!!!!!!!!!!!
burgessmaggie 发表于 2022-6-12 16:34 | 显示全部楼层
正准备学习的朋友推荐下载。                                 
claretttt 发表于 2022-6-12 16:45 | 显示全部楼层
资料够全的,多谢分享                                 
maudlu 发表于 2022-6-12 16:56 | 显示全部楼层
内容还是非常丰富的                                 
ccook11 发表于 2022-6-12 17:06 | 显示全部楼层
分享的资料很高端呢。                                    
eefas 发表于 2022-6-12 17:17 | 显示全部楼层
回复查看一下相关的内容。                                 
lzmm 发表于 2022-6-12 17:28 | 显示全部楼层
内容还是非常丰富的                                 
fentianyou 发表于 2022-6-12 17:39 | 显示全部楼层
这些资料太全了!!!                 
ingramward 发表于 2022-6-12 17:50 | 显示全部楼层
分享的资料很高端呢。                                    
suzhanhua 发表于 2022-6-12 18:00 | 显示全部楼层
  应用还是很广泛的                                 
jackcat 发表于 2022-6-12 18:11 | 显示全部楼层
分享的资料很高端呢。                                    
cashrwood 发表于 2022-6-12 18:22 | 显示全部楼层
以后学习就方便了                                 
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部