久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32F407ZGT6學習
[打印本頁]
作者:
xiaos
時間:
2015-4-10 17:03
標題:
STM32F407ZGT6學習
{//EEPROM AT24C02
#include "eeprom.h"
#include "stm32f4xx.h"
#include "Sys.h"
#define EEPROM_W
0xa0
#define EEPROM_R
0xa1
/***************************DEBUG*************************/
static void GPIO_Configuration(void)//設置A9 復用推挽輸出 A10 浮空輸入 并且重映射到USART1
{
RCC->AHB1ENR|=RCC_AHB1Periph_GPIOA;
RCC->AHB1ENR|=RCC_AHB1Periph_GPIOB;
OGPIO_Mode(A,9,GPIO_Mode_AF,0,GPIO_Speed_50MHz);
IGPIO_Mode(A,10,GPIO_PuPd_NOPULL);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
OGPIO_Mode(B,8,GPIO_Mode_OUT,1,GPIO_Speed_50MHz);//SCL
OGPIO_Mode(B,9,GPIO_Mode_OUT,1,GPIO_Speed_50MHz);//SDA
}
static void USART_Configuration(void)
{
USART_InitTypeDef
USART_InitStructure;
RCC->APB2ENR|=RCC_APB2Periph_USART1;
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Tx;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
void DeBug( uint8_t ch)
{
USART_SendData(USART1,ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
void DeStr(uint8_t *str)
{
while(*str)
DeBug(*str++);
}
uint32_t Ex(uint8_t N)
{
uint32_t Temp=1;
if(N==0)
return 1;
while(N--)
{
Temp*=10;
}
return Temp;
}
void DeNum(uint32_t Num)
{
uint32_t Temp=Num;
uint8_t Length=0,Cnt;
if(Num==0)
{
DeBug('0');
return ;
}
while(Temp)
{
Temp/=10;
Length++;
}
Temp=Num;
for(Cnt=0;Cnt<Length;Cnt++)
{
DeBug('0'+Temp/Ex(Length-Cnt-1));
Temp%=Ex(Length-Cnt-1);
}
}
void DeBug_Init(void)
{
GPIO_Configuration();
USART_Configuration();
}
/***********************I2C*************************/
static void I2C_Delay(void)
{
volatile uint32_t t=168*4;
while(t--);
}
static void I2C_Start(void)
{
I2C_SDA_HIGH();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SDA_LOW();
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}
static void I2C_Stop(void)
{
I2C_SDA_LOW();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SDA_HIGH();
I2C_Delay();
}
static void I2C_SendAck(void)
{
I2C_SDA_LOW();
I2C_Delay();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}
static void I2C_SendNoAck(void)
{
I2C_SDA_HIGH();
I2C_Delay();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
}
static uint8_t I2C_WaitAck(void)
{
uint8_t Ack;
I2C_SDA_HIGH();
I2C_SCL_HIGH();
I2C_Delay();
if(I2C_SDA_Read())
Ack=1;
else
Ack=0;
I2C_SCL_LOW();
I2C_Delay();
return Ack;
}
static void I2C_SendByte(uint8_t Byte)
{
uint8_t Cnt;
for(Cnt=0;Cnt<8;Cnt++)
{
if(Byte&0x80)
I2C_SDA_HIGH();
else
I2C_SDA_LOW();
I2C_Delay();
I2C_SCL_HIGH();
I2C_Delay();
I2C_SCL_LOW();
I2C_Delay();
Byte<<=1;
}
}
static uint8_t I2C_ReceiveByte(void)
{
uint8_t Byte=0,Cnt;
I2C_SDA_HIGH();
for(Cnt=0;Cnt<8;Cnt++)
{
Byte<<=1;
I2C_SCL_HIGH();
I2C_Delay();
if(I2C_SDA_Read())
Byte++;
I2C_SCL_LOW();
I2C_Delay();
}
return Byte;
}
/*****************EEPROM*****************************/
uint8_t ROM_WriteByte(uint8_t Address,uint8_t Data)
{
I2C_Start();
I2C_SendByte(EEPROM_W);
if(I2C_WaitAck())
return 1;
I2C_SendByte(Address);
if(I2C_WaitAck())
return 2;
I2C_SendByte(Data);
if(I2C_WaitAck())
return 3;
I2C_Stop();
return 0;
}
uint8_t ROM_ReadByte(uint8_t Address,uint8_t *pData)
{
I2C_Start();
I2C_SendByte(EEPROM_W);
if(I2C_WaitAck())
return 1;
I2C_SendByte(Address);
if(I2C_WaitAck())
return 2;
I2C_Start();
I2C_SendByte(EEPROM_R);
if(I2C_WaitAck())
return 3;
*pData=I2C_ReceiveByte();
I2C_SendNoAck();
I2C_Stop();
return 0;
}
void Test(void)
{
uint8_t Data;
DeBug_Init();
if(ROM_WriteByte(0,145))
{
DeStr("xie cuo wu \n");
return;
}
else
{
DeStr("xie jin qu de shi 145\n");
}
if(ROM_ReadByte(0,&Data))
{
DeStr("du cuo wu \n");
return;
}
else
{
DeStr("du chu lai de shi :");
DeNum(Data);
DeStr("\n");
}
}
}
{
#ifndef _FLASH_H
#define _FLASH_H
#include "stm32f4xx.h"
#define SPI_SCK_LOW()
GPIOB->ODR&=~(1<<3)
#define SPI_SCK_HIGH()
GPIOB->ODR|=1<<3
#define SPI_MOSI_LOW()
GPIOB->ODR&=~(1<<5)
#define SPI_MOSI_HIGH()
GPIOB->ODR|=1<<5
#define SPI_CS_LOW()
GPIOB->ODR&=~(1<<14)
#define SPI_CS_HIGH()
GPIOB->ODR|=1<<14
#define SPI_MISO_Read()
(GPIOB->IDR&(1<<4))
#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 Test(void);
#endif
#include "flash.h"
/*******************DeBug**********************/
static void GPIO_Configuration(void)
{
GPIO_InitTypeDef
GPIO_InitStructure;
RCC->AHB1ENR|=RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB;
GPIOA->MODER|=GPIO_Mode_AF<<2*9;
GPIOA->OTYPER|=GPIO_OType_PP<<9;
GPIOA->OSPEEDR|=GPIO_Speed_50MHz<<2*9;
GPIOA->MODER|=GPIO_Mode_IN<<2*10;
GPIOA->PUPDR|=GPIO_PuPd_NOPULL<<2*10;
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
//
GPIOB->MODER|=GPIO_Mode_OUT<<2*5|GPIO_Mode_OUT<<2*14;
//
GPIOB->OTYPER|=GPIO_OType_PP<<5|GPIO_OType_PP<<14;
//
GPIOB->OSPEEDR|=GPIO_Speed_50MHz<<2*5|GPIO_Speed_50MHz<<2*14;
//
//
GPIOB->MODER|=GPIO_Mode_IN<<2*4;
//
GPIOB->PUPDR|=GPIO_PuPd_NOPULL<<2*4;
//
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
//
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
//
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_14|GPIO_Pin_3;
//
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//
//
GPIO_Init(GPIOB,&GPIO_InitStructure);
//
//
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
//
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
//
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
//
//
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1);
}
static void USART_Configuration(void)
{
USART_InitTypeDef
USART_InitStructure;
RCC->APB2ENR|=RCC_APB2Periph_USART1;
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Tx;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
static void SPI_Configuration(void)
{
SPI_InitTypeDef
SPI_InitStructure;
SPI_CS_HIGH();
RCC->APB2ENR|=RCC_APB2Periph_SPI1;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //設置SPI單向或者雙向的數據模式:SPI設置為雙線雙向全雙工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
//設置SPI工作模式:設置為主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
//設置SPI的數據大小:SPI發送接收8位幀結構
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
//串行同步時鐘的空閑狀態為高電平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
//串行同步時鐘的第二個跳變沿(上升或下降)數據被采樣
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
//NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內部NSS信號有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
//定義波特率預分頻的值:波特率預分頻值為256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
//指定數據傳輸從MSB位還是LSB位開始:數據傳輸從MSB位開始
SPI_InitStructure.SPI_CRCPolynomial = 7;
//CRC值計算的多項式
SPI_Init(SPI1, &SPI_InitStructure); //根據SPI_InitStruct中指定的參數初始化外設SPIx寄存器
SPI_Cmd(SPI1, ENABLE); //使能SPI外設
}
void DeBug( uint8_t ch)
{
USART_SendData(USART1,ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
void DeStr(uint8_t *str)
{
while(*str)
DeBug(*str++);
}
uint32_t Ex(uint8_t N)
{
uint32_t Temp=1;
if(N==0)
return 1;
while(N--)
{
Temp*=10;
}
return Temp;
}
void DeNum(uint32_t Num)
{
uint32_t Temp=Num;
uint8_t Length=0,Cnt;
if(Num==0)
{
DeBug('0');
return ;
}
while(Temp)
{
Temp/=10;
Length++;
}
Temp=Num;
for(Cnt=0;Cnt<Length;Cnt++)
{
DeBug('0'+Temp/Ex(Length-Cnt-1));
Temp%=Ex(Length-Cnt-1);
}
}
void DeBug_Init(void)
{
GPIO_Configuration();
USART_Configuration();
SPI_Configuration();
}
/**********************SPI*********************************/
void SPI_Delay(void)
{
volatile uint16_t t=1500;
while(t--);
}
static void SPI_SendByte(uint8_t Byte)
{
//
uint8_t Cnt;
//
SPI_SCK_LOW();
//
for(Cnt=0;Cnt<8;Cnt++)
//
{
//
if(Byte&0x80)
//
SPI_MOSI_HIGH();
//
else
//
SPI_MOSI_LOW();
//
SPI_SCK_HIGH();
//
Byte<<=1;
//
SPI_SCK_LOW();
//
}
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI1,Byte);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
SPI_I2S_ReceiveData(SPI1);
}
static uint8_t SPI_ReceiveByte(void)
{
//
uint8_t Byte=0,Cnt;
//
//GPIOB->ODR|=1<<4;
//
for(Cnt=0;Cnt<8;Cnt++)
//
{
//
SPI_SCK_HIGH();
//
Byte<<=1;
//
if(SPI_MISO_Read())
//
Byte++;
//
SPI_SCK_LOW();
//
}
//
return Byte;
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI1,0xff);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
return SPI_I2S_ReceiveData(SPI1);
}
/************************FLASH****************************/
uint8_t FLASH_ReadStatusReg(void)
{
uint8_t Status;
SPI_CS_LOW();
SPI_SendByte(W25X_ReadStatusReg);
Status=SPI_ReceiveByte();
SPI_CS_HIGH();
return Status;
}
void FLASH_WriteEnable(void)
{
SPI_CS_LOW();
SPI_SendByte(W25X_WriteEnable);
SPI_CS_HIGH();
}
void FLASH_WriteByte(uint32_t Address,uint8_t Byte)
{
FLASH_WriteEnable();
SPI_CS_LOW();
SPI_SendByte(W25X_PageProgram);
SPI_SendByte(Address>>16);
SPI_SendByte(Address>>8);
SPI_SendByte(Address);
SPI_SendByte(Byte);
SPI_CS_HIGH();
while(FLASH_ReadStatusReg()&0x01);
}
void FLASH_ReadByte(uint32_t Address ,uint8_t *pByte)
{
SPI_CS_LOW();
SPI_SendByte(W25X_ReadData);
SPI_SendByte(Address>>16);
SPI_SendByte(Address>>8);
SPI_SendByte(Address);
*pByte=SPI_ReceiveByte();
SPI_CS_HIGH();
}
uint16_t FLASH_ReadID(void)
{
uint16_t Temp=0;
SPI_CS_LOW();
SPI_SendByte(W25X_ManufactDeviceID);
SPI_SendByte(0x00);
SPI_SendByte(0x00);
SPI_SendByte(0x00);
Temp|=SPI_ReceiveByte()<<8;
Temp|=SPI_ReceiveByte();
SPI_CS_HIGH();
return Temp;
}
void FLASH_Erase_Sector(uint32_t Address)
{
FLASH_WriteEnable();
while(FLASH_ReadStatusReg()&0x01);
SPI_CS_LOW();
SPI_SendByte(W25X_SectorErase);
SPI_SendByte(Address>>16);
SPI_SendByte(Address>>8);
SPI_SendByte(Address);
SPI_CS_HIGH();
while(FLASH_ReadStatusReg()&0x01);
}
void FLASH_Wrase_Chip(void)
{
FLASH_WriteEnable();
SPI_SendByte(0x00);
while(FLASH_ReadStatusReg()&0x01);
SPI_CS_LOW();
SPI_SendByte(W25X_ChipErase);
SPI_CS_HIGH();
while(FLASH_ReadStatusReg()&0x01);
}
void Test(void)
{
uint32_t Byte=1677;
uint16_t Temp;
uint8_t Data;
DeBug_Init();
DeStr("FLASH du xie \n");
Temp=FLASH_ReadID();
DeStr("Flash de ID shi :");
DeNum(Temp);
DeStr("\n");
FLASH_Erase_Sector(0);
DeStr("ca chu cheng gong \n");
while(Byte!=0)
{
FLASH_WriteByte(Byte--,0xcd);
}
DeStr("xie ru cheng gong \n");
Byte=1677;
while(Byte!=0)
{
FLASH_ReadByte(Byte--,&Data);
if(Data!=0xcd)
{
DeStr("ERROR \n");
return;
}
}
DeStr("SUCCESS \n");
}
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
av一级毛片
|
丝袜美腿av
|
一区二区三区欧美
|
玖玖视频国产
|
欧美精品一区二区在线观看
|
色综合一区二区
|
免费成人在线网站
|
亚洲精品v日韩精品
|
国产1区2区在线观看
|
国产成人综合久久
|
夜夜干夜夜操
|
欧美亚洲另类丝袜综合网动图
|
成人性生交a做片
|
久久国产精品免费一区二区三区
|
日韩欧美一二三区
|
欧美v在线观看
|
欧美老少妇一级特黄一片
|
国产一区二区三区视频
|
久久机热
|
av免费看片
|
欧美天堂
|
国产欧美一级二级三级在线视频
|
在线看片网站
|
超碰在线97国产
|
www.亚洲一区
|
免费99视频
|
精品日韩在线
|
亚洲一区国产精品
|
91久久北条麻妃一区二区三区
|
国产福利在线播放
|
日本成人中文字幕在线观看
|
午夜电影福利
|
欧美日韩精品中文字幕
|
欧美色性
|
麻豆久久久久久久久久
|
国产精品日本一区二区在线播放
|
欧美一级二级在线观看
|
欧美日韩在线观看视频网站
|
国产精品亚洲综合
|
国产高清一区二区
|
日韩精品一区二区三区视频播放
|