ARM7相关编程之c语言相关语法的书写格式总结

本文总结了ARM7编程中关于寄存器的读修改写最佳实践,以及结构体变量跨文件声明的注意事项。在设置寄存器时,直接赋值可能导致问题,而采用读修改写的方式可以避免冲突。在声明结构体变量时,如果在多个文件中使用,需要使用extern并完整声明结构体成员,以避免编译错误。
摘要由CSDN通过智能技术生成

1 关于对寄存器的读写方式
一直听说对寄存器赋值的时候,最好的方式是通过读修改写的方式,本人一直觉得直接赋值并没有什么不可以,直到今天,在lpc2138芯片下,在一个已经能够驱动2.2 TFT液晶显示汉字的情况下,写了一个驱动串口的的程序,使用的是UART0,在设置p0.0引脚与p0.1引脚分别为TxD0与RxD0时,一开始采用的写法如下:

PINSEL0 =(0x5);```
/*****分割线****************************/
int main (void)
{
        LCD_Init();
        LCD_Clear(RED);//基本刷屏测试
        RTCInit(); //RTC时钟初始化模块
        interrupt();
        BACK_COLOR=RED;   //字体背景色
        POINT_COLOR=BLUE;    // 字体的颜色   

        uart_init();


    while (1)
    {   screen1();//初始化界面显示 此句不能放在while(1)外,否则RTC秒钟显示不正常,也不能放在Get_Time后,显示也不正常            
        Get_Time(&date,&time);//显示当前时间值
    }

}

编译运行后,屏幕上无法显示相关信息,于是可是各种查,发现将写法改成如下,

PINSEL0 =(PINSEL0&0xFFFFFFF0)|(0x5);

程序即可正常显示汉字与数字(虽然说我的uart程序还是不好使~~),后来查了下屏幕的资料,发现有如下两个引脚这里写图片描述
查看相关SPI程序,发现果然有PINSEL0相关的配置,猜想会不会是两次赋值冲突的原因,我也不知道怎么验证,如有大神知道,还请不吝赐教

  1. 有关结构体变量的声明
    我在main.c中定义了如下的结构体变量:
struct DATE
  {
  uint16 year;
  uint8 mon;
  uint8 day;

  }GdateCurrentDate;

在RTC.c中准备利用此结构体变量来读取ARM7系列lpc2138RTC时间计数器的值,
首先在RTC.c中进行了如下声明:

extern struct TIME GdateCurrentDate;

然后进行了如下赋值:

 GdateCurrentDate.year =(uint16) YEAR ; //更新年份
 GdateCurrentDate.mon =(uint8) MONTH; //更新月份
 GdateCurrentDate.day =(uint8) DOM;//更新日期值         
 GtimeCurrentTime.hour = (uint8)HOUR; //更新小时
 GtimeCurrentTime.min =(uint8) MIN; //更新分钟
 GtimeCurrentTime.sec = (uint8)SEC; //更新秒

编译后报错;

APP\target.c(117): error:  #70: incomplete type is not allowed

查了下单词意思,
incomplete adj. 不完全的; 不完备的; 未完成的; 片;
于是将声明的写法改成如下方式:

extern struct DATE
{

uint16 year;
  uint8 mon;
  uint8 day;
} GdateCurrentDate;

正常通过,没有出现相同错误。
总结如下:
在一个.c文件中定义了一个结构体变量,在另一个.c文件中想使用的话,用extern 声明时应该采用类似如下写法,即将结构体成员写完整:

extern struct DATE
{

uint16 year;
  uint8 mon;
  uint8 day;
} GdateCurrentDate;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值