#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr(GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr(GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr(GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr(GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr(GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr(GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr(GPIOG_BASE+12) //0x40011E0C
#define GPIOA_IDR_Addr(GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr(GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr(GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr(GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr(GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr(GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr(GPIOG_BASE+8) //0x40011E08
#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 PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n)BIT_ADDR(GPIOF_IDR_Addr,n) //输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n)BIT_ADDR(GPIOG_IDR_Addr,n) //输入
可以像51一样进行位 *** 作
换芯片,改电路,底层肯定要重写的。写程序有个好习惯还是很重要的。下面说一下移植方面的习惯,
提高移植性,最重要的手段就是隐藏硬件实现的细节,把逻辑与底层分开。
举个例子,LED闪一下亮一下,P1_0=0在51上就是一句话的事。就这一句,就有三个地方涉及硬件,(1)硬件上是P1.0接LED,(2)硬件上低电平亮,相应的是高电平灭,(3)硬件是用的51,用了51独有的位 *** 作。
换个电路,或者换个芯片,这些都要重新改写。假设程序里面有十个地方需要亮灯,移植时就要改十个地方。把亮灯这件事定义成一个函数,或者叫方法,或者叫 *** 作,把具体的 *** 作细节隐藏起来,只表示出做了一件什么事情--亮灯。像这样,voidLED_ON(void)在主程序里面,或者说在应用层的程序中调用LED_ON()就是亮灯,具体怎么亮灯,应用程序不管,也不能管,而是由单独的底层程序来做,也就是LED_ON这个函数的内容,是放在单独的一个文件中。用51,就写一个51下的底层,要移植,要用CM3就写一个CM3的底层,主程序可以不用改动,至少是尽量少改动。
为了提高移植性,尽量用标准的C写代码,涉及不同编译系统的实现细节,也要注意隐藏细节,前面的硬件细节,这个算是软件的细节吧。
比如sfr,sbit,interrupt这些,都是51独有的,换到不同的系统上,都需要重写。处理办法也是一样的,隐藏起来,放到单独的底层文件中。
基本上,做到这两步,程序的移植性会提高很多。
再举个小例子吧:
//app.c
#include"bsp.h"//注意这里不要包含硬件有关的头文件,比如"reg51.h",不要包含在这里。
voidmain(void)
{
while(1)
{
if(hasKey())
{
led_on()
delay(100)
led_off()
}
}
//bsp.h
typedefunsignedshortuint16_t
typedefbitbool
voidled_on(void)
voidled_off(void)
voiddelay(uint16_tms)
boolhasKey(void)
//bsp_for_51.c
#include"bsp.h"
#include"reg51.h"
sbitled=P1^0
#defineON(0)
voidled_on(void)
{
led=ON
}
voidled_off(void)
{
led=!ON
}
voiddelay(uint16_tms)
{
inti
while(ms--)
for(i=0i}
boolhasKey(void)
{
return(P0!=0xFF)//测试是否有按键?
}
这个是51的系统,换成STM32,简单重写一下bsp.c,不需要改app.c,系统就可以移植过来。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)