这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » (STM32_RAM调试)库函数操作篇(库函数操作:实验2 按键输入)蒋粤 AR

共78条 8/8 |‹ 3 4 5 6 7 8 跳转至
助工
2012-06-11 21:35:21     打赏
71楼


//4Kbytes为一个Sector
//16个扇区为1个Block
//W25X16
//容量为2M字节,共有32个Block,512个Sector

//初始化SPI FLASH的IO口
void SPI_Flash_Init(void)
{
 RCC->APB2ENR|=1<<2;       //PORTA时钟使能     
 //这里
 GPIOA->CRL&=0XFFF000FF;
 GPIOA->CRL|=0X00033300;//PA2.3.4 推挽     
 GPIOA->ODR|=0X7<<2;    //PA2.3.4上拉
 SPIx_Init();     //初始化SPI

//读取SPI_FLASH的状态寄存器
//BIT7  6   5   4   3   2   1   0
//SPR   RV  TB BP2 BP1 BP0 WEL BUSY
//SPR:默认0,状态寄存器保护位,配合WP使用
//TB,BP2,BP1,BP0:FLASH区域写保护设置
//WEL:写使能锁定
//BUSY:忙标记位(1,忙;0,空闲)
//默认:0x00
u8 SPI_Flash_ReadSR(void)  

 u8 byte=0;  
 SPI_FLASH_CS=0;                            //使能器件  
 SPIx_ReadWriteByte(W25X_ReadStatusReg);    //发送读取状态寄存器命令   
 byte=SPIx_ReadWriteByte(0Xff);             //读取一个字节 
 SPI_FLASH_CS=1;                            //取消片选    
 return byte;  
}
//写SPI_FLASH状态寄存器
//只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!!!
void SPI_FLASH_Write_SR(u8 sr)  
{  
 SPI_FLASH_CS=0;                            //使能器件  
 SPIx_ReadWriteByte(W25X_WriteStatusReg);   //发送写取状态寄存器命令   
 SPIx_ReadWriteByte(sr);               //写入一个字节 
 SPI_FLASH_CS=1;                            //取消片选           
}  
//SPI_FLASH写使能 
//将WEL置位  
void SPI_FLASH_Write_Enable(void)  
{
 SPI_FLASH_CS=0;                            //使能器件  
    SPIx_ReadWriteByte(W25X_WriteEnable);      //发送写使能 
 SPI_FLASH_CS=1;                            //取消片选           
}
//SPI_FLASH写禁止 
//将WEL清零 
void SPI_FLASH_Write_Disable(void)  

 SPI_FLASH_CS=0;                            //使能器件  
    SPIx_ReadWriteByte(W25X_WriteDisable);     //发送写禁止指令   
 SPI_FLASH_CS=1;                            //取消片选           
}       
//读取芯片ID W25X16的ID:0XEF14
u16 SPI_Flash_ReadID(void)
{
 u16 Temp = 0;  
 SPI_FLASH_CS=0;       
 SPIx_ReadWriteByte(0x90);//发送读取ID命令    
 SPIx_ReadWriteByte(0x00);     
 SPIx_ReadWriteByte(0x00);     
 SPIx_ReadWriteByte(0x00);        
 Temp|=SPIx_ReadWriteByte(0xFF)<<8; 
 Temp|=SPIx_ReadWriteByte(0xFF); 
 SPI_FLASH_CS=1;       
 return Temp;
}        
//读取SPI FLASH 
//在指定地址开始读取指定长度的数据
//pBuffer:数据存储区
//ReadAddr:开始读取的地址(24bit)
//NumByteToRead:要读取的字节数(最大65535)
void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)  
{
  u16 i;                   
 SPI_FLASH_CS=0;                            //使能器件  
    SPIx_ReadWriteByte(W25X_ReadData);         //发送读取命令  
    SPIx_ReadWriteByte((u8)((ReadAddr)>>16));  //发送24bit地址   
    SPIx_ReadWriteByte((u8)((ReadAddr)>>8));  
    SPIx_ReadWriteByte((u8)ReadAddr);  
    for(i=0;i<NumByteToRead;i++)
 {
        pBuffer[i]=SPIx_ReadWriteByte(0XFF);   //循环读数 
    }
 SPI_FLASH_CS=1;                            //取消片选           

//SPI在一页(0~65535)内写入少于256个字节的数据
//在指定地址开始写入最大256字节的数据
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!! 
void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
  u16 i; 
    SPI_FLASH_Write_Enable();                  //SET WEL
 SPI_FLASH_CS=0;                            //使能器件  
    SPIx_ReadWriteByte(W25X_PageProgram);      //发送写页命令  
    SPIx_ReadWriteByte((u8)((WriteAddr)>>16)); //发送24bit地址   
    SPIx_ReadWriteByte((u8)((WriteAddr)>>8));  
    SPIx_ReadWriteByte((u8)WriteAddr);  
    for(i=0;i<NumByteToWrite;i++)SPIx_ReadWriteByte(pBuffer[i]);//循环写数 
 SPI_FLASH_CS=1;                            //取消片选
 SPI_Flash_Wait_Busy();        //等待写入结束
}
//无检验写SPI FLASH
//必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!
//具有自动换页功能
//在指定地址开始写入指定长度的数据,但是要确保地址不越界!
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大65535)
//CHECK OK
void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)  
{       
 u16 pageremain;   
 pageremain=256-WriteAddr%256; //单页剩余的字节数       
 if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//不大于256个字节
 while(1)
 {   
  SPI_Flash_Write_Page(pBuffer,WriteAddr,pageremain);
  if(NumByteToWrite==pageremain)break;//写入结束了
   else //NumByteToWrite>pageremain
  {
   pBuffer+=pageremain;
   WriteAddr+=pageremain; 

   NumByteToWrite-=pageremain;     //减去已经写入了的字节数
   if(NumByteToWrite>256)pageremain=256; //一次可以写入256个字节
   else pageremain=NumByteToWrite;    //不够256个字节了
  }
 };    
}
//写SPI FLASH 
//在指定地址开始写入指定长度的数据
//该函数带擦除操作!
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大65535)      
u8 SPI_FLASH_BUF[4096];
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)  
{
 u32 secpos;
 u16 secoff;
 u16 secremain;   
  u16 i;   

 secpos=WriteAddr/4096;//扇区地址 0~511 for w25x16
 secoff=WriteAddr%4096;//在扇区内的偏移
 secremain=4096-secoff;//扇区剩余空间大小  

 if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
 while(1)
 { 
  SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容
  for(i=0;i<secremain;i++)//校验数据
  {
   if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除    
  }
  if(i<secremain)//需要擦除
  {
   SPI_Flash_Erase_Sector(secpos);//擦除这个扇区
   for(i=0;i<secremain;i++)    //复制
   {
    SPI_FLASH_BUF[i+secoff]=pBuffer[i];  
   }
   SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区 

  }else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间.       
  if(NumByteToWrite==secremain)break;//写入结束了
  else//写入未结束
  {
   secpos++;//扇区地址增1
   secoff=0;//偏移位置为0  

      pBuffer+=secremain;  //指针偏移
   WriteAddr+=secremain;//写地址偏移   
      NumByteToWrite-=secremain;    //字节数递减
   if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完
   else secremain=NumByteToWrite;   //下一个扇区可以写完了
  } 
 };   
}
//擦除整个芯片
//整片擦除时间:
//W25X16:25s
//W25X32:40s
//W25X64:40s
//等待时间超长...
void SPI_Flash_Erase_Chip(void)  
{                                            
    SPI_FLASH_Write_Enable();                  //SET WEL
    SPI_Flash_Wait_Busy();  
   SPI_FLASH_CS=0;                            //使能器件  
    SPIx_ReadWriteByte(W25X_ChipErase);        //发送片擦除命令 
 SPI_FLASH_CS=1;                            //取消片选           
 SPI_Flash_Wait_Busy();          //等待芯片擦除结束
}  
//擦除一个扇区
//Dst_Addr:扇区地址 0~511 for w25x16
//擦除一个山区的最少时间:150ms
void SPI_Flash_Erase_Sector(u32 Dst_Addr)  
{  
 Dst_Addr*=4096;
    SPI_FLASH_Write_Enable();                  //SET WEL  
    SPI_Flash_Wait_Busy();  
   SPI_FLASH_CS=0;                            //使能器件  
    SPIx_ReadWriteByte(W25X_SectorErase);      //发送扇区擦除指令
    SPIx_ReadWriteByte((u8)((Dst_Addr)>>16));  //发送24bit地址   
    SPIx_ReadWriteByte((u8)((Dst_Addr)>>8));  
    SPIx_ReadWriteByte((u8)Dst_Addr); 
 SPI_FLASH_CS=1;                            //取消片选           
    SPI_Flash_Wait_Busy();          //等待擦除完成

//等待空闲
void SPI_Flash_Wait_Busy(void)  
{  
 while ((SPI_Flash_ReadSR()&0x01)==0x01);   // 等待BUSY位清空

//进入掉电模式
void SPI_Flash_PowerDown(void)  
{
   SPI_FLASH_CS=0;                            //使能器件  
    SPIx_ReadWriteByte(W25X_PowerDown);        //发送掉电命令 
 SPI_FLASH_CS=1;                            //取消片选           
    delay_us(3);                               //等待TPD 
}  
//唤醒
void SPI_Flash_WAKEUP(void)  

   SPI_FLASH_CS=0;                            //使能器件  
    SPIx_ReadWriteByte(W25X_ReleasePowerDown);   //  send W25X_PowerDown command 0xAB   
 SPI_FLASH_CS=1;                            //取消片选           
    delay_us(3);                               //等待TRES1
}   

#define SPI_FLASH_CS PAout(2)  //选中FLASH     
////////////////////////////////////////////////////////////////////////////
//W25X40读写
#define FLASH_ID 0XEF12           //W25X系列的FLASH从数据手册找到ID
//指令表
#define W25X_WriteEnable  0x06
#define W25X_WriteDisable  0x04
#define W25X_ReadStatusReg  0x05
#define W25X_WriteStatusReg  0x01
#define W25X_ReadData   0x03
#define W25X_FastReadData  0x0B
#define W25X_FastReadDual  0x3B
#define W25X_PageProgram  0x02
#define W25X_BlockErase   0xD8
#define W25X_SectorErase  0x20
#define W25X_ChipErase   0xC7
#define W25X_PowerDown   0xB9
#define W25X_ReleasePowerDown 0xAB
#define W25X_DeviceID   0xAB
#define W25X_ManufactDeviceID 0x90
#define W25X_JedecDeviceID  0x9F

void SPI_Flash_Init(void);
u16  SPI_Flash_ReadID(void);       //读取FLASH ID
u8  SPI_Flash_ReadSR(void);        //读取状态寄存器
void SPI_FLASH_Write_SR(u8 sr);   //写状态寄存器
void SPI_FLASH_Write_Enable(void);  //写使能
void SPI_FLASH_Write_Disable(void); //写保护
void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead);   //读取flash
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite);//写入flash
void SPI_Flash_Erase_Chip(void);       //整片擦除
void SPI_Flash_Erase_Sector(u32 Dst_Addr);//扇区擦除
void SPI_Flash_Wait_Busy(void);           //等待空闲
void SPI_Flash_PowerDown(void);           //进入掉电模式
void SPI_Flash_WAKEUP(void);     //唤醒

详情请登录网友——正点原子官方论坛
http://www.openedv.com/forums/list.htm或下载《STM32不完全手册V2.0》
源代码:实验16 SPI实验.rar


注意:我板上用的是W25X40(虽然图片上显示W25X16),查到FLASH_ID是0XEF12。


助工
2012-06-11 21:45:53     打赏
72楼
模拟SPI总线
//SPI写数据
//向7843写入1byte数据  
void ADS_Write_Byte(u8 num)   

 u8 count=0;  
 for(count=0;count<8;count++) 
 {   
  if(num&0x80)TDIN=1; 
  else TDIN=0;  
  num<<=1;   
  TCLK=0;//上升沿有效     
  TCLK=1;     
 }       
}   
//SPI读数据
//从7846/7843/XPT2046/UH7843/UH7846读取adc值   
u16 ADS_Read_AD(u8 CMD)  
{  
 u8 count=0;   
 u16 Num=0;
 TCLK=0;//先拉低时钟  
 TCS=0; //选中ADS7843
// delay_us(5); 
 ADS_Write_Byte(CMD);//发送命令字
 delay_us(6);//ADS7846的转换时间最长为6us
 TCLK=1;//给1个时钟,清除BUSY       
 TCLK=0;  
 for(count=0;count<16;count++) 
 {      
  Num<<=1;  
  TCLK=0;//下降沿有效          
  TCLK=1;
  if(DOUT)Num++;   
 }   
 Num>>=4;   //只有高12位有效.
 TCS=1;//释放ADS7843 
 return(Num);  
}

//与触摸屏芯片连接引脚   
#define PEN  PGin(13)   //PG13  INT
#define DOUT PFin(7)   //PF7  MISO
#define TDIN PFout(6)  //PF6  MOSI
#define TCLK PFout(8)  //PF8  SCLK
#define TCS  PFout(9) //PF9 CS    

详情请下载《STM32不完全手册V2.0》
源代码:实验17 触摸屏实验.rar

欢迎下载验证,虽然我的液晶触摸屏坏了,但之前拿别人的液晶触摸屏接上是可以的,可惜当时没有拍照,所以没图片。

高工
2012-06-11 21:52:11     打赏
73楼
你不会是外括了个spiflash吧?

助工
2012-06-13 12:40:11     打赏
74楼
没有,只是用了24C02

助工
2012-06-14 20:31:51     打赏
75楼

//复位DS18B20
void DS18B20_Rst(void)   
{                
 DS18B20_IO_OUT(); //SET PA0 OUTPUT
    DS18B20_DQ_OUT=0; //拉低DQ
    delay_us(750);    //拉低750us
    DS18B20_DQ_OUT=1; //DQ=1
 delay_us(15);     //15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void)    
{  
 u8 retry=0;
 DS18B20_IO_IN();//SET PA0 INPUT 
    while (DS18B20_DQ_IN&&retry<200)
 {
  retry++;
  delay_us(1);
 }; 
 if(retry>=200)return 1;
 else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
 {
  retry++;
  delay_us(1);
 };
 if(retry>=240)return 1;    
 return 0;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void)     // read one bit
{
    u8 data;
 DS18B20_IO_OUT();//SET PA0 OUTPUT
    DS18B20_DQ_OUT=0;
 delay_us(2);
    DS18B20_DQ_OUT=1;
 DS18B20_IO_IN();//SET PA0 INPUT
 delay_us(12);
 if(DS18B20_DQ_IN)data=1;
    else data=0; 
    delay_us(50);          
    return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)    // read one byte
{       
    u8 i,j,dat;
    dat=0;
 for (i=1;i<=8;i++)
 {
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }         
    return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)    
 {            
    u8 j;
    u8 testb;
 DS18B20_IO_OUT();//SET PA0 OUTPUT;
    for (j=1;j<=8;j++)
 {
        testb=dat&0x01;
        dat=dat>>1;
        if (testb)
        {
            DS18B20_DQ_OUT=0;// Write 1
            delay_us(2);                           
            DS18B20_DQ_OUT=1;
            delay_us(60);            
        }
        else
        {
            DS18B20_DQ_OUT=0;// Write 0
            delay_us(60);            
            DS18B20_DQ_OUT=1;
            delay_us(2);                         
        }
    }
}
//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
{                       
    DS18B20_Rst();   
 DS18B20_Check(); 
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0x44);// convert
}
//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在     
u8 DS18B20_Init(void)
{
 RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
 GPIOA->CRL&=0XFFFFFF0F;//PORTA.1 推挽输出
 GPIOA->CRL|=0X00000030;
 GPIOA->ODR|=1<<1;      //输出1
 DS18B20_Rst();
 return DS18B20_Check();

//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
 short tem;
    DS18B20_Start ();                    // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check(); 
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0xbe);// convert    
    TL=DS18B20_Read_Byte(); // LSB  
    TH=DS18B20_Read_Byte(); // MSB 
       
    if(TH>7)
    {
        TH=~TH;
        TL=~TL;
        temp=0;//温度为负 
    }else temp=1;//温度为正     
    tem=TH; //获得高八位
    tem<<=8;   
    tem+=TL;//获得底八位
    tem=(float)tem*0.625;//转换    
 if(temp)return tem; //返回温度值
 else return -tem;   
}
 
//IO方向设置
#define DS18B20_IO_IN()  {GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=0X00000080;}
#define DS18B20_IO_OUT() {GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=0X00000030;}
////IO操作函数             
#define DS18B20_DQ_OUT PAout(1) //数据端口 PA1
#define DS18B20_DQ_IN  PAin(1)  //数据端口 PA1
    
u8 DS18B20_Init(void);//初始化DS18B20
short DS18B20_Get_Temp(void);//获取温度
void DS18B20_Start(void);//开始温度转换
void DS18B20_Write_Byte(u8 dat);//写入一个字节
u8 DS18B20_Read_Byte(void);//读出一个字节
u8 DS18B20_Read_Bit(void);//读出一个位
u8 DS18B20_Check(void);//检测是否存在DS18B20
void DS18B20_Rst(void);//复位DS18B20  

详情请下载《STM32不完全手册V2.0》参考
源代码:实验18 DS18B20实验.rar


助工
2012-06-17 14:31:34     打赏
76楼

      1、本系列新手入门级库函数操作篇是基于ST官方库STM32F10x Library v1.0,正因为是低版本的库,所以我参考高版本的库(如STM32F10x Library v3.5)来完善低版本的库,能学到点东西。
       2、本系列新手入门级库函数操作篇是没有下载程序到flash里运行的,而是在STM32_RAM中调试,这是我做的具体教程,如下:
STM32_RAM调试.doc


新手入门级库函数操作篇——库函数操作:实验1 LED流水灯 实验1 LED流水灯.rar

用KEIL4以上版本(我使用KEIL4.23)打开工程,编译工程,然后使用Debug调试,并全速运行程序就可以看到LED3和LED4两路LED交替闪烁.(不可以使用Download按钮,且在调试过程中不可以硬件复位。)


助工
2012-06-18 13:12:14     打赏
77楼

1、本系列新手入门级库函数操作篇是基于ST官方库STM32F10x Library v1.0,正因为是低版本的库,所以我参考高版本的库(如STM32F10x Library v3.5)来完善低版本的库,能学到点东西。
       2、本系列新手入门级库函数操作篇是没有下载程序到flash里运行的,而是在STM32_RAM中调试,这是我做的具体教程,如下:
STM32_RAM调试.doc


void GPIO_Configuration_KEY(void)
{
 GPIO_Configuration_KEY0();
 GPIO_Configuration_KEY1();
 GPIO_Configuration_KEY2();
}

void GPIO_Configuration_KEY0(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
 //初始化 USER_BUTTON-->GPIOF.11   上拉输入
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_Init(GPIOF, &GPIO_InitStructure);

}

void GPIO_Configuration_KEY1(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
 //初始化 Anti_Tamper-->GPIOC.13   上拉输入
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
 GPIO_Init(GPIOC, &GPIO_InitStructure);

}

void GPIO_Configuration_KEY2(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
 //初始化 WK_UP-->GPIOA.0   下拉输入
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
 GPIO_Init(GPIOA, &GPIO_InitStructure);

}

#define LED1_PIN                    GPIO_Pin_2
#define LED1_GPIO                   GPIOE
#define LED1_RCC                    RCC_APB2Periph_GPIOE 
 
#define LED2_PIN                    GPIO_Pin_3
#define LED2_GPIO                   GPIOE
#define LED2_RCC                    RCC_APB2Periph_GPIOE 

#define LED3_PIN                    GPIO_Pin_4 
#define LED3_GPIO                   GPIOE
#define LED3_RCC                    RCC_APB2Periph_GPIOE 

#define LED4_PIN                    GPIO_Pin_5
#define LED4_GPIO                   GPIOE
#define LED4_RCC                    RCC_APB2Periph_GPIOE

#define KEY0_PIN          GPIO_Pin_11
#define KEY0_GPIO          GPIOF
#define KEY0_RCC          RCC_APB2Periph_GPIOF

#define KEY1_PIN          GPIO_Pin_13
#define KEY1_GPIO          GPIOC
#define KEY1_RCC          RCC_APB2Periph_GPIOC

#define KEY2_PIN          GPIO_Pin_0
#define KEY2_GPIO          GPIOA
#define KEY2_RCC          RCC_APB2Periph_GPIOA

详情见源代码:
实验2 按键输入.rar

按下user_button,LED1灯亮,松开则灭;按下anti_tamper,LED2灯亮,松开则灭;按下wait_up,LED3灯亮,松开则灭。


菜鸟
2012-07-12 13:38:15     打赏
78楼

你这样就能够把PC13设置为输入?????????

在此深表怀疑。。。。。。
-----------------------------------------------------
PC13是个特殊的脚,设置为IO口 ,涉及到BKP寄存器修改
  PWR_BackupAccessCmd(ENABLE);
 
  RCC_LSEConfig(RCC_LSE_OFF);
 
  BKP_TamperPinCmd(DISABLE); 
 
  PWR_BackupAccessCmd(DISABLE);

当然,我还是有疑问!我虽然设置成功了,可以读按键值,
但是,这个时候PC13的上拉只有30多欧姆,神奇啊!!!!这么强悍。。。
依然让我无语了。。。。。
这样的输入,PC13要是烧坏了咋怎。。。。。。

共78条 8/8 |‹ 3 4 5 6 7 8 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]