打印
[开发工具]

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

[复制链接]
2867|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 qjp1988113 于 2020-9-30 12:42 编辑

今天测试下HC32F460的位段功能。由于官方没提供例程,该程序由正点原子STM32对应的程序修改。
先来看下华大手册的官方描述:

写的比较简单,也未给出详细的具体操作说明。
下面给出STM32关于位段操作的说明,含地址对应公式:


我们参考M3编程手册--《Cortex M3权威指南》里面的位段说明,因为它是中文版本。

很明显位段的功能,就是把外设寄存器BIT位的操作控制等效为一个32为地址寄存器的操作。
我们往这个地址写读均能得到对应外设寄存器BIT位等效的回应。当然这个等效的寄存器地址
跟外设是有一定关联的。
再具体大家可以去看上面的那本书。
华大HC32F460的例程里面对于寄存器的定义划分和ST还是有差异的,我们查找手册(我们这里仅仅做IO输出输入的控制):



有这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);

编译下载,具体现象:


好了,今天就到这!






使用特权

评论回复
沙发
zeshoufx| | 2020-9-30 17:05 | 只看该作者
谢谢分享【HC32F460开发板之位段(bit band)功能】

使用特权

评论回复
板凳
qcliu| | 2020-10-11 17:01 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
地板
tfqi| | 2020-10-11 17:01 | 只看该作者
介绍的非常详细

使用特权

评论回复
5
wiba| | 2020-10-11 17:02 | 只看该作者
非常有参考价值

使用特权

评论回复
6
zljiu| | 2020-10-11 17:03 | 只看该作者
楼主辛苦 了

使用特权

评论回复
7
coshi| | 2020-10-11 17:03 | 只看该作者
资料非常不错

使用特权

评论回复
8
djx0| | 2021-12-29 12:14 | 只看该作者
很实用,感谢分享

使用特权

评论回复
9
mdc9| | 2022-5-19 15:28 | 只看该作者
mark!!!!!!!!!!!!!!!!!!

使用特权

评论回复
10
burgessmaggie| | 2022-6-12 16:34 | 只看该作者
正准备学习的朋友推荐下载。                                 

使用特权

评论回复
11
claretttt| | 2022-6-12 16:45 | 只看该作者
资料够全的,多谢分享                                 

使用特权

评论回复
12
maudlu| | 2022-6-12 16:56 | 只看该作者
内容还是非常丰富的                                 

使用特权

评论回复
13
ccook11| | 2022-6-12 17:06 | 只看该作者
分享的资料很高端呢。                                    

使用特权

评论回复
14
eefas| | 2022-6-12 17:17 | 只看该作者
回复查看一下相关的内容。                                 

使用特权

评论回复
15
lzmm| | 2022-6-12 17:28 | 只看该作者
内容还是非常丰富的                                 

使用特权

评论回复
16
fentianyou| | 2022-6-12 17:39 | 只看该作者
这些资料太全了!!!                 

使用特权

评论回复
17
ingramward| | 2022-6-12 17:50 | 只看该作者
分享的资料很高端呢。                                    

使用特权

评论回复
18
suzhanhua| | 2022-6-12 18:00 | 只看该作者
  应用还是很广泛的                                 

使用特权

评论回复
19
jackcat| | 2022-6-12 18:11 | 只看该作者
分享的资料很高端呢。                                    

使用特权

评论回复
20
cashrwood| | 2022-6-12 18:22 | 只看该作者
以后学习就方便了                                 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

粉丝