历史上的今天
返回首页

历史上的今天

今天是:2024年10月27日(星期日)

正在发生

2021年10月27日 | Linux之ARM(IMX6U)裸机主频和时钟配置

2021-10-27 来源:eefocus

I.MX6U 系列标准的工作频率为 528MHz,有些型号甚至可以工作到 696MHz,但是默认的工作频率为396MHz,这就造成了浪费了,本次我们来配置主频时钟使其工作在528MHz,以及其他的外设时钟源都工作在NXP推荐的工作频率。


1、I.MX6U 时钟系统详解

I.MX6U 的系统主频为 528MHz,有些型号可以跑到 696MHz,但是默认情况下内部 boot rom 会将 I.MX6U 的主频设置为 396MHz。我们在使用 I.MX6U的时候肯定是要发挥它的最大性能,那么主频肯定要设置到 528MHz(其它型号可以设置更高,比如 696MHz),其它的外设时钟也要设置到 NXP 推荐的值。可参考NXP官方参考手册。


1.1、系统时钟来源

打开 I.MX6U-ALPHA 开发板原理图,开发板时钟原理图如图:

在这里插入图片描述

在这里插入图片描述

I.MX6U-ALPHA 开发板的系统时钟来源于两部分: 32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源, 24MHz 晶振是 I.MX6U 内核和其它外设的时钟源。


1.2、7 路 PLL 时钟源

I.MX6U 的外设有很多,不同的外设时钟源不同, NXP 将这些外设的时钟源进行了分组,一共有 7 组,这 7 组时钟源都是从 24MHz 晶振 PLL 而来的,因此也叫做 7 组 PLL,这 7 组 PLL结构如图 :

在这里插入图片描述

1.3、7路PLL的具体作用

image.png?imageView2/2/w/550

1.4、时钟树简介

I.MX6U 的所有外设时钟源都是从这 7 路 PLL 和有些 PLL 的PFD 而来的,这些外设究竟是如何选择 PLL 或者 PFD 的?这个就要借助《IMX6ULL 参考手册》里面的时钟树了,在“Chapter 18 Clock Controller Module (CCM)”的 18.3 小节给出了 I.MX6U详细的时钟树图,如图:

在图中一共有三部分: CLOCK_SWITCHER、 CLOCK ROOT GENERATOR 和

SYSTEM CLOCKS。其中左边的 CLOCK_SWITCHER 就是那 7 路 PLL 和8 路 PFD,右边的 SYSTEM CLOCKS 就是芯片外设,中间的 CLOCK ROOT GENERATOR 是最复杂的!这一部分就像“月老”一样, 给左边的CLOCK_SWITCHER和右边的SYSTEM CLOCKS进行牵线搭桥。外设时钟源是有多路可以选择的, CLOCK ROOT GENERATOR 就负责从 7 路PLL 和 8 路 PFD 中选择合适的时钟源给外设使用。具体操作肯定是设置相应的寄存器,我们以ESAI 这个外设为例, ESAI 的时钟图如图:

在图中我们分为了 3 部分,这三部分如下:

①、此部分是时钟源选择器, ESAI 有 4 个可选的时钟源: PLL4、 PLL5、 PLL3_PFD2 和pll3_sw_clk 。 具 体 选 择 哪 一 路 作 为 ESAI 的 时 钟 源 是 由 寄 存 器 CCM->CSCMR2 的ESAI_CLK_SEL 位来决定的,用户可以自由配置,配置如图:

②、此部分是 ESAI 时钟的前级分频,分频值由寄存器 CCM_CS1CDR 的 ESAI_CLK_PRED来确定的,可设置 1~8 分频,假如现在 PLL4=650MHz,我们选择 PLL4 作为 ESAI 时钟,前级分频选择 2 分频,那么此时的时钟就是 650/2=325MHz。

③、此部分又是一个分频器,对②中输出的时钟进一步分频,分频值由寄存器CCM_CS1CDR 的 ESAI_CLK_PODF 来决定,可设置 1~8 分频。假如我们设置为 8 分频的话,经过此分频器以后的时钟就是 325/8=40.625MHz。因此最终进入到 ESAI 外设的时钟就是40.625MHz。


其他的外设也基本类似的


1.5、内核时钟设置

I.MX6U 的时钟系统前面已经分析的差不多了,现在就可以开始设置相应的时钟频率了。先从主频开始,我们将 I.MX6U 的主频设置为 528MHz,根据时钟树可以看到ARM 内核时钟如图所示:

图中各部分详解如下:

①、内核时钟源来自于 PLL1,假如此时 PLL1 为 996MHz。

②、通过寄存器 CCM_CACRR 的 ARM_PODF 位对 PLL1 进行分频,可选择 1/2/4/8 分频,假如我们选择 2 分频,那么经过分频以后的时钟频率是 996/2=498MHz。

③、大家不要被此处的 2 分频给骗了,此处没有进行 2 分频(我就被这个 2 分频骗了好久,

主频一直配置不正确! )。

④、经过第②步 2 分频以后的 498MHz 就是 ARM 的内核时钟,也就是 I.MX6U 的主频。


经过上面几步的分析可知,假如我们要设置内核主频为 528MHz,那么 PLL1 可以设置为1056MHz,寄存器 CCM_CACRR 的 ARM_PODF 位设置为 2 分频即可。同理,如果要将主频设置为 696MHz,那么 PLL1 就可以设置为 696MHz, CCM_CACRR 的 ARM_PODF 设置为 1 分频即可。现在问题很清晰了,寄存器 CCM_CACCR 的 ARM_PODF 位很好设置, PLL1 的频率可以通过寄存器CCM_ANALOG_PLL_ARMn 来设置。接下来详细的看一下 CCM_CACRR 和 CCM_ANALOG_PLL_ARMn 这两个寄存器, CCM_CACRR 寄存器结构如图所示:

寄存器 CCM_CACRR 只有 ARM_PODF 位,可以设置为 0~7,分别对应 1~8 分频。如果要设置为2分频的话CCM_CACCR就要设置为1。


再来看一下寄存器CCM_ANALOG_PLL_ARMn,此寄存器结构如图所示:

在寄存器 CCM_ANALOG_PLL_ARMn 中重要的位如下:

image.png?imageView2/2/w/550

在修改 PLL1 时钟频率的时候我们需要先将内核时钟源改为其他的时钟源, PLL1 可选择的时钟源如图所示:

①、 pll1_sw_clk 也就是 PLL1 的最终输出频率。


②、此处是一个选择器,选择 pll1_sw_clk 的时钟源,由寄存器 CCM_CCSR 的PLL1_SW_CLK_SEL 位决定 pll1_sw_clk 是选择 pll1_main_clk 还是 step_clk。正常情况下应该选择 pll1_main_clk,但是如果要对 pll1_main_clk(PLL1)的频率进行调整的话,比如我们要设置PLL1=1056MHz,此时就要先将 pll1_sw_clk 切换到 step_clk 上。等 pll1_main_clk 调整完成以后再切换回来。


③、此处也是一个选择器,选择 step_clk 的时钟源,由寄存器 CCM_CCSR 的 STEP_SEL 位来决定 step_clk 是选择 osc_clk 还是 secondary_clk。一般选择 osc_clk,也就是 24MHz 的晶振。这里我们就用到了一个寄存器 CCM_CCSR,此寄存器结构如图所示:

寄存器 CCM_CCSR 我们只用到了 STEP_SEL、 PLL1_SW_CLK_SEL 这两个位,一个是用来选择 step_clk 时钟源的,一个是用来选择 pll1_sw_clk 时钟源的。


到这里,修改 I.MX6U 主频的步骤就很清晰了,修改步骤如下:


①、 设置寄存器 CCSR 的 STEP_SEL 位,设置 step_clk 的时钟源为 24M 的晶振。


②、设置寄存器 CCSR 的 PLL1_SW_CLK_SEL 位,设置 pll1_sw_clk 的时钟源为step_clk=24MHz,通过这一步我们就将 I.MX6U 的主频先设置为 24MHz,直接来自于外部的24M 晶振。


③、设置寄存器 CCM_ANALOG_PLL_ARMn,将 pll1_main_clk(PLL1)设置为 1056MHz。


④、设置寄存器 CCSR 的 PLL1_SW_CLK_SEL 位,重新将 pll1_sw_clk 的时钟源切换回pll1_main_clk,切换回来以后的 pll1_sw_clk 就等于 1056MHz。


⑤、最后设置寄存器 CCM_CACRR 的 ARM_PODF 为 2 分频, I.MX6U 的内核主频就为1056/2=528MHz。


1.6、PFD 时钟设置

设置好主频以后我们还需要设置好其他的 PLL 和 PFD 时钟,PLL1 已经设置了,PLL2、 PLL3 和 PLL7 固定为 528MHz、 480MHz 和 480MHz, PLL4~PLL6 都是针对特殊外设的,用到的时候再设置。因此,接下来重点就是设置 PLL2 和 PLL3 的各自 4 路 PFD, NXP 推荐的这 8 路 PFD 频率如表所示:

image.png?imageView2/2/w/550

先设置 PLL2 的 4 路 PFD 频率,用到寄存器是 CCM_ANALOG_PFD_528n,寄存器结构如图所示:

从图可以看出,寄存器 CCM_ANALOG_PFD_528n 其实分为四组,分别对应PFD0~PFD3,每组 8 个 bit,我们就以 PFD0 为例,看一下如何设置 PLL2_PFD0 的频率。 PFD0对应的寄存器位如下:

image.png?imageView2/2/w/550

如果我们要设置 PLL2_PFD0 的频率为 352MHz 的话就需要设置 PFD0_FRAC 为 27,PFD0_CLKGATE 为 0 。 PLL2_PFD1~PLL2_PFD3 设 置 类 似 , 频 率 计 算 公 式 都 是528*18/PFDX_FRAC(X=1~3) , 因 此 PLL2_PFD1=594MHz 的 话 , PFD1_FRAC=16 ;PLL2_PFD2=400MHz 的话 PFD2_FRAC 不能整除,因此取最近的整数值,即 PFD2_FRAC=24,这样 PLL2_PFD2 实际为 396MHz; PLL2_PFD3=297MHz 的话, PFD3_FRAC=32。


接 下 来 设 置 PLL3_PFD0~PLL3_PFD3 这 4 路 PFD 的 频 率 , 使 用 到 的 寄 存 器 是CCM_ANALOG_PFD_480n,此寄存器结构如图所示:

从图可以看出,寄存器 CCM_ANALOG_PFD_480n 和 CCM_ANALOG_PFD_528n的结构是一模一样的,只是一个是 PLL2 的,一个是 PLL3 的。寄存器位的含义也是一样的,只是 频 率 计 算 公 式 不 同 , 比 如 PLL3_PFDX=480*18/PFDX_FRAC(X=0~3) 。 如 果PLL3_PFD0=720MHz 的话, PFD0_FRAC=12;如果 PLL3_PFD1=540MHz 的话, PFD1_FRAC=16;如果 PLL3_PFD2=508.2MHz 的话, PFD2_FRAC=17;如果 PLL3_PFD3=454.7MHz 的话,PFD3_FRAC=19。


1.7、AHB、 IPG 和 PERCLK 根时钟设置

7 路 PLL 和 8 路 PFD 设置完成以后最后还需要设置 AHB_CLK_ROOT 和 IPG_CLK_ROOT

的时钟, I.MX6U 外设根时钟可设置范围如图所示:

图给出了大多数外设的根时钟设置范围, AHB_CLK_ROOT 最高可以设置 132MHz,IPG_CLK_ROOT和PERCLK_CLK_ROOT最高可以设置66MHz。那我们就将AHB_CLK_ROOT、IPG_CLK_ROOT 和 PERCLK_CLK_ROOT 分 别 设 置 为 132MHz 、 66MHz 、 66MHz 。AHB_CLK_ROOT 和 IPG_CLK_ROOT 的涉及如下图所示:

①、此选择器用来选择 pre_periph_clk 的时钟源,可以选择 PLL2、 PLL2_PFD2、 PLL2_PFD0和 PLL2_PFD2/2。寄存器 CCM_CBCMR 的 PRE_PERIPH_CLK_SEL 位决定选择哪一个,默认选择 PLL2_PFD2,因此 pre_periph_clk=PLL2_PFD2=396MHz。


②、此选择器用来选择 periph_clk 的时钟源,由寄存器 CCM_CBCDR 的 PERIPH_CLK_SEL位与 PLL_bypass_en2 组成的或来选择。当 CCM_CBCDR 的 PERIPH_CLK_SEL 位为 0 的时候periph_clk=pr_periph_clk=396MHz。


③、通过 CBCDR 的 AHB_PODF 位来设置 AHB_CLK_ROOT 的分频值,可以设置 1~8 分频,如果想要 AHB_CLK_ROOT=132MHz 的话就应该设置为 3 分频: 396/3=132MHz。图 16.1.2中虽然写的是默认 4 分频,但是 I.MX6U 的内部 boot rom 将其改为了 3 分频!


④、通过 CBCDR 的 IPG_PODF 位来设置 IPG_CLK_ROOT 的分频值,可以设置 1~4 分频,IPG_CLK_ROOT 时钟源是 AHB_CLK_ROOT,要想 IPG_CLK_ROOT=66MHz 的话就应该设置2 分频: 132/2=66MHz。


最后要设置的就是 PERCLK_CLK_ROOT 时钟频率,其时钟结构图如下图所示:

从 上图可 以 看 出 , PERCLK_CLK_ROOT 来 源 有 两 种 : OSC(24MHz) 和IPG_CLK_ROOT,由寄存器 CCM_CSCMR1 的 PERCLK_CLK_SEL 位来决定,如果为 0 的话PERCLK_CLK_ROOT 的 时 钟 源 就 是 IPG_CLK_ROOT=66MHz 。 可 以 通 过 寄 存 器CCM_CSCMR1 的 PERCLK_PODF 位来设置分频,如果要设置 PERCLK_CLK_ROOT 为 66MHz的话就要设置为 1 分频。


在上面的设置中用到了三个寄存器: CCM_CBCDR、 CCM_CBCMR 和 CCM_CSCMR1,我们依次来看一下这些寄存器, CCM_CBCDR 寄存器结构如图所示:

寄存器 CCM_CBCDR 各个位的含义如下:

image.png?imageView2/2/w/550

接下来看一下寄存器 CCM_CBCMR,寄存器结构如下图所示:

寄存器 CCM_CBCMR 各个位的含义如下:

image.png?imageView2/2/w/550

最后看一下寄存器 CCM_CSCMR1,寄存器结构如下图所示:

此寄存器主要用于外设时钟源的选择,比如 QSPI1、 ACLK、 GPMI、 BCH 等外设,我们重点看一下下面两个位:

image.png?imageView2/2/w/550

在修改如下时钟选择器或者分频器的时候会引起与 MMDC 的握手发生:

①、 mmdc_podf

②、 periph_clk_sel

③、 periph2_clk_sel

④、 arm_podf

⑤、 ahb_podf


发生握手信号以后需要等待握手完成,寄存器 CCM_CDHIPR 中保存着握手信号是否完成,如果相应的位为 1 的话就表示握手没有完成,如果为 0 的话就表示握手完成,很简单,这里就不详细的列举寄存器 CCM_CDHIPR 中的各个位了。


另外在修改 arm_podf 和 ahb_podf 的时候需要先关闭其时钟输出,等修改完成以后再打开,否则的话可能会出现在修改完成以后没有时钟输出的问题。本教程需要修改寄存器CCM_CBCDR 的 AHB_PODF 位来设置 AHB_ROOT_CLK 的时钟,所以在修改之前必须先关闭AHB_ROOT_CLK 的输出。但是笔者没有找到相应的寄存器,因此目前没法关闭,那也就没法设置 AHB_PODF 了。不过 AHB_PODF 内部 boot rom 设置为了 3 分频,如果 pre_periph_clk 的时钟源选择 PLL2_PFD2 的话, AHB_ROOT_CLK 也是 396MHz/3=132MHz。


2、实验程序编写

我们在上一次实验的基础上(Linux之ARM(MX6U)裸机按键输入实验(GPIO的输出与输入))进行修改.


2.1、bsp_clk.c

#include "bsp_clk.h"


/*使能外设时钟*/

void clk_enable(void)

{

    CCM->CCGR0 =0xFFFFFFFF;

    CCM->CCGR1 =0xFFFFFFFF;

    CCM->CCGR2 =0xFFFFFFFF;

    CCM->CCGR3 =0xFFFFFFFF;

    CCM->CCGR4 =0xFFFFFFFF;

    CCM->CCGR5 =0xFFFFFFFF;

    CCM->CCGR6 =0xFFFFFFFF;


}

/*

 * @description : 初始化系统时钟 528Mhz,并且设置 PLL2 和 PLL3 各个

 * PFD 时钟,所有的时钟频率均按照 I.MX6U 官方手册推荐的值.

 * @param : 无

 * @return : 无

 */

void imx6u_clkinit(void)

{

    /* 1、设置 ARM 内核时钟为 528MHz */

    /* 1.1、判断当使用哪个时钟源启动的,正常情况下是由 pll1_sw_clk 驱动的,而

    * pll1_sw_clk 有两个来源: pll1_main_clk 和 step_clk, 如果要

    * 让 I.MX6ULL 跑到 528M, 那必须选择 pll1_main_clk 作为 pll1 的时钟

    * 源。 如果我们要修改 pll1_main_clk 时钟的话就必须先将 pll1_sw_clk 从

    * pll1_main_clk 切换到 step_clk,当修改完以后再将 pll1_sw_clk 切换

    * 回 pll1_main_cl, step_clk 等于 24MHz。

    */


    unsigned int reg = 0;

    

    if((((CCM->CCSR)>>2) & 0x1) ==0)

    {

        CCM->CCSR &= ~(1 << 8); /* 配置 step_clk 时钟源为 24MHz OSC */

        CCM->CCSR |= (1 << 2);  /* 配置 pll1_sw_clk 时钟源为 step_clk */

    }


    /* 1.2、设置 pll1_main_clk 为 1056MHz,也就是 528*2=1056MHZ,

    * 因为 pll1_sw_clk 进 ARM 内核的时候会被二分频!

    * 配置 CCM_ANALOG->PLL_ARM 寄存器

    * bit13: 1 使能时钟输出

    * bit[6:0]: 88, 由公式: Fout = Fin * div_select / 2.0,

    * 1056=24*div_select/2.0, 得出: div_select=88。

    */

    

    CCM_ANALOG->PLL_ARM = (1 << 13) | ((88 << 0) & 0X7F);

    CCM->CCSR &= ~(1 << 2);   /* 将 pll_sw_clk 时钟切换回 pll1_main_clk */

    CCM->CACRR = 1;  /* ARM 内核时钟为 pll1_sw_clk/2=1056/2=528Mhz */



    /* 2、设置 PLL2(SYS PLL)各个 PFD */

    reg = CCM_ANALOG->PFD_528;

    reg &=  ~(0x3f3f3f3f);      /* 清除原来的设置 */

    reg |= (32<<24);            /* PLL2_PFD3=528*18/32=297Mhz */

    reg |= (24<<16);            /* PLL2_PFD2=528*18/24=396Mhz */

    reg |= (16<<8);             /* PLL2_PFD1=528*18/16=594Mhz */

    reg |= (27<<0);             /* PLL2_PFD0=528*18/27=352Mhz */

    CCM_ANALOG->PFD_528 = reg;  /* 设置 PLL2_PFD0~3 */


    /* 3、设置 PLL3(USB1)各个 PFD */

    reg =0;                         /* 清零reg */

    reg = CCM_ANALOG->PFD_480;      /* 清除原来的设置 */

    reg &= ~(0x3f3f3f3f);           

    reg |=  (19<<24);               /* PLL3_PFD3=480*18/19=454.74Mhz */

    reg |=  (17<<16);               /* PLL3_PFD2=480*18/17=508.24Mhz */

    reg |=  (16<<8);                /* PLL3_PFD1=480*18/16=540Mhz */

    reg |=  (12<<0);                /* PLL3_PFD0=480*18/12=720Mhz */

推荐阅读

史海拾趣

Custom LeatherCraft Manufacturing Co Inc公司的发展小趣事

随着电子行业的迅速发展,工程师和技术人员需要携带的工具和设备也越来越多。CLC敏锐地捕捉到了这一变化,开始研发具有更多功能和口袋的工具包。同时,他们还引入了新的材料和技术,使产品更加轻便、耐用。这些创新设计不仅满足了客户的需求,还进一步巩固了CLC在市场上的地位。

DURATOOL公司的发展小趣事

人才是企业发展的第一资源。DURATOOL公司一直高度重视人才的培养和引进。公司建立了一套完善的人才选拔和培养机制,通过内部培训、外部招聘等方式不断吸纳优秀人才加入公司。同时,公司还为员工提供了广阔的发展空间和良好的福利待遇,激发了员工的积极性和创造力。这些举措使得DURATOOL公司拥有一支高素质、专业化的员工队伍,为企业的发展提供了有力的人才保障。

Antenna Factor公司的发展小趣事

随着公司实力的不断增强,Antenna Factor公司开始将目光投向国际市场。他们积极参加国际电子展会和技术交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。同时,公司还加大了对海外市场的研发投入和市场推广力度,逐步实现了产品的全球化销售。这一战略不仅为公司带来了更广阔的发展空间,也提升了其在全球电子行业中的竞争力。

通过以上五个故事,我们可以看到Antenna Factor公司在电子行业中的发展历程和取得的成就。他们以技术创新为驱动,不断突破自我,积极拓展市场,加强质量管理和品牌建设,逐步实现了公司的快速发展和壮大。未来,随着无线通信技术的不断进步和应用领域的不断拓展,相信Antenna Factor公司将继续保持领先地位,为电子行业的发展做出更大的贡献。

正泰公司的发展小趣事

2014年,正泰公司接到了一份来自美国光伏巨头SE的大订单。然而,客户对车间现场使用的安规测试仪的检测方法提出了质疑,要求限期完成整改。面对这一挑战,正泰公司的员工曹敬乐根据国际标准中的相关要求,结合实际参数,重新对检测工装进行改进设计和样品制备。经过不断测试和改进,最终满足了外方的要求,订单顺利投产。这一事件不仅展示了正泰公司的技术实力和创新能力,也体现了公司对市场变化的敏锐度和应对挑战的能力。

EMC Component Group公司的发展小趣事

为了在全球市场上保持领先地位,正泰建立了北美、欧洲、亚太等三大全球研发中心,并与清华大学、上海交大等国内外知名院校、机构展开合作,探索“产学研”融合模式。通过整合全球创新资源,正泰在智能电网、新能源电车充电设施等前沿领域取得了一系列创新进展。这种全球研发体系的建立,不仅提升了公司的研发能力,也增强了公司的市场竞争力。

DC Components公司的发展小趣事

在电子行业中,产品质量是企业立足之本。DC Components公司深知这一点,因此始终把质量控制放在首位。公司通过实施严格的质量控制系统,确保每一个产品都符合高质量标准,并符合所有合同要求。这种对质量的坚守,使DC Components公司在市场上赢得了良好的口碑,吸引了众多客户的青睐。

问答坊 | AI 解惑

工程师如何应对“工程知识半衰期”?

有一次,我上网搜寻一些培训资料,偶然地浏览了一个网站,其声称工程知识的半衰期为两年左右。这也就意味着,作为一个工程师,我至今所掌握的知识中有一半会在两年内就过时。而到10年之后,这些知识中只有3%还仍然能用! 这一观点是发布在一个宣传 ...…

查看全部问答>

OS_ENTER_CRITICAL()在中断子函数里的调用!!!

用的keil在调试时出现一个问题, 我在Keil的中断里调用了一个函数, void UART0_Exception(void)//串口中断 {             OS_ENTER_CRITICAL();             &nbs ...…

查看全部问答>

小弟想买块开发板弄弄,各位能给点建议吗?

小弟刚工作,内容是嵌入式,公司不让拿板回家,只好自己买,大家给点建议好吗?买什么型号和厂商的板好点? 问过一些人,他们说现在买2410或2440,但没说什么厂商的,我主要是想入门和练习,最好扩展性好一点,谢谢!…

查看全部问答>

用msp430单片机进行电力谐波信号处理

哪位高手比较熟悉430单片机,能否给我点意见,万分感谢 …

查看全部问答>

电子信息工程专业的大学生对编程感兴趣,该往哪方面发展?

   我是厦门大学电子信息工程专业的大二学生.大家可能都知道,我这专业是偏向硬件的.我们也开课学过C语言,JAVA,正在学汇编.在学习的过程中,我发现我在软件(编程)这方面的能力比同专业的其他同学明显强了不少,而在其他科目上学起来跟其他 ...…

查看全部问答>

!!!串口数据保存到文件的问题

void COM232task(void) {    char filename[12]=\"hello2\";    struct fs_descrip *file;    unsigned char sec_buf[512];    file = fs_fopen(filename, O_WRITE  ? O_APPEND); & ...…

查看全部问答>

[求助] PIC16F526问题

请教您一个技术问题, PIC16F526 的 PB4 端口有没有电平变化唤醒单片机功能或者说  PB4 端口 有没有 输入功能 程序是从 PIC16F506 移植过来的,用MPLAB IDE 8.10 模拟调试,PB0、PB1、PB3 端口 都能 唤醒 ,而 PB4 不 ...…

查看全部问答>

我没有相关方面的知识,但是对plc很感兴趣,怎么学习呢?

我没有相关电气方面的知识,但是对PLC很感兴趣,我作为一点都不懂的菜鸟,该如何学起啊?各位老师们望指点指点我,让我少走弯路。。。拜托啦。。拜托啦~~~…

查看全部问答>

请问有完全支持MFC的wince的SDK吗?

我是菜鸟,刚刚才接触wince的编程,以前都是在window下编程的,使用vs2005. 我需要将我以前的工程转成能在wince 6.0下运行。我在网上下载wince 6.0的SDK,但是用代码转移的时候,发现很多MFC的类,函数都不支持,编译不能通过。 请问有什么办法能 ...…

查看全部问答>

怎么联系管理?

如果有需要,联系网站的管理员,在哪儿可以找到链接?…

查看全部问答>