嵌入式知识盲区扫除计划(永久更新)

(1)系统时钟 Systick 与 专用定时器 Timer 

系统时钟,用于操作体统,它是系统的时间计时器,系统根据它得到时间值,来完成某些功能。它具有公用性。比如用于轮询操作的实现。

专用定时器,它通常用于和APB,APH相关的地方,用于某些需要计时的地方。它具有专用性,哪一个需要,哪一个就根据需要构成一个专用定时器。

最后,它们两个是没有关系的,是相互独立的

(2) 如何设置W5300网卡基地址

问题背景:主控板需要进行通信,通信的方式是tcp/ip通信,W5300网卡,对网卡进行驱动配置时,需要设置网卡的基地址,偏移量,等地址相关配置信息。例程如下:

 下面讲述 W5300S_BASE_ADDRESS( 0x68000000 )的由来:

   在原理图中找到网卡片选

 ETH1CS   对应引脚是 PG10。

接下来需要查看stm32f4技术手册:

FSMC总线,内存框图

 不同内存块,起始和终止地址:

 可以看出,每个内存块又分为四个更小的三区,如第一个图中 FSMC_NE[4:1],片选有四,CS1, CS2, CS3, CS4。

是NOR/PSRAM ,还是NAND Flash,或者 PC Card的选择根据的是外设的类型

之下更小的区分,就要看原理图了,引脚号和片选号有对应关系,可在技术手册中查找。

下面的链接可以跳转到引脚和片选的对照表:

STM32的FSMC详解_魏波-CSDN博主-CSDN博客_fsmc是什么意思(跳转到其他文章了,希望原文作者不要介意)

(3)驱动程序和应用层程序浅见

        以W5300网卡为例:

        驱动程序,有引脚配置,数据收发,接受,绑定等,它有一个完整得数据处理流程。在设备上电后就会执行,当接收到数据后,就会触发数据处理流程,(硬件相关,不需要软件上的调动)。

        应用层程序,接受,数据收发,绑定等,应用层调用驱动层某些函数接口。对收发数据进行处理,例:以太网数据转换为CAN数据等。

重点:驱动程序,应用层程序,它们的核心关联是收发的数据。驱动层接收到的数据,存入到缓冲队列。应用层需要用到数据时,从此缓冲队列中读取数据。

(4)程序开发的小见解

        程序编写之前,程序流程图尽量写的详尽一些。不要怕耗费时间,在这时稍微多花费一些时间,总比在后期对整个程序进行大手术要好得多。

        要满足程序的一般需求,不是说你编写的程序可以正常运行,功能可以正常实现就可以了。要满足程序的其他性能需求。

        健壮性保障程序能够稳健的运行,不至于时不时的程序跑飞了,跑崩了。

这个需要尽可能考虑到整个系统可能出现的情况,编写对应的程序,处理与之相对的问题。程序要做到简单,不复杂。能用简单的程序就能够解决的问题,就不要为了彰显能力而故意选择复杂的。记住,越简单越经典。还有就是整个程序运行的顺畅度,上下文逻辑的严谨性。

        容错性:就是当数据出错,或程序出错时,整个运行程序要有对应的处理机制,不能说错了一点,整个程序就崩了。

程序中要经常性的写一些 if 语句,检测数据是否符合规格,符合则继续执行,不符合则退出这段程序。

校验和是否一致啊,CAN数据包收尾是否符合规定啊,反正就是要多做校验,记住这个是必须有的。

        另一点就是编写程序时,即使一个问题的解决完全可以写在一个处理函数中,也不要这样写。要把这个处理函数分割成多个小的处理函数,每个小的处理函数只完成一个简单的功能。这样编写程序的优点是:

        便于后续调试测试时,检测到出错的位置,并且便于修改代码,只需要修改小的函数就行,不至于牵一发而动全身。毕竟谁也不能保证写的程序就完全正确。

(5) 读取LED状态灯,HAL库驱动源程序及应用程序

/*****************************************************
* 以太网Led显示
*****************************************************/
#define  NET_LED_PIN GPIO_PIN_8
void Net_Led_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    __HAL_RCC_GPIOB_CLK_ENABLE();
   
    /* NET_LED引脚配置 */
    GPIO_InitStruct.Pin = NET_LED_PIN;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/*****************************************************
* 获得以太网led状态
*****************************************************/
int8_t Get_Net_State(void)
{
    int8_t PinVaule = 0; 

    PinVaule = HAL_GPIO_ReadPin(GPIOB, NET_LED_PIN); 

    if(PinVaule == GPIO_PIN_RESET || PinVaule == GPIO_PIN_SET)
    {
      return PinVaule;
    }
}

uint8_t uc_NetState = 0;
uc_NetState = Get_Net_State();
    
if(uc_NetState == GPIO_PIN_SET)
{
    //w5300S_Reset(0);
}

(6) C语言编程中的位定义

typedef struct
{
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_FaceIDStatus : 2;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_SysErrSt : 3;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_FatigWarnSt : 3;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_DistrWarnSt : 3;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_FaceID : 4;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_FaceIDWelcomeMode : 1;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_DrvrDetSts : 3;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_InterestsRegion : 5;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_L3DriverFatigueSt_Byte1 : 8;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_FuncSt : 2;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_Mode : 2;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_L3DriverFatigueSt_Byte0 : 4;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_FaceIDRegisterResult : 2;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_L3DriverDistractionSt : 6;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_1_MsgCounter : 4;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_FaceIDDeleteResult : 2;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_FaceIDVerifyResult : 2;
    uint8 Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_DMS_1_Checksum : 8;
} TxPdu_Cfg_Tx_A55project_SOP_DMS_CMX_V1_0_DMS_1_BufType;


/******************************************************************************
*    Receive Signal structures
******************************************************************************/
/*Cfg*/
typedef struct
{
    uint8 unused0_Byte0 : 8;
    uint8 unused0_Byte1 : 8;
    uint8 unused0_Byte2 : 4;
    uint8 Cfg_Rx_A55project_SOP_DMS_CMX_V1_0_GW_ACU_2_A_B_A_ACU_FaceID_Delete : 4;
    uint8 unused1_Byte0 : 8;
    uint8 unused1_Byte1 : 8;
    uint8 unused1_Byte2 : 8;
    uint8 unused1_Byte3 : 3;
    uint8 Cfg_Rx_A55project_SOP_DMS_CMX_V1_0_GW_ACU_2_A_B_A_ACU_DMSSwitch : 2;
    uint8 Cfg_Rx_A55project_SOP_DMS_CMX_V1_0_GW_ACU_2_A_B_A_ACU_DMSMode : 3;
    uint8 unused2 : 8;
} RxPdu_Cfg_Rx_A55project_SOP_DMS_CMX_V1_0_GW_ACU_2_A_B_A_BufType;

位定义,一般用在通信报文协议之中,不同bit位代表不同的意思。

结构体重 :后面的数字代表,此变量所占Bit的位数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值