EDN首页   博客首页

最新日志

发表于:2008-10-9 14:54:11
标签:STM32F  RTC  

3

STM32年月日计算程序

如果将RTC计数器设置成1秒进位1次,RTC计数器溢出时间大概有136年,所以不必考虑时间会溢出的问题。

先设置好记时起点的年月日时分秒。
然后调用下面的计算程序即可。
我只是简单测试了一下该实时时钟,外接了一个32.768K的晶振。
但我感觉该实时时钟的时间精度不太高,如果要精确的话,恐怕不太适用。
这只是我的测试结论,不一定准确,大家可实验一下。
下面的源程序经过测试了,可参考一下。
/*源程序*/
const uchar MaxDayArray[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //
uchar IRTYear,IRTMonth,IRTDay,IRTHour,IRTMinute,IRTSecond;

计算时分秒:
void Time_GetValue(u32 TimeVar)
{
  u32 THH = 0, TMM = 0, TSS = 0;
  /* Compute  hours */
  THH = TimeVar/3600;
  /* Compute minutes */
  TMM = (TimeVar % 3600)/60;
  /* Compute seconds */
  TSS = (TimeVar % 3600)% 60;
  RTHour=(uchar)THH;
  RTMinute=(uchar)TMM;
  RTSecond=(uchar)TSS;
}
调用方式:Time_GetValue(RTC_GetCounter());

计算年月日:
/*CaculateTime :Caculate new Time*/
void CaculateTime(void)
{
    uint IYear;
    IYear=2000+IRTYear;
    if(2==IRTMonth) { //
        IRTDay++;
        if((IYear%4==0&&IYear%100!=0)||(IYear%400==0)) { //leap year
            if ((IRTDay>MaxDayArray[IRTMonth-1]+1)) {
                //Day overflow
                IRTDay=1;
                IRTMonth++;
                if(IRTMonth>12) {
                    //Month overflow
                    IRTMonth=1;
                    IRTYear++;
                    if (IRTYear>99) {
                        //Year overflow
                        IRTYear=0;
                    }
                }
            }
        } else { //no leap year
            if ((IRTDay>MaxDayArray[IRTMonth-1])) {
                IRTDay=1;
                IRTMonth++;
                if(IRTMonth>12) {
                    //Month overflow
                    IRTMonth=1;
                    IRTYear++;
                    if (IRTYear>99) {
                        //Year overflow
                        IRTYear=0;
                    }
                }
            }
        }
    } else { //
        IRTDay++;
        if ((IRTDay>MaxDayArray[IRTMonth-1])) {
            IRTDay=1;
            IRTMonth++;
            if(IRTMonth>12) {
                //Month overflow
                IRTMonth=1;
                IRTYear++;
                if (IRTYear>99) {
                    //Year overflow
                    IRTYear=0;
                }
            }        
        }
    }
}
调用方式:
            TempValue=RTC_GetCounter();
            do while(TempValue > 0x00015180);
            {
                 //
                 CaculateTime();
                 TempValue -=0x00015180;
            } 新生成的年月日时分秒就是当前的年月日。

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(67)
发表于:2008-9-25 14:23:39
标签:SDI-12  

2

SDI-12(Serial Digital Interface)简介

 
SDI-12通讯标准是近五年来欧美国家在环境监测中广泛使用的一种串行数据通讯接口协议。在该协议支持下,可广泛应用在工农业多参数测控、江河湖海的水文和气象等地球环境监测、养殖和食品生产中具有远距离传送,全天候防护和节省经费的优点。
典型的测量过程
步骤 1: 主机发中断命令的内容是:1)break信号,2)mark信号。
其中,break信号是持续至少12mS的空号信号(space);然后是持续8.33mS(允许误差-0.4mS)的mark信号;
步骤2. 主机设备向指定地址的传感器发送命令,指示它进行测量。
步骤3. 该地址传感器在15mS内做出应答,返回测量数据所需的最大时间和将要返回的数据的数目。
步骤4. 如果测量结果立即可以得到,则记录设备给传感器发送命令,指令它传回测量结果。如果测量结果未准备好,则数据记录设备等待传感器发出请求,这个请求表明数据已准备好。然后记录设备传送命令取数据。
步骤5. 传感器应答,返回一个或多个测量结果

点击此处查看原文 >>

系统分类: 通信网络   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(90)
发表于:2008-9-23 14:46:32
标签:无标签

1

真正程序员(搞笑版)

  作者:佚名       
        
          真正的程序员从来不写注释,难写的程序必定也难读。   
    
          真正的程序员不写应用程序,他们直接从最底层的裸机开始编程。他们认为应用程序编程是那些不会系统编程的人干的活。   
    
          真正的程序员不画流程图,流程图是没文化的人的文档,居住在山洞里的人才在岩壁上画流程图。   
    
          真正的程序员不读手册,依赖手册是无知和懦弱的表现。   
    
          真正的程序员从不一次做对,他们可以连续30个小时坐在机器前面给程序打补丁。   
    
          真正的程序员从不按早9晚5的生活过日子,如果你在早上9点看见一个程序员,那一定是他一夜未眠。   
    
          真正的程序员比用户还清楚用户需要什么。   
    
          真正的程序员喜欢兼卖爆米花,他们利用CPU散发出的热量做爆米花,可以根据米花裂的速度听出正在运行什么程序。   
    
          真正的程序员不到万不得已不谈恋爱,在老婆和程序之间,他们会毫不犹豫的选择程序。   
    
          :P

点击此处查看原文 >>

系统分类: 生活点滴   |    用户分类:    |    来源: 转贴

评论(2) | 阅读(151)
发表于:2008-9-21 18:09:53
标签:stm32f  flash  代码保护  加密  

3

STM32对内部Flash的内容有专门的保护措施[转贴]

转自:21ic   作者:香水城

所有STM32的芯片都提供对Flash的保护,防止对Flash的非法访问——写保护和读保护。

读保护是作用于整个Flash存储区,一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出:
  通过调试器(JTAG或SWD)
  从RAM中启动并执行的程序

写保护是以四页(1KB/页)Flash存储区为单位提供保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志。

以下是一个简单的小结:
读保护  写保护  对Flash的操作功能
有效   有效   CPU只能读;禁止调试和非法访问
有效   无效   CPU可以读写;禁止调试和非法访问;页0~3为写保护
无效   有效   CPU可读;允许调试和非法访问
无效   无效   CPU可以读写;允许调试和非法访问

更多详细内容请看:《STM32F10x闪存编程手册》 英文下载 中文下载

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(118)
发表于:2008-9-12 18:02:40
标签:GCCAVR  

2

GCCAVR使用心得

1.GCCAVR的中断程序名在每个芯片的头文件中。

2.GCCAVR在E2PROM中预定义变量名和对应的数据用:

     int user EEMEM = 1000;//这里user是变量名,1000是user内的数据,EEMEM是存储类型。

3.出了下面的编译提示:

../gkdm-21_2.c:268: error: expected declaration or statement at end of input

很可能是{}加的不对。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(127)
发表于:2008-8-27 9:54:25
标签:STM32  I2C  EEPROM  

11

基于STM32的I2C EEPROM驱动程序

        我发现写博客还是很有好处的,前天我的LCD没显示了我以为是程序的哪里被我改错了,我就这改改那改改,也没弄好,倒是把程序弄得心里没底了,没办法把博客里的程序下回去,烧到片子里,发现还是没有反应,才确定是硬件问题,因为我传到博客里的程序都是调好的。

        这两天调EEPROM驱动才发现ST给的例子在万利的开发板上根本调不通,于是到网上找了一圈,软I2C的硬I2C的就是没有一个能拿过来就用的。经过我东拼西凑终于凑出了一个能调通的程序,已经在AT24C02、AT24C04上验证通过。

/* Includes ------------------------------------------------------------------*/
#include "at24c04.h"

/* Private define ------------------------------------------------------------*/
#define I2C_Speed              100000
#define I2C1_SLAVE_ADDRESS7    0xA0
#define I2C_PageSize           16
/* I2C START mask */
#define CR1_START_Set           ((u16)0x0100)
#define CR1_START_Reset         ((u16)0xFEFF)

/* I2C STOP mask */
#define CR1_STOP_Set            ((u16)0x0200)
#define CR1_STOP_Reset          ((u16)0xFDFF)

/* I2C ACK mask */
#define CR1_ACK_Set             ((u16)0x0400)
#define CR1_ACK_Reset           ((u16)0xFBFF)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/

u16 EEPROM_ADDRESS ;
/* Private function prototypes -----------------------------------------------*/
void GPIO_Configuration(void);
void I2C_Configuration(void);
void I2C_AcknowledgePolling(void);
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configure the used I/O ports pin
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;

  /* Configure I2C1 pins: SCL and SDA */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/*******************************************************************************
* Function Name  : I2C_Configuration
* Description    : I2C Configuration
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C_Configuration(void)
{
  I2C_InitTypeDef  I2C_InitStructure;

  /* I2C configuration */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
 
  /* I2C Peripheral Enable */
  I2C_Cmd(I2C1, ENABLE);
  /* Apply I2C configuration after enabling it */
  I2C_Init(I2C1, &I2C_InitStructure);
}

/*******************************************************************************
* Function Name  : I2C_EE_Init
* Description    : Initializes peripherals used by the I2C EEPROM driver.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C_EE_Init()
{
  /* GPIO configuration */
  GPIO_Configuration();

  /* I2C configuration */
  I2C_Configuration();

  /* depending on the EEPROM Address selected in the i2c_ee.h file */
#ifdef EEPROM_Block0_ADDRESS
  /* Select the EEPROM Block0 to write on */
  EEPROM_ADDRESS = EEPROM_Block0_ADDRESS;
#endif
#ifdef EEPROM_Block1_ADDRESS
  /* Select the EEPROM Block1 to write on */
  EEPROM_ADDRESS = EEPROM_Block1_ADDRESS;
#endif
#ifdef EEPROM_Block2_ADDRESS
  /* Select the EEPROM Block2 to write on */
  EEPROM_ADDRESS = EEPROM_Block2_ADDRESS;
#endif
#ifdef EEPROM_Block3_ADDRESS
  /* Select the EEPROM Block3 to write on */
  EEPROM_ADDRESS = EEPROM_Block3_ADDRESS;
#endif
}

void I2C_AcknowledgePolling(void)
{
    do{
        I2C_GenerateSTART(I2C1,ENABLE);
        I2C_ReadRegister(I2C1,I2C_Register_SR1);//清除ADDR位

        I2C_Send7bitAddress(I2C1,0xa0,I2C_Direction_Transmitter);
    }while(!(I2C_ReadRegister(I2C1,I2C_Register_SR1)&0x0002));
 
    I2C_ClearFlag(I2C1,I2C_FLAG_AF);
}

void I2C_24CXX_Read(u8 EEPROM_ADDRESS,u8 ReadAddr,u8 *pBuffer,u8 NumByteToRead)
{
    u8 i;

    I2C_AcknowledgePolling();
   
    I2C1->CR1 |= CR1_START_Set;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); 
  
    I2C1->DR = EEPROM_ADDRESS;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    I2C1->DR = ReadAddr;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
              
    I2C1->CR1 |= CR1_START_Set;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); 

    I2C1->DR = EEPROM_ADDRESS+1;
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));   
    I2C1->CR1 |= CR1_ACK_Set;

    if(NumByteToRead>1){
        for(i=0;i<NumByteToRead-1;i++)
     {
            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
            *pBuffer ++= I2C1->DR;
           
            I2C1->CR1 |= CR1_ACK_Set;
        }
    }
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
    *pBuffer = I2C1->DR;
    I2C1->CR1 &= CR1_ACK_Reset;
   
    I2C1->CR1 |= CR1_STOP_Set;
}


void I2C_24CXX_Write(u8 EEPROM_ADDRESS,u8 WriteAddr,u8* pBuffer,u8 NumByteToWrite)
{
    u8 wLen,addr;
   
    wLen="NumByteToWrite";
    addr="WriteAddr";
    ScrollPage:I2C_AcknowledgePolling();
   
               I2C1->CR1 |= CR1_START_Set;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); 
 
               I2C1->DR = EEPROM_ADDRESS;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

               I2C1->DR = addr;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
                             
               I2C1->DR = *pBuffer++;
               while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
              
               addr++;
               wLen--;
       
    while(wLen){
        if((addr%8)!=0)
     {
            I2C1->DR = *pBuffer++;
            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
           
            addr++;
            wLen--;
        }
        else{
            I2C1->CR1 |= CR1_STOP_Set;
            goto ScrollPage;
        }
    }
    I2C1->CR1 |= CR1_STOP_Set;
}

完整的工程点击下载,里面没有包含固件库,用的是2.02版固件库。

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(2) | 阅读(390)
发表于:2008-8-15 21:16:37
标签:多路ADC  DMA  模数转换  STM32  

8

STM32多通道ADC规则转换实现了!

比画了很多天,终于今天下狠心把多通道ADC转换逼出来了,一直就看着ADC多通道的多种用法和DMA的用法眼晕,找了很多例子最多是3通道而且用的不是一个AD.终于靠自己的力量弄出来了,长出了一口气啊.我这里用的ADC的通道8~15共8个通道,采用自动连续转换模式,转换完一个通道的数据由DMA送到内存中,主程序中把每个通道的数据分检出来经过"去极值取平均值滤波"后送给LCD显示,在万利的开发板上显示的值比万利的例子稳定多了.

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
  debug();
#endif

  /* System clocks configuration ---------------------------------------------*/
  RCC_Configuration();

  /* NVIC configuration ------------------------------------------------------*/
  NVIC_Configuration();

  /* GPIO configuration ------------------------------------------------------*/
  GPIO_Configuration();

  LcdShow_Init();

  /* DMA1 channel1 configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//外设地址
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RCVTab;//内存地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//dma传输方向单向
  DMA_InitStructure.DMA_BufferSize = 160;//设置DMA在传输时缓冲区的长度 word
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设置DMA的外设递增模式,一个外设
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//设置DMA的内存递增模式,
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据字长
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//内存数据字长
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//设置DMA的传输模式:连续不断的循环模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置DMA的优先级别
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);

  /* ADC1 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立工作模式
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描方式
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发禁止
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
  ADC_InitStructure.ADC_NbrOfChannel = 8;//用于转换的通道数
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channels configuration [规则模式通道配置]*/
  ADC_RegularChannelConfig(ADC1, ADC_Channel_8 , 1, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_9 , 2, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 3, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 4, ADC_SampleTime_239Cycles5); 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 5, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 6, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 7, ADC_SampleTime_239Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 8, ADC_SampleTime_239Cycles5); 

  /* Enable ADC1 DMA [使能ADC1 DMA]*/
  ADC_DMACmd(ADC1, ENABLE);
 
  /* Enable ADC1 [使能ADC1]*/
  ADC_Cmd(ADC1, ENABLE); 

  /* Enable ADC1 reset calibaration register */  
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));
 
  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
 
    while(1)
  {
    vu16 value1 = 0;
    vu16 value2 = 0; 
    vu16 value3 = 0;
    vu16 value4 = 0;
    vu16 value5 = 0; 
    vu16 value6 = 0; 
    vu16 value7 = 0; 
    vu16 value8 = 0;
 value1 = average(ADC_RCVTab,0);
 value2 = average(ADC_RCVTab,1); 
 value3 = average(ADC_RCVTab,2);
 value4 = average(ADC_RCVTab,3);
 value5 = average(ADC_RCVTab,4);
 value6 = average(ADC_RCVTab,5); 
 value7 = average(ADC_RCVTab,6);
 value8 = average(ADC_RCVTab,7); 
 
    u8 num1 = value3 % 10;
    u8 num2 = (value3 / 10) % 10;
    u8 num3= (value3 / 100) % 10;
    u8 num4 = value3 / 1000;
    if (num1 > 9)
      display[3] = num1 + (65 - 10);
    else
      display[3] = num1 + (48-0);

    if (num2 > 9)
      display[2] = num2 +(65 - 10);
    else
      display[2] = num2 + (48 - 0);

    if (num3>9)
      display[1]=num3+(65-10);
    else
      display[1]=num3+(48-0);

    if (num4>9)
      display[0]=num4+(65-10);
    else
      display[0]=num4+(48-0);

    write_string(display);
    delay();
  }
}

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(13) | 阅读(1277)
发表于:2008-8-13 20:43:39
标签:STM32F  中文  汉化  固件库  SDIO  

13

汉化STM32F2.02版固件库之最后一篇(SDIO)

/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* 文件名称: stm32f10x_sdio.c
* 程序作者: MCD Application Team
* 程序版本: V2.0.2
* 编制日期: 07/11/2008
* 功能描述: 这个文件提供了所有SDIO的固件函数.
********************************************************************************
* 目前的固件的目的是为客户提供关于他们的产品的编码信息以便于节省他们时间。
* 结果, 意法半导体将不会为此承担任何直接,间接或相应的损害赔偿方面的任何索赔要求,
* 例如固件或使用所作的客户编码中他涉嫌包含与他们的相关产品的信息。
*******************************************************************************/
/*******************************************************************************
* 函数名称: SDIO_DeInit
* 功能描述: Deinitializes the SDIO peripheral registers to their default
*                  reset values[取消SDIO设备寄存器的初始化还原到他们的默认值].
* 输入参数: 无
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void SDIO_DeInit(void)
{
  SDIO->POWER = 0x00000000;
  SDIO->CLKCR = 0x00000000;
  SDIO->ARG = 0x00000000;
  SDIO->CMD = 0x00000000;
  SDIO->DTIMER = 0x00000000;
  SDIO->DLEN = 0x00000000;
  SDIO->DCTRL = 0x00000000;
  SDIO->ICR = 0x00C007FF;
  SDIO->MASK = 0x00000000;
}

/*******************************************************************************
* 函数名称: SDIO_Init
* 功能描述: Initializes the SDIO peripheral according to the specified
*                  parameters in the SDIO_InitStruct[依照SDIO_InitStruct结构体指定的参数初始化SDIO设备].
* 输入参数: SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure
*                  that contains the configuration information for the SDIO
*                  peripheral.[指向包含着SDIO设备配置信息的结构体SDIO_InitTypeDef的指针]
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct)
{
  u32 tmpreg = 0;
   
  /* Check the parameters [检查参数]*/
  assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge));
  assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass));
  assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave));
  assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide));
  assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl));
  
/*---------------------------- SDIO CLKCR Configuration ------------------------*/ 
  /* Get the SDIO CLKCR value [取得SDIO CLKCR的值]*/
  tmpreg = SDIO->CLKCR;
 
  /* Clear CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN bits [清CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN位]*/
  tmpreg &= CLKCR_CLEAR_MASK;
 
  /* Set CLKDIV bits according to SDIO_ClockDiv value [依照SDIO_ClockDiv的值设置CLKDIV位]*/
  /* Set PWRSAV bit according to SDIO_ClockPowerSave value [依照SDIO_ClockPowerSave的值设置PWRSAV位]*/
  /* Set BYPASS bit according to SDIO_ClockBypass value [依照SDIO_ClockBypass的值设置BYPASS位]*/
  /* Set WIDBUS bits according to SDIO_BusWide value [依照SDIO_BusWide的值设置WIDBUS位]*/
  /* Set NEGEDGE bits according to SDIO_ClockEdge value [依照SDIO_ClockEdge的值设置NEGEDGE位]*/
  /* Set HWFC_EN bits according to SDIO_HardwareFlowControl value [依照SDIO_HardwareFlowControl的值设置HWFC_EN位]*/
  tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv  | SDIO_InitStruct->SDIO_ClockPowerSave |
             SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide |
             SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl);
 
  /* Write to SDIO CLKCR [写SDIO CLKCR]*/
  SDIO->CLKCR = tmpreg;            
}

/*******************************************************************************
* 函数名称: SDIO_StructInit
* 功能描述: Fills each SDIO_InitStruct member with its default value.[用默认值填充SDIO_InitStruct的每一个成员]
* 输入参数: SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which
*                  will be initialized.[指向将要被初始化的结构体SDIO_InitTypeDef的指针]
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct)
{
  /* SDIO_InitStruct members default value [SDIO_InitStruct成员的默认值]*/
  SDIO_InitStruct->SDIO_ClockDiv = 0x00;
  SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising;
  SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable;
  SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
  SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b;
  SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
}
完整的stm32f10x_sdio.c点击下载,终于完成了!几次都想放弃了,还是咬牙坚持下来了.

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(5) | 阅读(874)
发表于:2008-8-13 20:32:18
标签:STM32F  中文  汉化  固件库  FSMC  

13

汉化STM32F2.02版固件库之二十三(FSMC)

/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* 文件名称: stm32f10x_fsmc.c
* 程序作者: MCD Application Team
* 程序版本: V2.0.2
* 编制日期: 07/11/2008
* 功能描述: 这个文件提供了所有FSMC(Flexible static memory controller[可擦写的静态存储器控制器])的固件函数.
********************************************************************************
* 目前的固件的目的是为客户提供关于他们的产品的编码信息以便于节省他们时间。
* 结果, 意法半导体将不会为此承担任何直接,间接或相应的损害赔偿方面的任何索赔要求,
* 例如固件或使用所作的客户编码中他涉嫌包含与他们的相关产品的信息。
*******************************************************************************/

/* 包涵的文件 ------------------------------------------------------------------*/
#include "stm32f10x_fsmc.h"
#include "stm32f10x_rcc.h"

/* 自用类型 -----------------------------------------------------------*/
/* 自用定义 ------------------------------------------------------------*/
/* --------------------- FSMC registers bit mask ---------------------------- */
/* FSMC BCRx Mask */
#define BCR_MBKEN_Set                       ((u32)0x00000001)
#define BCR_MBKEN_Reset                     ((u32)0x000FFFFE)
#define BCR_FACCEN_Set                      ((u32)0x00000040)

/* FSMC PCRx Mask */
#define PCR_PBKEN_Set                       ((u32)0x00000004)
#define PCR_PBKEN_Reset                     ((u32)0x000FFFFB)
#define PCR_ECCEN_Set                       ((u32)0x00000040)
#define PCR_ECCEN_Reset                     ((u32)0x000FFFBF)
#define PCR_MemoryType_NAND                 ((u32)0x00000008)

/* 自用宏 -----------------------------------------------------------*/
/* 自用变量 ---------------------------------------------------------*/
/* 自用函数原型 -----------------------------------------------------*/
/* 自用函数 ---------------------------------------------------------*/

/*******************************************************************************
* 函数名称: FSMC_NORSRAMDeInit
* 功能描述: Deinitializes the FSMC NOR/SRAM Banks registers to their default
*                  reset values[取消FSMC NOR/SRAM 体寄存器的初始化还原到他们的默认值].
* 输入参数: - FSMC_Bank: specifies the FSMC Bank to be used[指定使用的FSMC体]
*                    这个参数可以是下面的值之一:
*                       - FSMC_Bank1_NORSRAM1: FSMC 体1 NOR/SRAM1 
*                       - FSMC_Bank1_NORSRAM2: FSMC 体1 NOR/SRAM2
*                       - FSMC_Bank1_NORSRAM3: FSMC 体1 NOR/SRAM3
*                       - FSMC_Bank1_NORSRAM4: FSMC 体1 NOR/SRAM4                      
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void FSMC_NORSRAMDeInit(u32 FSMC_Bank)
{
  /* Check the parameter [检查参数]*/
  assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank));
 
  /* FSMC_Bank1_NORSRAM1 */
  if(FSMC_Bank == FSMC_Bank1_NORSRAM1)
  {
    FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030DB;   
  }
  /* FSMC_Bank1_NORSRAM2,  FSMC_Bank1_NORSRAM3 or FSMC_Bank1_NORSRAM4 */
  else
  {  
    FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030D2;
  }

  FSMC_Bank1->BTCR[FSMC_Bank + 1] = 0x0FFFFFFF;
  FSMC_Bank1E->BWTR[FSMC_Bank] = 0x0FFFFFFF; 
}

/*******************************************************************************
* 函数名称: FSMC_NANDDeInit
* 功能描述: Deinitializes the FSMC NAND Banks registers to their default
*                  reset values[取消FSMC NAND体寄存器的初始化还原到他们的默认值].
* 输入参数: - FSMC_Bank: specifies the FSMC Bank to be used[指定使用的FSMC体]
*                    这个参数可以是下面的值之一:
*                       - FSMC_Bank2_NAND: FSMC Bank2 NAND
*                       - FSMC_Bank3_NAND: FSMC Bank3 NAND                      
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void FSMC_NANDDeInit(u32 FSMC_Bank)
{
  /* Check the parameter [检查参数]*/
  assert_param(IS_FSMC_NAND_BANK(FSMC_Bank));
 
  if(FSMC_Bank == FSMC_Bank2_NAND)
  {
    /* Set the FSMC_Bank2 registers to their reset values [设置FSMC_Bank2寄存器到他们的复位值]*/
    FSMC_Bank2->PCR2 = 0x00000018;
    FSMC_Bank2->SR2 = 0x00000040;
    FSMC_Bank2->PMEM2 = 0xFCFCFCFC;
    FSMC_Bank2->PATT2 = 0xFCFCFCFC; 
  }
  /* FSMC_Bank3_NAND */ 
  else
  {
    /* Set the FSMC_Bank3 registers to their reset values [设置FSMC_Bank3寄存器到他们的复位值]*/
    FSMC_Bank3->PCR3 = 0x00000018;
    FSMC_Bank3->SR3 = 0x00000040;
    FSMC_Bank3->PMEM3 = 0xFCFCFCFC;
    FSMC_Bank3->PATT3 = 0xFCFCFCFC;
  } 
}

完整stm32f10x_fsmc.c点击下载,请您在下载的同时到左上角顶我一下,以示支持!谢谢

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(1) | 阅读(769)
发表于:2008-8-12 21:56:55
标签:STM32F  中文  汉化  固件库  DAC  

13

汉化STM32F2.02版固件库之二十二(DAC)

/*******************************************************************************
* 函数名称: DAC_DeInit
* 功能描述: Deinitializes the DAC peripheral registers to their default
*                  reset values[还原DAC外设寄存器到默认复位值].
* 输入参数: 无.
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void DAC_DeInit(void)
{
  /* Enable DAC reset state [使能DAC复位状态]*/
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE);
  /* Release DAC from reset state [解除DAC复位状态]*/
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE);
}

/*******************************************************************************
* 函数名称: DAC_Init
* 功能描述: Initializes the DAC peripheral according to the specified
*                  parameters in the DAC_InitStruct[依照DAC_InitStruct指定的参数初始化DAC外部设备].
* 输入参数: (1) DAC_Channel: the selected DAC channel[选择DAC通道].
*                    This parameter can be one of the following values[这个参数可以是下面的值之一]:
*                       - DAC_Channel_1: DAC Channel1 selected[选择DAC通道1]
*                       - DAC_Channel_2: DAC Channel2 selected[选择DAC通道2]
*           (2) DAC_InitStruct: pointer to a DAC_InitTypeDef structure that
*                    contains the configuration information for the specified
*                    DAC channel.[指向包含了指定DAC通道配置信息的DAC_InitTypeDef结构指针]
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void DAC_Init(u32 DAC_Channel, DAC_InitTypeDef* DAC_InitStruct)
{
  u32 tmpreg1 = 0, tmpreg2 = 0;

  /* Check the DAC parameters [检查DAC参数]*/
  assert_param(IS_DAC_TRIGGER(DAC_InitStruct->DAC_Trigger));
  assert_param(IS_DAC_GENERATE_WAVE(DAC_InitStruct->DAC_WaveGeneration));
  assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude));
  assert_param(IS_DAC_OUTPUT_BUFFER_STATE(DAC_InitStruct->DAC_OutputBuffer));

/*---------------------------- DAC CR Configuration --------------------------*/
  /* Get the DAC CR value [获得DAC CR的值]*/
  tmpreg1 = DAC->CR;
  /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits [清BOFFx, TENx, TSELx, WAVEx和MAMPx位]*/
  tmpreg1 &= ~(CR_CLEAR_Mask << DAC_Channel);
  /* Configure for the selected DAC channel: buffer output, trigger, wave generation,
     mask/amplitude for wave generation [配置选择的DAC通道:缓存输出,触发器,波形发生器,波形发生器的时标/振幅]*/
  /* Set TSELx and TENx bits according to DAC_Trigger value [依照DAC_Trigger的值设置TSELx和TENx位]*/
  /* Set WAVEx bits according to DAC_WaveGeneration value [依照DAC_WaveGeneration的值设置WAVEx位]*/
  /* Set MAMPx bits according to DAC_LFSRUnmask_TriangleAmplitude value [依照DAC_LFSRUnmask_TriangleAmplitude的值设置MAMPx位]*/
  /* Set BOFFx bit according to DAC_OutputBuffer value [依照DAC_OutputBuffer的值设置BOFFx位]*/  
  tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration |
             DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | DAC_InitStruct->DAC_OutputBuffer);
  /* Calculate CR register value depending on DAC_Channel [根据DAC_Channel计算CR寄存器值]*/
  tmpreg1 |= tmpreg2 << DAC_Channel;
  /* Write to DAC CR [写DAC CR]*/
  DAC->CR = tmpreg1;
}

从二十一篇往后都是ST新器件的功能,原来MXCHIP翻译的固件库说明已经没的参考了,全靠我自己了,所以没有把原文替换掉,而是在后面加了括号。完整的stm32f10x_dac.c点击下载,请您在下载的同时到左上角顶我一下,以示支持!谢谢

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(1) | 阅读(529)
2345下一页总共 , 当前 /